From 5afb4ca9b760d62be13b14796a802401d80c7ea4 Mon Sep 17 00:00:00 2001 From: lexborisov Date: Mon, 29 Aug 2016 01:20:40 +0400 Subject: [PATCH] First commit --- CHANGELOG.md | Bin 0 -> 102 bytes LICENSE | 458 + Makefile | 69 + README.md | 130 + devel/osx/Modest.xcodeproj/project.pbxproj | 804 ++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 114756 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../xcschemes/Modest.xcscheme | 91 + .../xcschemes/xcschememanagement.plist | 22 + devel/osx/Modest/main.c | 188 + examples/Makefile | 32 + examples/selectors/selectors_low_level.c | 101 + include/modest/finder/finder.h | 68 + include/modest/finder/match.h | 44 + include/modest/finder/myosi.h | 51 + include/modest/finder/pseudo_class.h | 92 + include/modest/finder/resource.h | 125 + include/modest/finder/type.h | 54 + include/modest/myosi.h | 52 + include/mycss/an_plus_b.h | 71 + include/mycss/api.h | 524 + include/mycss/check.h | 41 + include/mycss/convert.h | 44 + include/mycss/declaration/entry.h | 53 + include/mycss/declaration/init.h | 54 + include/mycss/declaration/myosi.h | 75 + include/mycss/declaration/parser.h | 41 + include/mycss/declaration/state.h | 47 + include/mycss/entry.h | 157 + include/mycss/media/init.h | 40 + include/mycss/media/myosi.h | 42 + include/mycss/media/state.h | 38 + include/mycss/mycss.h | 79 + include/mycss/myosi.h | 281 + include/mycss/mystring.h | 69 + include/mycss/namespace/init.h | 64 + include/mycss/namespace/myosi.h | 74 + include/mycss/namespace/parser.h | 46 + include/mycss/namespace/state.h | 46 + include/mycss/parser.h | 54 + include/mycss/property/const.h | 71 + include/mycss/property/init.h | 47 + include/mycss/property/myosi.h | 59 + include/mycss/property/parser.h | 40 + include/mycss/property/resources.h | 65 + include/mycss/selectors/function.h | 75 + include/mycss/selectors/function_parser.h | 64 + include/mycss/selectors/function_resource.h | 90 + include/mycss/selectors/init.h | 66 + include/mycss/selectors/list.h | 62 + include/mycss/selectors/myosi.h | 228 + include/mycss/selectors/myosi_resource.h | 33 + include/mycss/selectors/parser.h | 65 + include/mycss/selectors/pseudo.h | 52 + include/mycss/selectors/pseudo_resource.h | 161 + include/mycss/selectors/state.h | 90 + include/mycss/selectors/value.h | 107 + include/mycss/selectors/value_resource.h | 57 + include/mycss/stylesheet.h | 58 + include/mycss/tokenizer.h | 140 + include/mycss/tokenizer_end.h | 125 + include/mycss/tokenizer_global.h | 78 + include/mycss/tokenizer_resource.h | 362 + include/mycss/values/consume.h | 43 + include/mycss/values/resources.h | 27 + include/mycss/values/serialization.h | 38 + include/mycss/values/units.h | 94 + include/mycss/values/units_resources.h | 237 + include/mycss/values/values.h | 65 + include/myhtml/api.h | 2648 +++++ include/myhtml/api_encoding.h | 71 + include/myhtml/callback.h | 47 + include/myhtml/charef.h | 56 + include/myhtml/charef_resource.h | 5957 +++++++++++ include/myhtml/data_process.h | 72 + include/myhtml/def.h | 58 + include/myhtml/encoding.h | 146 + include/myhtml/encoding_detect_resource.h | 5580 ++++++++++ include/myhtml/encoding_resource.h | 9330 +++++++++++++++++ include/myhtml/incoming.h | 67 + include/myhtml/myhtml.h | 238 + include/myhtml/mynamespace.h | 64 + include/myhtml/mynamespace_resource.h | 63 + include/myhtml/myosi.h | 514 + include/myhtml/mystring.h | 146 + include/myhtml/parser.h | 48 + include/myhtml/rules.h | 47 + include/myhtml/stream.h | 62 + include/myhtml/tag.h | 149 + include/myhtml/tag_const.h | 293 + include/myhtml/thread.h | 212 + include/myhtml/token.h | 168 + include/myhtml/tokenizer.h | 73 + include/myhtml/tokenizer_doctype.h | 51 + include/myhtml/tokenizer_end.h | 102 + include/myhtml/tokenizer_script.h | 57 + include/myhtml/tree.h | 426 + include/myhtml/utils.h | 48 + include/myhtml/utils/mchar_async.h | 129 + include/myhtml/utils/mcobject.h | 70 + include/myhtml/utils/mcobject_async.h | 114 + include/myhtml/utils/mcsimple.h | 61 + include/myhtml/utils/mcsync.h | 81 + include/myhtml/utils/mctree.h | 97 + include/myhtml/utils/resources.h | 208 + projects/CMakeLists.txt | 200 + source/modest/Makefile.mk | 14 + source/modest/finder/finder.c | 358 + source/modest/finder/finder.h | 68 + source/modest/finder/match.c | 287 + source/modest/finder/match.h | 44 + source/modest/finder/myosi.h | 51 + source/modest/finder/pseudo_class.c | 832 ++ source/modest/finder/pseudo_class.h | 92 + source/modest/finder/resource.h | 125 + source/modest/finder/type.c | 126 + source/modest/finder/type.h | 54 + source/modest/myosi.h | 52 + source/mycss/Makefile.mk | 14 + source/mycss/an_plus_b.c | 512 + source/mycss/an_plus_b.h | 71 + source/mycss/api.h | 524 + source/mycss/check.c | 195 + source/mycss/check.h | 41 + source/mycss/convert.c | 258 + source/mycss/convert.h | 44 + source/mycss/declaration/entry.c | 117 + source/mycss/declaration/entry.h | 53 + source/mycss/declaration/init.c | 142 + source/mycss/declaration/init.h | 54 + source/mycss/declaration/myosi.h | 75 + source/mycss/declaration/parser.c | 80 + source/mycss/declaration/parser.h | 41 + source/mycss/declaration/state.c | 227 + source/mycss/declaration/state.h | 47 + source/mycss/entry.c | 383 + source/mycss/entry.h | 157 + source/mycss/media/init.c | 51 + source/mycss/media/init.h | 40 + source/mycss/media/myosi.h | 42 + source/mycss/media/state.c | 29 + source/mycss/media/state.h | 38 + source/mycss/mycss.c | 234 + source/mycss/mycss.h | 79 + source/mycss/myosi.h | 281 + source/mycss/mystring.c | 279 + source/mycss/mystring.h | 69 + source/mycss/namespace/init.c | 338 + source/mycss/namespace/init.h | 64 + source/mycss/namespace/myosi.h | 74 + source/mycss/namespace/parser.c | 92 + source/mycss/namespace/parser.h | 46 + source/mycss/namespace/state.c | 182 + source/mycss/namespace/state.h | 46 + source/mycss/parser.c | 248 + source/mycss/parser.h | 54 + source/mycss/property/const.h | 71 + source/mycss/property/init.c | 140 + source/mycss/property/init.h | 47 + source/mycss/property/myosi.h | 59 + source/mycss/property/parser.c | 88 + source/mycss/property/parser.h | 40 + source/mycss/property/resources.h | 65 + source/mycss/selectors/function.c | 244 + source/mycss/selectors/function.h | 75 + source/mycss/selectors/function_parser.c | 675 ++ source/mycss/selectors/function_parser.h | 64 + source/mycss/selectors/function_resource.h | 90 + source/mycss/selectors/init.c | 466 + source/mycss/selectors/init.h | 66 + source/mycss/selectors/list.c | 155 + source/mycss/selectors/list.h | 62 + source/mycss/selectors/myosi.h | 228 + source/mycss/selectors/myosi_resource.h | 33 + source/mycss/selectors/parser.c | 359 + source/mycss/selectors/parser.h | 65 + source/mycss/selectors/pseudo.c | 78 + source/mycss/selectors/pseudo.h | 52 + source/mycss/selectors/pseudo_resource.h | 161 + source/mycss/selectors/state.c | 1156 ++ source/mycss/selectors/state.h | 90 + source/mycss/selectors/value.c | 368 + source/mycss/selectors/value.h | 107 + source/mycss/selectors/value_resource.h | 57 + source/mycss/stylesheet.c | 68 + source/mycss/stylesheet.h | 58 + source/mycss/tokenizer.c | 1366 +++ source/mycss/tokenizer.h | 140 + source/mycss/tokenizer_end.c | 1093 ++ source/mycss/tokenizer_end.h | 125 + source/mycss/tokenizer_global.c | 794 ++ source/mycss/tokenizer_global.h | 78 + source/mycss/tokenizer_resource.h | 362 + source/mycss/values/consume.c | 91 + source/mycss/values/consume.h | 43 + source/mycss/values/resources.h | 27 + source/mycss/values/serialization.c | 47 + source/mycss/values/serialization.h | 38 + source/mycss/values/units.c | 67 + source/mycss/values/units.h | 94 + source/mycss/values/units_resources.h | 237 + source/mycss/values/values.c | 48 + source/mycss/values/values.h | 65 + source/myhtml/Makefile.mk | 14 + source/myhtml/api.h | 2648 +++++ source/myhtml/api_encoding.h | 71 + source/myhtml/callback.c | 69 + source/myhtml/callback.h | 47 + source/myhtml/charef.c | 153 + source/myhtml/charef.h | 56 + source/myhtml/charef_resource.h | 5957 +++++++++++ source/myhtml/data_process.c | 320 + source/myhtml/data_process.h | 72 + source/myhtml/def.h | 58 + source/myhtml/encoding.c | 1125 ++ source/myhtml/encoding.h | 146 + source/myhtml/encoding_detect.c | 385 + source/myhtml/encoding_detect_resource.h | 5580 ++++++++++ source/myhtml/encoding_resource.h | 9330 +++++++++++++++++ source/myhtml/incoming.c | 213 + source/myhtml/incoming.h | 67 + source/myhtml/myhtml.c | 1470 +++ source/myhtml/myhtml.h | 238 + source/myhtml/mynamespace.c | 114 + source/myhtml/mynamespace.h | 64 + source/myhtml/mynamespace_resource.h | 63 + source/myhtml/myosi.c | 50 + source/myhtml/myosi.h | 514 + source/myhtml/mystring.c | 574 + source/myhtml/mystring.h | 146 + source/myhtml/parser.c | 281 + source/myhtml/parser.h | 48 + source/myhtml/perf.c | 288 + source/myhtml/rules.c | 3560 +++++++ source/myhtml/rules.h | 47 + source/myhtml/stream.c | 143 + source/myhtml/stream.h | 62 + source/myhtml/tag.c | 320 + source/myhtml/tag.h | 149 + source/myhtml/tag_const.h | 293 + source/myhtml/tag_init.c | 2627 +++++ source/myhtml/thread.c | 1132 ++ source/myhtml/thread.h | 212 + source/myhtml/token.c | 942 ++ source/myhtml/token.h | 168 + source/myhtml/tokenizer.c | 1690 +++ source/myhtml/tokenizer.h | 73 + source/myhtml/tokenizer_doctype.c | 432 + source/myhtml/tokenizer_doctype.h | 51 + source/myhtml/tokenizer_end.c | 615 ++ source/myhtml/tokenizer_end.h | 102 + source/myhtml/tokenizer_script.c | 568 + source/myhtml/tokenizer_script.h | 57 + source/myhtml/tree.c | 2735 +++++ source/myhtml/tree.h | 426 + source/myhtml/utils.c | 218 + source/myhtml/utils.h | 48 + source/myhtml/utils/mchar_async.c | 761 ++ source/myhtml/utils/mchar_async.h | 129 + source/myhtml/utils/mcobject.c | 189 + source/myhtml/utils/mcobject.h | 70 + source/myhtml/utils/mcobject_async.c | 468 + source/myhtml/utils/mcobject_async.h | 114 + source/myhtml/utils/mcsimple.c | 125 + source/myhtml/utils/mcsimple.h | 61 + source/myhtml/utils/mcsync.c | 155 + source/myhtml/utils/mcsync.h | 81 + source/myhtml/utils/mctree.c | 285 + source/myhtml/utils/mctree.h | 97 + source/myhtml/utils/resources.h | 208 + 271 files changed, 101785 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 devel/osx/Modest.xcodeproj/project.pbxproj create mode 100644 devel/osx/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme create mode 100644 devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 devel/osx/Modest/main.c create mode 100644 examples/Makefile create mode 100644 examples/selectors/selectors_low_level.c create mode 100644 include/modest/finder/finder.h create mode 100644 include/modest/finder/match.h create mode 100644 include/modest/finder/myosi.h create mode 100644 include/modest/finder/pseudo_class.h create mode 100644 include/modest/finder/resource.h create mode 100644 include/modest/finder/type.h create mode 100644 include/modest/myosi.h create mode 100644 include/mycss/an_plus_b.h create mode 100644 include/mycss/api.h create mode 100644 include/mycss/check.h create mode 100644 include/mycss/convert.h create mode 100644 include/mycss/declaration/entry.h create mode 100644 include/mycss/declaration/init.h create mode 100644 include/mycss/declaration/myosi.h create mode 100644 include/mycss/declaration/parser.h create mode 100644 include/mycss/declaration/state.h create mode 100644 include/mycss/entry.h create mode 100644 include/mycss/media/init.h create mode 100644 include/mycss/media/myosi.h create mode 100644 include/mycss/media/state.h create mode 100644 include/mycss/mycss.h create mode 100644 include/mycss/myosi.h create mode 100644 include/mycss/mystring.h create mode 100644 include/mycss/namespace/init.h create mode 100644 include/mycss/namespace/myosi.h create mode 100644 include/mycss/namespace/parser.h create mode 100644 include/mycss/namespace/state.h create mode 100644 include/mycss/parser.h create mode 100644 include/mycss/property/const.h create mode 100644 include/mycss/property/init.h create mode 100644 include/mycss/property/myosi.h create mode 100644 include/mycss/property/parser.h create mode 100644 include/mycss/property/resources.h create mode 100644 include/mycss/selectors/function.h create mode 100644 include/mycss/selectors/function_parser.h create mode 100644 include/mycss/selectors/function_resource.h create mode 100644 include/mycss/selectors/init.h create mode 100644 include/mycss/selectors/list.h create mode 100644 include/mycss/selectors/myosi.h create mode 100644 include/mycss/selectors/myosi_resource.h create mode 100644 include/mycss/selectors/parser.h create mode 100644 include/mycss/selectors/pseudo.h create mode 100644 include/mycss/selectors/pseudo_resource.h create mode 100644 include/mycss/selectors/state.h create mode 100644 include/mycss/selectors/value.h create mode 100644 include/mycss/selectors/value_resource.h create mode 100644 include/mycss/stylesheet.h create mode 100644 include/mycss/tokenizer.h create mode 100644 include/mycss/tokenizer_end.h create mode 100644 include/mycss/tokenizer_global.h create mode 100644 include/mycss/tokenizer_resource.h create mode 100644 include/mycss/values/consume.h create mode 100644 include/mycss/values/resources.h create mode 100644 include/mycss/values/serialization.h create mode 100644 include/mycss/values/units.h create mode 100644 include/mycss/values/units_resources.h create mode 100644 include/mycss/values/values.h create mode 100644 include/myhtml/api.h create mode 100644 include/myhtml/api_encoding.h create mode 100644 include/myhtml/callback.h create mode 100644 include/myhtml/charef.h create mode 100644 include/myhtml/charef_resource.h create mode 100644 include/myhtml/data_process.h create mode 100644 include/myhtml/def.h create mode 100644 include/myhtml/encoding.h create mode 100644 include/myhtml/encoding_detect_resource.h create mode 100644 include/myhtml/encoding_resource.h create mode 100644 include/myhtml/incoming.h create mode 100644 include/myhtml/myhtml.h create mode 100644 include/myhtml/mynamespace.h create mode 100644 include/myhtml/mynamespace_resource.h create mode 100644 include/myhtml/myosi.h create mode 100644 include/myhtml/mystring.h create mode 100644 include/myhtml/parser.h create mode 100644 include/myhtml/rules.h create mode 100644 include/myhtml/stream.h create mode 100644 include/myhtml/tag.h create mode 100644 include/myhtml/tag_const.h create mode 100644 include/myhtml/thread.h create mode 100644 include/myhtml/token.h create mode 100644 include/myhtml/tokenizer.h create mode 100644 include/myhtml/tokenizer_doctype.h create mode 100644 include/myhtml/tokenizer_end.h create mode 100644 include/myhtml/tokenizer_script.h create mode 100644 include/myhtml/tree.h create mode 100644 include/myhtml/utils.h create mode 100644 include/myhtml/utils/mchar_async.h create mode 100644 include/myhtml/utils/mcobject.h create mode 100644 include/myhtml/utils/mcobject_async.h create mode 100644 include/myhtml/utils/mcsimple.h create mode 100644 include/myhtml/utils/mcsync.h create mode 100644 include/myhtml/utils/mctree.h create mode 100644 include/myhtml/utils/resources.h create mode 100644 projects/CMakeLists.txt create mode 100644 source/modest/Makefile.mk create mode 100644 source/modest/finder/finder.c create mode 100644 source/modest/finder/finder.h create mode 100644 source/modest/finder/match.c create mode 100644 source/modest/finder/match.h create mode 100644 source/modest/finder/myosi.h create mode 100644 source/modest/finder/pseudo_class.c create mode 100644 source/modest/finder/pseudo_class.h create mode 100644 source/modest/finder/resource.h create mode 100644 source/modest/finder/type.c create mode 100644 source/modest/finder/type.h create mode 100644 source/modest/myosi.h create mode 100644 source/mycss/Makefile.mk create mode 100644 source/mycss/an_plus_b.c create mode 100644 source/mycss/an_plus_b.h create mode 100644 source/mycss/api.h create mode 100644 source/mycss/check.c create mode 100644 source/mycss/check.h create mode 100644 source/mycss/convert.c create mode 100644 source/mycss/convert.h create mode 100644 source/mycss/declaration/entry.c create mode 100644 source/mycss/declaration/entry.h create mode 100644 source/mycss/declaration/init.c create mode 100644 source/mycss/declaration/init.h create mode 100644 source/mycss/declaration/myosi.h create mode 100644 source/mycss/declaration/parser.c create mode 100644 source/mycss/declaration/parser.h create mode 100644 source/mycss/declaration/state.c create mode 100644 source/mycss/declaration/state.h create mode 100644 source/mycss/entry.c create mode 100644 source/mycss/entry.h create mode 100644 source/mycss/media/init.c create mode 100644 source/mycss/media/init.h create mode 100644 source/mycss/media/myosi.h create mode 100644 source/mycss/media/state.c create mode 100644 source/mycss/media/state.h create mode 100644 source/mycss/mycss.c create mode 100644 source/mycss/mycss.h create mode 100644 source/mycss/myosi.h create mode 100644 source/mycss/mystring.c create mode 100644 source/mycss/mystring.h create mode 100644 source/mycss/namespace/init.c create mode 100644 source/mycss/namespace/init.h create mode 100644 source/mycss/namespace/myosi.h create mode 100644 source/mycss/namespace/parser.c create mode 100644 source/mycss/namespace/parser.h create mode 100644 source/mycss/namespace/state.c create mode 100644 source/mycss/namespace/state.h create mode 100644 source/mycss/parser.c create mode 100644 source/mycss/parser.h create mode 100644 source/mycss/property/const.h create mode 100644 source/mycss/property/init.c create mode 100644 source/mycss/property/init.h create mode 100644 source/mycss/property/myosi.h create mode 100644 source/mycss/property/parser.c create mode 100644 source/mycss/property/parser.h create mode 100644 source/mycss/property/resources.h create mode 100644 source/mycss/selectors/function.c create mode 100644 source/mycss/selectors/function.h create mode 100644 source/mycss/selectors/function_parser.c create mode 100644 source/mycss/selectors/function_parser.h create mode 100644 source/mycss/selectors/function_resource.h create mode 100644 source/mycss/selectors/init.c create mode 100644 source/mycss/selectors/init.h create mode 100644 source/mycss/selectors/list.c create mode 100644 source/mycss/selectors/list.h create mode 100644 source/mycss/selectors/myosi.h create mode 100644 source/mycss/selectors/myosi_resource.h create mode 100644 source/mycss/selectors/parser.c create mode 100644 source/mycss/selectors/parser.h create mode 100644 source/mycss/selectors/pseudo.c create mode 100644 source/mycss/selectors/pseudo.h create mode 100644 source/mycss/selectors/pseudo_resource.h create mode 100644 source/mycss/selectors/state.c create mode 100644 source/mycss/selectors/state.h create mode 100644 source/mycss/selectors/value.c create mode 100644 source/mycss/selectors/value.h create mode 100644 source/mycss/selectors/value_resource.h create mode 100644 source/mycss/stylesheet.c create mode 100644 source/mycss/stylesheet.h create mode 100644 source/mycss/tokenizer.c create mode 100644 source/mycss/tokenizer.h create mode 100644 source/mycss/tokenizer_end.c create mode 100644 source/mycss/tokenizer_end.h create mode 100644 source/mycss/tokenizer_global.c create mode 100644 source/mycss/tokenizer_global.h create mode 100644 source/mycss/tokenizer_resource.h create mode 100644 source/mycss/values/consume.c create mode 100644 source/mycss/values/consume.h create mode 100644 source/mycss/values/resources.h create mode 100644 source/mycss/values/serialization.c create mode 100644 source/mycss/values/serialization.h create mode 100644 source/mycss/values/units.c create mode 100644 source/mycss/values/units.h create mode 100644 source/mycss/values/units_resources.h create mode 100644 source/mycss/values/values.c create mode 100644 source/mycss/values/values.h create mode 100644 source/myhtml/Makefile.mk create mode 100644 source/myhtml/api.h create mode 100644 source/myhtml/api_encoding.h create mode 100644 source/myhtml/callback.c create mode 100644 source/myhtml/callback.h create mode 100644 source/myhtml/charef.c create mode 100644 source/myhtml/charef.h create mode 100644 source/myhtml/charef_resource.h create mode 100644 source/myhtml/data_process.c create mode 100644 source/myhtml/data_process.h create mode 100644 source/myhtml/def.h create mode 100644 source/myhtml/encoding.c create mode 100644 source/myhtml/encoding.h create mode 100644 source/myhtml/encoding_detect.c create mode 100644 source/myhtml/encoding_detect_resource.h create mode 100644 source/myhtml/encoding_resource.h create mode 100644 source/myhtml/incoming.c create mode 100644 source/myhtml/incoming.h create mode 100644 source/myhtml/myhtml.c create mode 100644 source/myhtml/myhtml.h create mode 100644 source/myhtml/mynamespace.c create mode 100644 source/myhtml/mynamespace.h create mode 100644 source/myhtml/mynamespace_resource.h create mode 100644 source/myhtml/myosi.c create mode 100644 source/myhtml/myosi.h create mode 100644 source/myhtml/mystring.c create mode 100644 source/myhtml/mystring.h create mode 100644 source/myhtml/parser.c create mode 100644 source/myhtml/parser.h create mode 100644 source/myhtml/perf.c create mode 100644 source/myhtml/rules.c create mode 100644 source/myhtml/rules.h create mode 100644 source/myhtml/stream.c create mode 100644 source/myhtml/stream.h create mode 100755 source/myhtml/tag.c create mode 100644 source/myhtml/tag.h create mode 100644 source/myhtml/tag_const.h create mode 100755 source/myhtml/tag_init.c create mode 100644 source/myhtml/thread.c create mode 100644 source/myhtml/thread.h create mode 100644 source/myhtml/token.c create mode 100644 source/myhtml/token.h create mode 100644 source/myhtml/tokenizer.c create mode 100644 source/myhtml/tokenizer.h create mode 100644 source/myhtml/tokenizer_doctype.c create mode 100644 source/myhtml/tokenizer_doctype.h create mode 100644 source/myhtml/tokenizer_end.c create mode 100644 source/myhtml/tokenizer_end.h create mode 100644 source/myhtml/tokenizer_script.c create mode 100644 source/myhtml/tokenizer_script.h create mode 100644 source/myhtml/tree.c create mode 100644 source/myhtml/tree.h create mode 100644 source/myhtml/utils.c create mode 100644 source/myhtml/utils.h create mode 100644 source/myhtml/utils/mchar_async.c create mode 100644 source/myhtml/utils/mchar_async.h create mode 100644 source/myhtml/utils/mcobject.c create mode 100644 source/myhtml/utils/mcobject.h create mode 100644 source/myhtml/utils/mcobject_async.c create mode 100644 source/myhtml/utils/mcobject_async.h create mode 100644 source/myhtml/utils/mcsimple.c create mode 100644 source/myhtml/utils/mcsimple.h create mode 100644 source/myhtml/utils/mcsync.c create mode 100644 source/myhtml/utils/mcsync.h create mode 100644 source/myhtml/utils/mctree.c create mode 100644 source/myhtml/utils/mctree.h create mode 100644 source/myhtml/utils/resources.h diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..56d4d29fa20b57a5c26add0ab448551268523184 GIT binary patch literal 102 zcmezW&wxRX!4QZI7`Pa0u|h5eM}|^{bRaHfC}B`wFk-M|&;ip1K%HhleOwG$K)xG8 VCPNWaO)^71LoN_z0(EdP0012w4$uGq literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6a67a0d --- /dev/null +++ b/LICENSE @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +(This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.) + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dcacca1 --- /dev/null +++ b/Makefile @@ -0,0 +1,69 @@ +TARGET := source +SRCDIR := source + +CC ?= gcc + +LIBNAME := modest +LIBPOSTFIX := .so +LIBSTATIC_POSTFIX := _static +LIB_TMP := lib +INCLUDE_TMP := include +BIN_TMP := bin + +MODEST_OPTIMIZATION_LEVEL ?= -O2 + +CFLAGS ?= -Wall -Werror +CFLAGS += $(MODEST_OPTIMIZATION_LEVEL) -fPIC --std=c99 -I$(SRCDIR) + +MODEST_BUILD_WITHOUT_THREADS ?= NO +ifeq ($(MODEST_BUILD_WITHOUT_THREADS),YES) + $(info Build without POSIX Threads) + CFLAGS += -DMODEST_BUILD_WITHOUT_THREADS +else + $(info Build with POSIX Threads) + CFLAGS += -pthread +endif + +ifeq ($(OS),Windows_NT) +else + UNAM := $(shell uname -s) + ifeq ($(UNAM),Darwin) + LIBPOSTFIX := .dylib + else + CFLAGS += -D_POSIX_C_SOURCE=199309L + endif +endif + +SRCS := +HDRS := +EXTDIRS := examples + +all: shared static + for f in $(EXTDIRS); do $(MAKE) -C $$f all; done + +include $(TARGET)/myhtml/Makefile.mk +include $(TARGET)/mycss/Makefile.mk +include $(TARGET)/modest/Makefile.mk + +OBJS := $(patsubst %.c,%.o,$(SRCS)) + +shared: $(OBJS) $(HDRS) + $(CC) -shared $(LDFLAGS) $(OBJS) -o $(LIB_TMP)/lib$(LIBNAME)$(LIBPOSTFIX) + +static: shared + $(AR) crus $(LIB_TMP)/lib$(LIBNAME)$(LIBSTATIC_POSTFIX).a $(OBJS) + +clean: + for f in $(EXTDIRS); do $(MAKE) -C $$f clean; done + rm -f $(OBJS) + rm -f $(LIB_TMP)/* + rm -f $(BIN_TMP)/* + +clean_include: + rm -rf $(INCLUDE_TMP) + +clone: clean_include MODEST_clone mycss_clone modest_clone + find include -name "*.h" -exec sed -i '.bak' -E 's/^[ \t]*#[ \t]*include[ \t]*"([^"]+)"/#include <\1>/g' {} \; + find include -name "*.h.bak" -exec rm -f {} \; + +.PHONY: all clean clone \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..86b23c1 --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +# Modest C/C++ HTML Render + +Modest is a fast HTML Render implemented as a pure C99 library with no outside dependencies. + +## Now + +```text +The current version is 0.0.1 - devel +``` + +## Changes +Please, see [CHANGELOG.md] file + +## Features + +Render is in development. Now available: + +- Search nodes by Selectors +- See Features of [MyHTML] +- See Features of [MyCSS] + +## The Story of Creation + +[The Story of Creation] + +## Build and Installation + +**Make** + +```bash +make +``` + +If successful copy lib/* and include/* at the right place for you + +Flags that can be passed to make: +- `MODEST_OPTIMIZATION_LEVEL=-O2` set compiler optimization level. Default: -O2 +- `MODEST_BUILD_WITHOUT_THREADS=YES` build without POSIX Threads. Default: NO + +*for example* +```bash +make MODEST_BUILD_WITHOUT_THREADS=NO +``` + +```bash +cp lib/* /usr/local/lib +cp -r include/* /usr/local/include +``` + +**CMake** + +In modest/project directory: + +```bash +cmake . +make +sudo make install +``` + +Flags that can be passed to CMake: +- `MODEST_OPTIMIZATION_LEVEL=-O2` set compiler optimization level. Default: -O2 +- `CMAKE_INSTALL_LIBDIR=lib` set path to install created library. Default: lib +- `MODEST_BUILD_SHARED=ON` build shared library. Default: ON +- `MODEST_BUILD_STATIC=ON` build static library. Default: ON +- `MODEST_INSTALL_HEADER=OFF` install header files. Default OFF +- `MODEST_BUILD_WITHOUT_THREADS=YES` build without POSIX Threads. Default: NO +- `MODEST_EXTERN_MALLOC=my_malloc_func` set extern malloc function. Default: UNDEFINED +- `MODEST_EXTERN_REALLOC=my_realloc_func` set extern realloc function. Default: UNDEFINED +- `MODEST_EXTERN_CALLOC=my_calloc_func` set extern calloc function. Default: UNDEFINED +- `MODEST_EXTERN_FREE=my_free_func` set extern free function. Default: UNDEFINED + +*for example* +```bash +cmake . -DCMAKE_INSTALL_LIBDIR=lib64 -DMODEST_INSTALL_HEADER=ON +``` + + +## Build with your program + +I advise to build using clang, but decided to show examples of gcc + +**for example** + +*build with shared library* +```bash +gcc -Wall -Werror -O2 -lmodest your_program.c -o your_program +``` + +*build with static library* +```bash +gcc -Wall -Werror -O2 your_program.c /path/to/libmodest_static.a -o your_program +``` + +## Dependencies + +None + +## In other languages, external bindings + +Send pull request if you create any bindings + +## Examples + +See [examples] directory + +## AUTHOR + +Alexander Borisov + +## COPYRIGHT AND LICENSE + +Copyright (C) 2015-2016 Alexander Borisov + +This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +See the [LICENSE] file. + + +[high]: https://github.com/lexborisov/modest/blob/master/include/myhtml/api.h +[low]: https://github.com/lexborisov/modest/tree/master/include/myhtml +[examples]: https://github.com/lexborisov/modest/tree/master/examples +[MyHTML]: https://github.com/lexborisov/myhtml +[MyCSS]: https://github.com/lexborisov/mycss +[CHANGELOG.md]: https://github.com/lexborisov/modest/blob/master/CHANGELOG.md +[The Story of Creation]: http://lexborisov.github.io/myhtml/ +[LICENSE]: https://github.com/lexborisov/myhtml/blob/master/LICENSE diff --git a/devel/osx/Modest.xcodeproj/project.pbxproj b/devel/osx/Modest.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6152349 --- /dev/null +++ b/devel/osx/Modest.xcodeproj/project.pbxproj @@ -0,0 +1,804 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0E108E3C1D57EE71009D43FA /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E108E351D57EE71009D43FA /* init.c */; }; + 0E108E3D1D57EE71009D43FA /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E108E381D57EE71009D43FA /* parser.c */; }; + 0E108E3E1D57EE71009D43FA /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E108E3A1D57EE71009D43FA /* state.c */; }; + 0E108E411D5872DD009D43FA /* an_plus_b.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E108E3F1D5872DD009D43FA /* an_plus_b.c */; }; + 0E108E441D5893B5009D43FA /* function_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E108E421D5893B5009D43FA /* function_parser.c */; }; + 0E108E4B1D5B324F009D43FA /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E108E461D5B324F009D43FA /* init.c */; }; + 0E108E4C1D5B324F009D43FA /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E108E491D5B324F009D43FA /* state.c */; }; + 0E17B98D1D50B20700F1995B /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E17B98B1D50B20700F1995B /* serialization.c */; }; + 0E42F0EF1D1749E10010E1C2 /* data_process.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E42F0ED1D1749E10010E1C2 /* data_process.c */; }; + 0E465ABA1CFC4BC500CA7D65 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465AB91CFC4BC500CA7D65 /* main.c */; }; + 0E465B1E1CFC4C5E00CA7D65 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B061CFC4C5E00CA7D65 /* parser.c */; }; + 0E465B201CFC4C5E00CA7D65 /* entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B091CFC4C5E00CA7D65 /* entry.c */; }; + 0E465B211CFC4C5E00CA7D65 /* tokenizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B0B1CFC4C5E00CA7D65 /* tokenizer.c */; }; + 0E465B221CFC4C5E00CA7D65 /* mycss.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B0D1CFC4C5E00CA7D65 /* mycss.c */; }; + 0E465B231CFC4C5E00CA7D65 /* check.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B131CFC4C5E00CA7D65 /* check.c */; }; + 0E465B241CFC4C5E00CA7D65 /* convert.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B151CFC4C5E00CA7D65 /* convert.c */; }; + 0E465B261CFC4C5E00CA7D65 /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B181CFC4C5E00CA7D65 /* mystring.c */; }; + 0E465B271CFC4C5E00CA7D65 /* tokenizer_end.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B191CFC4C5E00CA7D65 /* tokenizer_end.c */; }; + 0E465B281CFC4C5E00CA7D65 /* tokenizer_global.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B1B1CFC4C5E00CA7D65 /* tokenizer_global.c */; }; + 0E465B2F1CFC4C9800CA7D65 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B2C1CFC4C9800CA7D65 /* parser.c */; }; + 0E465B301CFC4C9800CA7D65 /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B2E1CFC4C9800CA7D65 /* state.c */; }; + 0E465B5F1CFC4CBA00CA7D65 /* charef.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B361CFC4CBA00CA7D65 /* charef.c */; }; + 0E465B601CFC4CBA00CA7D65 /* encoding_detect.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B3A1CFC4CBA00CA7D65 /* encoding_detect.c */; }; + 0E465B611CFC4CBA00CA7D65 /* encoding.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B3C1CFC4CBA00CA7D65 /* encoding.c */; }; + 0E465B621CFC4CBA00CA7D65 /* incoming.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B3E1CFC4CBA00CA7D65 /* incoming.c */; }; + 0E465B631CFC4CBA00CA7D65 /* myhtml.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B401CFC4CBA00CA7D65 /* myhtml.c */; }; + 0E465B641CFC4CBA00CA7D65 /* myosi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B421CFC4CBA00CA7D65 /* myosi.c */; }; + 0E465B651CFC4CBA00CA7D65 /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B441CFC4CBA00CA7D65 /* mystring.c */; }; + 0E465B661CFC4CBA00CA7D65 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B461CFC4CBA00CA7D65 /* parser.c */; }; + 0E465B671CFC4CBA00CA7D65 /* perf.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B481CFC4CBA00CA7D65 /* perf.c */; }; + 0E465B681CFC4CBA00CA7D65 /* rules.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B491CFC4CBA00CA7D65 /* rules.c */; }; + 0E465B691CFC4CBA00CA7D65 /* tag_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B4C1CFC4CBA00CA7D65 /* tag_init.c */; }; + 0E465B6A1CFC4CBA00CA7D65 /* tag.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B4D1CFC4CBA00CA7D65 /* tag.c */; }; + 0E465B6B1CFC4CBA00CA7D65 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B4F1CFC4CBA00CA7D65 /* thread.c */; }; + 0E465B6C1CFC4CBA00CA7D65 /* token.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B511CFC4CBA00CA7D65 /* token.c */; }; + 0E465B6D1CFC4CBA00CA7D65 /* tokenizer_doctype.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B531CFC4CBA00CA7D65 /* tokenizer_doctype.c */; }; + 0E465B6E1CFC4CBA00CA7D65 /* tokenizer_end.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B551CFC4CBA00CA7D65 /* tokenizer_end.c */; }; + 0E465B6F1CFC4CBA00CA7D65 /* tokenizer_script.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B571CFC4CBA00CA7D65 /* tokenizer_script.c */; }; + 0E465B701CFC4CBA00CA7D65 /* tokenizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B591CFC4CBA00CA7D65 /* tokenizer.c */; }; + 0E465B711CFC4CBA00CA7D65 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B5B1CFC4CBA00CA7D65 /* tree.c */; }; + 0E465B721CFC4CBA00CA7D65 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B5D1CFC4CBA00CA7D65 /* utils.c */; }; + 0E465B7F1CFC4CD100CA7D65 /* mchar_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B741CFC4CD100CA7D65 /* mchar_async.c */; }; + 0E465B801CFC4CD100CA7D65 /* mcobject_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B761CFC4CD100CA7D65 /* mcobject_async.c */; }; + 0E465B811CFC4CD100CA7D65 /* mcsimple.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B781CFC4CD100CA7D65 /* mcsimple.c */; }; + 0E465B821CFC4CD100CA7D65 /* mcsync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B7A1CFC4CD100CA7D65 /* mcsync.c */; }; + 0E465B831CFC4CD100CA7D65 /* mctree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B7C1CFC4CD100CA7D65 /* mctree.c */; }; + 0E465B8B1CFC64F100CA7D65 /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465B891CFC64F100CA7D65 /* init.c */; }; + 0E465BA41CFF594100CA7D65 /* mynamespace.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465BA21CFF594100CA7D65 /* mynamespace.c */; }; + 0E5D5C7B1D464F74001BA53C /* values.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E5D5C791D464F74001BA53C /* values.c */; }; + 0E5D5C7E1D46AC0B001BA53C /* units.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E5D5C7C1D46AC0B001BA53C /* units.c */; }; + 0E7BE0FC1D434DB10063BDE5 /* stylesheet.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E7BE0FA1D434DB10063BDE5 /* stylesheet.c */; }; + 0E7BE0FF1D43581F0063BDE5 /* list.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E7BE0FD1D43581F0063BDE5 /* list.c */; }; + 0E84999A1D1B1E7A0027A80B /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E8499981D1B1E7A0027A80B /* stream.c */; }; + 0E84999B1D1B1E7A0027A80B /* callback.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E8499991D1B1E7A0027A80B /* callback.c */; }; + 0E84999E1D1B23490027A80B /* mcobject.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E84999C1D1B23490027A80B /* mcobject.c */; }; + 0E8499A11D21ABDF0027A80B /* pseudo.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E84999F1D21ABDF0027A80B /* pseudo.c */; }; + 0EBB6F261D6BA22900F75F4A /* match.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EBB6F241D6BA22900F75F4A /* match.c */; }; + 0EBB6F2B1D6D10D500F75F4A /* pseudo_class.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EBB6F291D6D10D500F75F4A /* pseudo_class.c */; }; + 0EC3AF111D66543F00027DDC /* finder.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EC3AF0C1D66543F00027DDC /* finder.c */; }; + 0EC3AF121D66543F00027DDC /* type.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EC3AF0F1D66543F00027DDC /* type.c */; }; + 0EC768F21D4F610C00CE1587 /* entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EC768F01D4F610C00CE1587 /* entry.c */; }; + 0ECA38641D08B88E00171335 /* value.c in Sources */ = {isa = PBXBuildFile; fileRef = 0ECA38621D08B88E00171335 /* value.c */; }; + 0ECA38681D08CCAB00171335 /* function.c in Sources */ = {isa = PBXBuildFile; fileRef = 0ECA38661D08CCAB00171335 /* function.c */; }; + 0EFEFB681D49FCFD00F2A070 /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEFB661D49FCFD00F2A070 /* state.c */; }; + 0EFEFB6B1D49FD7500F2A070 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEFB691D49FD7500F2A070 /* parser.c */; }; + 0EFEFB6E1D4A014700F2A070 /* consume.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEFB6C1D4A014700F2A070 /* consume.c */; }; + 0EFEFB711D4A13CD00F2A070 /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEFB6F1D4A13CD00F2A070 /* init.c */; }; + 0EFEFB7B1D4A301E00F2A070 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEFB791D4A301E00F2A070 /* parser.c */; }; + 0EFEFB7F1D4A40B500F2A070 /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEFB7D1D4A40B500F2A070 /* init.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 0E465AB41CFC4BC500CA7D65 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0E108E351D57EE71009D43FA /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../../mycss/source/mycss/namespace/init.c; sourceTree = ""; }; + 0E108E361D57EE71009D43FA /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../../mycss/source/mycss/namespace/init.h; sourceTree = ""; }; + 0E108E371D57EE71009D43FA /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../../mycss/source/mycss/namespace/myosi.h; sourceTree = ""; }; + 0E108E381D57EE71009D43FA /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../../mycss/source/mycss/namespace/parser.c; sourceTree = ""; }; + 0E108E391D57EE71009D43FA /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../../mycss/source/mycss/namespace/parser.h; sourceTree = ""; }; + 0E108E3A1D57EE71009D43FA /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../../mycss/source/mycss/namespace/state.c; sourceTree = ""; }; + 0E108E3B1D57EE71009D43FA /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../../mycss/source/mycss/namespace/state.h; sourceTree = ""; }; + 0E108E3F1D5872DD009D43FA /* an_plus_b.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = an_plus_b.c; path = ../../../mycss/source/mycss/an_plus_b.c; sourceTree = ""; }; + 0E108E401D5872DD009D43FA /* an_plus_b.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = an_plus_b.h; path = ../../../mycss/source/mycss/an_plus_b.h; sourceTree = ""; }; + 0E108E421D5893B5009D43FA /* function_parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = function_parser.c; path = ../../../mycss/source/mycss/selectors/function_parser.c; sourceTree = ""; }; + 0E108E431D5893B5009D43FA /* function_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = function_parser.h; path = ../../../mycss/source/mycss/selectors/function_parser.h; sourceTree = ""; }; + 0E108E461D5B324F009D43FA /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../../mycss/source/mycss/media/init.c; sourceTree = ""; }; + 0E108E471D5B324F009D43FA /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../../mycss/source/mycss/media/init.h; sourceTree = ""; }; + 0E108E481D5B324F009D43FA /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../../mycss/source/mycss/media/myosi.h; sourceTree = ""; }; + 0E108E491D5B324F009D43FA /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../../mycss/source/mycss/media/state.c; sourceTree = ""; }; + 0E108E4A1D5B324F009D43FA /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../../mycss/source/mycss/media/state.h; sourceTree = ""; }; + 0E17B98B1D50B20700F1995B /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = serialization.c; path = ../../../mycss/source/mycss/values/serialization.c; sourceTree = ""; }; + 0E17B98C1D50B20700F1995B /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = serialization.h; path = ../../../mycss/source/mycss/values/serialization.h; sourceTree = ""; }; + 0E42F0EC1D1749E10010E1C2 /* data_process.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = data_process.h; path = ../../../myhtml/source/myhtml/data_process.h; sourceTree = ""; }; + 0E42F0ED1D1749E10010E1C2 /* data_process.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = data_process.c; path = ../../../myhtml/source/myhtml/data_process.c; sourceTree = ""; }; + 0E42F0EE1D1749E10010E1C2 /* charef_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = charef_resource.h; path = ../../../myhtml/source/myhtml/charef_resource.h; sourceTree = ""; }; + 0E465AB61CFC4BC500CA7D65 /* Modest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Modest; sourceTree = BUILT_PRODUCTS_DIR; }; + 0E465AB91CFC4BC500CA7D65 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; + 0E465B061CFC4C5E00CA7D65 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../../mycss/source/mycss/parser.c; sourceTree = ""; }; + 0E465B071CFC4C5E00CA7D65 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../../mycss/source/mycss/parser.h; sourceTree = ""; }; + 0E465B091CFC4C5E00CA7D65 /* entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = entry.c; path = ../../../mycss/source/mycss/entry.c; sourceTree = ""; }; + 0E465B0A1CFC4C5E00CA7D65 /* entry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = entry.h; path = ../../../mycss/source/mycss/entry.h; sourceTree = ""; }; + 0E465B0B1CFC4C5E00CA7D65 /* tokenizer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer.c; path = ../../../mycss/source/mycss/tokenizer.c; sourceTree = ""; }; + 0E465B0C1CFC4C5E00CA7D65 /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer.h; path = ../../../mycss/source/mycss/tokenizer.h; sourceTree = ""; }; + 0E465B0D1CFC4C5E00CA7D65 /* mycss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mycss.c; path = ../../../mycss/source/mycss/mycss.c; sourceTree = ""; }; + 0E465B0E1CFC4C5E00CA7D65 /* mycss.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mycss.h; path = ../../../mycss/source/mycss/mycss.h; sourceTree = ""; }; + 0E465B0F1CFC4C5E00CA7D65 /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../../mycss/source/mycss/myosi.h; sourceTree = ""; }; + 0E465B101CFC4C5E00CA7D65 /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../../mycss/source/mycss/mystring.h; sourceTree = ""; }; + 0E465B121CFC4C5E00CA7D65 /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api.h; path = ../../../mycss/source/mycss/api.h; sourceTree = ""; }; + 0E465B131CFC4C5E00CA7D65 /* check.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = check.c; path = ../../../mycss/source/mycss/check.c; sourceTree = ""; }; + 0E465B141CFC4C5E00CA7D65 /* check.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = check.h; path = ../../../mycss/source/mycss/check.h; sourceTree = ""; }; + 0E465B151CFC4C5E00CA7D65 /* convert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = convert.c; path = ../../../mycss/source/mycss/convert.c; sourceTree = ""; }; + 0E465B161CFC4C5E00CA7D65 /* convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert.h; path = ../../../mycss/source/mycss/convert.h; sourceTree = ""; }; + 0E465B181CFC4C5E00CA7D65 /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../../mycss/source/mycss/mystring.c; sourceTree = ""; }; + 0E465B191CFC4C5E00CA7D65 /* tokenizer_end.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_end.c; path = ../../../mycss/source/mycss/tokenizer_end.c; sourceTree = ""; }; + 0E465B1A1CFC4C5E00CA7D65 /* tokenizer_end.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_end.h; path = ../../../mycss/source/mycss/tokenizer_end.h; sourceTree = ""; }; + 0E465B1B1CFC4C5E00CA7D65 /* tokenizer_global.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_global.c; path = ../../../mycss/source/mycss/tokenizer_global.c; sourceTree = ""; }; + 0E465B1C1CFC4C5E00CA7D65 /* tokenizer_global.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_global.h; path = ../../../mycss/source/mycss/tokenizer_global.h; sourceTree = ""; }; + 0E465B1D1CFC4C5E00CA7D65 /* tokenizer_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_resource.h; path = ../../../mycss/source/mycss/tokenizer_resource.h; sourceTree = ""; }; + 0E465B2B1CFC4C9800CA7D65 /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../../mycss/source/mycss/selectors/state.h; sourceTree = ""; }; + 0E465B2C1CFC4C9800CA7D65 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../../mycss/source/mycss/selectors/parser.c; sourceTree = ""; }; + 0E465B2D1CFC4C9800CA7D65 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../../mycss/source/mycss/selectors/parser.h; sourceTree = ""; }; + 0E465B2E1CFC4C9800CA7D65 /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../../mycss/source/mycss/selectors/state.c; sourceTree = ""; }; + 0E465B341CFC4CBA00CA7D65 /* api_encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api_encoding.h; path = ../../../myhtml/source/myhtml/api_encoding.h; sourceTree = ""; }; + 0E465B351CFC4CBA00CA7D65 /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api.h; path = ../../../myhtml/source/myhtml/api.h; sourceTree = ""; }; + 0E465B361CFC4CBA00CA7D65 /* charef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = charef.c; path = ../../../myhtml/source/myhtml/charef.c; sourceTree = ""; }; + 0E465B371CFC4CBA00CA7D65 /* charef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = charef.h; path = ../../../myhtml/source/myhtml/charef.h; sourceTree = ""; }; + 0E465B381CFC4CBA00CA7D65 /* def.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = def.h; path = ../../../myhtml/source/myhtml/def.h; sourceTree = ""; }; + 0E465B391CFC4CBA00CA7D65 /* encoding_detect_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding_detect_resource.h; path = ../../../myhtml/source/myhtml/encoding_detect_resource.h; sourceTree = ""; }; + 0E465B3A1CFC4CBA00CA7D65 /* encoding_detect.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encoding_detect.c; path = ../../../myhtml/source/myhtml/encoding_detect.c; sourceTree = ""; }; + 0E465B3B1CFC4CBA00CA7D65 /* encoding_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding_resource.h; path = ../../../myhtml/source/myhtml/encoding_resource.h; sourceTree = ""; }; + 0E465B3C1CFC4CBA00CA7D65 /* encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encoding.c; path = ../../../myhtml/source/myhtml/encoding.c; sourceTree = ""; }; + 0E465B3D1CFC4CBA00CA7D65 /* encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding.h; path = ../../../myhtml/source/myhtml/encoding.h; sourceTree = ""; }; + 0E465B3E1CFC4CBA00CA7D65 /* incoming.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = incoming.c; path = ../../../myhtml/source/myhtml/incoming.c; sourceTree = ""; }; + 0E465B3F1CFC4CBA00CA7D65 /* incoming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = incoming.h; path = ../../../myhtml/source/myhtml/incoming.h; sourceTree = ""; }; + 0E465B401CFC4CBA00CA7D65 /* myhtml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myhtml.c; path = ../../../myhtml/source/myhtml/myhtml.c; sourceTree = ""; }; + 0E465B411CFC4CBA00CA7D65 /* myhtml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myhtml.h; path = ../../../myhtml/source/myhtml/myhtml.h; sourceTree = ""; }; + 0E465B421CFC4CBA00CA7D65 /* myosi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myosi.c; path = ../../../myhtml/source/myhtml/myosi.c; sourceTree = ""; }; + 0E465B431CFC4CBA00CA7D65 /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../../myhtml/source/myhtml/myosi.h; sourceTree = ""; }; + 0E465B441CFC4CBA00CA7D65 /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../../myhtml/source/myhtml/mystring.c; sourceTree = ""; }; + 0E465B451CFC4CBA00CA7D65 /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../../myhtml/source/myhtml/mystring.h; sourceTree = ""; }; + 0E465B461CFC4CBA00CA7D65 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../../myhtml/source/myhtml/parser.c; sourceTree = ""; }; + 0E465B471CFC4CBA00CA7D65 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../../myhtml/source/myhtml/parser.h; sourceTree = ""; }; + 0E465B481CFC4CBA00CA7D65 /* perf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = perf.c; path = ../../../myhtml/source/myhtml/perf.c; sourceTree = ""; }; + 0E465B491CFC4CBA00CA7D65 /* rules.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rules.c; path = ../../../myhtml/source/myhtml/rules.c; sourceTree = ""; }; + 0E465B4A1CFC4CBA00CA7D65 /* rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rules.h; path = ../../../myhtml/source/myhtml/rules.h; sourceTree = ""; }; + 0E465B4B1CFC4CBA00CA7D65 /* tag_const.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tag_const.h; path = ../../../myhtml/source/myhtml/tag_const.h; sourceTree = ""; }; + 0E465B4C1CFC4CBA00CA7D65 /* tag_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tag_init.c; path = ../../../myhtml/source/myhtml/tag_init.c; sourceTree = ""; }; + 0E465B4D1CFC4CBA00CA7D65 /* tag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tag.c; path = ../../../myhtml/source/myhtml/tag.c; sourceTree = ""; }; + 0E465B4E1CFC4CBA00CA7D65 /* tag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tag.h; path = ../../../myhtml/source/myhtml/tag.h; sourceTree = ""; }; + 0E465B4F1CFC4CBA00CA7D65 /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread.c; path = ../../../myhtml/source/myhtml/thread.c; sourceTree = ""; }; + 0E465B501CFC4CBA00CA7D65 /* thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thread.h; path = ../../../myhtml/source/myhtml/thread.h; sourceTree = ""; }; + 0E465B511CFC4CBA00CA7D65 /* token.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = token.c; path = ../../../myhtml/source/myhtml/token.c; sourceTree = ""; }; + 0E465B521CFC4CBA00CA7D65 /* token.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = token.h; path = ../../../myhtml/source/myhtml/token.h; sourceTree = ""; }; + 0E465B531CFC4CBA00CA7D65 /* tokenizer_doctype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_doctype.c; path = ../../../myhtml/source/myhtml/tokenizer_doctype.c; sourceTree = ""; }; + 0E465B541CFC4CBA00CA7D65 /* tokenizer_doctype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_doctype.h; path = ../../../myhtml/source/myhtml/tokenizer_doctype.h; sourceTree = ""; }; + 0E465B551CFC4CBA00CA7D65 /* tokenizer_end.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_end.c; path = ../../../myhtml/source/myhtml/tokenizer_end.c; sourceTree = ""; }; + 0E465B561CFC4CBA00CA7D65 /* tokenizer_end.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_end.h; path = ../../../myhtml/source/myhtml/tokenizer_end.h; sourceTree = ""; }; + 0E465B571CFC4CBA00CA7D65 /* tokenizer_script.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_script.c; path = ../../../myhtml/source/myhtml/tokenizer_script.c; sourceTree = ""; }; + 0E465B581CFC4CBA00CA7D65 /* tokenizer_script.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_script.h; path = ../../../myhtml/source/myhtml/tokenizer_script.h; sourceTree = ""; }; + 0E465B591CFC4CBA00CA7D65 /* tokenizer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer.c; path = ../../../myhtml/source/myhtml/tokenizer.c; sourceTree = ""; }; + 0E465B5A1CFC4CBA00CA7D65 /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer.h; path = ../../../myhtml/source/myhtml/tokenizer.h; sourceTree = ""; }; + 0E465B5B1CFC4CBA00CA7D65 /* tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tree.c; path = ../../../myhtml/source/myhtml/tree.c; sourceTree = ""; }; + 0E465B5C1CFC4CBA00CA7D65 /* tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tree.h; path = ../../../myhtml/source/myhtml/tree.h; sourceTree = ""; }; + 0E465B5D1CFC4CBA00CA7D65 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utils.c; path = ../../../myhtml/source/myhtml/utils.c; sourceTree = ""; }; + 0E465B5E1CFC4CBA00CA7D65 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../myhtml/source/myhtml/utils.h; sourceTree = ""; }; + 0E465B741CFC4CD100CA7D65 /* mchar_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mchar_async.c; path = ../../../myhtml/source/myhtml/utils/mchar_async.c; sourceTree = ""; }; + 0E465B751CFC4CD100CA7D65 /* mchar_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mchar_async.h; path = ../../../myhtml/source/myhtml/utils/mchar_async.h; sourceTree = ""; }; + 0E465B761CFC4CD100CA7D65 /* mcobject_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcobject_async.c; path = ../../../myhtml/source/myhtml/utils/mcobject_async.c; sourceTree = ""; }; + 0E465B771CFC4CD100CA7D65 /* mcobject_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcobject_async.h; path = ../../../myhtml/source/myhtml/utils/mcobject_async.h; sourceTree = ""; }; + 0E465B781CFC4CD100CA7D65 /* mcsimple.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcsimple.c; path = ../../../myhtml/source/myhtml/utils/mcsimple.c; sourceTree = ""; }; + 0E465B791CFC4CD100CA7D65 /* mcsimple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcsimple.h; path = ../../../myhtml/source/myhtml/utils/mcsimple.h; sourceTree = ""; }; + 0E465B7A1CFC4CD100CA7D65 /* mcsync.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcsync.c; path = ../../../myhtml/source/myhtml/utils/mcsync.c; sourceTree = ""; }; + 0E465B7B1CFC4CD100CA7D65 /* mcsync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcsync.h; path = ../../../myhtml/source/myhtml/utils/mcsync.h; sourceTree = ""; }; + 0E465B7C1CFC4CD100CA7D65 /* mctree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mctree.c; path = ../../../myhtml/source/myhtml/utils/mctree.c; sourceTree = ""; }; + 0E465B7D1CFC4CD100CA7D65 /* mctree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mctree.h; path = ../../../myhtml/source/myhtml/utils/mctree.h; sourceTree = ""; }; + 0E465B7E1CFC4CD100CA7D65 /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../../myhtml/source/myhtml/utils/resources.h; sourceTree = ""; }; + 0E465B881CFC63D700CA7D65 /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../../mycss/source/mycss/selectors/myosi.h; sourceTree = ""; }; + 0E465B891CFC64F100CA7D65 /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../../mycss/source/mycss/selectors/init.c; sourceTree = ""; }; + 0E465B8A1CFC64F100CA7D65 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../../mycss/source/mycss/selectors/init.h; sourceTree = ""; }; + 0E465BA21CFF594100CA7D65 /* mynamespace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mynamespace.c; path = ../../../myhtml/source/myhtml/mynamespace.c; sourceTree = ""; }; + 0E465BA31CFF594100CA7D65 /* mynamespace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mynamespace.h; path = ../../../myhtml/source/myhtml/mynamespace.h; sourceTree = ""; }; + 0E465BA51CFF5A5600CA7D65 /* mynamespace_resource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = mynamespace_resource.h; path = ../../../myhtml/source/myhtml/mynamespace_resource.h; sourceTree = ""; }; + 0E5D5C781D464F2C001BA53C /* resources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../../mycss/source/mycss/values/resources.h; sourceTree = ""; }; + 0E5D5C791D464F74001BA53C /* values.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = values.c; path = ../../../mycss/source/mycss/values/values.c; sourceTree = ""; }; + 0E5D5C7A1D464F74001BA53C /* values.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = values.h; path = ../../../mycss/source/mycss/values/values.h; sourceTree = ""; }; + 0E5D5C7C1D46AC0B001BA53C /* units.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = units.c; path = ../../../mycss/source/mycss/values/units.c; sourceTree = ""; }; + 0E5D5C7D1D46AC0B001BA53C /* units.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = units.h; path = ../../../mycss/source/mycss/values/units.h; sourceTree = ""; }; + 0E5D5C7F1D46AC7E001BA53C /* units_resources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = units_resources.h; path = ../../../mycss/source/mycss/values/units_resources.h; sourceTree = ""; }; + 0E780D451D02F8AC008972B9 /* myosi_resource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi_resource.h; path = ../../../mycss/source/mycss/selectors/myosi_resource.h; sourceTree = ""; }; + 0E7BE0FA1D434DB10063BDE5 /* stylesheet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stylesheet.c; path = ../../../mycss/source/mycss/stylesheet.c; sourceTree = ""; }; + 0E7BE0FB1D434DB10063BDE5 /* stylesheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stylesheet.h; path = ../../../mycss/source/mycss/stylesheet.h; sourceTree = ""; }; + 0E7BE0FD1D43581F0063BDE5 /* list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = list.c; path = ../../../mycss/source/mycss/selectors/list.c; sourceTree = ""; }; + 0E7BE0FE1D43581F0063BDE5 /* list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = list.h; path = ../../../mycss/source/mycss/selectors/list.h; sourceTree = ""; }; + 0E8499961D1B1E7A0027A80B /* callback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = callback.h; path = ../../../myhtml/source/myhtml/callback.h; sourceTree = ""; }; + 0E8499971D1B1E7A0027A80B /* stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stream.h; path = ../../../myhtml/source/myhtml/stream.h; sourceTree = ""; }; + 0E8499981D1B1E7A0027A80B /* stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stream.c; path = ../../../myhtml/source/myhtml/stream.c; sourceTree = ""; }; + 0E8499991D1B1E7A0027A80B /* callback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = callback.c; path = ../../../myhtml/source/myhtml/callback.c; sourceTree = ""; }; + 0E84999C1D1B23490027A80B /* mcobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcobject.c; path = ../../../myhtml/source/myhtml/utils/mcobject.c; sourceTree = ""; }; + 0E84999D1D1B23490027A80B /* mcobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcobject.h; path = ../../../myhtml/source/myhtml/utils/mcobject.h; sourceTree = ""; }; + 0E84999F1D21ABDF0027A80B /* pseudo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pseudo.c; path = ../../../mycss/source/mycss/selectors/pseudo.c; sourceTree = ""; }; + 0E8499A01D21ABDF0027A80B /* pseudo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pseudo.h; path = ../../../mycss/source/mycss/selectors/pseudo.h; sourceTree = ""; }; + 0E8499A21D21AC500027A80B /* pseudo_resource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pseudo_resource.h; path = ../../../mycss/source/mycss/selectors/pseudo_resource.h; sourceTree = ""; }; + 0EBB6F241D6BA22900F75F4A /* match.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = match.c; path = ../../source/modest/finder/match.c; sourceTree = ""; }; + 0EBB6F251D6BA22900F75F4A /* match.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = match.h; path = ../../source/modest/finder/match.h; sourceTree = ""; }; + 0EBB6F271D6BA8B500F75F4A /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/modest/finder/myosi.h; sourceTree = ""; }; + 0EBB6F281D6BAE3100F75F4A /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/modest/myosi.h; sourceTree = ""; }; + 0EBB6F291D6D10D500F75F4A /* pseudo_class.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pseudo_class.c; path = ../../source/modest/finder/pseudo_class.c; sourceTree = ""; }; + 0EBB6F2A1D6D10D500F75F4A /* pseudo_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pseudo_class.h; path = ../../source/modest/finder/pseudo_class.h; sourceTree = ""; }; + 0EC3AF0C1D66543F00027DDC /* finder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = finder.c; path = ../../source/modest/finder/finder.c; sourceTree = ""; }; + 0EC3AF0D1D66543F00027DDC /* finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = finder.h; path = ../../source/modest/finder/finder.h; sourceTree = ""; }; + 0EC3AF0E1D66543F00027DDC /* resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resource.h; path = ../../source/modest/finder/resource.h; sourceTree = ""; }; + 0EC3AF0F1D66543F00027DDC /* type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = type.c; path = ../../source/modest/finder/type.c; sourceTree = ""; }; + 0EC3AF101D66543F00027DDC /* type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = type.h; path = ../../source/modest/finder/type.h; sourceTree = ""; }; + 0EC768F01D4F610C00CE1587 /* entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = entry.c; path = ../../../mycss/source/mycss/declaration/entry.c; sourceTree = ""; }; + 0EC768F11D4F610C00CE1587 /* entry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = entry.h; path = ../../../mycss/source/mycss/declaration/entry.h; sourceTree = ""; }; + 0ECA38621D08B88E00171335 /* value.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = value.c; path = ../../../mycss/source/mycss/selectors/value.c; sourceTree = ""; }; + 0ECA38631D08B88E00171335 /* value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = value.h; path = ../../../mycss/source/mycss/selectors/value.h; sourceTree = ""; }; + 0ECA38651D08BC3600171335 /* value_resource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = value_resource.h; path = ../../../mycss/source/mycss/selectors/value_resource.h; sourceTree = ""; }; + 0ECA38661D08CCAB00171335 /* function.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = function.c; path = ../../../mycss/source/mycss/selectors/function.c; sourceTree = ""; }; + 0ECA38671D08CCAB00171335 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = function.h; path = ../../../mycss/source/mycss/selectors/function.h; sourceTree = ""; }; + 0ECA38691D090BBD00171335 /* function_resource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = function_resource.h; path = ../../../mycss/source/mycss/selectors/function_resource.h; sourceTree = ""; }; + 0EFEFB661D49FCFD00F2A070 /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../../mycss/source/mycss/declaration/state.c; sourceTree = ""; }; + 0EFEFB671D49FCFD00F2A070 /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../../mycss/source/mycss/declaration/state.h; sourceTree = ""; }; + 0EFEFB691D49FD7500F2A070 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../../mycss/source/mycss/declaration/parser.c; sourceTree = ""; }; + 0EFEFB6A1D49FD7500F2A070 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../../mycss/source/mycss/declaration/parser.h; sourceTree = ""; }; + 0EFEFB6C1D4A014700F2A070 /* consume.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = consume.c; path = ../../../mycss/source/mycss/values/consume.c; sourceTree = ""; }; + 0EFEFB6D1D4A014700F2A070 /* consume.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = consume.h; path = ../../../mycss/source/mycss/values/consume.h; sourceTree = ""; }; + 0EFEFB6F1D4A13CD00F2A070 /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../../mycss/source/mycss/declaration/init.c; sourceTree = ""; }; + 0EFEFB701D4A13CD00F2A070 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../../mycss/source/mycss/declaration/init.h; sourceTree = ""; }; + 0EFEFB721D4A142E00F2A070 /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../../mycss/source/mycss/declaration/myosi.h; sourceTree = ""; }; + 0EFEFB781D4A301E00F2A070 /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../../mycss/source/mycss/property/resources.h; sourceTree = ""; }; + 0EFEFB791D4A301E00F2A070 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../../mycss/source/mycss/property/parser.c; sourceTree = ""; }; + 0EFEFB7A1D4A301E00F2A070 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../../mycss/source/mycss/property/parser.h; sourceTree = ""; }; + 0EFEFB7C1D4A34B700F2A070 /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../../mycss/source/mycss/property/myosi.h; sourceTree = ""; }; + 0EFEFB7D1D4A40B500F2A070 /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../../mycss/source/mycss/property/init.c; sourceTree = ""; }; + 0EFEFB7E1D4A40B500F2A070 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../../mycss/source/mycss/property/init.h; sourceTree = ""; }; + 0EFEFB831D4E06CD00F2A070 /* const.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = const.h; path = ../../../mycss/source/mycss/property/const.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0E465AB31CFC4BC500CA7D65 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0E108E341D57EE38009D43FA /* namespace */ = { + isa = PBXGroup; + children = ( + 0E108E371D57EE71009D43FA /* myosi.h */, + 0E108E361D57EE71009D43FA /* init.h */, + 0E108E351D57EE71009D43FA /* init.c */, + 0E108E3B1D57EE71009D43FA /* state.h */, + 0E108E3A1D57EE71009D43FA /* state.c */, + 0E108E391D57EE71009D43FA /* parser.h */, + 0E108E381D57EE71009D43FA /* parser.c */, + ); + name = namespace; + sourceTree = ""; + }; + 0E108E451D5B3240009D43FA /* media */ = { + isa = PBXGroup; + children = ( + 0E108E481D5B324F009D43FA /* myosi.h */, + 0E108E471D5B324F009D43FA /* init.h */, + 0E108E461D5B324F009D43FA /* init.c */, + 0E108E4A1D5B324F009D43FA /* state.h */, + 0E108E491D5B324F009D43FA /* state.c */, + ); + name = media; + sourceTree = ""; + }; + 0E465AAD1CFC4BC500CA7D65 = { + isa = PBXGroup; + children = ( + 0E465AB81CFC4BC500CA7D65 /* Modest */, + 0E8499A61D22B6270027A80B /* modest */, + 0E465AC11CFC4C0000CA7D65 /* mycss */, + 0E465AC01CFC4BF900CA7D65 /* myhtml */, + 0E465AB71CFC4BC500CA7D65 /* Products */, + ); + sourceTree = ""; + }; + 0E465AB71CFC4BC500CA7D65 /* Products */ = { + isa = PBXGroup; + children = ( + 0E465AB61CFC4BC500CA7D65 /* Modest */, + ); + name = Products; + sourceTree = ""; + }; + 0E465AB81CFC4BC500CA7D65 /* Modest */ = { + isa = PBXGroup; + children = ( + 0E465AB91CFC4BC500CA7D65 /* main.c */, + ); + path = Modest; + sourceTree = ""; + }; + 0E465AC01CFC4BF900CA7D65 /* myhtml */ = { + isa = PBXGroup; + children = ( + 0E8499971D1B1E7A0027A80B /* stream.h */, + 0E8499981D1B1E7A0027A80B /* stream.c */, + 0E8499961D1B1E7A0027A80B /* callback.h */, + 0E8499991D1B1E7A0027A80B /* callback.c */, + 0E465B351CFC4CBA00CA7D65 /* api.h */, + 0E465B341CFC4CBA00CA7D65 /* api_encoding.h */, + 0E465B431CFC4CBA00CA7D65 /* myosi.h */, + 0E465B421CFC4CBA00CA7D65 /* myosi.c */, + 0E465B411CFC4CBA00CA7D65 /* myhtml.h */, + 0E465B401CFC4CBA00CA7D65 /* myhtml.c */, + 0E465B471CFC4CBA00CA7D65 /* parser.h */, + 0E465B461CFC4CBA00CA7D65 /* parser.c */, + 0E465B521CFC4CBA00CA7D65 /* token.h */, + 0E465B511CFC4CBA00CA7D65 /* token.c */, + 0E465B5C1CFC4CBA00CA7D65 /* tree.h */, + 0E465B5B1CFC4CBA00CA7D65 /* tree.c */, + 0E465B4A1CFC4CBA00CA7D65 /* rules.h */, + 0E465B491CFC4CBA00CA7D65 /* rules.c */, + 0E465B4E1CFC4CBA00CA7D65 /* tag.h */, + 0E465B4D1CFC4CBA00CA7D65 /* tag.c */, + 0E465B4C1CFC4CBA00CA7D65 /* tag_init.c */, + 0E465B5A1CFC4CBA00CA7D65 /* tokenizer.h */, + 0E465B591CFC4CBA00CA7D65 /* tokenizer.c */, + 0E465B581CFC4CBA00CA7D65 /* tokenizer_script.h */, + 0E465B571CFC4CBA00CA7D65 /* tokenizer_script.c */, + 0E465B541CFC4CBA00CA7D65 /* tokenizer_doctype.h */, + 0E465B531CFC4CBA00CA7D65 /* tokenizer_doctype.c */, + 0E465B561CFC4CBA00CA7D65 /* tokenizer_end.h */, + 0E465B551CFC4CBA00CA7D65 /* tokenizer_end.c */, + 0E465B501CFC4CBA00CA7D65 /* thread.h */, + 0E465B4F1CFC4CBA00CA7D65 /* thread.c */, + 0E465B371CFC4CBA00CA7D65 /* charef.h */, + 0E465B361CFC4CBA00CA7D65 /* charef.c */, + 0E42F0EE1D1749E10010E1C2 /* charef_resource.h */, + 0E42F0EC1D1749E10010E1C2 /* data_process.h */, + 0E42F0ED1D1749E10010E1C2 /* data_process.c */, + 0E465B381CFC4CBA00CA7D65 /* def.h */, + 0E465B391CFC4CBA00CA7D65 /* encoding_detect_resource.h */, + 0E465B3A1CFC4CBA00CA7D65 /* encoding_detect.c */, + 0E465B3D1CFC4CBA00CA7D65 /* encoding.h */, + 0E465B3C1CFC4CBA00CA7D65 /* encoding.c */, + 0E465B3B1CFC4CBA00CA7D65 /* encoding_resource.h */, + 0E465B3F1CFC4CBA00CA7D65 /* incoming.h */, + 0E465B3E1CFC4CBA00CA7D65 /* incoming.c */, + 0E465B451CFC4CBA00CA7D65 /* mystring.h */, + 0E465B441CFC4CBA00CA7D65 /* mystring.c */, + 0E465BA31CFF594100CA7D65 /* mynamespace.h */, + 0E465BA21CFF594100CA7D65 /* mynamespace.c */, + 0E465BA51CFF5A5600CA7D65 /* mynamespace_resource.h */, + 0E465B481CFC4CBA00CA7D65 /* perf.c */, + 0E465B4B1CFC4CBA00CA7D65 /* tag_const.h */, + 0E465B5E1CFC4CBA00CA7D65 /* utils.h */, + 0E465B5D1CFC4CBA00CA7D65 /* utils.c */, + 0E465B731CFC4CBE00CA7D65 /* utils */, + ); + name = myhtml; + sourceTree = ""; + }; + 0E465AC11CFC4C0000CA7D65 /* mycss */ = { + isa = PBXGroup; + children = ( + 0E465B121CFC4C5E00CA7D65 /* api.h */, + 0E465B0F1CFC4C5E00CA7D65 /* myosi.h */, + 0E465B0E1CFC4C5E00CA7D65 /* mycss.h */, + 0E465B0D1CFC4C5E00CA7D65 /* mycss.c */, + 0E465B0A1CFC4C5E00CA7D65 /* entry.h */, + 0E465B091CFC4C5E00CA7D65 /* entry.c */, + 0E7BE0FB1D434DB10063BDE5 /* stylesheet.h */, + 0E7BE0FA1D434DB10063BDE5 /* stylesheet.c */, + 0E465B101CFC4C5E00CA7D65 /* mystring.h */, + 0E465B181CFC4C5E00CA7D65 /* mystring.c */, + 0E465B0C1CFC4C5E00CA7D65 /* tokenizer.h */, + 0E465B0B1CFC4C5E00CA7D65 /* tokenizer.c */, + 0E465B1C1CFC4C5E00CA7D65 /* tokenizer_global.h */, + 0E465B1B1CFC4C5E00CA7D65 /* tokenizer_global.c */, + 0E465B1A1CFC4C5E00CA7D65 /* tokenizer_end.h */, + 0E465B191CFC4C5E00CA7D65 /* tokenizer_end.c */, + 0E465B1D1CFC4C5E00CA7D65 /* tokenizer_resource.h */, + 0E465B141CFC4C5E00CA7D65 /* check.h */, + 0E465B131CFC4C5E00CA7D65 /* check.c */, + 0E465B161CFC4C5E00CA7D65 /* convert.h */, + 0E465B151CFC4C5E00CA7D65 /* convert.c */, + 0E465B071CFC4C5E00CA7D65 /* parser.h */, + 0E465B061CFC4C5E00CA7D65 /* parser.c */, + 0E108E401D5872DD009D43FA /* an_plus_b.h */, + 0E108E3F1D5872DD009D43FA /* an_plus_b.c */, + 0E108E451D5B3240009D43FA /* media */, + 0E108E341D57EE38009D43FA /* namespace */, + 0EFEFB771D4A2FE700F2A070 /* property */, + 0EFEFB651D49FCC900F2A070 /* declaration */, + 0E465B291CFC4C6C00CA7D65 /* selectors */, + 0E5D5C771D464ECE001BA53C /* values */, + ); + name = mycss; + sourceTree = ""; + }; + 0E465B291CFC4C6C00CA7D65 /* selectors */ = { + isa = PBXGroup; + children = ( + 0E465B881CFC63D700CA7D65 /* myosi.h */, + 0E780D451D02F8AC008972B9 /* myosi_resource.h */, + 0E465B8A1CFC64F100CA7D65 /* init.h */, + 0E465B891CFC64F100CA7D65 /* init.c */, + 0E7BE0FE1D43581F0063BDE5 /* list.h */, + 0E7BE0FD1D43581F0063BDE5 /* list.c */, + 0ECA38631D08B88E00171335 /* value.h */, + 0ECA38621D08B88E00171335 /* value.c */, + 0ECA38651D08BC3600171335 /* value_resource.h */, + 0E465B2B1CFC4C9800CA7D65 /* state.h */, + 0E465B2E1CFC4C9800CA7D65 /* state.c */, + 0E465B2D1CFC4C9800CA7D65 /* parser.h */, + 0E465B2C1CFC4C9800CA7D65 /* parser.c */, + 0E8499A01D21ABDF0027A80B /* pseudo.h */, + 0E84999F1D21ABDF0027A80B /* pseudo.c */, + 0E8499A21D21AC500027A80B /* pseudo_resource.h */, + 0ECA38671D08CCAB00171335 /* function.h */, + 0ECA38661D08CCAB00171335 /* function.c */, + 0E108E431D5893B5009D43FA /* function_parser.h */, + 0E108E421D5893B5009D43FA /* function_parser.c */, + 0ECA38691D090BBD00171335 /* function_resource.h */, + ); + name = selectors; + sourceTree = ""; + }; + 0E465B731CFC4CBE00CA7D65 /* utils */ = { + isa = PBXGroup; + children = ( + 0E84999D1D1B23490027A80B /* mcobject.h */, + 0E84999C1D1B23490027A80B /* mcobject.c */, + 0E465B751CFC4CD100CA7D65 /* mchar_async.h */, + 0E465B741CFC4CD100CA7D65 /* mchar_async.c */, + 0E465B771CFC4CD100CA7D65 /* mcobject_async.h */, + 0E465B761CFC4CD100CA7D65 /* mcobject_async.c */, + 0E465B791CFC4CD100CA7D65 /* mcsimple.h */, + 0E465B781CFC4CD100CA7D65 /* mcsimple.c */, + 0E465B7B1CFC4CD100CA7D65 /* mcsync.h */, + 0E465B7A1CFC4CD100CA7D65 /* mcsync.c */, + 0E465B7D1CFC4CD100CA7D65 /* mctree.h */, + 0E465B7C1CFC4CD100CA7D65 /* mctree.c */, + 0E465B7E1CFC4CD100CA7D65 /* resources.h */, + ); + name = utils; + sourceTree = ""; + }; + 0E5D5C771D464ECE001BA53C /* values */ = { + isa = PBXGroup; + children = ( + 0E5D5C7D1D46AC0B001BA53C /* units.h */, + 0E5D5C7C1D46AC0B001BA53C /* units.c */, + 0E5D5C7F1D46AC7E001BA53C /* units_resources.h */, + 0E5D5C7A1D464F74001BA53C /* values.h */, + 0E5D5C791D464F74001BA53C /* values.c */, + 0EFEFB6D1D4A014700F2A070 /* consume.h */, + 0EFEFB6C1D4A014700F2A070 /* consume.c */, + 0E17B98C1D50B20700F1995B /* serialization.h */, + 0E17B98B1D50B20700F1995B /* serialization.c */, + 0E5D5C781D464F2C001BA53C /* resources.h */, + ); + name = values; + sourceTree = ""; + }; + 0E5E4B8C1D6502F60030ECA0 /* finder */ = { + isa = PBXGroup; + children = ( + 0EBB6F271D6BA8B500F75F4A /* myosi.h */, + 0EC3AF0D1D66543F00027DDC /* finder.h */, + 0EC3AF0C1D66543F00027DDC /* finder.c */, + 0EC3AF101D66543F00027DDC /* type.h */, + 0EC3AF0F1D66543F00027DDC /* type.c */, + 0EBB6F2A1D6D10D500F75F4A /* pseudo_class.h */, + 0EBB6F291D6D10D500F75F4A /* pseudo_class.c */, + 0EBB6F251D6BA22900F75F4A /* match.h */, + 0EBB6F241D6BA22900F75F4A /* match.c */, + 0EC3AF0E1D66543F00027DDC /* resource.h */, + ); + name = finder; + sourceTree = ""; + }; + 0E8499A61D22B6270027A80B /* modest */ = { + isa = PBXGroup; + children = ( + 0EBB6F281D6BAE3100F75F4A /* myosi.h */, + 0E5E4B8C1D6502F60030ECA0 /* finder */, + ); + name = modest; + sourceTree = ""; + }; + 0EFEFB651D49FCC900F2A070 /* declaration */ = { + isa = PBXGroup; + children = ( + 0EFEFB721D4A142E00F2A070 /* myosi.h */, + 0EC768F11D4F610C00CE1587 /* entry.h */, + 0EC768F01D4F610C00CE1587 /* entry.c */, + 0EFEFB701D4A13CD00F2A070 /* init.h */, + 0EFEFB6F1D4A13CD00F2A070 /* init.c */, + 0EFEFB671D49FCFD00F2A070 /* state.h */, + 0EFEFB661D49FCFD00F2A070 /* state.c */, + 0EFEFB6A1D49FD7500F2A070 /* parser.h */, + 0EFEFB691D49FD7500F2A070 /* parser.c */, + ); + name = declaration; + sourceTree = ""; + }; + 0EFEFB771D4A2FE700F2A070 /* property */ = { + isa = PBXGroup; + children = ( + 0EFEFB7C1D4A34B700F2A070 /* myosi.h */, + 0EFEFB831D4E06CD00F2A070 /* const.h */, + 0EFEFB7E1D4A40B500F2A070 /* init.h */, + 0EFEFB7D1D4A40B500F2A070 /* init.c */, + 0EFEFB7A1D4A301E00F2A070 /* parser.h */, + 0EFEFB791D4A301E00F2A070 /* parser.c */, + 0EFEFB781D4A301E00F2A070 /* resources.h */, + ); + name = property; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 0E465AB51CFC4BC500CA7D65 /* Modest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0E465ABD1CFC4BC500CA7D65 /* Build configuration list for PBXNativeTarget "Modest" */; + buildPhases = ( + 0E465AB21CFC4BC500CA7D65 /* Sources */, + 0E465AB31CFC4BC500CA7D65 /* Frameworks */, + 0E465AB41CFC4BC500CA7D65 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Modest; + productName = Modest; + productReference = 0E465AB61CFC4BC500CA7D65 /* Modest */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0E465AAE1CFC4BC500CA7D65 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = "Alexander Borisov"; + TargetAttributes = { + 0E465AB51CFC4BC500CA7D65 = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 0E465AB11CFC4BC500CA7D65 /* Build configuration list for PBXProject "Modest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 0E465AAD1CFC4BC500CA7D65; + productRefGroup = 0E465AB71CFC4BC500CA7D65 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0E465AB51CFC4BC500CA7D65 /* Modest */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 0E465AB21CFC4BC500CA7D65 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0E108E4B1D5B324F009D43FA /* init.c in Sources */, + 0EFEFB7F1D4A40B500F2A070 /* init.c in Sources */, + 0E465B1E1CFC4C5E00CA7D65 /* parser.c in Sources */, + 0E465B6E1CFC4CBA00CA7D65 /* tokenizer_end.c in Sources */, + 0E465B631CFC4CBA00CA7D65 /* myhtml.c in Sources */, + 0E465B661CFC4CBA00CA7D65 /* parser.c in Sources */, + 0ECA38641D08B88E00171335 /* value.c in Sources */, + 0EC3AF111D66543F00027DDC /* finder.c in Sources */, + 0E465B681CFC4CBA00CA7D65 /* rules.c in Sources */, + 0E84999E1D1B23490027A80B /* mcobject.c in Sources */, + 0E465B831CFC4CD100CA7D65 /* mctree.c in Sources */, + 0E465B601CFC4CBA00CA7D65 /* encoding_detect.c in Sources */, + 0E465ABA1CFC4BC500CA7D65 /* main.c in Sources */, + 0E84999A1D1B1E7A0027A80B /* stream.c in Sources */, + 0EC768F21D4F610C00CE1587 /* entry.c in Sources */, + 0E84999B1D1B1E7A0027A80B /* callback.c in Sources */, + 0E465B621CFC4CBA00CA7D65 /* incoming.c in Sources */, + 0E108E3C1D57EE71009D43FA /* init.c in Sources */, + 0E465B641CFC4CBA00CA7D65 /* myosi.c in Sources */, + 0E5D5C7B1D464F74001BA53C /* values.c in Sources */, + 0EFEFB6E1D4A014700F2A070 /* consume.c in Sources */, + 0EBB6F261D6BA22900F75F4A /* match.c in Sources */, + 0E465B711CFC4CBA00CA7D65 /* tree.c in Sources */, + 0E465B211CFC4C5E00CA7D65 /* tokenizer.c in Sources */, + 0E108E3E1D57EE71009D43FA /* state.c in Sources */, + 0E465B241CFC4C5E00CA7D65 /* convert.c in Sources */, + 0E465B6A1CFC4CBA00CA7D65 /* tag.c in Sources */, + 0E465B721CFC4CBA00CA7D65 /* utils.c in Sources */, + 0E465B811CFC4CD100CA7D65 /* mcsimple.c in Sources */, + 0E465B6B1CFC4CBA00CA7D65 /* thread.c in Sources */, + 0E465B221CFC4C5E00CA7D65 /* mycss.c in Sources */, + 0E465B201CFC4C5E00CA7D65 /* entry.c in Sources */, + 0E465B801CFC4CD100CA7D65 /* mcobject_async.c in Sources */, + 0E465B611CFC4CBA00CA7D65 /* encoding.c in Sources */, + 0E465B231CFC4C5E00CA7D65 /* check.c in Sources */, + 0E465B7F1CFC4CD100CA7D65 /* mchar_async.c in Sources */, + 0EFEFB711D4A13CD00F2A070 /* init.c in Sources */, + 0EFEFB681D49FCFD00F2A070 /* state.c in Sources */, + 0E465B5F1CFC4CBA00CA7D65 /* charef.c in Sources */, + 0E465B6D1CFC4CBA00CA7D65 /* tokenizer_doctype.c in Sources */, + 0E465B6C1CFC4CBA00CA7D65 /* token.c in Sources */, + 0E465B6F1CFC4CBA00CA7D65 /* tokenizer_script.c in Sources */, + 0E465B261CFC4C5E00CA7D65 /* mystring.c in Sources */, + 0EC3AF121D66543F00027DDC /* type.c in Sources */, + 0E42F0EF1D1749E10010E1C2 /* data_process.c in Sources */, + 0E465B701CFC4CBA00CA7D65 /* tokenizer.c in Sources */, + 0E465BA41CFF594100CA7D65 /* mynamespace.c in Sources */, + 0E8499A11D21ABDF0027A80B /* pseudo.c in Sources */, + 0E108E4C1D5B324F009D43FA /* state.c in Sources */, + 0E108E411D5872DD009D43FA /* an_plus_b.c in Sources */, + 0E465B281CFC4C5E00CA7D65 /* tokenizer_global.c in Sources */, + 0E465B2F1CFC4C9800CA7D65 /* parser.c in Sources */, + 0E465B821CFC4CD100CA7D65 /* mcsync.c in Sources */, + 0E17B98D1D50B20700F1995B /* serialization.c in Sources */, + 0EFEFB6B1D49FD7500F2A070 /* parser.c in Sources */, + 0E108E3D1D57EE71009D43FA /* parser.c in Sources */, + 0ECA38681D08CCAB00171335 /* function.c in Sources */, + 0E108E441D5893B5009D43FA /* function_parser.c in Sources */, + 0E465B301CFC4C9800CA7D65 /* state.c in Sources */, + 0EBB6F2B1D6D10D500F75F4A /* pseudo_class.c in Sources */, + 0EFEFB7B1D4A301E00F2A070 /* parser.c in Sources */, + 0E7BE0FC1D434DB10063BDE5 /* stylesheet.c in Sources */, + 0E465B651CFC4CBA00CA7D65 /* mystring.c in Sources */, + 0E465B8B1CFC64F100CA7D65 /* init.c in Sources */, + 0E465B671CFC4CBA00CA7D65 /* perf.c in Sources */, + 0E465B271CFC4C5E00CA7D65 /* tokenizer_end.c in Sources */, + 0E465B691CFC4CBA00CA7D65 /* tag_init.c in Sources */, + 0E5D5C7E1D46AC0B001BA53C /* units.c in Sources */, + 0E7BE0FF1D43581F0063BDE5 /* list.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 0E465ABB1CFC4BC500CA7D65 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 0E465ABC1CFC4BC500CA7D65 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 0E465ABE1CFC4BC500CA7D65 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ../../source; + OTHER_CFLAGS = ( + "-DMyHTML_WITH_PERF", + "-DMyHTML_FORCE_RDTSC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 0E465ABF1CFC4BC500CA7D65 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../../source; + OTHER_CFLAGS = ( + "-DMyHTML_WITH_PERF", + "-DMyHTML_FORCE_RDTSC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0E465AB11CFC4BC500CA7D65 /* Build configuration list for PBXProject "Modest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0E465ABB1CFC4BC500CA7D65 /* Debug */, + 0E465ABC1CFC4BC500CA7D65 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0E465ABD1CFC4BC500CA7D65 /* Build configuration list for PBXNativeTarget "Modest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0E465ABE1CFC4BC500CA7D65 /* Debug */, + 0E465ABF1CFC4BC500CA7D65 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0E465AAE1CFC4BC500CA7D65 /* Project object */; +} diff --git a/devel/osx/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/devel/osx/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fe9d885 --- /dev/null +++ b/devel/osx/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..2957e0bfe99f3b22b1a71a64ef0e12bd23004e82 GIT binary patch literal 114756 zcmd3P2YeJ&)bHH6Q+9V|dr7urK}rB2z0-T|p|=>4B?Qt)p^DB$DRu<`#YP~A9l?SH z6zp9TD+>04ide9tymMz}H@jxz7yaJv@x(xO%74x|_w;-B&fJ=c^1Ax;^fws9uncB6 zhG&F!z1#Jf)@gC5wywOoYFel2xeG!i^>x!b71x%`FNedEI@MR#I2g2M>n^+D6-HzX zjFWLOZl(*%mijCGmV+e zgqV3u88e?LXR4Vc%u?oj=0av8vx(WvT*q9`Y+-I-Ze(s^Zf5Ra?qu#_?q=>`?q?og z9%de49%Wu;USVEk4l%DWuQP|4H<-7XcbNB>qs&jt&&)5(ugq`E@5~>}Y35JnFXjy5 zk$_}mMoyG~{HQZZMqN->l!>xXHYz~9(Lgj5jYZ?oL^KsmLo-nknu|iH3{{{?bP>83 ztww9mTC@&bf-Xguq07+~=xTH=+KjfKo6uHtFWQavp!?AM=mGR3dI~*_ouwB`1Y#N)+ zX0Ul|FLo3=njOQAWyi7O*$M1Kb}BoKozBi;E7(f5imhgA*hOqDyOdqVUdSr!)$BFw zdUgYQExVE3#5S=z*jw41>}~A5>~3~1`zX7QeS&?CeT994eUp8U{fIrze#L&x{>YwU ze`5b+|6lm2x3&9#_Uya<$x2ZW*_n zQ#it{;?{6$xpmy-+|}GQ+zs3<+-`0^_Zas$cYu3_dzpKUdy{*YJIZ~;ea3yx{lNXm zo#KAte&$&o^Bm9f0x$Ds-om?hFMkf-f$zw7=X>xed={V07w`l4f&3tT6hE3D!%yam z_z=I4ujcFcCHzwUe4g;D`AhgK_-ptb{H^>>{x<%0{to_5{x1G*{&D^Qe~^EIf0BQS zf0}=pe~o{ge~W*cKgu8DKjlB;Kj**Uf8c-Qf8+n;{}NciAjpDQa0)IVQ3wj{g!V#b z@g}iR+$P>C?iBA7?-K77cZ&~*4~mb7kBX0r2gIkur^V;R7sOY@SH;8P8{#|SyW&yt znE0{yiTH*1rTC3_Li}F*LHt?#Mf^iNZD0(@z#9aE$sif52AjcUa2vb^pCM>yXXt3? zWaw(>W=Jul8Zr%8hCD;Qp|_!rVSr(vVW?r4VU%ICVZ332VX|S0VTNI*p~!Haq0|sE zlp7WpstnbJIzzo-sbQI6rQrg@D#JyFwT5+u%MDi;t}(1PY%**%++euTu+`9L*kQQU zaEIYe!!E}Bk2>~9=k9AX@59BCY79A_MFoMfDAoNk<9oMS99mKaNo^Nr=k zN@JC=)>vm;Vq9uG-?-99jH`@mjBAaT880_pZM?>~(YVRD#dw497UNc9lW~XfcH zly1r}<(P6!Jx#q#{Y?E$gH1zBBTOSrV@=~sg{DcSX{PC>*`_(Bxuz0RnQ6YM!c=Km zWU4hSHZ3u&Fr9BwOvJR>w8nI)=`zz*rmIcYnl_rQH*GQ9Y`Vp?-PB~d&2+ozZqq%c zJ*N9idrc3S_L=sZ4w{}YJ!5*-^rGn{(;?GqrZ-J*nU0v=GkswC(DbS4Gt+U?SEg@G zCrv+^PMLl+{bu^p^q0g+SP~_JBui$=E;%HRlpy(~fYe?(N9rskOXo`6r8FsB%9e7Z z0;#9eSL!E?l158oq_NUCX}mN+nkdbYilpg(l^ox>09Zf^qq8C`cwK#IwLbOl35wcR@o-oWrrM; z+sWVHS$_{oqUOWseGBdS-wubUfv?#Am1q8B;PLIA>S$ACEqRI zBkz(QmG{Z}<;Ud5J>P`8V_L=07Z=#b7a7 z+!l`|!IEg{Wa(^4wsf&%S+XrTmR!p~%OJ~O%XrHK%S20|rO0xgrPwmpQe~;O)L729 zth8KUxzKW%<#NjvmMbk=EH_wgwA^I5*>a0ztEJI$x8)woF3Y`^eU|-}$1IOqUbMVq zdD-%=<%s1y%lnouEypciS-!UXV)@nbo8@<_U=^(ftIO)PdaMc7M61{8v-+)FtX-|$ ztmj&Dt$EgbYk_r$b*Ocib+~neb)!D^$F{f)>o~Etgl&Lw;r>8VExeg zk@bZ2TkA>dch=L^KdpaR&)6iJY%|*|HlNLJ3)qru-E8ODy4&(>`L+UEPuo!2Fxzn3 z2-{@a6x&qWG~0CB4BJfGEZclrxov@Mp>2t6sco5UxowSYt!+XuD}Z6Db_wtZ_mY5UIhz3oriU$!%L z#*XZ)9osp(&2G0l>`r?-dwcsi_7r=nJ@&<630@)t+jgC!@&5rGkCdUrPZpR+SeUAGb4>%rl>~%ckc*^m#;~B@Zj>C>O9B(?_a(wLg z#PO-)GspLi9~?hAPB|GTawhJ9{`&oT<(`htn)eN^UfEXZ#my~zT^DV`I+-`=NHZ&ou`~XIe&Js zF6`o5yvy!#xSTGRtG(+SR|i)|S0`6zSF)>%E6bJb%5mko2D%2h2D^s1Cb%ZL3SE<2 z=edeqb6q8_YFCYGk*n5qf$Kt-;v%k9u8Uk3yH>ldajkc4aNXkC>S}atb8UAuxpugA zyY{&5bKUPc;5z7f!u6!o2#-ExBd4 z+3j`v+?qlu`+#kBXai4I1>ptoJ&i%dn2ltQeGakl+Jgmp!v3hJCyC=yL^tAJ|_w?|j zcv3xSo?f2bo<5$wo{^qWp3$B$p6Q+$o|&Fmp81|~&jQav&l1m4&oa+)&l=BK&pOX~ z&nC}i&kdd%JzG7Ep1VEwcy@X2^*rKv)U(g?oacGZ3!WD}hdpn5-toNeIqEs?`O5RP z=Nr!n&ySu{p5GEs0-JynxCB1IoM1_?CO8wk3BCk>Lg$3!gf0nP6S^g&B=kw>o6s+z zf5L!-feC{Wh9!(loSHZzadzT)i6x2i63Y`S5~~wy6B`njCay@lAdw_qoVYge(!?tg zuTI>MxGC}a#2XWDN!*sWBk{JxI}`6o+?{xT;@-qZ689$_NPIH!nZ)N4UrKy6@%6+v z6W>XEFY#F7M~R;%ev$Z9;)%rX5`RqmIq|o|(}`!ite5v1ypq@AwR>IO1h3DV%B|7%e^bTiuWS#8t*0E%e_~5*Lyd5uk+sEz1iF7ZSwB)-r>F5d$0FC?}Oflz5Be6 zd!O(=?S0PsqW2Z=Yu-1!Z+nk;k9t4!e&YSyd))ht_oVj+?@!)ey?=QB@*yAR6MZJ1 z*=O@PeIB3J7x1<7b?|leb@g@krTQ{_*}gnqPhTHjf8QYAP~QmOXx}*BMBilJG~Z0$ z9AB}o)K}(P;H&i2`09L%ean33`!4jY@~!r*^Ihh<(szyTTHj{h7T-<2t-kHPTYb0t z?(*&O?eRU}d&u{w?=jy&-&4M4eJ}W4_8sya_PynM*Z02f1K-EK&wO9{zV?0V``&lT z_lxg$-=BWQkNtw*=$HLgzr*kLC;I*Vp#L0yCw~|Jx&9P?xo4&4_V@D-^bhe5 z_mA?A^-u6m@=x{8@Xz+2=P&Wk^OyT8{MG(ie}jLy{{sJ|{>%KA`>*g{>EGnv?7z-` zz5f<}lm9ON-Tr(0yZn3o5Bc}`5Bi_*Kk0wb|C0Z&02{yoF<=PD0dv3}a0EPogn&N~ z2(%BJ6X+aB4xAh49!LwM2eJb>fr3EKK;J;Wz@Wh3!0^C`z?i_;z{EgdU}|7mU{+vu zpg1r$FfULRSQw}X)C3j!!+|#f?*xtoJ_>vh_%iTK;D^9ZfjXkGgX;{*zqzOq=lcpujN}8KgnzSIPDycqcdD4oc3zJqStxLKxX?@al zNjE3mlC(YP_N2R#_9Wexv^Qyg(t)IBl3qwUlyo@h-K3*QpClbmI+65a(r-zB2650B zGzXnQZ!js?G1x75Zm@f>U$B30KyYAiP;hW?NN{LySa5i7L~vwqRB&`~T5wiycCa`& zH#jd?7F-yt2-XK1f{TMof=h!+a9!}~;FjPG!5f1&1$P8@1@8^+4(mcr^G?@cZBo!5@RCf(Z`kyB_UQ+GVuMY?s?EuU)UnovIotDh@M7#>7aB%vc%6)Uk!B3q#B5 zX28FCXJ<;Ml8WNGx^0Y^u_&y9w=p)x4)rm*Md?sv>y(?7J8)=r_Ry5f+?>3W?7;;? zQ}Q#ja#FIh^KWJ9KbL z#=t=X2W1S%D#*>vEV7*g0OM*)L$#sO2;DI_bw#!w(GSrc-~61(RppBsLL*9n&+>WY z@LXFvxO_lKJ@m-pBNo}b6i{VjQgwC3+~V31byLdg%I8)9M~ThnisufDIhC+tMNUR~ zkM`*+d$eDXk)4s-qkVo}-pZ9>`KB{HndIA<3?`GwVzQYWCYQ-$@|gm~qF5E1VpklB zQ*kM7#dAB;3*_5}>C5zE`ZJxGfy^K!0YvOod`cJPeGv5*%9l!VkdMQi;vi6hH2m^V9n}@MZD@H#Xnb+~ z{MqnP0+f0C;3<)hbRo1<(TF`W6 z);4AaGgC=YIx3yR0CSjP#<7hlV$M^7O1o{$T&6^6ubiWFm<=$|`eB35le5gu4BDvj z`qYSOq)rOef%YY}a<*_;<=kpezxJ)1A6Q&pGJhyo9t>__r~(?=q0$I;>#!s0>Ka1e z2m-CZ4i3$2C@ZpcXyx=kP`HIP)#X+7fYBObqpQo{Y-@xU*4H+a)Hl?I!Xm$gX=0L_ zn5|4BvyIuVWGY!owvyAt>;P-t37#_-Y`7=1!o`XeVSkpHQ_!P*K~8?NJKM)RMZ?8@<}v1R<^Xe$ zd4hRT>8lJl;7)L2otS6g=XvG@U^)^041%A*$`Fn9j+Av(CnBRveMH1F zjjO6yraA05R}BYmPA5Cy3hM2KEUhW7Dh-vYjz9|>ac&w!V`!*O1NKEdzLI(&5OWm_ zC5SpcfUc4nE~rDNC;;8hQu=B10p|r%GxRx{Q+kt`wN>dnUigo?83nL*bvLQQiKt$0b3Be}9YMnAwDO0Au4wt!*8+oQf(paZz zu`+E=T3To+RqOU026bq^LRC4Gh`eC`k+`8DZimA@HD+m_!z=_)d&aRHC7~c{r_4}h zDzmnub5IA=QJJmGRZ5i(5R-uWYRIf?V++R@*A|!67T0LQI%RC(P_TtJfwFGsT+|)) zKq)8{rJ;0`F;l;7EW}XYMujM(Y3XeEP+VVJQC&t)h0&E_rN|~IbCmO@6fUcSU=NQg z(Xz=&z@d8kVU&Z;g=giWJd^@APMu#~9~zj>*sxNpao!X43IlFKJ;CTuAGp3R>WBKH z0g!A%LQ)9RrgcEvfC@-rXnL$LN{Nlr?jM8(7ugabl8fbbI~s(BFklcZhK8dN z@Tie!6dH}jfM5#Cmxo|D=MAkWE~|sjl-Z8`lhrJMvCB3kq|7U_IZ_AI)Kr8tmM4#( z($pv!k0$8S-G;_9RocNqGzp?XguIA`=;pT_O-55FfvsNxPmIzm{XQG}I+_lp$yhW4 zMrvYlRat0IbpuFdf%e#0Xg0`BHPFIP{Wdg*sfzmix~jnEA-htcl!cYFRGBtD3_4HI z$)AtPA@E1Y4+CyT3(!JJcFR*yk7;{wMpbAji~i45_WHuKjxi zZV{~QaAm|>(Cimn8a)S zQv<^b=OWi@&MG#}XXN#0pO=%ha-|xo(3R+_t;+e@IA4R-!}#lIDU9@XbPd|TR80nD z4uM)i^@=v?m($;`Q$wD1{D!FGH>|Rae%)v*^ML zHG>MX@*vvBB=10b(L?BA^ay%XS*Kj0T&i5AT)qSCM~~5L2pv?eP_9%np{pqiH0%vo z8Y*d^p>#;q;_}*R)#(f70bdngT_x*am%Ra=9gE%gCPlm6hKQv)pIR0 zPtCICq%X~zSDIc>FfTJVl$EZH^b6>!ZODLLQYI@`Dd*4Bf>`^`o!e(<=MOQn8qsUY zHA?3<(Hn?{hPTk$;DFynN6>rdeej;)zC<`7nbTaI(MnOhf)xSBpgqxl2oNE7-HeS|(npD5QVo0Tof4a(5N z=yUW1(ElZK0(~{3`H7QNT9l2Tq?;gJ$!uS_tfa24sHV8K4*C!E)eA#aMe0x$mB2X6 z1%)b_*HEQaj+&jFK;J?!1LHM7UCTq0eoYZn;PJ)fwcF51>Jb0&nlO3aqaV;$%5}>1 z%BE?P=F{~vj(OYoSh72wJCh)5B1QE^iYw_*SnNfPwgRTruyD~UUhAIZA|+* zFFd3Dr&7%#mMyY%1*&6Y+sp!FXrR(ygld+#jm4CMHeVmdN#$ooiV;>|C8)Ppku|VJ z)}%Bl+m!7}QxhvQommTORd#^axJ$X4nq13zi<(e#5g73cn)4h7W*NWiqM2pHl~QAj zDx+8rn+Ta7o1om<$a1t=Et^IZc~zVf5LWTJHrXKlX80_o2=ZSBu~?H zDAE;S&t-eiE4nLp>PaK$Tidm*Yqwab(h@H(TB@0Bc7%x>Bke*uHE(wm&<79jM%^>{j+D_bK-)4}ceEhrrJ;_!$8s@gV%{g`Y?0c(eyGLUkPx z`@m{FY&F**9sYJnRQ20@5siA$IBIYkxJ-4P&QQ2Ij5Gqlb<*-C`i|(B*^KKd3Fr3B zCJr}8*T(5N(J_-Pga#BliJh!Gq&%#2o?25|P1ojus|MwV-da!1etOoaCA-w9dF2J=Mdc-WVikKCdpZ3VPCTo;th}!Nn>=2xy(X)+G^J84#HNj} ztuBQwPu-NtW%KJR!wq|OGkX(6eE_+h-NN3$-Utw{D6cAql-KA%{f~-EpYg1cJhL=M+IfT91 z@O69G`y--zKzXy-TpwZ|*39*9YMc2td*9DK9sxL@yweQuB>Qwk($6UGHoK_j*%#@F zi0Ljw;D&q-Eb{W^HGWvd7pD zlw-IZHAM0A<9k305X*k3KA!jk!hJsETJckK7d z$I2(r{DoVa+s+;PuYV}!zMt9OV($B${X_Xo`8@p4NHbe|XpQzz=!m3Mg_fiZN+~O^ zPt%M&tu(YaRFPI)w={eproD|3HZ#e0Vise}VIB)u#0G4{CM;oDIj(%Ae64(=oKU`1 zPAcCi-zz^TKi-Kg*a}A9iFSRk3%jugC*VZol=2f8exQ9>uBwj>%i!2(=R*?-CA|pDxvI3d7Fx14np$e9VyKpKOoc~}X;*`8 zP0>~(Yo7}n=2F9%5rt)=No>?-{d(O=sWTYrGlzw$${TdH`kt=412Lzp9tc&PFhq^6nS$o=+WYlcoZIu$KbJe z93HQnA&4Oe5yTRN3E~LicjAe-5KqFB*+Y0Lo<@*BkVue~Ag}TsK|X@~O7bjPtqz9P z3@tNfYV@g;Luu4nnn#OvbqY#PwP}|Fvh{EfiF3{$J~ssVR#3H7N9Fl5!{;VX91V$F zO~c%Z@{-h&l)CDM+LCYw8<*hujH3yc;t-yP%LpRLsW6*qX;4nQ=t9CE(&CpiTJ@3|>7+ybpiNMyZWga(j%>#l;0v)rkb@v6L9R$W!yZ!e z|M$Rygi8YUBK6R7QHStl^bkRAdMwE3uYL$UE9Hh+o1l<5%#j_z*!|3F=1Bxde45s0TqQ1f^2cEKOxFQ_;A1b>P@!=DqBPEZCxnFM7u;Vjkc(9QsjE&}zLDPUH;qTpxn^Dw~>9Vw*R7 zftfa22vP)G^~Yl$N|?M?HstyTvtf`xn$}dMu3Od z#&zSsI7SjQN=crrra%)0e+_2@WzC4g@%sdWmACgGT&7=-_c6({YjHoEyrGZKEY~e4mX{f)0#DLMcjEzXKpS*6A3D$)&%oy z5Mw7@edqCu-kDBkvNN-@b3mmt(zBq+ogN)ux%pfu=rz~^%H1Wjw?;F;4Y;f|{4bf<`xcbbaN4~u#Qx02p=K0z}Z zxeExIr6kXQ^dYi7scVe3X{j(wh=t0kYnP>}^Dd!U(6jow!@8DVq-pt_|BaSISM}eA zM(!eAtLJEfx`Hakl?2UII>!{6IeFktVw8G4w<%6g;x>c2T~AOcRkuZ9b-R(;%1s1? znkB!LgE@mX1`h5H?oJvwxJi28m`BipaNq!SgTN6UnLXUzR+Z}^?qN_ah@g;A&Zo*% z9#O8k&9hcy7ZiX>WfbIQ$9I|BLGFpL%LGMQ80|8-XTfE1&vDOlFK{msR6$TBK~)4* zx8gFxt}w<|h7U&j$F_P#ZS+2-a{h#%+W*-neZhSL-B#{P?l|`q2jL4$pn;&p1TAUe zPH^9HC%NwkT1wDLf-WQoCdj6Z4$V`Sl1-mjUN&F-ZH88Msr8;(7e=bNNU0YdmtVNk z^l`s(zj42Fe-N~cpydRuAn5!iD1dvx+LBIC@+QEll0<5P{wd&vY0DN??S+=m0<~^p z@e*yV3pBK2&+3I$VF|Qcpcff)QoX&pwjLI=mDHBk(Dijt9>-jwqSJavr3#CM6gsVff|)*6D=Djk{!q+@@g^)JGt zrSj>N6-cx$Y2+bixm4vP{-QfRhtiwN=Mi)nL02}@+mr7T^XR^OKY}hN=n8mrq#4k$ z|FREb2p-H2i@9q!525cWg080d5$zm?TL4<)Wx2LI?+tz|KaL;INc;rUk1yn5GTc#H zU0ttf8to2@r5z1hLYdlM(4w?DTe!4dJCj(W6@o2J5wwN+y7dIz^cFvbp9;^I#!u&G zz;h<>v*G)tbC|Ky;EUJl?Aa7>&*0Bz()9`OuQq|(K3osARw~b|uBB6yYFm&#YYRa) z60{*I@8Zwni^EO?+~l>AS!Nr;^MDsU-$A&5<1?8L9(*J^W~k-{`) zu#^~95W^+Ju!R^NAqI7MrK@>5s!m<24Dla2a6Y{mrm3ged#Qt|UMM{4W@$^BwPk=1 zeYKA;gAL9LCdE~)f*JD|0CkZzU5BD$Kv6!rxDM9RRKk)Icwlo!OoJT=MR2JK46_)} zHw4!R))+3IwH4FgArrNU0*%P%p4W|2)sG2P zLgqBE7Q#TNHcU>Dtyf8PWoj{9T$5T_pE{c^MFM$=(BgUym zG;W*krjtz*8p=x+j;^j=sBx-y6WW|e71{E%Oi%qg3uYJSEKy-Y4VCNPTN5$YfK9~Y zh_RARg(=}&XBgFmEabi0de^OvS9 zrHg!1Dpdid%+(|aEgS7XQ7Ny6SvyC&gp()JgX#JCP)+8i zq-PBooRVEIAR}c!_Ta3PjQre!jO>9!^K$a?qM!e!{`~v?FFij!J2xYL@PLApf`UQ$ zDcOVa2c_ia4#`Lvl9!*JF(h|j-q4I8VIjT4AEEK?U4kBHx9=pkdN! zUP_gw_bKJoFw(WEk@u@8hV=>a3$-Nx6GQX*z_O2=g8ck~+?>+%Fo|abCZ^*qV1Wk; z1dgDCjeh# z0Xi)_j|aEI$_D*LoeRMt*eKCff}Uy=>;yec$I}~b;D+rg+;r5waUi%MGzid^eMTAj zhTw$`DD**@UV>i;2ua$6O2k);FD?s>ZK#|Zs-;B^nB%hqJ^%lO1fW!&nKSOxOW&%2 zR5(X~REtjOMo9lV^V@}vLMIwS|M9B$E!nWRlLauJUA9MrE<#tKn{cksUFadC2&qDv zkS=5hnL?J3E#wHfLY|N>6bLC-fHv2m^&d!eC*DFjN>O3>QWSBZX1I zXkm;nRv0IY7bXZ3g+gJHFj<%)OckaH(}fwrOktKVTbLsh3FisL!d#(5C>27&JfTdO zFO&-lgoQ$dP$^Ui)k2N1NT?O+gnFStSS&0NmI}*+<-!W#d|{<0lA!Mi`jH^;E#O#wBM54;KM6WRSVUM%Se~#VVU2{92x}&+ zm9TcgItlA0Yyx4ug!L0PiLmVmdk$ec61Fp8yAZY;VY?GHg|KOa%^++RVRHzZN7w?w z_9AQ_!uBKV0KyI;>=42ZBkTymjw0+B!j2>C1i}^)b~0h75_URaXA*WcVT%Y`OxO~_ zh6r0m*mA-yBy1&Ns|mY^uyurOAnX#tE+gy;!mcFjg@h%9y@;@@3A>iCmk{%JI|#dzu(uQTPQuS(Lj}!K5!k!@PNy2_l*dGb|6JdWL>~DnqgRp-R_6)&@U`#Miut>0x zV2NNe!B&Fp1Um_K6P!S>mta4^Nd&he_#A>e65N^KE(CWYxI4iq1g8<4L2wqqIRxhs zTtILyg8NV-{aE-!_*D2z_+0ox_)<77d?kD>d?TC?z7SmZ=r6hu)ph(^&QN}?>9MT=+^ZK7Rth)&TZx1VxE{U7KlB?USe;tkJwl2C-xTyhy%qz;$U%zI8+=a4i`s=BgIkTXmN}#CowoTr4gTmx{~8<>CtQd~v0Cfq0>)h(uf^UL;;Dt`^sbYsGcq zCE}&xW#Z-H72=iRRpQm+HR5`4gLtjDQQRbM7OxYp7q^Hv5ZsU8VFZsNxRBtP1eXxJ zkl;Fkmk_*y;8g@)O7N8gZzT98f}04;Il&wf-b3&s1Ro^$If7p$_%Ok56Z{^*9}xTr zfhh-klHeZ+{)2Fsa1!AxgtHUQO*k*%k_hysxz2>^Mz|Ehr4#5JbNPhpO`sVJonLMk z;YJc}EP<{kH-m6<2y|V!5aG%RS4p@<1bU*--{cg+T}-&k33oN&t|i=cgu8)ow-9bS z;dT=4PQvXX+<;V&ipm4shU_>F|Wp71vjeksAY%}GL$Nr9ZbhGmjvPt9px2RTNn=o*0wf-&=1hWfKK)NXpB2_j6-qfedA2R6jv41RKOCD zxv@CAbez|VZ0EL#mg1W7ScLm^gg1(8neh-*DMaRj)KBV)U8s_4W04-#k=}y(Gagb4 zxm1Qq%Zs&1r5NEnrUSiGWcyDuR54&r>R?BTYz1wiD!kYXa(#{Mx>z=!(*a>+c5a&h zBkR~;J`KJj7K`?>j&`gSUgL;gRmrrtG*3Dg7@=gRg2elvc;Wy{*H2 z+zM?i2DF(|eG)UuYTnnuK7}P3@o0;~Xk9%lZ>o$nzK?X6&)do(op4gu6Q=2Fg=4hi za~R#=QfRgCy!9K+W-*jKF>Kpe30D(Jevf~Q!)f2RX|({@>v!1|leyjYl@beM1d zJ#!%WP%PN*I@otbw)}YG*FqVh7ImgArr)cL9mq2}-Vbf(Q6Io)nHxAA=2Y8d9s-${ zQklm98Fiqa|D&*Cz$`l0uW{Wwo$#ouPit)jWV6v2oI1|$ZFOGJLXV^G23TpNM!?fW zwtj6I#b%RMofmvhLvxBT%3(;-VgLH~u&Qdb0^31@WnpzxR-34eVn5bv8@lLFY%5`| zh5FVuz_VkXL5Bs__})B zFdPT3zPPNYg~vAZ(t%8EmA*QZb!iQ-fF(9%GW6G>WY}q=O#>NEcZcX8mbQY7DP9<& zPm7k$NFBu1cIkw_loYG-<8&ZL+jGg5;omSxM{%_>_$|~jO2gyim4@j$o~NzJNppDA zR5Lm{8s_L|iAA>FEr(5aW8vITb86ZG{4_0{C@P`53&hH;M91{CHGnsJAU#Kk(f0W| zT%fIR%?!s2CzU!}u&p{452RKHY2QjHX)&mglv9h7F=Mbq2ZQEgoE4&RDusx=V%@^| zI!>pyRxK)YEC$grpaUGYR%pSPmf^>7dTVr~uK!U)F*0AbVHI(YC+s*;7VgLjKgRc2d7 z-fSsqY>3gyCLJt0uARj74E3-mBvwwh>ma%R)mg=8!96-!{(s~z2JAi^tmnV=?lCA2 z=_tMbrIcbo_Uj;h+iG-L<`O5^JfS1?Z)>oLxRNw|&$Za`dsfFA*miT#%aj-fU(#U) zx7EWn_a9<#Uej@gwlx$)$I_N6{+13mysg^VEUh?h{5>6QWRWeqjXt4rS;PWk<^G|L zHTu6{#R%;)9cye{-x=4C<`&udw29+Lo(8k> zuw_K~a&;9^jBy$RI%sJt#@RxQdex-;6N`0@jy3PUVa13oS;v~+3bS!+E8OYQoPV6W z#MoU2T>#66+9W}p*?*8p0+VZ$Ea#+Di9giI9k$E2dil-n9d_CcC3T# zL}N#^pAJ^rN{sp+Mt$^FT3pb9FrB-#N3E zA;nmxBdv;?YsOUty1XgYTUY2H7Z=(3x5=KHBT9J37JXZnSlmTA?wWresp7D@SVvnI zH)n~P^RJ+FQI@Xr|DC`&(Z_~kUY$a1} zA?%ih8q4Y3I^fO!)k0&)+oPjxZN)-cl1DeateYPS#Wu5zdv%~~t(a6xpvadM^^&y} zliH^PH??B=aa2Dx9f}p-K^^Yaw#J3#@d%gJF#>!>$Gh#nDP9cLi#paFtr%4c8A9d) z@5`%?HE(?(G<#QD6(o{V#p&f6^<~ZMJ*|kp1xG;@lze@{{JR6SjH z94n?Db+kv~qQz-R|6LVg)bm#zZC_hep+yjmf%{X3d#n|i#WCziau6LHO{@-dpsmWF ztEe{p6$2&eP*40@3ykK>Bbr0XV`t+w}onr*zax}-%eW$LRV zz7uz1GL8p|Hih^x#5739JkpA)wHN@vfsLbLT%&2Y4)T6m#idQu#E5H*j&Uq*FpI-n zeE&63hxxGWTCZg|t;lDpj`#8Zs@D^vT(fk@Ph0VeaST&cj98f$>nNYMVva2aF4|E? ztT8sDFwN6Jziew%YEJ0l0%w}R9pRQR8AFRrkChI zKgYGNfAX{ONAyY^@7K6^am+s2r?u=`nl|WozqeI`qw(nbwPO|TIvwtGD;oSyBM_dO ziILw;I^bV%OPo0TMh3JfR8<;F+%^phGp(pc3l|W@Yb?@E9f|#KRK+OmT{;%m_P7`6 z2gTQs-8!Ps)=q82E5&m8ppIiGvJH&ascIpw2u@n0&ljJ;9k_HV;hjCQ=Lqc~bg72+9GaqL22(;GU5>%U05 zWoOm&u8!wvtM*5tN{jh((=i<@F>a3bPa=<5JQgFfPjpP*f1@u3>q{Lg5LdI}c9Hc3 z=`n8XgbovIt4T)OSgfM|pyRY}tGjMC$vA7!Ouy)G9oo)ayu9VK4%4Zv(K6~g9nsR3 zkPejGinh1#I4vWZB1{k9q!z=o3Wbh#EhF{(@}b~5_;mBaZ$?( zT5{`1sjUoI91+Et)R25SOnO{b7bmVZD^iQ7FSXObGFut{INU|P(hwu;PC8Kbf21k~ zteXy&8yD=KTuUW=!&2-3rs`n%|9)~scT{mBp_HZL_G~3#YB8M6;}DLqv4rO9fW7}C z*D)gOql5L03l`V=!8AK$Uix<@!n?Og{iPwW7nL+X8Ym5t1{2($-~j{=BzRDhG*p5O z?xhg~!|@@oM;PqI3-*83HkYk96Z-i5*|Sz;W#(tWZWEcAd9b-`RzBT+G%q8(>4a1$ zO#_DF?v^V}mu3J%vj`qeFznk;@JJ;Ywh5@4SLQrBX|yZ!(@vxtVcRxv8CX zD!IWmb47kW-SIG|pg`U6Fc-GqOOLR#PP&4!bBT1RbeVKH!7#+L37$i6QIm9~bQQ33 z4Z-ITTuj-Sdp6nGcY4gr>pwoC4NiVW?#e0JD+%=tB%~Xpt(21+rJJOirCSItB{)Pd z=v!Hn)F^EOPT(ui^9e4eoGdt-oa~>OdC!)+SE-z2WMyQnoVEhqaT`4<_el3qUUo_M zO1mZa0(S+$l>}E2T-_wyFFgRf>?OE{;6;>|+Ox__ZQr_1t1kpYp&S%|q0C&7nVA8e zB_ks{|c zKcC>01cOmu*d%=>eGZsl5emWZ{;#ua5&I1f9(?J@rdS_;Sk371|j0eR$}R>%j44&{r=PfMlkxD9DQ$X4xqx0<7$k z-LgkcAowbRuO=9Vc72oVm3`VUZy@;Evp>xK;KgR^L`_B+=@IRhJIm)%7Lw&Ia#tBP z?bt-{W`eIH`1&TfyW9gLlS=Rwf^VQK+;~=pdD`*?rSfr&g`8|P5P|259_DxxqII64h zqNzMyo}e+YgWy|rCOQt-cY18{Ci6N~GO#;ZcG!mHY4U6;kLmIZd8Q0e`8I-YC-@G6 z?`)Fi$VD2|T?F5K_T`Z<;^f2?Ma?#>yCHdjT;1xB*2s%MKVkEdT?F4tS=g;w?%*A- z^!e5~a|P%Kq%67c_CfIa1$p$92$4ipUM62aahJ<0*WpFI6qGCfwMo(jvHV5ZmL&hCM!M458W(pr!3qeZn!Y_`inAe-*2;4*TYK+F*pgq9-vZ#cMUVWp{0;ygA@~h~-=x5AX)$c;O<)FUctb?OJJ-ZAO+q!lz7+0p5nd{REu zD(Fx0&j9)>!S54%l!6}9LC5dhny%}0P6jp7{A_h!_%Q!}nK6LI^*CnE%rl+MBEcUL z{1FBHSOpz%VtMVZsT!r}8R?K`f*fE6%&^Lt&1MH+nk{Cl*=DvA{3*eo5qK{I{-Vk3 zG`j%PL-3abAE%gKomDS3ar4Nmz#5I0ocsddB|k>!=Jw{!ROs=FVso;&3-AKz$u|VU zi(3i)R@0C18!YWPXdUF|(VhhC!U=MR21WE>n$yhLRPOOSi#f-f3%L0Ne@F256!!;; z3l^?4z4xk0YbNaSujcpBT4(NS9z^Bd&)nZUz&w!PQv^eb{4>G7G?@pRhX5vQvIRQw z8^!$ntjb+{x}5ASn7tx1D^qfE(&nidb_kFdvc91qYSS z&s=7nPdJWnJmCbwiB0AO=7qovY%FFVoRKnPI;+ggsGD`>$ICUdD9EAun~@z;$D5a! z;k|_M^Fi}U^95>H;bg+m7f{je3e5*cFMu}yXrSrM-8u7W^Q8b4w_Y({X1-j5vJ%b~ zf!gm6D%~ecR~=6Qn3wL%%p1(tQKI4+>-FX>AmJMc=OCPuO4y|t>$DHAS=LkMG(D3# zfV}7;&AiRLvsKL7%(nw3Z1UzI9K5rcaIiN&^bTvs9Zca9XRatn2W8I4D#)j)UUm*m z^&*w5dAIpN%5}WBY~E{r2yh=EoR4sRiW^XIr=HF`eVpjD=Fzt>WTex!L9+l3n4hM^ z#)~`VXUxw6=<|dN60RKuZLfk>kKVMj#~j+)0Hpl9bXurpW#@wDYKDE){6?#=Z<^l% z*mnrmfp8ruY$pvi^?@(@98+n{gf5+G+&KUmWe>;9pR_93PtBhJ>KBAdCR`Va+EtV6 z=npS_{U{Ji8@w6m*{Wvd(u}&9*c0X-T7~`5dL^gKFzkxa^b+JXQ$Zm6`d7Od%MD&f)qSX24^Bhz~?>MCj@meHKfSWFfx zr7>PLWwBZ8OlOOea2bTlq%>wx8uy(JO?#lrSPd#CPm5I1gJkhqg01mwX=iBPPfT2d`(fD42IWKW9QOU0d; z*?8pPpEUE#)tZ1Yq~=+Aw<^g#mcE)K`w*^gv?O!4eW5oNq0k7Myk&@GB!!9>M=hf) zqk%fu!m&T$22kn-s**f2^Z1g>^~xnLhrTSQAO{Ne%t*0onPizxS&laWVwqu?381qH zH<)mA0)&GJ5U}}5rm<;P3QR;~(HG_BWT$69yD$U78|YAGM29RTmiZJpUJK4rZh`mq zK?{x>PPh@xoE!Ft?LT21#Z?99Ip9T4_P^SY2hg7GNz`TduLJw`?F>A>k$wctH|3rOC33? zn?_-$pVa_3ukg_R4m)+j&7xr;HpjJWv#4Pqu83~4Kv=LqSeQw;S(KOAnut<=`0VLb z@E)BEnhItVfQn3Ck)4|pJ!@gvZJ}WyzUcQ_AS_rQEEEy$Jc?Vai~hBSY0Rt@`I!_d zBM&AJW9qE6wI+nD%-o3Dy<$1s z>Nvh(c@t=Sn{e|8S4L@^uhKYglH>Zj?$SI$Mh=a#G#E5%+)>NNl)8A056dT(PXY3C z!Yv@&LJC=-LXLFhE*U;YqYm<6kR=QeOln0MO_pyg-&0w}HMSotKLRN1v|2^DY6@DT zf*KC&TeHKgLS<&;(y*10o(@_J?>y3z49g!@*aJSk@3tZo zqQc-uyn)qdwE&dWWRxwHiGuJA?Y8 z%ygQ9HM>u1PisFa{$AGJ);`w0gj-FxHH2GBxOGj|{?-A23;O_rr@NHmUUpW+Uvs3e zUH%45#i`GxdP%#?%|XjL#yYW8ZVIiFfSW0VyMl06Qf{tNrBri7$$IW%n)}gAH6QeS z`ijhanhQiM(>lvq46t#Xwso$x1Ykpi1J|*h!fsGu=M}O)jdy6qo<-|ab#R*@7g}oo zGH#t}U1Y5VNZ4C>BjGkt$jvIG_>{TP2|*BYJ>VK%+n5KW=H;U<)+?i{EU$k&+m1F2H(|^=81`N;vqxk>YMsaR=Xe{eh*=X(VO= ziIA?SNkzmXS#P!8383-K?k?-y01BH>HxX_J1-(@xcGju;wocGM^B~8CfI%mea+=FB z>jTzDC~900JZjwssE-luHp1ObQSZ=D&%N^Uf=l7$npvtf=jT&v&dbP&?l@VWvOZ5m z5YN?HU$DLixGxj#F2d3FKX;FcI}+cYKJO=$+RSVyr)c6&_`6z z@w;Dm`rz9dXnH{|$Q9x*LAZAHj(LUGZJne;r3I|$5haXx!XLB{u*d* zzN)Y}G;PR?^zv+0o2yk+x6K2niG({qxPuh+2@N&ReeuJrhMEo0ftmpg6wNWz7PNJw zQjHgxZJlhLHA{Vpa8CoOo{ShCy!MezpVKs$wq0T7Bx0<#9=43u#A(a4WdV&jgnO27 z&ruqm*TlK+*l)Hm8jYE18CjqPhi1lm+4@rwnPd_mbVB+hp-*NeWMopvBs9?&Ap!~n zlc1s~Y7lYD4=qjK2ho&WWO{dc528$y-Vg)dl%j7LqSGE6-<@lhr{c!8fa!Qo(uP&~f!yk( zK2t5Z(?$9rX2`uG2EL1IWN`SSadPE_fZbNXYh@tR85V!btA{zxG&F2Kfhnm3(_w{be$N;B={34$``>{bM9ju zclKo;u%M6&E++fNwXO=5o=L)&rC%)#PZ`M9q+g3L9pmR>;1^Q(OGCK3x#zP_r*L#q zSuMx1YCe)IZ`H}e%J_ar`Yq{qO5s!kMEYIncO%UA4!#xxzmdYc3nz=(r;uPJg1`@;;gV6td5Vf!~XP|BA5(C*9`dRA!V(9KtcIB@#=9#rtTIFHfsi{fa#ZUhr{Zlkk z&N$LPOaC0rFU3Im^53QAA5xQD{I3tadLJgzC35=4%G(%qWWf_$`+fS)=%)WC{fG1) z(<#%RV&GrGq6kachV)<3e?|9qVcAYt2B2#h_&@C>mM?wvz};6fj&e;3hnI1FN~PA+ zlrWCODmBBBF$jZFHkpjU89OM$GjkkxShivK>Gz5hdzSgEMuY6SyHl{{ju zh;1ok*fO%wO*xWg7;Q@J zC@ecANIe_gZu_qdsj_lUY=N9nl2M6N%CN}rWK@|_>B5o`le+7#xp@z%P7XvkC&F_T za;6vQZ!)H2$a9^Pk(=Sq;9MtTy0Byki%mMuZbokT!J1xWl&rk8#{3|(>>T4Y(vTsS z3n_QqGr}1x7uXNr)2tR}tc>isuWtD2I&)rM9k+IujNN7NQgtvH9T|I2yoJJ&BP?Bf=N|DQ?v){LS)^PiWUR>GmPJO7u(*Xq?q*xe z-E8f_NjD$az3YK|j#-}LaWz!-1(ns6vbDvPS7jV5jZZZP%~->4=!a+Ub(EpPA~&=x zg@#9ie|&k=!{)AGStVh^9JD;K-^w^D!&ow;bi)Z5EEzIz=m=qv+u4>;hGuumE~_qy zXjZUSBWFsoprx_-XU3Ts#)2W$WtoigGgvUlY8oRfayL5?;Ck@O2R6~f z-;r@Ax_1k{t!t5+*%o6n`|j@AMIY~c{;skUtdMnHT2dqT7D}q+J|st*(a3)=<1s0n zYKX~rJmU$ZpAwczVUc^%tS0@d&{POAgXZ=6((-a+ zdB!GLLYI?SoLPY}DWfB^GLr-UOupgNDlBc%m|13YRMy;h%h6_k%Q;2t4^gjA$&}+l z%B`79e=NXcFwpzcq);yMD8_5_K*ycl=kqj=R7#u2KVj>dZ1%=wve3n}FQk-0}ETS%Fm!m_)tbV$iP z49V`cmK&ypnc7yAv&dy_E{j@OBDYrJx_f8JeWcV;w@)VfNSVFD!r0R(b@w!McebrN za^SgU)Ri04TI0S)C9a5i^?*#diUY2=z<`tP& z3Jb$49$YCb`)#X3)6f21;+0n<(KQbT7 zd|K9Ks!=KPnapQVeO_4B2+LZjD$Lp}*<Q1ye280U&(w^>ZY1O zWWJU8HoET$3&D4o)IHqPZ7DzOj(oZDmE%W^asQanlrc5#gpV`7=vVg3%&(CBMp%v% z7I|mha(rplPm8^?w5R`O%!Z-}ODd%tJ?f#{#Ya;&h(yX%(Y4bhzk z++2O{t`X64IpZrWEv2O8v7%-T%-X)cqGk=s8mtV@Vgi1mu$&}SPd1A>=icncr_xi@ z$h9ilc(SMPl*zNwxNcUKQEGjEIE5~dnrwU8-N<52eJ@~`;vrjkMv?ty@WDUt0 zA&Z!*^0P)}jiQLm#?BCyGi4FaGK)BAu=hN3#Zl(rJe-;@PugV9D#?-yhLkm*<;ki- z6tQ!JMc#L}oM(#e{Q0fFtuejH$seMn#`#9v=&4!$enkUWb*9l52+M_tMmmS?mili( z%W)<%F`QY>F;Aph%xcJz<3h?Cm|5X0#)T}#g>}NRUKa6Uqli6wPF=fBHHyfk0(nu8 z9pS`knV)4045{{Hvi8VgV36I{CBl+;sl4IKp%&o8zBh~eq>YoTRawR&A=O@e)|xC930a2-%hkdnH>xey z8j}9=XSg@q5wVyhCKXmr) zi~<}SG77LVk)uGlytq>y+a$=kE$eP6e0$a%S$AgLB`o&}%YDLfzpy;8A?u#3dlBZ( z4+_geQuyKjshf5=-15@48pd_{$LGMyS!7F|sH26+dVF zfoRIfZq|RZ{#1tB6k*vYEH6mW7Y)%pXMS+;6=TejR#!$YanvwVh(w%CwGEa9O?AE0 zwu5a)H2)CSh= zrE+N?4}v|MOrTpO560v7OKm;2{n54c+E&{3wJ~S^NmzasmS2SB*A2E+wgb>zEiAtY zi`<&F{P8~x#L#7r-LxoZ`n=5OQSeeyt2)AVtaMVUG1GRO?Rc}(`%_r{!kFlo+3;e? zH~Sl+6(y{mqZN6Y?QH3n(`{$i&a|B+)HI=PC)5E#9k{`Ej_q7SO0@`8jY$0ue_}Og z=f=--&Bc0EWxUh2U23}u6H*8G)wXM>+UtaB73%hwpbj#+t>7P@e6+ONba4sSTjlSv z6T4U2&9*zFW~#}K?M~ZWXx<~#9fT_HbE`WUn$uqBDjhq{IDV3AnrdU4xw0Z@JHhsl z?QyA_>VBr}3EPvVyVHf5xD~!j#ojds?{=Wa!*yIHPwcG6cIj;!ZN|=B%1C(C#?GDX z4WVWURqlnW#$Nbcf9zRa`9-a1d$oDND0!xAd(S3!?o#fI+CH&;isR6$UlbS{U)Bb1gs!y&gTO)sr!YLDx%wmOske}Fi zm{gX~fiwa?G-O>@3sl*itOi5@}PZ;U_LGHE5R^GgLykw9?q8D65g1vGD^V z`&4_sOEr7IUWahKP|Jl{A%!aq;qKtgxgQ*0PDIR?lkh{M#0qG%hbe5zn+En)dmEaw zg<2)lYN=UcXzqU65!It3!(bH?Xc>J;C;s+b?efGw<&`=60{cQl_Y~?xp-z&blMT@o zuRn5gEr-d~9^+SitkBV|@gzsfQoB6#PdN(OyX`&bt`zE2p-z*!Uef`g;~pL7-Gxmb zxzXz3_=K(VN_m7755fa^0TV4S)lcE=!hVR^`}laB9cDaw-*f}b)Dvb3z_M`15 zNW)WI)wG{zX9tf}n_4H->2alf(q`N_$-F+mW?O6}Z9mg~Uca`UZ@&OrFA{1{s5?tr zXPCD7PCI5&nLK1Q21f4d$)9O3u}IuMvR`VK<3h?)4g1x0#syi%2B9{_%V@nd|A^lA z&1PIx9y@Zh-(|5#T)H%Ku9^yvA=3( zK(I3)%n_>G1Xs;XaONBLUv!{Z(n==r%$|tK#MzVmJ-Zwc?C;w@uzzU(NT~CLx~ouk z6KeYg`zLlr1UnR;b8S2?8~tuu@y4w_HbP@T;uzqtqMLHqbZqY! zqzrd3VOT6wxl^w0W$1Pl2C6EWIq<3}l@71r*RyP1mdKx6mBy#=j!cJ+a>~}`a5}P4 zX4qURRJmWSn)~JZq#ZNj`$x?{DQDl76F_d3$lg5G@*G1PBalrw$#INyuy^MeBh(c_ zmD}ZNw^3kU=h4N-Y;VfS?O?g1Q!WRI_{N2!#36@;lxqWr$HB1RK(1G)E2ZqdhHUq! z$yHta;;5`z{#>NAs!A?-D=L!Ovtz2m7!^_-*g66ZMg<3>!u~>CC3O!l{X1#yE`_CL zan1QdO|_gt#X2%aqeBi0sVlA3!LZ<9SXeF8gQV!ers((`EI;aUqUS-Y()>Yd6&K?Z z+M#1tha4GF?j$%CI2aimj0|gqDx~fqhVHx_jtkshY!lPCc~r@N49?5jozP!-DZ+g9INO$eZo)L8>*ELpUPC!cjs! z8rjIO(A{?Hmk&Q-l$9I&@e&^GI9?fXvEvxWv5w<}daO{77wU-@J5F$%=r~EJ^tY!A z^{llc624yLINf|tn|fS7?`hl2Tjct@lGAZcMC^oZ7whwCK*xmM24!Ro2^SM!mJ3boSW2 zLy=&JywFRY{l#7VZ^zBJdcenset?o8S#t57nhFZN;Ai$vY{FSn}@YLjVj); zJmq*+8L{5+wBs3}o-fo3*E^nbJTKIBLVG^B?q800_=1#gJB_^NaAD`ZolA?mdiF0i z|6%<8yrHj?_pW4Bri&#-fsR|?aC!f7lu1~d-+OOk6Fa1#a}zVRYt6Hd?VD$);Yct>gCd=4F9aw zuq^j1${prUrE`<9~(BUbDARm zFOsFM>f0x0sXVR^Uh5a?b!&$Xn|9EBM&kDL?0y|!Sfr;budmZHgnGl;x)*iZfRhKD zqzu;Wx=Unrpl}oyo3-xB9-Xzo;h4$>9brz|& z2=!K>-gdD*B+aU`z`T8Jn^5mqJ7ShuTeHmYXip#7uRRHouqC6%NTbIJ_0F|*(bA09 zE0qzK>cx7AUaFVr<$8rs?-J_WLS?t(UZLJ6)cY@0ChAqnME?H-uCnSvePFFF|MQSY zTO*?;uivuC=0;sagSWtl#{!xRU+L>z(n;_Z_WP`V2`#8&l_@bSAz9?{RkJ#luIx-s z%oy=2^VjJCp+2~F_(o-Lnk~() z2iMMNPoL^tv0`awK`1n8+* z*d7YZ3WQd#_IK{Fa*?S%Lz#bFM%o}fq&Mh|dXwI)&(vG=u->Y->9h3N`W$_(K2P68 zpRez#@20owyXzhL9{K`(q28(QsV~wO>r3>#^u6_^`Z9gF-leb5_tCrc9=%szsqd@r zr|++?(htxN)K}{V=?Cj;WR2;E=!fcu>4)n_=tt^D=|}6w=*Q~E>Bs9Q=qKtY=_l)_ z=%?zZ>8I;w=x6F@>1XTb=;!L^>F4Vg=oji2>Ff0M`o;PN{Sy6B{WAS>{R;g`{VM%x z{TlsR{W|@6{oncx`i=Tc`px<+`mOqH`tAB1`kne+`rZ0H`n~#n`u+L?`h)sI`osDo z`lI?|`s4Z&`jh%o`qTO|`m_3T`t$lm{RRC+{U!Zn{T2OH{Wbk{{SEz1{Vn}%{T=;X z{XPAC{R90&{UiNj{S*CD{WJY@{R{m|{VV-z{TuyT{X6}8{XhB-`j7fg`p^0=`mg$L z`tSN5`hWF5^}n2oGtIf3bAWT8)8bT}n$zms-Z{uQ*tvsqN9Rt?e>u~g8O}^+mec06 zI~`8l>2zj0bDS<`t~1Z+cIG<^oI{*Lox_}k&f(4x&XLYh&e6^>&auvM&LZb{XR))y zS?VlvmOCq)l}?Yd%31BKaZYefbWUzvb__0FJkXXgxO z$l2g*bT&Dgoim*+&aku9Ne}R_P#K6H73yO`eO#zd2=z&!J|)zrg~|Z?tWcj5>hnU~ zDAX5(`l3)@66(uBeMP9R3iUOizAjYOd~XW%Eup?G)OUpXu2A0-DkIwmLj6#vEa*NK zDr4HGLj6prp9}R1p?)dUuY~%wP#F}y6)J`cI|yw@q3tBJe+eyJ zXcSzXlhAG!+ATu6 zRcN;f?RKHvA+$S%c9+oZ7TP^RyH{xU3GIHNJs`9Ph4zrp9v0doLVHwbj|uH@p*SIaTWfFbUB#5*$HMK@{_K=B&^-0v$+}zaC8t}I_hrF$IO)U*E)lT_eyEifW#WLZ@G;dE&XRov)91gU$H+y|E+8ex$!MZ@WwY{w+)ZW|@s0+@C7H4ny z(74z`freVj5Pvk>9&F@^CV!i+wY|2j(H{y#pIja>B$8dA(OVk|v@=%u1LWs#ZwZ8( z+FE>pm?8Vf2TEgErASF;xE{v`8^f*MP^i7tJ3aPzuY7#$W*?WP1zLUe?M*HIKuffs z`^g8h)6B_3Y`U|0b$D(=V#OTLPqL=kofDHCB$EwKp;qs0k=54{@HI6whui(ZSOM0` zN8FJ|npX5OGo*fM+kzo~`z&uu(A(G=v+_`x*0pI`IUkr6XbBURQLB!S35z#PXw;vd za`>7WTLX=)#(%xIvpqaJSQiVzqvgXRH+^_|pfS+mZ4Jl@uM38PjnjGDAFJ@=;M$uwUK3zUvu<7$glZu!x<2{<& zSu*wTG-Hw$Uc%yI`J&aUrDNK|!Rd|dcsbY_3N-NFSO(|HM~3wKNYHOQ6tm|7nS5No z$)hc)y`@cB)a-4okCttne6nzpC!1R911(0?nI)_XB{ZWA@`+)aJV6D`3QAYYIyY-S zR_&L`2lO<5=Zd9WtK`~|mebl2Y)(?WQYOkxO5_c-23i`WKc}}ewKYdee9h)kHq9mi zqbaYKDP8?&HY5b*jWXe=eiAkZS{j03X&bR1BO)q)i+pNG(o?kD+F&Cg9P|@$!3OX2 zc=Fq2@`9w~{y=l6X|AmJ_E3`BUvq)d^Wlp1#)LMzA?L*z7Fx1=Z)5y0=Th_=aS4$ZlzqLJX3L^AZv>R7b`M8PLt~&M13FnRH}4 zDYJnY3@ZL$mUP~*DdNq3!?ZBMKRGSH4ZBxh`7NUuBW#X*3 zHU(*HYHtq4)beElM?8TvsGR|>m4PEFGE}A+5lE0H9I~Ci))GzM4 z;qn=K{26*p=CSRqbDLwbqhu0WJc%*OH3qe4#$#oQ+=LXyOn|&vo0>w219tX!nKB_B z%{fEJpOmOnCd%1Vu2oLQlG0VkbO~`An@Bcz!&GxSQ|JKe2RZykOIjr#NpK^fVt9$N z#=>cWOyiDcKO+!mW_A*sB_|bfcG%JwOFLPnt%|3m-e$HnkuDOrj0tVV6wR0r$|gl& zh-cK|?QfbCDU6G>1Y)sL*FvDrZfcp49PvK+#L$#am^C~%Iep!h)63B`W|pyGm=Nli zMYk!Fw1)$7^=HfmW648OKEY%0@xlo8_5e%UXbm*Uv*ls6%mK4^ z+oYgvjj^gr)yz9KDd=o(i!t}zqya3H$rAjD`x9cjIjN+JWZL0r%^eH&?pS2>@p3UU zH!^8w8Ep)HiBr(*z2qa~6Cd%l1Y~dr8|#{k2@kdGGd6&Eo~fy~CAwzFUM8Q-Nqp9r zEU`W?2ft{QtdQvn64M3d1bl6+#%evb#EPcwk*V|gNlk>rcMh`ml}X1YCXJUG-^(uE zT;j3~LFX7-$Y-yT4-QFuFy_=W~cmm*n?& zIfTp^!Ga%gi~EgK*4 z&6B>qxmrFmDlr$i2%udh>)aAyY_q6N(z zy^G~8VraIU?nMThHl}mQBhJn8q2Zf66mOuZ2C3WRBSSZN#0-jPK1pNXoihEfP0~k4 z*HjtYBOl1$3jBN=sxQ9|H zMYf){P3cjol)Fip@O>maXw1=8_JmBiX`LChv>As!Eg#BCYwhfj2m7m6x5}+y)^V{e z>p7XAEFpm$mD-JM6!wSY+?rVxBaK(i17x6kgP}I&`q5IoAfGQxo5h-sy-st#EV3e@ zu^Ds0O?vK^scul4q-hWzi;AhR@3q=d`rhKHJ|3}QeG@AOIEu;>& z)g_FB@Aq4D*+GWqG6QaiDt{!?4(Y!f#(){`t3H*<8~Yp=dlxR`q@t%F+`&bNB?okN zv#<`a9&6|5f?A-pvftktoJU)g+rVu9@~0;JSr=-W9WBZiQhO_oqD^IgptfzgQ5AA% zlY6qpiF8!#>unO7Q|)18Drbhq7D)?xt#W%VD)yZeo7BhZK8NIH$s*?t#(u0%8p)O1-TJQdxnKKwy`mF%Xh_e}Pa_vt05;3%9)#8?$9+$%`57 zq1LA8b34fA%D4QSEJRB{cGHo8IV$ikDd5>U0cwZEX#)+cmObUz@ncS=)bMUu!)z2u zcSrE9oHHf%p*eObSG;98X;U4Gc=mf@hYmST`Ed2tJ=|K)*x?U*>!ercIpTHek}6x# z%#Fqw*{Mk#b#AFtwsqxcYiw!ah$z(5)EtYlA@cdHXyc}DWd*15Z?v`xrCN$Mxw5CX zYZ+I4maSN_w6nXQZfVCN=2wxkn#3hW&d7c|vss1aP#arwZQ&%PF;Xc-VQ>JyIeSO8eALvO=W!dczIvGXitj zY4JxNFPD$^t={CveeH4tY@_p!?Xg9l_sHkRZ6SLf9S>QD=Q3VK565$A$mY{JyFH73nga%M`AzRf+QkDI+= z{JH7y&?*)Bj!Vf3;d-uzFvhjT_RMo;%jYIFOA~oY{Ze}g(3vgXBK8eg( zAa(k$mVR_v*r|$^WKXFuuV43~V4gO~V=Z&`9g@?RMuu)_4PTMG6aUK4^VNzinr(KQ-^?00h!Hae%zSt-?~Y<2NWwZsB4zl@r?ztrkG zz1)1s618RryfMEWD8>3lE*JGzbayRay=JU~BTq+G8-{@m;pyQ(V{EuPSnAB|W8fw_ zvH{SkF}IVq2v|ua>>d(>T=fbw3KMsc?lTr{Ldy58joBUDa-m+(+_iMc0`57R6)R^1 zh}3iVD3?Z|_Q(_=rgoTA>)XsWqt+bobKfZ#tAit@Lf<+_ts`9EU}yyWUY)atagmRuOmHRfGt?(`r3V&=*Bj-G+6Zm_c ztmTAMmMnQ=D(6Be8T@;aQ9Dz}u9vcZD^NWZ?X6AioT%aL29 zN)O-buV{ptE)FDXH=Tw84gwxoD<98ZkfZjbdCMwz%bd`B>fRn zzE3J|OS|qzxiK(XZi+>#?m;QrcblgFo-844J>8rTm!4e@BId4eOzUzbjLp&BaZH+S;xuHrS zz0OSLV4g4M?>b`HKVBejn zgrG^-U@(H4g(QQ#T=~&{@O5ojl- z>zn-Yw80nsjf2Y~g*Q9j>QC4#XtY1}wl>N0FXjSVe`t;GvAV4PEQ9DYCL%o7*hFTc z6pVV@HF(=x6N@ue-0Ucs;}_e@#t(B^n|w{te#EuY-!6H=f;8qOW65g{Q<0Y8%8(gs zb_7ZCeXQh>{S7V(nCHAn6>5{Bo1NdL7Ukz>oar;|@N*l(6poftmy(+ul#(P9Mi9e# z`9p_x{xLQ`a^*n7at(YQ^|vM!23I8YE21U3oH> zwtt*UY~IAopVNNno#-6ERq%h41zSz>W};v2E49-%CG32;hRH0pwt=Sfl|1xi9TfC) zeB+bHjr7;?eLB|&nL%k&*c&-LV;{%-HDBzZ}#!ngY=j3 zcBK3vW9&C0u5nUeQn;62=PxMmF7M!@-<;sFnI!+%v!ut|HCwfMwfsqg8C!A-iO$B$ z&q(KT5hEI>#ZswhE0j{I7&l(!Pb?#{?d+#8sf>!3N%6`5NIWW4DW&{XE?UmBi+bkW~i-@ZDrAoy%t4#Mr zcNkpLr9z6zFsqfwj&*KDu}&>k$wtTKZRMymx{2%BS?UG)mT2qs8pFOiV=p&qWP_AU z(NeZv(i}IVQ;NjZzpGh_PyZ+7We}DlP{NUuD=bA*w3)3hv2lSYenrAHODfj?lVU~| zAKcZ6&7ECyrRqPbEIGay`!&(Zn*War8X38KO`P^bRokU%iiQ|-Xt;C1%I+n-biAAN zL)@BgYmvW}GETMSWe-C*-Vg5~rGuOC?3SgurNF|I(Ki132Un+*o%4@mxfUf0ACNz? z;jCF6O9Z&pCwKIsepxJY3ICtv!jC1JXY;#;*tvmgZ<#^!|5*kNGvpn}=$%#9a;g5$ zsx{F`EgWt~J+qIL-dv}#d|Cv{2@iPGq5BE~`cJ1rpEnkt> zAn{5edAhpki@Gj$?eAKpEZtBL6Diz0}j&9{JDzFK;}H+J2(z6ka*!I?2V0OkNS%tLv2~T&JxK2<DIu|cQd1LJe z;|)%(i+C#<|HMmC-W1xqvA3eRE^%GXE6QA#x_CdzTS9w#z3U3zil*@vp8u=2qD4z~ zz3ay0oDyD!#*Yz`ZH&~aS@zp`6_|_HuzZm4{xjFzu6tbf>Q143EVPe=_M!3Cv#LG0 z?lz&gxOjQze#O3`MN4`kFXb!V?3?w9`O@njGoI`&en7dHCr)2@${5!a>bu4i1&x}I}A@7m~k!S$l+CD+TYS6r{UUUR+fdc*am z>n+#Yu6JDTy54iW@A|++`9Bld7ef0=Xx|9!JE8qYXg><=XQBNnwBLpHU!naatZBkJ zKv*rpstN1%!a7)3cNErt32TP1W(liZ=K8Vg6W6D%&s?9ozHoi%`pWgS>l@d%uJ2sm zyZ+<)!S$o-C)dxeUtGVseslfq`a@WCVRZ}ZFku}ftmA~WR9HR2I#F1s32Q)D>xFfO zur>>8SXk!>>n_5&yRdc&>k?sIDy&_?+AXXrlU|ybn`XW=QTv>$Ir|swFJC-Zw6tpx zwc@XhYG>)|S_nmnSL>jwpTIN2#*Byr#}u=PRlS1S*Rv z%K1~Rue_qj>+$l5s@h6#h1Z*?#CNGhTCUK(?W5!`@ds)uOZ-LNQbhPbsK2PXvbwy8 zcgFgw%d5zyydqJFmt7l5-}g}}sVqgJyt>F=>qDuernZRhanux5`)m1-dL6C`coLOz zB1%8>QS$h_Wu;Y>o+4klKTuS`3tNl4e`a3l8TzjM5X+Q(ocPqyrn*G zZEb}gkC%8TQ@~eLUFWN&Dl6;i$|?h;b>5mprNW5PFMX7F6KzSI&s$SeS>;7Z)}5CR zY8H7aJ)WxavHbgXw=@BKhkCMk* zTJ0|>DJ$~T__3}k;4P}DDfbjr)>Kyb0zO|^ZFzN~QYfNi?W0s$URGP;tE?;HYtvr* zROTz<0(eDHIbYWE*7~Zwp2{TaW=50-^-s8Hg54uZ>3x)ZUit#uT11P(x;kH=sJ5K&^zz|^ z(m+K`9Upj4w5~Ivl-WnA#^bB;257;2{)Hw}Qe9P4&1$No|~3?DDRBz+eY4a0 z+*5N;m(Dv)So7EAo*}FSTjRWQr1Q=d)*-2!r{=DY`sYhw9UAw~hTNmlCt!HA-Y(0% zLS}uruokY%y;4|*Z%x+M%B-&w))A?)9-MniH0!U0b!0s2+sL{uA?rJH?~Yr2kFbu8 z%&T+nm+}t?>zGvX>A8mP)*GM@E+$htfs>z{Ieky-yNtX1oBe-+m1t;zboGV4EuwI)^8`FTu@&8GH~uuh0& zou`qtC!TfQpu8Q(I*)(XcAJ4j&tfwYqU6xl7x4KeT z>mpH{S1siU$myx%$Hy&Wy)ZS>8uM!N{Id3pjv$YvLNF>;FU5kwx^pVA@_3V=630fx zTJl6!fGrQw=l5et(F-bB&@SiWmKDYSk#Jv z!a6%{#Sv7kH^Gjh^Ny8Sn^AR~u+ELzaiWwzNm%EllAj)n9IGlL$K0vOJ3H@ODRz#q z&R>^zp0Mt^HMMb(%xImk?v^T}P#(Ru(J-x6VQr7waV2(?CD?II-gPqTYlXFAUEcM= zy2sXJeUr@kW?@~BD(jhfcSW-vB&-YLS>Hp}lM=GNKkvbK)(;8mo>3P*D&-#&)A}aQq6#HFR_emwz85g5ZjEcDj zy49GNn_Y^Yh?sj2Vs1Lz-c(|H#l2{gUNlSQwz(Z~F?K5Ujf&++F_*CJmrATFUNT2Q z$qL;gl+1PR;ljFVoqMFP9>8n=#McSO{?Qbv>sYpA=_)p>5(T7%OXZK-`{d~BTE3vWv$u1XWgQFn zm_=#H_|j6|oUw4H)VLe7z>7Gsy){{24!|qmhn|qe9o+7Mg3hP%=I$k3@^F!tTx~vKEpPk^cdqE*;|*PWr)2cz zQ%CwW8N$P+SPAQ01;?3^cQyFlF`%X9G=B2`VnXvM`m0{D&rR@4X<3VptEyf=fW2P zAM5jXIWP^IHo`PMW5@Kh+FEwM9OI1}T;WwceDbC(D8*{KmM+{lV&tgN^UR_y=fOGV zA3J*@8Ll5S25s}E#S7z#28}N+p$xO-yXdjZC`))n$AZq<5+!}W+Cj*bl}8J?zHAJC zuk?`6zl7G;wVZagzEb{Ubq%9Vf@c<*K3hLwOv-<6PybhAm=mtfg~q@|T|7T|N^5sl zSMS<1#j0c|Im$4lNGVgQlz=irX;F4j_E5T%eUu($rLsmjLODS>TRBg;K)Fb{Sh+;G zOu0h2Ub#)VUwKSy2~}!g`ai z-h8S1s)66QzjS{!@SB0($j%~-8O1HadYk-%`MH{*n{VH(t5z_QZy^!IBGJgrE6GIR z-c@ocvW1kbOXPfslpEbY(GY)j|02V_mw%O?4{HD8*B+*yx0=rS&HcOSm(KO>-<0LM zwstM-SXI!`TTnisvNC-yv#0%wPuD0r(xiqPf6pJF%)e5doNvij^R;|y{`UEU@(1Vd zkiVlyV{S^HbdRv!C#>wbFh_qxSRWJCCxrDWy5s@pvoUu;+SCCTu zwwQlQVM}F1rDXO=%D ze`=d?j8A{2(4#3zHVlQaPze)&-X-H5_z1p--xMX&0y{tkWPu%WAQ$ps2-HJ6EQJH% zAXoze4u!+vNMKf%c@~@l=fQ=r4lagE;4-)ZZi8PHB`Xg?upEv7(q!EWPr*Cz9(({F z!6)z;d;wpI@wiv3M^8{UQY0Uy{Yr(*zMvm+B+fPIc?2mpCI$lF2Q4)S*F z4tu~t*b^4RUO-(sD3gP_bWoR$!-2YVP(H`8a6Fs{C&P8{EPSshIzHD&0D0-?=tsd- zfDJk}=nulf@F+YE8{tKG8D53g0lW0C6~*~4aKi+c4*1a-f+oP1PJHR?gl_18Uf37* zgA?FfxDu|0YvFph0d9g@fHFBLhm&$RpM<9YJDkr0esWiSiKEBj2i z2Y5dFF?a&d$i|jzp3COBZ0aTZBluoXax~Z;2E&ekZ8;f`1$NMZwwXhH<&*$<<3<%NqriFd6VkUM=90 zyas54d9VoZLEgcz7ARBRVL*BEE(78skGRa+2(Q8W@EPEPydU9b_*GHdca546neuK)&uT;4ekV$KL!L z7!Kr-k1hF&VK2b9`O9GiU{`)G>@4^Oz5|&jJ}$t=1^Bq&cSRXu1?qVS^*m%JNQX?Yfdf3y4ESQm;cyXL z1GfSB55cA(_~-|@KI0-P$-0vFdD|fJlF>g1_6fx z=Hk=EW13n#bD^SJ}_;duZIpSWRoFkqA>Xa*q$_RWi;$?UhUWYe< zx*bUwMoxoSuo|ehkypZva2pVFBe8uXwvT)Suy5qg@C*E=D5J1zlnorUR{jj=BUMf*0T;_#S=)@){-c`2+q`l+o#s2WXGRhogrB zJ{*k?N0$IGI+}VMO+Aiogk~U*(XD`uqlux>ov;X&z}~P7x&Ysg?uJ#c2Jro8;(7EL za4}p9*TW5P6Wjv$Xf*LK`eAq!9tZlI(X`9a&%zskJ)^$?d^W}cgJ1{P39`TrI%ETO zjlpMQuw_gc;IA?GYYhGxQwP(5SRI3nV>)0tQ0_53urKTn2f&eV3>*j8Fy>@96)pm7 z8FL8`KVz&{HS5J0=A2C%mXts>&Hh`K9k zfF@`GVzX!#91O?832+i%ThZxoCY%RX!1Ztg5PwC)UlI8h-3#{v?WgDw_+C-QQwQT| zALGXYwvETO@z^$gD&X(&%@79i9gn}q&xdx{1NMPl*bj)M@dv>gI0UeHJh3(YG$5A7 z-wDsc7m8AhkBjkV@kpouY%QJ!KBxoyR*b#H)N}D1mXn856fQ!>a?6XEvN4&{}`~n{0pFtE38lq#7hPBSFs!p zgu{V)s-T`KE`s%N31C~r^>91f1=v|Zo)r(nqd`E4PDz zkO4Np)=DS1VJzVLO3GAO3RA!fwEs%txbk4Q6=-jjkHF*b6ubn~ZRHz)pDXdLhkQI5 z&>lTILMGUOygWHTU3 zG@Jsb!&!j;Jow9V3*avg{_@~2&jWzJJdXi&<-u1T%Iu+zJow8)9eF+jV#V_fe5WW? z1Ay45A||SciK=`U3d3PM;H#<%@IVbr1Z=5lggLMbRzMF>{;K_86;S>v%3gI091kbL zd2k`D2kN})a-cm`QT8f)UiAXJ46gxoT=fpT2b8y3he8+$V_+OC1hlL1M>X2jXjh|M zeHB~_|Argk2_SZ=-v;!mKZH-&f(F}z1Mo!+by`CV)!>sF zd{To?YN~)buAyFQsMi|mwWbBy0N>P5zcstT?tq_a_62-Xvl`X_KB_quPJol)R5$~u znBJpj;Cd!?Cad{te_c zk-R37*TlQv9@q#k0(Cu+x}HefPy7t<)x@viXZQpDQj|&C0rfqJGE8!S6DY$Zd^HJQ zO`;r=D95A{sDV159FrP=`kvGZvtb_0hdluwO3Si5m&w;W}qU@9YRFugI;KRvQ7!1_)WXe5x6j0X5jj$LF zg(Ki7z;}~R0Ln1=dbkxHgpYw3n*0Nh$K>DOzlt&?6YPLrrr?(;c|aah$YV+|ltCp_ z!vvTPLBK~-@X-|fG6la(A&#aHM^lyo{l%1S=!FA;a!sLJQz+Mzli&)#KU1y+>Uaum zc*AH+3x>4aWhRQ_-AyKA<-hy{Y(nDt1r31MY_V z03S@n|5IOq*WgWf2i}K|;8XYlzJ_lVWts+sPzv?17|w-j;4z@yrV)G7J^|`&+E*Z- zqpz9v6a13pQ~bpiF^TM7Ha0dN}72l+O@WpE`>2H$n?IJ^tk z){f(9Pmf|weWAa32ucu zfHKwJ2gGpwBS8JsKLyXiMj#gJv8^84>andJ+v-1rPvCQ)9_y*cdg`&BdaS1&>;Hhi z6eYMF(8mO+(;#&kq)vm>X^=V%>W~9@PyoYV1dN7pPz+^I3DqzWrhpgxFdcS=255#b z%!0WvAKGCL=!C_vH!KJ0Hb~tD_XFxSco3|GL*WQG8jgb#;S@L>&VqA+It;D@VjxHi z1c`y*HE=!L2)DrPa2MPQ#9EM83qA%+lx53m?G8@ELpw-@y0qBm4rt z!=H+>a~cc;4F9JDVHAvo@lXmCPz4iUGE4&>)IktJ&;%{e26JE+ z*bO>hAuNKuU>U4{9@rOF!D?6ohrr>AGUE^UOHo4Gfd#BUJcM=v;vqylgouX_@em>& zLc~LecnA>>A>tuKJcNjc5b+Qq9zw)JhARa=?fp`cJ4&Lc~Le zcnA>>A>tuKJcNjc5b+Qq9zw)Jh~DESvx*!)b6PoCD{>MQ|}( z3Rl3@a2?zLH^XgkC)@+~!$a^WJONL`bMOMZ46nhP@D98WAHk>a1$+(P!4L2={09G3 zltu*xfC}5g4)8C?1Uopv1#TDug)kDvz&NOZi7*Ac&<)t%DBv(S5{Qk)2Z4BKd<>q1 zKNY2EFi?k0)L|2K*hF14H30r^!v9V9zv&pjUrlGjd2k_MZ_~SgjZN6tgpJJwPz1$L z29>Z691LsWP&fkag{R;dcphFb-?}Z@CD_yX8Ij06qrdKTH|IqX7Sgu_s&t zlq0+n_Jaf9ARsQn_%lo_gr9(?;V(sL#g^8cAOmbr5BRZlHq3)v;dEFJ8{jgy65fK( z;Y+}#*6$UiZ9Gu7ZIfXd_~39j1x|xA0ejkrxi-q)_62+m-zmy0Vq{hYcz_t0H3_JX zS=7fY>SGr5F^l?`bw5xSvz`O$brx|vo3hWQ9%dK7Fc<-pefA<)0!yI_E`b~1Cb$*u z0Bo53GyDqF%WQlyhnSc{{&T38IbQI?{(voWj)Y_2c(@0i1bjJ%^30(;bMfU|>SS&n zP@cJzXYPEU9CP=E<$zstuZO#V_?r6wP&aeQdmi;M4~=>Mucf<;^0IE*1$++(f+8UT zN=r9GrxGUEt%Rf?-AH$L_b@Qz5JSz7L)Q#3bPv)X(jbkvk7w`wu64Zche!Xv^E$8V zo)3HNwH`CovX5F{;TM)agTb@ejwr*$oGms$+X9F_S-Gg51>h;%@WJHEvvyh!1(Z#R7@jJTxbq0|v zCW;kY;5K)8z@s3jR~R|!>7<@c>Q$vXGSsu%dUjiH4E9p*0Ealri6E%|8ku;9tmHr^ z^_w6^eL3p4#&=TRoz-8>I%4s@%7O+-NJa{(pw|ZW+~6C&M~()*xdxM&Mi~1z#Tov@ zTn)2Ph$6Vzh9&WS!!C5ACw+*)EDd+C8{Ia19t4fN-^e_T-oUOK)j+R}ex^2d+$fwS z=(CYN8=0xmJzfSuW3x1NCykR+iBGA?7krHl8_V99_oVE}9N!3U<*nj9DB;j;8j|^fK3i;CDHGFGeV(D2p7wcc&+P z=+7qh;=X@3)9*)upqX7X%YfTzmYHnmu~{wZP>+V_u-QuNq1hVN? zW1r1G<4fFDb8|E|M{{#DH%D`GG?%@(9W?*nZ#?2@5VY{`w(#$^@b9+p@3!#owiwDJ z{QE7YGZXn+oW@RD=%R(4v`kMI%(Jlu zolo#hwE7X>Su0(%nn(n5@tw6=#Gl;Y7I!gEYxmUpLq5hltv_cFj*cQW81Z$JD8`# zG~8AP`{-bX4))Q(J~})If{wWf#Vj4mP#$x1G)G5sbTmgtztu60W1QeLXM>gZKX^Kw*l}jLvkSJH3b{p1mY+C& z?0S_4=%VWro(DlUyXf{FRjAHKbY&3s&}}$6>1Kv*$2rLv{tSZdI_RDc9dy@0cO7*9 zolg8gH+r&;UBsb>?t18vj5jfV5A*lP%vbofdzhhz8G7iW$8;9r`|hz6^Ym~}J)Yqn zd$`A*`s`T-`FnndzZX5-X3x>gU?%$LITw5Ed6V1RIWsY9v=w*&x{{}&Cx76DndfRDlGxhdO^sa?jde@^NQ<;xhdM_plbM!Vx zZ*%lEM;~+asldm4%4d9u9DPP&o<8H4hzxy>ae~vF4T8RU?3)Mk^espcblJBBt!Rt6 z`ucm>HySt5*Gzq5xq+MLD^FiD89V4#5ncAHfg9^*KmBCsCrdwB`pMEymVSGXqu(hK z(Q$vb-9I}y@vZikslP1!W$72D_kLP$z--1&fN=wiUv ze8-PWWj;C`uo#^V_?yQ(MXv+&IV&KP^WuRFG4qzI6T?0QgX-ou>@`T;v0WVS)AX-7x?KwpFUGl(G!M}LDR;k`ji@%w|evx|84 zaRA@iAm7@cKRM4Ot^~p0fc%u9E=|zq;O=;1u(<|LU^3<#Y`($f8XU!cB-33cxzZK zerF8sX4qVovk|=y)BCV}=zW;{!}LB(@53&j_hDE0i+lVV1jAF1f$W%VcpmIzxEY6g zZ@AfpSD+H_qtoFv_>Ma0a(H`mIb4^+bve8jgBiw1d}G7MVVA?*@b-ut z6rl{|@zw}$ji`nmM|{E8e9I5m=Lm0(F#m`Jn03TSE^-rnj@08wf15{|Z=^m)>T_f! zGLsE&j?9I5M;675BR{}9BY(kcBkR$S-)K!cI?|c0n04eNbU$)053t8k$w^OEyfex> zqw-RK61dG#zHlS9q#jxmq9Q(gjew9=#-ds zbUt)8x;Fh8!4&2Z#R{TX!+N%}3-66K$LItOatb#y`Yul~+vxv-V2p0Z=yptM((x7< zd50{Nr7kTP&kW|Xidf7xW*a++;}AzVfj7q_@+a4LfH}vSYpi$1+TmC`9BYSTb5anu zGqyOo9a|djkNpPsICc?oy{QG=@oa29`Da~m`TRPB# z-t@zp;|DVoZ;m&|cwJ49al&ipWkMc`5=trbFrfm~k$=Lc)Z`1k;%9!tdlP!1s|kL8 zf_s@T8sF>$GftSvZ02B(6Be=pGfptqgd-$!j*DF3FYfUVkJ0Od7rYFDiLa6lw=%H+ zC9t=N<*3Med`t~K=S#jp{}b!b1eqtwJaG^*Pn3D0%oAmvDDy;_C(1lg=85x>dEyE- zU>_3?ahkLEz9zc!iC4LU?`xv(Yogo}pCR`o{Z4uxc_wwl+mq~L(ip<<#-vD=u#A;> zYtkmRvYlPT;q6I(qN7RPne;LUCfnoWSJ2I5`<$E}cQW}M^fWm;?tOAW>~?Zx^fUQe z{7sx}my>JrD@}1rlikwfHnd0P$@-bR8uL%SiMOXD#dkc#8&llRl>8LJ9ZhjZQ{2xK zZ%wH}H9q8H8Zd-OY+^U&nsNqnO}U5NPtoBN9ZvZ-2&N_{C8_Y{)O470YB9_(wGqRa zz)ThrgWsR3!>Mvl_0H5i9N{>p@aEJ%vB#;`c@PBC0=zZNThr3;CK<@iyO?!aJ_=Hp z(!57azT-!J!M#nZ$M3YDHEwTO2RhLUJxm+ROct<+r7UL^v24cQylG~bW`=3;9Oh4C zp7x0Uf?#?Ql97Vfc?-8UJu_L!f&A0$Xu8bP-{&*F=O=1Wm-;lLC2nAPJ37*t-VA3V z5iBN(6-2X!Ex6g~ZgzScd)bf9r|Wt84W0zSj1XSoRbJx_GU9G$$U7rD^3KRj5z14Y zuW++7-0X~BX+UFIq2C$$ouS_uUFb%C#xR|Q$T~yT8M4k;&qidOq1PGvNZ=4hNaQLH zc!8e7^c<$=Fg=H*<1O?YCU=~~rqdzkEDzPGUM z3}GDM$Q-8UFg=IK9wvL3%wc*C({tEP;@E@CVKRqZ;XcoK83Z$RJyX{+bv-jJ>CyGf zx5+{_-1N*)-s59x@HzUP`7O24_e_1yY(x{}pV^M?3`FLc)0xR^=CXk0tYS55*?<{l z?n367=eWs3p70#G!{rWl8{uvvT<-8U$$-AYb5ax?hkt;~;WCHI94>SC&(ucd@cPIc zuJdr;VR(1s4VO23I`W3g8!m6Syy5bO%Ns6lxV+&TkT+c3@I&Z0{5toMIb7!O=g2%u z$FpRfCG)H_$UMu9%qouk&vL7?Mlcckon^nXV%Wr1cCZ`!oTZyt$2r9r{=_#l%iFUa z1%b%HZ12p@i2IwJl^o=vFvW0(vrAEy@>JtX+~I6HoZW`@bfOF08NgtMA?xhXjAa@+ zn!N(w&TO5`-hw-vt((~gILt9la2j3Bc8{}f^Ee11UP0yv`;17B>=Cj@$Q+TE0u;h- zBXkxabA<0c!d@d}j%bKIM!3BQ-%f;mM*KlHdeWPIm?2^$lZjv%Yq84+T}S9TVh8&< zh^`~#jyQ?j5tq2dvmlt0l;or&6=`^zEMzAqxsiWPRhpvDIbqCaCAykpr*phB=QyX( z%^bHs=Pz!cqd9kZz(ZaJ!Q9tyKXczjFLU)WHD($*=OaF$Cc2vY0}W_NS9CIW zAVV0=D0DM-8gkAJM^AI@ckX7c@=p-Vb5rxoHP0^QRm2a2YyYDC@#aY-KyU(DA}UoZ$-hk$0iIk@7~$8~G~oM#>wR5qTrCkd1tVQjt&i z8vRD#!5uHkPJZ0QqH4H{Mebse+>7L1B=;hBv8W+( zFVgcOcdN`cd=+FlL#k*c`Rfx(X7E8FN$R|vM<`han5s#M?6LDMgIlCV!0Q; zPHN;{tn0-Y(e>g|)Ix`gb+vdZb6ARZ7VBlPUKYo*j{}@UKa2mwn~N`T1%DG4KM8^* z-dmCezrQ34dRg)=c_>OK-d$3L^4RZ^5BLguUDAX$*y9qtEa^gb1~3@k&XN&~W-QZ~ z%L-&(;+t9Gn^_|J64{p=;4sHH!D$kadC47gwKO?tc#{mszEt+5GB35$rG+R$aY`Wb z(ogu7dgyPd8(ivpS=x?{^rR2{8ORW1Upk&y*y+->*x}M0>}C)9vCpNakaMY?mtH{6 zOKZxC2y3RQF2D%29#Jyw5M_aM>tUvl;I#v&UtAf7vbW@_t}g! z{QmNf_>|B1l5fz>^19TgA-|!k<+@tljlt+-`FJKVl^M)qA$GcaDa%=ju9olQFlVsK z<+@oe`|@kZzFhX@vM;yS<$7BFZxF1|)rz;U(-nm%N+_i$OBJePh83Sslh65qdNiXm zz3In5hG4HNCNP<4$i5<+*(_oeTkyTF*vA26U*X$XA^Qs1SIEA?URPY_2LA-X$`DfV z4!Oun0SZ$LdtF(P_mF+1>?=Ry3u@DZ4)j3gl`^lCd8N!N$0GAenOEw2rOYd5vVaw= zXEz5q!f{TK$QAxV&Xu>&_saX|c~vsfl8t;6qzLX~RY@x023J+Xx3lVFKE<7^l6lqd zw4)<`;67IMWDr9cfxBHL|ElrGy($tNuhQ|Vcyzo<$E$R_O2?~oyh_KbbiC>+*O7gd zj-!*1nk?iYKW-!1ZA80`=n7OuztJ*B>o;2F=&z7Bx(Pat?tzY@bsVkZXdOq(7_H-I z9Y^apTGnVCN9#Cx1sjOt5Jx$|Y0e^Nw4Bj5xy?Nu@FECeQj(sW6hyx<`i;?VOd0eW zBWsMTF|x+g;4{AGSDN9DW8{sIH%8tVd1HnnZ;ZS#(~vhNoY}bJnAL1YzcKoa(Qk}? zV@{&q82!dv<2rK3$Q|=I2v&!Xig(CGUJ6i{Vw9sI?s&DHS64^&)%6&JOsiwriFa4K z!`1p(eTVxz#CN{>c@V65g;#kEZ>~v0Ix>@+BG~B~Z>;%Si&+^63rUcv5mbPMMrD?#y7LZH?zh**F56CAXuA(WXQf&_O-IF z%|I?>UMut3>d3rS=Cv}fm3ghqYh_+5^IDnLHbmyNGOv|+Z9hgch3UAzwX>PaQkJud z7}l~LJ6^jV-~8H3+(g%Fb-h;CYjwTOPS@#roxJN(BJaA?WJ1sDicyIV`GlH$!Popk z9pqit0D0Fnp$$D5#&{+%6?eEUoP{hV3c1(Gy-x0R2YDO>>-D$3C}sHo{j9Hz-(TO9 z=CqKe6N9$h%!3Ldd zc#{mgO%}3~pF+sFp*STe&3n|~JL=Pnmgr?jUB-#CNmqmj9r7CWAz-X=U6?*?&AQ5If|ZRWskkcO&$fo z#-yYo4R50Bjk@0WE_u-PM%gzOp%~?;hHq!%&orPhO>r9=-NwewxQ&fH=tW=pGXi(9 zaX!mfiLN)UWdpk2sOyco-nb9hHy*-mY`n}Zo&~`snKvaTC9-dleUr?a+{dQu=zCLc z@*?x5^7!UAeaSa`&rj5%5lv`D3tHp0H_5-rcfZMPY?{Js=CXiAEM+z8h-DL7*^ca+ zj-%&IcX+~c+{fk+Uf~VWk{+FJmVa|*$+4>6& zX+saZvvmmev2_$YaMRN_NEp(e6#`-*R}C)9 zIEMGOU&rrn|1Su3Btb7b+|iELaYs8ck(sRIz~x1-cKF72zRGL3y`5>%&rUga z%DFQadB{&e>~`n-)Zj;C-6`u%S$F%l+)C#)o`@H+Ox`m;6KnTH~!<-rCiZKJ;el@o!kRs@6 zudep$Xm3q)vbR2sXhJh|vsX8J-QZq-6ZZC`5AyCE&P2jlLJVu!z$Uh`hyBRA_b|se z!Fg_>n|*e;&kpyc#ovW}8F`0XnvAVxEV zc|@^-Xx6Zv?d-x%_vw0{uJ_5l?-ZA~%Tw%fpIz=xLNZd5j<=A1zx?~NkcW~~rUveB z{}23(?E8O3_WiQ&mwkU5+S3tT?;p$r+{OM`%)uS*k7Ok}->>uivhUxBJK66}_8;af zfAavhv0v`}a_^TrAqB4^cY@v%^q!D`?C3k81n=_+HTil6 z1DO+KPLMf4<^-7&WKNJdLFNRR6J$=1IYH(GnG;S2!2#dJfi#q(D&9TtJq^&$0sS0k zO9wjB8+UkMAl^JMj1f#E0ylYJ9oyK6UJlsl0Xse51`qu2O&uLL$3-r4i)TS_FgZFo zn3WvlA}_i*sGEbOk@H{$Dx<4|x;pp`b&>a=oCoDR*cH7Tl=t8ehBJyWj7Q#sGg(M9 zzMF%4*v~mgYW$$IDx_t5d- zS4fTT}mQy0@dJIKyB3%`NT*!7+O} zR+_R@z>bb}q95Km=B;C6nSfh4=5N3;e*=!`{+Pc3$CeO<-#?y$ax|qQf8hR(_r(1j z_nXHj5zbr|un50#d>xzEid`O$XCLnH_#yOu{C*Ie$Vd+C?nDV>KjF<2a-Xon6Lxsw z13u?>+9AscSx$6i7-l&!nQ4S!rV}SPk6upv!(-g_iGPFO6<$#$0_%7${VM2 zdTIpreabg*YC5u?vWHU(vC~rzf*|pA2fNwBehzYkF)%l1|`HV05hVS`_TGXXJjc7tMTGEF0bfOF0=|x`#FqmPC zWDMh(#8hSwP6YE<$YP>cK{RVv&qlVeon6GUj{_X$7$-S{qW-+VWv=lzx46p#9`TeH z{1*i0l8}rPyiRJ;@fMlLOg3_on|u_cFs0Gwxu0o(e$MIOoY~I}Viu8@>)atuWAEpl z1;P2Gc=vp9%2N@&p4aF3j!a_?x;gJ&&byQIX1ZYC7wq|hOc(6&g8g0i5c|2{-@niT zJzvo8g_&$74tIFrFYcj-i+L%AySP{j*)RTvJzUiP#Z`FkqV6u<34%*`a7UNqz4R@$ zsmnk{VZWE`?2=tw^5&)6xZg{b zmp4A8CiQ8CEH?&Vo*Q;^V=aE;hTYsa!)31WZxGx}P736>8A?e$=LdemOgHs<(|&F) zU^y$<%TbQw)@}tPp)wy~rdzG~gRb}nBR?a@oqp)%&Jto+!(ZIP zjoeMkJLvcB`j4d-1G0>vzL2g znZ^wEqrZD*xaThK`}gjrME?8!z5DXt|DL+k!~FOC`}fDQkzK@bi$^>Of(JP%NMXLf z><`TTpaVVV#XO?0%LjJw;396~pESHpW-9UlcKJ^my3h@?|6}%lmU0;P^v~HKc$kz_ zq{baRtUx9FI}iIakR6!$;Q?-AXAhqS!K2(1p%@<`_oJ^Ez(_{38sEYrcl=1+M>n_? z1dshqd7K?{KbH5g+kN~c?eO+vGd~VvJ`350zXy*`1i_O6==h1h15Y}knxE&S$FzxmW}K9%FC{+~Vxf@j4kPepn%h#~l`XU91i1kW>L=I43& zmfFX@Pd~?@UMCPt<3xM#oyF_N3b39 z|C|Z}SaidRYelcn z7lb6wNkPn%yfuH|pH04;b(kmlzd^{W$w|SF)T06Bebs;ds(DkSA_F>1QHw_CF-0{0 z`_IjqLU$>XVb+vi@iYF}l=E4JSyTQOguLdR*Iq*huhph5b6JXi?)89_yiP+}(2DJt z>GgylBvnRo@Gk!IR2}KeevWf82zetvp_HT-gBgl{<_-VM8~&Np{+ZPNnbiK7)Sd9p zrS8KCbe;NQ5R&F&%#-FD%#g;u(%4s8out)CTAifTSK8*ZL~m*JmR2w6^qMXW>G+BI zm?_;nqOgZ_kAn~=9r9)pKH^KhW)k7d<|=o%7lfpDo9W-93ih3TB%?7;`U_kNLf*=S zoxfES`+ln*{@J$A=&kuUC-I|oZata_dD7BPWHW+(|^}bNRE6I zrvyD2#1Q1kAx{o@a(;-sIn9DF|21JTiC_{^pjhMxldz`+!wjRH68{bdCZ)r2o>;t9`EPT zQyz2V@qV5!ad&xsryU*n1NWY17$X_OcqVa>Q(WZ+de7r#@;u@x?ktbK^JX9y-|-{A zP=|UnME`lcnYRV4@pfKs=k<2pZrE|&KDd{>gBZ#PMx!VH{W&3d-EQ7^_MwZszRSGF zILR6QhQg^xgPSb;4KfsV zFNJ?$6w{HR@GRzFw}r1DLt*G0QZzmJ2&EKdC`$z@Q-iv+MfXL`UDR7ehcO!2i@J-V<}bQ~vpfhw zin)bi_E5|ois_)34vM+8VukQdF>e&}MzKoROR?|xfgkyWIy9pNtubRU?-ny-u>lNb zDD#M71<|Z#F9{sP+{KP^g3DaxI*-spF+CLfF9<1~gjaZjw4^5k@)j?O?u&;advV!| zf51n4irmG2rZ&IQfJXGjtrZ{6D8?Xf@r5j6F|rqzz4#`!V0XpkE`EgLoFb7waZ{l> z4b^F=PD5WOC%MUsJ%$#f2)Yf`ZRq=a#+Q7<_xyy8L+vuO7dj2qY3LxPGZVMyzt<%s zbS?|fZK!TT*RhLu+*YXD3ia)T>NxZ+Ptj?pPD_N4k$1>KR&wB$OX#yi2})Cq5BY?e ze8E?=pd)|KjUJ3;0+X1G@3(|+r-VLBEMXb3Y{s`(VkdFzL8m2jTH+LEkhjDG9`Xp; zOUPbQw(E0MpX{3Q>d-;&4hccG-*C4FNhuX3H6+zvuYxr2>bEkEEUO0}d7?PyOY{EaI$5Z_y=Vd%V+&P(aMlp85Ehk3Z;QY(mN zHG4_GEtfjPQBH7~Yy6GBN2Tnb)cqi&bZT^5Iy2djxpZmDQGtr+yR^PbyN}YcmzKS> zeoO1O^l$u*n1C`$#?mpYWdm`zkJ9@&jebj?=Ms7@{TKK6hsU^+ zGV+#5M|$2u_A;`U$xlIwAa|L{RG~T_;l|5+&3CwyGCw14nYOg21D)y0Ak0x_1fwxe znF;8=jPA?mzKrh6tY;&e*}`^qafIWXB9U`kK=);Cq5CrTgOIYX@)~ZY>>H%TTxD~T zn|zq5teMId!%oUp#6HTJt?c*w#4psMF7+{2S#y;&Q&}^WHB;H{3}7(BFk4xFXUfiH zJ_}gHQp{D>TxHEv)=Xv1RMxJ_nyKtr%u)6^FN2VB{??Rx1+$bhOF46tGebY z%uuc{W++#J(wL=O1u9`b<-VpFeQ-PFWGUx6EO&-$K}dNWmG_(F?Yz8h%7^0LFK^G~ zby41)%ln=3U-AvQDX*LIdMRHAzg^yqmTyfv%w2v3t60rC%v2!-=BQwf3g)O#gCB7( z6>9S<@>PgHXBFhEptB0@yMo)U;I=F1uY&F>?B*b+xXKM~bB{+n{GTd@q~sYF#i;A1}J2h3Tq9u4`8miW6;(S29!NM|D1fjw4~siG_u|KTyu z_%{gg{}dNeDG6zirP4cOB?tK^h?}frpOxgQ^b3R0Wu;i$OeJ$yI>BkYRp~tTSm|$W zaTnh}C7oCDX62-$B@>y+Mo#imh@upy1QmIYntX#@`|qa-sa%T&G^Q!d(Lv=-^k5(( zgOK;V`~E}pUd3Hi(RmebR`FJq(v-s+RlHF}&sFqXMbA~f<44R}Mb}kyT}9VbbX~=J zRYtIaGeJnzWTZxaRrOXi7rue2CGq=JKjIU<#_v|Ozp7@aS|53_~AJuhKy)sp(j^C)>hkod~`Vf2%)pxR+J?sxcKG4kvnaE16;Q#*5 XD@p#}|IJbL|NYy)`Ijk literal 0 HcmV?d00001 diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme new file mode 100644 index 0000000..eb82964 --- /dev/null +++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..e6d52de --- /dev/null +++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Modest.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 0E465AB51CFC4BC500CA7D65 + + primary + + + + + diff --git a/devel/osx/Modest/main.c b/devel/osx/Modest/main.c new file mode 100644 index 0000000..2760505 --- /dev/null +++ b/devel/osx/Modest/main.c @@ -0,0 +1,188 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/myhtml.h" +#include "mycss/mycss.h" +#include "mycss/declaration/init.h" +#include "modest/finder/finder.h" + +struct res_data { + char *data; + size_t size; +}; + +struct res_data load_data(const char* filename) +{ + FILE *f = fopen(filename, "rb"); + fseek(f, 0L, SEEK_END); + + long l = ftell(f); + fseek(f, 0L, SEEK_SET); + + char *html = (char*)myhtml_malloc(l); + fread(html, 1, l, f); + + fclose(f); + + struct res_data res = {html, (size_t)l}; + return res; +} + +myhtml_tree_t * myhtml(const char* data, size_t data_size, bool is_file, bool print_result) +{ + setbuf(stdout, NULL); + + myhtml_t* myhtml = myhtml_create(); + myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); + + uint64_t all_start = myhtml_hperf_clock(NULL); + uint64_t tree_init_start = myhtml_hperf_clock(NULL); + + myhtml_tree_t* tree = myhtml_tree_create(); + myhtml_tree_init(tree, myhtml); + + uint64_t tree_init_stop = myhtml_hperf_clock(NULL); + uint64_t parse_start = myhtml_hperf_clock(NULL); + + if(is_file) { + struct res_data res = load_data(data); + myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.data, res.size); + free(res.data); + } + else { + myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + } + + uint64_t parse_stop = myhtml_hperf_clock(NULL); + uint64_t all_stop = myhtml_hperf_clock(NULL); + + if(print_result) { + myhtml_tree_print_node_children(tree, tree->document, stdout, 0); + + printf("\n\nMyHTML Information:\n"); + printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); + myhtml_hperf_print("\tFirst Tree init", tree_init_start, tree_init_stop, stdout); + myhtml_hperf_print("\tParse html", parse_start, parse_stop, stdout); + myhtml_hperf_print("\tTotal", all_start, all_stop, stdout); + printf("\n"); + } + + //myhtml_tree_destroy(tree); + //myhtml_destroy(myhtml); + + return tree; +} + +mycss_entry_t * mycss(const char* data, size_t data_size, bool is_file, bool print_result) +{ + // base init + mycss_t *mycss = mycss_create(); + mycss_status_t status = mycss_init(mycss); + + // currenr entry work init + mycss_entry_t *entry = mycss_entry_create(); + status = mycss_entry_init(mycss, entry); + + uint64_t parse_start = myhtml_hperf_clock(NULL); + + if(is_file) { + struct res_data res = load_data(data); + mycss_parse(entry, MyHTML_ENCODING_UTF_8, res.data, res.size); + free(res.data); + } + else { + mycss_parse(entry, MyHTML_ENCODING_UTF_8, data, data_size); + } + + uint64_t parse_stop = myhtml_hperf_clock(NULL); + + if(print_result) { + printf("\n"); + mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(entry); + mycss_selectors_print_list(entry->selectors, stylesheet->sel_list_first, stdout); + + printf("\n------------\nMyCSS Information:\n"); + printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); + myhtml_hperf_print("\tParse css", parse_start, parse_stop, stdout); + } + + //mycss_entry_destroy(entry, true); + //mycss_destroy(mycss, true); + + return entry; +} + +int main(int argc, const char * argv[]) { + setbuf(stdout, NULL); + + char *html = "sdsd

"; + //char *html = "/new/C-git/test_full.html"; + char *css = "img {width: auto\\9; height: auto; max-width: 100%; -ms-interpolation-mode: bicubic;}"; + char *selector = "html|fff >> div"; + + myhtml_tree_t *myhtml_tree = myhtml(html, strlen(html), false, true); + mycss_entry_t *mycss_entry = mycss(css, strlen(css), false, true); + + mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(mycss_entry); + + /* simple api */ + uint64_t parse_simple_start = myhtml_hperf_clock(NULL); + +// mycss_status_t out_status; +// modest_finder_t *finder = modest_finder_create_simple(myhtml_tree, NULL); +// +// mycss_selectors_list_t *list = mycss_selectors_parse(mycss_entry->selectors, MyHTML_ENCODING_UTF_8, selector, strlen(selector), &out_status); +// myhtml_collection_t *collection = modest_finder_by_selectors_list(finder, list, myhtml_tree->node_html, NULL); +// + uint64_t parse_simple_stop = myhtml_hperf_clock(NULL); +// +// printf("\nPrint simple result:\n"); +// for(size_t i = 0; i < collection->length; i++) { +// myhtml_tree_print_node(myhtml_tree, collection->list[i], stdout); +// } +// +// finder = modest_finder_destroy(finder, true); + + /* full api */ + uint64_t parse_start = myhtml_hperf_clock(NULL); + + myhtml_collection_t* full_collection = NULL; + modest_finder_t *finder_full = modest_finder_by_stylesheet(myhtml_tree, stylesheet, &full_collection, NULL, NULL); + + uint64_t parse_stop = myhtml_hperf_clock(NULL); + + printf("\n\n------------\nInformation:\n"); + printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); + myhtml_hperf_print("\tFound selectors", parse_start, parse_stop, stdout); + myhtml_hperf_print("\tParse and Found Simple selectors", parse_simple_start, parse_simple_stop, stdout); + printf("\n"); + + printf("\nPrint result:\n"); + for(size_t i = 0; i < full_collection->length; i++) { + myhtml_tree_print_node(myhtml_tree, full_collection->list[i], stdout); + } + + printf("\n"); + + modest_finder_destroy(finder_full, true); + + return 0; +} + diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..dab68ae --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,32 @@ +TARGET := examples +SRCDIR := examples + +CC ?= gcc +LIBS := ../lib/libmodest_static.a +LDLIBS := $(LIBS) + +INCLUDE_TMP := include + +MODEST_OPTIMIZATION_LEVEL ?= -O2 + +CFLAGS ?= -Wall -Werror +CFLAGS += $(MODEST_OPTIMIZATION_LEVEL) -fPIC --std=c99 -I../include + +find_files_h = $(wildcard $(dir)/*.h) +find_files_c = $(wildcard $(dir)/*.c) + +SUBDIRS := selectors +HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) +SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) + +OBJS := $(patsubst %.c,%,$(SRCS)) + +all: $(TARGET) + +$(TARGET): $(OBJS) + cp -r $(OBJS) ../bin/ + +clean: + rm -f $(OBJS) + +.PHONY: all \ No newline at end of file diff --git a/examples/selectors/selectors_low_level.c b/examples/selectors/selectors_low_level.c new file mode 100644 index 0000000..ee23d7f --- /dev/null +++ b/examples/selectors/selectors_low_level.c @@ -0,0 +1,101 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include +#include + +#include +#include +#include +#include + +myhtml_tree_t * parse_html(const char* data, size_t data_size) +{ + myhtml_t* myhtml = myhtml_create(); + myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); + + myhtml_tree_t* tree = myhtml_tree_create(); + myhtml_tree_init(tree, myhtml); + + myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + + return tree; +} + +mycss_entry_t * create_css_parser(void) +{ + // base init + mycss_t *mycss = mycss_create(); + mycss_status_t status = mycss_init(mycss); + + // currenr entry work init + mycss_entry_t *entry = mycss_entry_create(); + status = mycss_entry_init(mycss, entry); + + return entry; +} + +int main(int argc, const char * argv[]) +{ + const char *html = "

"; + const char *selector = "div > :nth-child(2n+1):not(:has(a))"; + + myhtml_tree_t *html_tree = parse_html(html, strlen(html)); + mycss_entry_t *css_entry = create_css_parser(); + + mycss_status_t out_status; + modest_finder_t *finder = modest_finder_create_simple(html_tree, NULL); + + mycss_selectors_list_t *list = mycss_selectors_parse(css_entry->selectors, MyHTML_ENCODING_UTF_8, selector, strlen(selector), &out_status); + myhtml_collection_t *collection = modest_finder_by_selectors_list(finder, list, html_tree->node_html, NULL); + + /* destroy Modest finder */ + modest_finder_destroy(finder, true); + + /* print result */ + fprintf(stdout, "HTML Tree:\n"); + myhtml_tree_print_node_children(html_tree, html_tree->document, stdout, 0); + fprintf(stdout, "\n"); + + fprintf(stdout, "Selector:\n\t"); + mycss_selectors_print_list(css_entry->selectors, list, stdout); + fprintf(stdout, "\n"); + + printf("\nFound result:\n"); + for(size_t i = 0; i < collection->length; i++) { + fprintf(stdout, "\t"); + myhtml_tree_print_node(html_tree, collection->list[i], stdout); + } + fprintf(stdout, "\n"); + + // destroy all + mycss_t *mycss = css_entry->mycss; + mycss_entry_destroy(css_entry, true); + mycss_destroy(mycss, true); + + myhtml_t* myhtml = html_tree->myhtml; + myhtml_tree_destroy(html_tree); + myhtml_destroy(myhtml); + + return 0; +} + + diff --git a/include/modest/finder/finder.h b/include/modest/finder/finder.h new file mode 100644 index 0000000..1afb525 --- /dev/null +++ b/include/modest/finder/finder.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_FINDER_H +#define MODEST_FINDER_FINDER_H +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +//extern "C" { +#endif + +typedef bool (*modest_finder_selector_type_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); + +/* init */ +modest_finder_t * modest_finder_create(void); +modest_status_t modest_finder_init(modest_finder_t* finder, myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet); +void modest_finder_clean(modest_finder_t* finder); +modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destroy); + +/* simple api */ +modest_finder_t * modest_finder_create_simple(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet); + +/* callbacks */ +void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); + +/* base api */ +void modest_finder_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list); +myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, myhtml_tree_node_t* base_node, myhtml_collection_t* collection); + +/* process */ +myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_FINDER_H */ diff --git a/include/modest/finder/match.h b/include/modest/finder/match.h new file mode 100644 index 0000000..4300292 --- /dev/null +++ b/include/modest/finder/match.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_MATCH_H +#define MODEST_FINDER_MATCH_H +#pragma once + +#include +#include + +#ifdef __cplusplus +//extern "C" { +#endif + +bool modest_finder_match_attribute_only_key(myhtml_token_attr_t* attr, const char* key, size_t key_len); +bool modest_finder_match_attribute_eq(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_ws(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_begin(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_end(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_sub(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_hsp(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_MATCH_H */ diff --git a/include/modest/finder/myosi.h b/include/modest/finder/myosi.h new file mode 100644 index 0000000..0207f62 --- /dev/null +++ b/include/modest/finder/myosi.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_MYOSI_H +#define MODEST_FINDER_MYOSI_H +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +//extern "C" { +#endif + +struct modest_finder typedef modest_finder_t; + +typedef void (*modest_finder_callback_f)(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +typedef bool (*modest_finder_match_f)(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); + +struct modest_finder { + myhtml_tree_t* tree; + mycss_stylesheet_t* stylesheet; + + modest_finder_callback_f callback_found; + void* callback_found_ctx; +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_MYOSI_H */ diff --git a/include/modest/finder/pseudo_class.h b/include/modest/finder/pseudo_class.h new file mode 100644 index 0000000..e6eb6d0 --- /dev/null +++ b/include/modest/finder/pseudo_class.h @@ -0,0 +1,92 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_PSEUDO_CLASS_H +#define MODEST_FINDER_PSEUDO_CLASS_H +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +//extern "C" { +#endif + +bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); + +/* classes */ +bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_PSEUDO_CLASS_H */ diff --git a/include/modest/finder/resource.h b/include/modest/finder/resource.h new file mode 100644 index 0000000..839914a --- /dev/null +++ b/include/modest/finder/resource.h @@ -0,0 +1,125 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_RESOURCE_H +#define MODEST_FINDER_RESOURCE_H +#pragma once + +/* see enum mycss_selectors_type (mycss_selectors_type_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_type_f modest_finder_static_selector_type_map[MyCSS_SELECTORS_TYPE_LAST_ENTRY] = +{ + modest_finder_selector_type_undef, /* MyCSS_SELECTORS_TYPE_UNDEF */ + modest_finder_selector_type_element, /* MyCSS_SELECTORS_TYPE_ELEMENT */ + modest_finder_selector_type_id, /* MyCSS_SELECTORS_TYPE_ID */ + modest_finder_selector_type_class, /* MyCSS_SELECTORS_TYPE_CLASS */ + modest_finder_selector_type_attribute, /* MyCSS_SELECTORS_TYPE_ATTRIBUTE */ + modest_finder_selector_type_pseudo_class_function, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION */ + modest_finder_selector_type_pseudo_class, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS */ + modest_finder_selector_type_pseudo_element_function, /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION */ + modest_finder_selector_type_pseudo_element /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT */ +}; + +/* see enum mycss_selectors_sub_type (mycss_selectors_sub_type_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_type_f modest_finder_static_selector_sub_type_pseudo_class_function_map[MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY] = +{ + modest_finder_selector_sub_type_pseudo_class_function_undef, /* UNDEF */ + modest_finder_selector_sub_type_pseudo_class_function_undef, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_UNKNOWN */ + modest_finder_selector_sub_type_pseudo_class_function_current, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT */ + modest_finder_selector_sub_type_pseudo_class_function_dir, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR */ + modest_finder_selector_sub_type_pseudo_class_function_drop, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP */ + modest_finder_selector_sub_type_pseudo_class_function_has, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS */ + modest_finder_selector_sub_type_pseudo_class_function_lang, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG */ + modest_finder_selector_sub_type_pseudo_class_function_matches, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES */ + modest_finder_selector_sub_type_pseudo_class_function_not, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT */ + modest_finder_selector_sub_type_pseudo_class_function_nth_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD */ + modest_finder_selector_sub_type_pseudo_class_function_nth_column, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN */ + modest_finder_selector_sub_type_pseudo_class_function_nth_last_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD */ + modest_finder_selector_sub_type_pseudo_class_function_nth_last_column, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN */ + modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_function_nth_of_type /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE */ + +}; + +/* see enum mycss_selectors_sub_type (mycss_selectors_sub_type_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_type_f modest_finder_static_selector_sub_type_pseudo_class_map[MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_ENTRY] = +{ + modest_finder_selector_sub_type_pseudo_class_undef, /* UNDEF */ + modest_finder_selector_sub_type_pseudo_class_undef, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNKNOWN */ + modest_finder_selector_sub_type_pseudo_class_active, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ACTIVE */ + modest_finder_selector_sub_type_pseudo_class_any_link, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ANY_LINK */ + modest_finder_selector_sub_type_pseudo_class_blank, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_BLANK */ + modest_finder_selector_sub_type_pseudo_class_checked, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CHECKED */ + modest_finder_selector_sub_type_pseudo_class_current, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CURRENT */ + modest_finder_selector_sub_type_pseudo_class_default, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DEFAULT */ + modest_finder_selector_sub_type_pseudo_class_disabled, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DISABLED */ + modest_finder_selector_sub_type_pseudo_class_drop, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DROP */ + modest_finder_selector_sub_type_pseudo_class_empty, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_EMPTY */ + modest_finder_selector_sub_type_pseudo_class_enabled, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ENABLED */ + modest_finder_selector_sub_type_pseudo_class_first_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_CHILD */ + modest_finder_selector_sub_type_pseudo_class_first_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_focus, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FOCUS */ + modest_finder_selector_sub_type_pseudo_class_future, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUTURE */ + modest_finder_selector_sub_type_pseudo_class_hover, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_HOVER */ + modest_finder_selector_sub_type_pseudo_class_in_range, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_IN_RANGE */ + modest_finder_selector_sub_type_pseudo_class_indeterminate, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INDETERMINATE */ + modest_finder_selector_sub_type_pseudo_class_invalid, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INVALID */ + modest_finder_selector_sub_type_pseudo_class_last_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_CHILD */ + modest_finder_selector_sub_type_pseudo_class_last_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_link, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LINK */ + modest_finder_selector_sub_type_pseudo_class_only_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_CHILD */ + modest_finder_selector_sub_type_pseudo_class_only_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_optional, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OPTIONAL */ + modest_finder_selector_sub_type_pseudo_class_out_of_range, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OUT_OF_RANGE */ + modest_finder_selector_sub_type_pseudo_class_past, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PAST */ + modest_finder_selector_sub_type_pseudo_class_placeholder_shown, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PLACEHOLDER_SHOWN */ + modest_finder_selector_sub_type_pseudo_class_read_only, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_ONLY */ + modest_finder_selector_sub_type_pseudo_class_read_write, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_WRITE */ + modest_finder_selector_sub_type_pseudo_class_required, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_REQUIRED */ + modest_finder_selector_sub_type_pseudo_class_root, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ROOT */ + modest_finder_selector_sub_type_pseudo_class_scope, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_SCOPE */ + modest_finder_selector_sub_type_pseudo_class_target, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_TARGET */ + modest_finder_selector_sub_type_pseudo_class_user_error, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_USER_ERROR */ + modest_finder_selector_sub_type_pseudo_class_valid, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VALID */ + modest_finder_selector_sub_type_pseudo_class_visited /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VISITED */ +}; + +/* see enum mycss_selectors_combinator (mycss_selectors_combinator_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_combinator_f modest_finder_static_selector_combinator_map[MyCSS_SELECTORS_COMBINATOR_LAST_ENTRY] = +{ + modest_finder_node_combinator_undef, /* MyCSS_SELECTORS_COMBINATOR_UNDEF */ + modest_finder_node_combinator_descendant, /* MyCSS_SELECTORS_COMBINATOR_DESCENDANT */ + modest_finder_node_combinator_child, /* MyCSS_SELECTORS_COMBINATOR_CHILD */ + modest_finder_node_combinator_next_sibling, /* MyCSS_SELECTORS_COMBINATOR_NEXT_SIBLING */ + modest_finder_node_combinator_following_sibling, /* MyCSS_SELECTORS_COMBINATOR_FOLLOWING_SIBLING */ + modest_finder_node_combinator_column /* MyCSS_SELECTORS_COMBINATOR_COLUMN */ +}; + +/* see enum mycss_selectors_match (mycss_selectors_match_t) on mycss/selectors/myosi.h */ +static const modest_finder_match_f modest_finder_static_selector_match_map[MyCSS_SELECTORS_MATCH_LAST_ENTRY] = +{ + modest_finder_match_attribute_eq, /* MyCSS_SELECTORS_MATCH_EQUAL */ + modest_finder_match_attribute_ws, /* MyCSS_SELECTORS_MATCH_INCLUDE */ + modest_finder_match_attribute_hsp, /* MyCSS_SELECTORS_MATCH_DASH */ + modest_finder_match_attribute_begin, /* MyCSS_SELECTORS_MATCH_PREFIX */ + modest_finder_match_attribute_end, /* MyCSS_SELECTORS_MATCH_SUFFIX */ + modest_finder_match_attribute_sub /* MyCSS_SELECTORS_MATCH_SUBSTRING */ +}; + +#endif /* MODEST_FINDER_RESOURCE_H */ diff --git a/include/modest/finder/type.h b/include/modest/finder/type.h new file mode 100644 index 0000000..38e87e6 --- /dev/null +++ b/include/modest/finder/type.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_TYPE_H +#define MODEST_FINDER_TYPE_H +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +//extern "C" { +#endif + +bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_TYPE_H */ diff --git a/include/modest/myosi.h b/include/modest/myosi.h new file mode 100644 index 0000000..89c830e --- /dev/null +++ b/include/modest/myosi.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_MYOSI_H +#define MODEST_MYOSI_H +#pragma once + +#ifdef __cplusplus +//extern "C" { +#endif + +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum modest_status { + MODEST_STATUS_OK = 0x000000, + MODEST_STATUS_ERROR_MEMORY_ALLOCATION = 0x020000 +} +typedef modest_status_t; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_MYOSI_H */ diff --git a/include/mycss/an_plus_b.h b/include/mycss/an_plus_b.h new file mode 100644 index 0000000..8e3df84 --- /dev/null +++ b/include/mycss/an_plus_b.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_AN_PLUS_B_H +#define MyHTML_MyCSS_AN_PLUS_B_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define mycss_an_plus_b_current_entry(entry) (*entry->anb->entry) + +struct mycss_an_plus_b { + mycss_an_plus_b_entry_t** entry; +}; + +struct mycss_an_plus_b_entry { + long a; + long b; + long n; + + bool is_broken; + mycss_selectors_list_t* of; +}; + +mycss_an_plus_b_t * mycss_an_plus_b_create(void); +mycss_status_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb); +mycss_status_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb); +mycss_an_plus_b_t * mycss_an_plus_b_destroy(mycss_an_plus_b_t* anb, bool self_destroy); + +mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_create(mycss_entry_t* entry); +void mycss_an_plus_b_entry_clean_all(mycss_an_plus_b_entry_t* anb_entry); +mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_destroy(mycss_entry_t* entry, mycss_an_plus_b_entry_t* anb_entry, bool self_destroy); + +void mycss_an_plus_b_print(mycss_an_plus_b_entry_t* anb_entry, FILE* fh); + +void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry); + +bool mycss_an_plus_b_state_anb_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus_n_hyphen(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus_n(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus_n_plus(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_AN_PLUS_B_H */ diff --git a/include/mycss/api.h b/include/mycss/api.h new file mode 100644 index 0000000..09df493 --- /dev/null +++ b/include/mycss/api.h @@ -0,0 +1,524 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCSS_MyCSS_API_H +#define MyCSS_MyCSS_API_H +#pragma once + +/** + * @file mycss/api.h + * + * Fast C/C++ CSS Parser (Cascading Style Sheets). Using threads. + * + * C99 and POSIX Threads! + * This is part of big project. + * All projects (and this too) is based on myhtml (https://github.com/lexborisov/myhtml) + * + * By https://www.w3.org/TR/css-syntax-3/ specification. + * + */ + +#define MyCSS_VERSION_MAJOR 0 +#define MyCSS_VERSION_MINOR 0 +#define MyCSS_VERSION_PATCH 9 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @struct mycss statuses + */ +// base +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum mycss_status { + MyCSS_STATUS_OK = 0x000000, + MyCSS_STATUS_ERROR_MEMORY_ALLOCATION = 0x010001, + MyCSS_STATUS_ERROR_TOKENIZER_STATE_ALLOCATION = 0x010020, + MyCSS_STATUS_ERROR_TOKENIZER_INCOMING_BUFFER_ADD = 0x010021, + MyCSS_STATUS_ERROR_TOKENIZER_TOKEN_ALLOCATION = 0x010022, + MyCSS_STATUS_ERROR_INCOMING_BUFFER_INIT = 0x010030, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_CREATE = 0x010039, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_INIT = 0x010040, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_INCOMING_BUFFER_INIT = 0x010041, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_NODE_ADD = 0x010042, + MyCSS_STATUS_ERROR_SELECTORS_CREATE = 0x010100, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_CREATE = 0x010101, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_INIT = 0x010102, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_NODE_ADD = 0x010103, + MyCSS_STATUS_ERROR_SELECTORS_LIST_CREATE = 0x010104, + MyCSS_STATUS_ERROR_SELECTORS_LIST_INIT = 0x010105, + MyCSS_STATUS_ERROR_SELECTORS_LIST_ADD_NODE = 0x010106, + MyCSS_STATUS_ERROR_NAMESPACE_CREATE = 0x010200, + MyCSS_STATUS_ERROR_NAMESPACE_INIT = 0x010201, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_CREATE = 0x010202, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_INIT = 0x010203, + MyCSS_STATUS_ERROR_NAMESPACE_NODE_ADD = 0x010204, + MyCSS_STATUS_ERROR_MEDIA_CREATE = 0x010404, + MyCSS_STATUS_ERROR_STRING_CREATE = 0x010501, + MyCSS_STATUS_ERROR_STRING_INIT = 0x010502, + MyCSS_STATUS_ERROR_STRING_NODE_INIT = 0x010503, + MyCSS_STATUS_ERROR_AN_PLUS_B_CREATE = 0x010600, + MyCSS_STATUS_ERROR_AN_PLUS_B_INIT = 0x010601, + MyCSS_STATUS_ERROR_DECLARATION_CREATE = 0x010700, + MyCSS_STATUS_ERROR_DECLARATION_INIT = 0x010701, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_CREATE = 0x010702, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_INIT = 0x010703, + MyCSS_STATUS_ERROR_PARSER_LIST_CREATE = 0x010800 +} +typedef mycss_status_t; + +#define MyCSS_FAILED(_status_) ((_status_) != MyCSS_STATUS_OK) + +/** + * Tokenizer Token types + */ +enum mycss_token_type { + MyCSS_TOKEN_TYPE_UNDEF = 0x0000, + MyCSS_TOKEN_TYPE_WHITESPACE = 0x0001, + MyCSS_TOKEN_TYPE_IDENT = 0x0002, + MyCSS_TOKEN_TYPE_FUNCTION = 0x0003, + MyCSS_TOKEN_TYPE_AT_KEYWORD = 0x0004, + MyCSS_TOKEN_TYPE_HASH = 0x0005, + MyCSS_TOKEN_TYPE_STRING = 0x0006, + MyCSS_TOKEN_TYPE_URL = 0x0007, + MyCSS_TOKEN_TYPE_NUMBER = 0x0008, + MyCSS_TOKEN_TYPE_DIMENSION = 0x0009, + MyCSS_TOKEN_TYPE_PERCENTAGE = 0x000a, + MyCSS_TOKEN_TYPE_INCLUDE_MATCH = 0x000b, + MyCSS_TOKEN_TYPE_DASH_MATCH = 0x000c, + MyCSS_TOKEN_TYPE_PREFIX_MATCH = 0x000d, + MyCSS_TOKEN_TYPE_SUFFIX_MATCH = 0x000e, + MyCSS_TOKEN_TYPE_SUBSTRING_MATCH = 0x000f, + MyCSS_TOKEN_TYPE_COLUMN = 0x0010, + MyCSS_TOKEN_TYPE_CDO = 0x0011, + MyCSS_TOKEN_TYPE_CDC = 0x0012, + MyCSS_TOKEN_TYPE_BAD_STRING = 0x0013, + MyCSS_TOKEN_TYPE_DELIM = 0x0014, + MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS = 0x0015, + MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS = 0x0016, + MyCSS_TOKEN_TYPE_COMMA = 0x0017, + MyCSS_TOKEN_TYPE_COLON = 0x0018, + MyCSS_TOKEN_TYPE_SEMICOLON = 0x0019, + MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET = 0x001a, + MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET = 0x001b, + MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET = 0x001c, + MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET = 0x001d, + MyCSS_TOKEN_TYPE_BAD_URL = 0x001e, + MyCSS_TOKEN_TYPE_COMMENT = 0x001f, + MyCSS_TOKEN_TYPE_UNICODE_RANGE = 0x0020, + MyCSS_TOKEN_TYPE_EOF = 0x0021, + MyCSS_TOKEN_TYPE_LAST_ENTRY = 0x0022 +} +typedef mycss_token_type_t; + +/** + * @struct mycss_t MyCSS + * + * Basic structure. Create once for using many times. +*/ +typedef struct mycss mycss_t; + +/** + * @struct mycss_entry_t MyCSS_ENTRY + * + * Secondary structure. Create once for using many times. + */ +typedef struct mycss_entry mycss_entry_t; + +/** + * @struct mycss_token_t MyCSS_TOKEN + * + * Tokenizer data structure. + */ +typedef struct mycss_token mycss_token_t; + +/** + * @struct mycss_token_done_callback_f + * + * Callback for token is ready + */ +typedef mycss_token_t* +(*mycss_token_ready_callback_f)(mycss_entry_t* entry, mycss_token_t* token); + +/*********************************************************************************** + * + * MyCSS + * + ***********************************************************************************/ + +/** + * Create a MyCSS structure + * + * @return mycss_t* if successful, otherwise an NULL value. + */ +mycss_t* +mycss_create(void); + +/** + * Allocating and Initialization resources for a MyCSS structure + * + * @param[in] mycss_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status value. + */ +mycss_status_t +mycss_init(mycss_t* mycss); + +/** + * Destroy of a MyCSS structure + * + * @param[in] mycss_t* + * @param[in] call free() function for mycss_t* object? true or false + * + * @return NULL if successful, otherwise an MyCSS structure. + */ +mycss_t* +mycss_destroy(mycss_t* mycss, bool self_destroy); + +/** + * Parsing CSS + * + * @param[in] previously created structure mycss_entry_t* + * @param[in] Now is not working! Coming Soon. Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] CSS data + * @param[in] CSS data size + * + * All input character encoding decode to utf-8 + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status + */ +mycss_status_t +mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); + +/** + * Parsing CSS chunk. For End Parsing call mycss_parse_chunk_end function + * + * @param[in] previously created structure mycss_entry_t* + * @param[in] CSS data + * @param[in] CSS data size + * + * All input character encoding decode to utf-8 + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status + */ +mycss_status_t +mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); + +/** + * End of parsing CSS chunks + * + * @param[in] mycss_entry_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status + */ +mycss_status_t +mycss_parse_chunk_end(mycss_entry_t* entry); + +/*********************************************************************************** + * + * MyCSS_ENTRY + * + ***********************************************************************************/ + +/** + * Create a MyCSS_ENTRY structure + * + * @return mycss_entry_t* if successful, otherwise an NULL value. + */ +mycss_entry_t* +mycss_entry_create(void); + +/** + * Allocating and Initialization resources for a MyCSS_ENTRY structure + * + * @param[in] mycss_t* + * @param[in] mycss_entry_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status value. + */ +mycss_status_t +mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); + +/** + * Clear all structures + * + * @param[in] mycss_entry_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status value. + */ +mycss_status_t +mycss_entry_clean_all(mycss_entry_t* entry); + +/** + * Destroy of a MyCSS_ENTRY structure + * + * @param[in] mycss_entry_t* + * @param[in] call free() function for mycss_entry_t* object? true or false + * + * @return NULL if successful, otherwise an MyCSS_ENTRY structure. + */ +mycss_entry_t* +mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy); + +/** + * Set or Get current callback function for token is ready + * + * @param[in] mycss_entry_t* + * @param[in] mycss_token_ready_callback_f + * function which will be returned when the token is ready + * or NULL for only return current function + * + * @example_function + * mycss_token_t * your_name_callback(mycss_entry_t* entry, mycss_token_t* token) { + * return token; + * } + * + * @example See tokenizer_high_level.c in examples directory + * + * @return mycss_token_ready_callback_f structure + */ +mycss_token_ready_callback_f +mycss_entry_token_ready_callback(mycss_entry_t* entry, + mycss_token_ready_callback_f callback_f); + +/** + * Get tokens count + * + * @param[in] mycss_entry_t* + * + * @return count of token + */ +size_t +mycss_entry_token_count(mycss_entry_t* entry); + +/** + * Get current Incoming Buffer + * See MyHTML_INCOMING in https://github.com/lexborisov/myhtml + * + * @param[in] mycss_entry_t* + * + * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + */ +myhtml_incoming_buffer_t* +mycss_entry_incoming_buffer_current(mycss_entry_t* entry); + +/** + * Get first Incoming Buffer from list + * See MyHTML_INCOMING in https://github.com/lexborisov/myhtml + * + * @param[in] mycss_entry_t* + * + * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + */ +myhtml_incoming_buffer_t* +mycss_entry_incoming_buffer_first(mycss_entry_t* entry); + +/*********************************************************************************** + * + * MyCSS_TOKEN + * + ***********************************************************************************/ + +/** + * Get begin position of Token + * + * @param[in] mycss_token_t* + * + * @return size_t, begin position for token + */ +size_t +mycss_token_begin(mycss_token_t* token); + +/** + * Get length of Token + * + * @param[in] mycss_token_t* + * + * @return size_t, length of token + */ +size_t +mycss_token_length(mycss_token_t* token); + +/** + * Get begin position and length for Token + * + * @param[in] mycss_token_t* + * @param[out] size_t*, optional, token length + * + * @return size_t, begin position for token + */ +size_t +mycss_token_position(mycss_token_t* token, size_t *return_length); + +/** + * Get Token type + * + * @param[in] mycss_token_t* + * + * @return mycss_token_type_t + */ +mycss_token_type_t +mycss_token_type(mycss_token_t* token); + +/** + * Get Token name by Token type + * + * @param[in] mycss_token_type_t + * + * @return token name terminated with a null character ('\0') + */ +const char* +mycss_token_name_by_type(mycss_token_type_t type); + +/** + * Converting raw token data (your input const char*) + * to strict string as required by the specification + * + * @param[in] mycss_entry_t* + * @param[in] mycss_token_t*, token from which data will be obtained + * @param[in] myhtml_string_t*, a pointer to the row in which the data will be written + * @param[in] initialization myhtml_string_t* object + * + * @return length of processed data + */ +size_t +mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, + myhtml_string_t* str, bool init_string); + +/*********************************************************************************** + * + * MyCSS_ENCODING + * + * @description It is inherited from the main project MyHTML + * See https://github.com/lexborisov/myhtml + * + ***********************************************************************************/ + +/** + * Set character encoding for input stream + * + * @param[in] mycss_entry_t* + * @param[in] Input character encoding. + * See https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h + * myhtml_encoding_t + * + */ +void +mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); + +/** + * Get character encoding for current stream + * + * @param[in] mycss_entry_t* + * + * @return myhtml_encoding_t + */ +myhtml_encoding_t +mycss_encoding_get(mycss_entry_t* entry); + +/** + * Get encoding from @charset "..."; + * + * See for information: + * https://www.w3.org/TR/css-syntax-3/#get-an-encoding + * https://www.w3.org/TR/css-syntax-3/#charset-rule + * myhtml_encoding_by_name in https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h + * + * If @charset rule is missing or encoding not found return MyHTML_ENCODING_UTF_8 by default + * + * @param[in] css data stream + * @param[in] css data stream size + * + * @return myhtml_encoding_t + */ +myhtml_encoding_t +mycss_encoding_check_charset_rule(const char* css, size_t size); + +/*********************************************************************************** + * + * MyCSS_CONVERT + * + * @description It is inherited from the main project MyHTML + * See https://github.com/lexborisov/myhtml + * + ***********************************************************************************/ + +/** + * Convert data to double number + * + * @param[in] data to convert + * @param[in] data size + * @param[out] converting result + * @param[out] is integer or float + * + * @return length of data converting + */ +size_t +mycss_convert_data_to_double(const char* data, size_t size, double* return_num, bool* is_float); + +/** + * Convert data to unicode range code point + * See https://www.w3.org/TR/css-syntax-3/#unicode-range-token-diagram + * See https://www.w3.org/TR/css-syntax-3/#consume-a-unicode-range-token + * + * @param[in] data to convert + * @param[in] data size + * @param[out] start range converting result + * @param[out] end range converting result + * + * @return length of data converting + */ +size_t +mycss_convert_unicode_range_to_codepoint(const char *data, size_t size, size_t *start, size_t *end); + +/** + * Convert hex data to code point + * + * @param[in] data to convert + * @param[in] data size + * @param[out] result codepoint + * @param[in] how much length can be consumed + * + * @return length of data converting + */ +size_t +mycss_convert_hex_to_codepoint(const char *data, size_t size, size_t *codepoint, unsigned int max_consumed); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCSS_MyCSS_API_H */ diff --git a/include/mycss/check.h b/include/mycss/check.h new file mode 100644 index 0000000..2f8f39c --- /dev/null +++ b/include/mycss/check.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_CHECK_H +#define MyHTML_MyCSS_CHECK_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +bool mycss_check_three_code_points_would_start_identifier(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +bool mycss_check_two_code_points_valid_escape(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +bool mycss_check_three_code_points_would_start_number(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_CHECK_H */ diff --git a/include/mycss/convert.h b/include/mycss/convert.h new file mode 100644 index 0000000..49e72d6 --- /dev/null +++ b/include/mycss/convert.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_CONVERT_H +#define MyHTML_MyCSS_CONVERT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +const char * mycss_convert_split_dimension_string(myhtml_string_t* str, double* value, bool* is_float); + +size_t mycss_convert_data_to_integer(const char* data, size_t size, long* return_num); +size_t mycss_convert_data_to_double(const char *data, size_t size, double *return_num, bool* is_float); +size_t mycss_convert_unicode_range_to_codepoint(const char *data, size_t size, size_t *start, size_t *end); +size_t mycss_convert_hex_to_codepoint(const char *data, size_t size, size_t *codepoint, unsigned int max_consumed); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_CONVERT_H */ diff --git a/include/mycss/declaration/entry.h b/include/mycss/declaration/entry.h new file mode 100644 index 0000000..1b97569 --- /dev/null +++ b/include/mycss/declaration/entry.h @@ -0,0 +1,53 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_ENTRY_H +#define MyHTML_MyCSS_DECLARATION_ENTRY_H +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); +void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); +void mycss_declaration_entry_destroy(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); + +mycss_declaration_entry_t * mycss_declaration_entry(mycss_declaration_t* declaration); +mycss_declaration_entry_t * mycss_declaration_entry_last(mycss_declaration_t* declaration); + +void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); +void mycss_declaration_entry_remove(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); +mycss_declaration_entry_t * mycss_declaration_entry_delete(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); + +void mycss_declaration_entry_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry, FILE* fh); +void mycss_declaration_entries_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* first_dec_entry, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_ENTRY_H */ + diff --git a/include/mycss/declaration/init.h b/include/mycss/declaration/init.h new file mode 100644 index 0000000..448290e --- /dev/null +++ b/include/mycss/declaration/init.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_INIT_H +#define MyHTML_MyCSS_DECLARATION_INIT_H +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +mycss_declaration_t * mycss_declaration_create(void); +mycss_status_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration); +void mycss_declaration_clean_all(mycss_declaration_t* declaration); +void mycss_declaration_clean(mycss_declaration_t* declaration); +mycss_declaration_t * mycss_declaration_destroy(mycss_declaration_t* declaration, bool self_destroy); + +void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); + +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); +void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); + +mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); + +mycss_token_type_t mycss_declaration_ending_token_type(mycss_declaration_t* declaration); +void mycss_declaration_ending_token_type_set(mycss_declaration_t* declaration, mycss_token_type_t ending_token_type); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_INIT_H */ + diff --git a/include/mycss/declaration/myosi.h b/include/mycss/declaration/myosi.h new file mode 100644 index 0000000..2ca870d --- /dev/null +++ b/include/mycss/declaration/myosi.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_MYOSI_H +#define MyHTML_MyCSS_DECLARATION_MYOSI_H +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycss_declaration_entry mycss_declaration_entry_t; +typedef struct mycss_declaration mycss_declaration_t; + +typedef void (*mycss_callback_declaration_destroy_f)(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry); + +enum mycss_declaration_flags { + MyCSS_DECLARATION_FLAGS_UNDEF = 0x00, + MyCSS_DECLARATION_FLAGS_BAD = 0x01 +} +typedef mycss_declaration_flags_t; + +struct mycss_declaration { + mycss_entry_t* ref_entry; + + mycss_declaration_entry_t** entry; + mycss_declaration_entry_t* entry_last; + + mycss_token_type_t ending_token; + + mcobject_t* mcobject_entries; /* for a dec entries */ + mcobject_t* mcobject_list; /* for a dec list */ +}; + +struct mycss_declaration_entry { + mycss_property_type_t type; + + unsigned int value_type; + void* value; + + bool is_important; + mycss_declaration_flags_t flags; + + mycss_declaration_entry_t* next; + mycss_declaration_entry_t* prev; +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_MYOSI_H */ diff --git a/include/mycss/declaration/parser.h b/include/mycss/declaration/parser.h new file mode 100644 index 0000000..ab4e4c2 --- /dev/null +++ b/include/mycss/declaration/parser.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_PARSER_H +#define MyHTML_MyCSS_DECLARATION_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +void mycss_declaration_parser_begin(mycss_entry_t* entry, mycss_token_t* token); +void mycss_declaration_parser_ident(mycss_entry_t* entry, mycss_token_t* token); +void mycss_declaration_parser_end(mycss_entry_t* entry, mycss_token_t* token); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_PARSER_H */ diff --git a/include/mycss/declaration/state.h b/include/mycss/declaration/state.h new file mode 100644 index 0000000..4616196 --- /dev/null +++ b/include/mycss/declaration/state.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_DECLARATION_H +#define MyHTML_MyCSS_DECLARATION_DECLARATION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +bool mycss_declaration_state_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_declaration_state_data(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_colon_before_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_colon_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_colon_delim_after_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_find_ending(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_parse_error(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_DECLARATION_H */ diff --git a/include/mycss/entry.h b/include/mycss/entry.h new file mode 100644 index 0000000..37f94a3 --- /dev/null +++ b/include/mycss/entry.h @@ -0,0 +1,157 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_ENTRY_H +#define MyHTML_MyCSS_ENTRY_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct mycss_entry_parser_list_entry { + mycss_parser_token_f parser; + mycss_parser_token_f parser_switch; + mycss_token_type_t ending_token; + + bool is_local; +} +typedef mycss_entry_parser_list_entry_t; + +struct mycss_entry_parser_list { + mycss_entry_parser_list_entry_t* list; + size_t size; + size_t length; +} +typedef mycss_entry_parser_list_t; + +struct mycss_entry { + /* refs */ + mycss_t* mycss; + mycss_token_t* token; + mycss_stylesheet_t* stylesheet; + + /* objects and memory for css modules */ + mchar_async_t* mchar; + size_t mchar_node_id; + size_t mchar_value_node_id; + + mcobject_t* mcobject_string_entries; + + /* css modules */ + mycss_namespace_t* ns; + mycss_selectors_t* selectors; + mycss_an_plus_b_t* anb; + mycss_media_t* media; +// mycss_rules_t* rules; + mycss_declaration_t* declaration; + void** values; + + /* incoming buffer */ + mcobject_t* mcobject_incoming_buffer; + myhtml_incoming_buffer_t* first_buffer; + myhtml_incoming_buffer_t* current_buffer; + + /* options */ + mycss_entry_type_t type; + myhtml_encoding_t encoding; + + /* tokenizer */ + mycss_tokenizer_state_t state; + mycss_tokenizer_state_t state_back; + + /* parser */ + mycss_entry_parser_list_t* parser_list; + mycss_parser_token_f parser; + mycss_parser_token_f parser_switch; + mycss_parser_token_f parser_error; + mycss_parser_token_f parser_original; + mycss_token_type_t parser_ending_token; + + /* callbacks */ + mycss_token_ready_callback_f token_ready_callback; + mycss_callback_selector_done_f callback_selector_done; + + /* helpers */ + size_t token_counter; + size_t help_counter; +}; + +mycss_entry_t * mycss_entry_create(void); +mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); +mycss_status_t mycss_entry_clean(mycss_entry_t* entry); +mycss_status_t mycss_entry_clean_all(mycss_entry_t* entry); +mycss_entry_t * mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy); + +void mycss_entry_end(mycss_entry_t* entry); + +mycss_token_ready_callback_f mycss_entry_token_ready_callback(mycss_entry_t* entry, mycss_token_ready_callback_f callback_f); + +size_t mycss_entry_token_count(mycss_entry_t* entry); +myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry); +myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry); + +myhtml_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size); + +mycss_stylesheet_t * mycss_entry_stylesheet(mycss_entry_t* entry); +mycss_selectors_list_t * mycss_entry_current_selectors_list(mycss_entry_t* entry); + +void mycss_entry_parser_set(mycss_entry_t* entry, mycss_parser_token_f parser); +void mycss_entry_parser_switch_set(mycss_entry_t* entry, mycss_parser_token_f parser_switch); +void mycss_entry_parser_original_set(mycss_entry_t* entry, mycss_parser_token_f parser_original); + +/* parser list */ +mycss_entry_parser_list_t * mycss_entry_parser_list_create_and_init(size_t size); +void mycss_entry_parser_list_clean(mycss_entry_parser_list_t* parser_list); +mycss_entry_parser_list_t * mycss_entry_parser_list_destroy(mycss_entry_parser_list_t* parser_list, bool self_destroy); + +mycss_status_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, + mycss_parser_token_f parser_switch, mycss_token_type_t ending_token, + bool is_local); + +void mycss_entry_parser_list_pop(mycss_entry_t* entry); +size_t mycss_entry_parser_list_length(mycss_entry_t* entry); +mycss_token_type_t mycss_entry_parser_list_current_ending_token_type(mycss_entry_t* entry); +mycss_parser_token_f mycss_entry_parser_list_current_parser(mycss_entry_t* entry); +mycss_parser_token_f mycss_entry_parser_list_current_parser_switch(mycss_entry_t* entry); +bool mycss_entry_parser_list_current_is_local(mycss_entry_t* entry); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_ENTRY_H */ diff --git a/include/mycss/media/init.h b/include/mycss/media/init.h new file mode 100644 index 0000000..78c6915 --- /dev/null +++ b/include/mycss/media/init.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MEDIA_INIT_H +#define MyHTML_MyCSS_MEDIA_INIT_H +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +mycss_media_t * mycss_media_create(void); +mycss_status_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media); +mycss_status_t mycss_media_clean_all(mycss_media_t* media); +mycss_media_t * mycss_media_destroy(mycss_media_t* media, bool self_destroy); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MEDIA_INIT_H */ diff --git a/include/mycss/media/myosi.h b/include/mycss/media/myosi.h new file mode 100644 index 0000000..ef45cc3 --- /dev/null +++ b/include/mycss/media/myosi.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MEDIA_MYOSI_H +#define MyHTML_MyCSS_MEDIA_MYOSI_H +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycss_media mycss_media_t; + + +struct mycss_media { +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MEDIA_MYOSI_H */ diff --git a/include/mycss/media/state.h b/include/mycss/media/state.h new file mode 100644 index 0000000..29a4f87 --- /dev/null +++ b/include/mycss/media/state.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MEDIA_STATE_H +#define MyHTML_MyCSS_MEDIA_STATE_H +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +bool mycss_media_state_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MEDIA_STATE_H */ diff --git a/include/mycss/mycss.h b/include/mycss/mycss.h new file mode 100644 index 0000000..46a34bf --- /dev/null +++ b/include/mycss/mycss.h @@ -0,0 +1,79 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MYCSS_H +#define MyHTML_MyCSS_MYCSS_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef MyCSS_DEBUG + #define MyCSS_DEBUG_MESSAGE(format, ...) \ + myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) +#else + #define MyCSS_DEBUG_MESSAGE(format, ...) +#endif + +#ifdef DEBUG_MODE +#define MyHTML_DEBUG_ERROR(format, ...) \ +myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) +#else +#define MyHTML_DEBUG_ERROR(format, ...) +#endif + +#include +#include +#include +#include +#include + +struct mycss { + mycss_tokenizer_state_f* parse_state_func; +}; + +mycss_t * mycss_create(void); +mycss_status_t mycss_init(mycss_t* mycss); +mycss_t * mycss_destroy(mycss_t* mycss, bool self_destroy); + +mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); +mycss_status_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); +mycss_status_t mycss_parse_chunk_end(mycss_entry_t* entry); + +size_t mycss_token_begin(mycss_token_t* token); +size_t mycss_token_length(mycss_token_t* token); +size_t mycss_token_position(mycss_token_t* token, size_t *return_length); +mycss_token_type_t mycss_token_type(mycss_token_t* token); +const char * mycss_token_name_by_type(mycss_token_type_t type); +size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str, bool init_string, bool case_insensitive); + +myhtml_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token); + +// encoding +void mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); +myhtml_encoding_t mycss_encoding_get(mycss_entry_t* entry); +myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/include/mycss/myosi.h b/include/mycss/myosi.h new file mode 100644 index 0000000..a1a306d --- /dev/null +++ b/include/mycss/myosi.h @@ -0,0 +1,281 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MYOSI_H +#define MyHTML_MyCSS_MYOSI_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum mycss_status { + MyCSS_STATUS_OK = 0x000000, + MyCSS_STATUS_ERROR_MEMORY_ALLOCATION = 0x010001, + MyCSS_STATUS_ERROR_TOKENIZER_STATE_ALLOCATION = 0x010020, + MyCSS_STATUS_ERROR_TOKENIZER_INCOMING_BUFFER_ADD = 0x010021, + MyCSS_STATUS_ERROR_TOKENIZER_TOKEN_ALLOCATION = 0x010022, + MyCSS_STATUS_ERROR_INCOMING_BUFFER_INIT = 0x010030, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_CREATE = 0x010039, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_INIT = 0x010040, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_INCOMING_BUFFER_INIT = 0x010041, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_NODE_ADD = 0x010042, + MyCSS_STATUS_ERROR_SELECTORS_CREATE = 0x010100, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_CREATE = 0x010101, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_INIT = 0x010102, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_NODE_ADD = 0x010103, + MyCSS_STATUS_ERROR_SELECTORS_LIST_CREATE = 0x010104, + MyCSS_STATUS_ERROR_SELECTORS_LIST_INIT = 0x010105, + MyCSS_STATUS_ERROR_SELECTORS_LIST_ADD_NODE = 0x010106, + MyCSS_STATUS_ERROR_NAMESPACE_CREATE = 0x010200, + MyCSS_STATUS_ERROR_NAMESPACE_INIT = 0x010201, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_CREATE = 0x010202, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_INIT = 0x010203, + MyCSS_STATUS_ERROR_NAMESPACE_NODE_ADD = 0x010204, + MyCSS_STATUS_ERROR_MEDIA_CREATE = 0x010404, + MyCSS_STATUS_ERROR_STRING_CREATE = 0x010501, + MyCSS_STATUS_ERROR_STRING_INIT = 0x010502, + MyCSS_STATUS_ERROR_STRING_NODE_INIT = 0x010503, + MyCSS_STATUS_ERROR_AN_PLUS_B_CREATE = 0x010600, + MyCSS_STATUS_ERROR_AN_PLUS_B_INIT = 0x010601, + MyCSS_STATUS_ERROR_DECLARATION_CREATE = 0x010700, + MyCSS_STATUS_ERROR_DECLARATION_INIT = 0x010701, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_CREATE = 0x010702, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_INIT = 0x010703, + MyCSS_STATUS_ERROR_PARSER_LIST_CREATE = 0x010800 +} +typedef mycss_status_t; + +#define MyCSS_FAILED(_status_) ((_status_) != MyCSS_STATUS_OK) + +// entry +typedef struct mycss_entry mycss_entry_t; + +enum mycss_entry_type { + MyCSS_ENTRY_TYPE_CLEAN = 0x0000, + MyCSS_ENTRY_TYPE_END = 0x0001 +} +typedef mycss_entry_type_t; + +// mycss +typedef struct mycss mycss_t; + +// mycss_tokenizer +typedef struct mycss_token mycss_token_t; + +enum mycss_tokenizer_state { + MyCSS_TOKENIZER_STATE_DATA = 0x000, + // + // generated by Perl script utils/mycss_first_char.pl + MyCSS_TOKENIZER_STATE_APOSTROPHE = 0x001, + MyCSS_TOKENIZER_STATE_ASTERISK = 0x002, + MyCSS_TOKENIZER_STATE_CIRCUMFLEX_ACCENT = 0x003, + MyCSS_TOKENIZER_STATE_COLON = 0x004, + MyCSS_TOKENIZER_STATE_COMMA = 0x005, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT = 0x006, + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT = 0x007, + MyCSS_TOKENIZER_STATE_DIGIT = 0x008, + MyCSS_TOKENIZER_STATE_DOLLAR_SIGN = 0x009, + MyCSS_TOKENIZER_STATE_FULL_STOP = 0x00a, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS = 0x00b, + MyCSS_TOKENIZER_STATE_LEFT_CURLY_BRACKET = 0x00c, + MyCSS_TOKENIZER_STATE_LEFT_PARENTHESIS = 0x00d, + MyCSS_TOKENIZER_STATE_LEFT_SQUARE_BRACKET = 0x00e, + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN = 0x00f, + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT = 0x010, + MyCSS_TOKENIZER_STATE_NUMBER_SIGN = 0x011, + MyCSS_TOKENIZER_STATE_PLUS_SIGN = 0x012, + MyCSS_TOKENIZER_STATE_QUOTATION_MARK = 0x013, + MyCSS_TOKENIZER_STATE_REVERSE_SOLIDUS = 0x014, + MyCSS_TOKENIZER_STATE_RIGHT_CURLY_BRACKET = 0x015, + MyCSS_TOKENIZER_STATE_RIGHT_PARENTHESIS = 0x016, + MyCSS_TOKENIZER_STATE_RIGHT_SQUARE_BRACKET = 0x017, + MyCSS_TOKENIZER_STATE_SEMICOLON = 0x018, + MyCSS_TOKENIZER_STATE_SOLIDUS = 0x019, + MyCSS_TOKENIZER_STATE_TILDE = 0x01a, + MyCSS_TOKENIZER_STATE_VERTICAL_LINE = 0x01b, + MyCSS_TOKENIZER_STATE_WHITESPACE = 0x01c, + // end generated code + // + + MyCSS_TOKENIZER_STATE_QUOTATION_MARK_BACK = 0x01d, + + MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_BACK = 0x01e, + MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_RSOLIDUS = 0x01f, + + MyCSS_TOKENIZER_STATE_APOSTROPHE_BACK = 0x020, + + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_RSOLIDUS = 0x021, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS = 0x022, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS_RSOLIDUS = 0x023, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_FULL_STOP = 0x024, + + MyCSS_TOKENIZER_STATE_SOLIDUS_COMMENT_END = 0x025, + + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_RSOLIDUS = 0x026, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK = 0x027, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS = 0x028, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS_RSOLIDUS = 0x029, + + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS = 0x02a, + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS_MINUS = 0x02b, + + MyCSS_TOKENIZER_STATE_PLUS_SIGN_FULL_STOP = 0x02c, + + MyCSS_TOKENIZER_STATE_LETTER_U = 0x02d, + MyCSS_TOKENIZER_STATE_LETTER_U_NEXT = 0x02e, + + // global + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DIGIT = 0x050, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL = 0x051, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DOT = 0x052, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E = 0x053, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_PLUS_MINUS = 0x054, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_DECIMAL = 0x055, + + // Consume a numeric token + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC = 0x056, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_RSOLIDUS = 0x057, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS = 0x058, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS_RSOLIDUS = 0x059, + + // Consume an ident-like token + MyCSS_TOKENIZER_GLOBAL_STATE_IDENT = 0x05a, + + // Consume a url token + MyCSS_TOKENIZER_GLOBAL_STATE_URL = 0x05b, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_STRING_BACK = 0x05c, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER = 0x05d, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER_WHITESPACE = 0x05e, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_RSOLIDUS = 0x05f, + MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL = 0x060, + + // Consume a string token + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED = 0x061, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS = 0x062, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS_R = 0x063, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED = 0x064, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS = 0x065, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS_R = 0x066, + + // Consume a name + MyCSS_TOKENIZER_GLOBAL_STATE_NAME = 0x067, + MyCSS_TOKENIZER_GLOBAL_STATE_NAME_RSOLIDUS = 0x068, + + // Consume a unicode-range token + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_BEFORE = 0x069, + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE = 0x06a, + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_QUESTION = 0x06b, + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_MINUS = 0x06c, + + // back + MyCSS_TOKENIZER_GLOBAL_BACK = 0x080, + + MyCSS_TOKENIZER_STATE_FIRST_ENTRY = MyCSS_TOKENIZER_STATE_DATA, + MyCSS_TOKENIZER_STATE_LAST_ENTRY = 0x100 +} +typedef mycss_tokenizer_state_t; + +enum mycss_token_type { + MyCSS_TOKEN_TYPE_UNDEF = 0x0000, + MyCSS_TOKEN_TYPE_WHITESPACE = 0x0001, + MyCSS_TOKEN_TYPE_IDENT = 0x0002, + MyCSS_TOKEN_TYPE_FUNCTION = 0x0003, + MyCSS_TOKEN_TYPE_AT_KEYWORD = 0x0004, + MyCSS_TOKEN_TYPE_HASH = 0x0005, + MyCSS_TOKEN_TYPE_STRING = 0x0006, + MyCSS_TOKEN_TYPE_URL = 0x0007, + MyCSS_TOKEN_TYPE_NUMBER = 0x0008, + MyCSS_TOKEN_TYPE_DIMENSION = 0x0009, + MyCSS_TOKEN_TYPE_PERCENTAGE = 0x000a, + MyCSS_TOKEN_TYPE_INCLUDE_MATCH = 0x000b, + MyCSS_TOKEN_TYPE_DASH_MATCH = 0x000c, + MyCSS_TOKEN_TYPE_PREFIX_MATCH = 0x000d, + MyCSS_TOKEN_TYPE_SUFFIX_MATCH = 0x000e, + MyCSS_TOKEN_TYPE_SUBSTRING_MATCH = 0x000f, + MyCSS_TOKEN_TYPE_COLUMN = 0x0010, + MyCSS_TOKEN_TYPE_CDO = 0x0011, + MyCSS_TOKEN_TYPE_CDC = 0x0012, + MyCSS_TOKEN_TYPE_BAD_STRING = 0x0013, + MyCSS_TOKEN_TYPE_DELIM = 0x0014, + MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS = 0x0015, + MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS = 0x0016, + MyCSS_TOKEN_TYPE_COMMA = 0x0017, + MyCSS_TOKEN_TYPE_COLON = 0x0018, + MyCSS_TOKEN_TYPE_SEMICOLON = 0x0019, + MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET = 0x001a, + MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET = 0x001b, + MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET = 0x001c, + MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET = 0x001d, + MyCSS_TOKEN_TYPE_BAD_URL = 0x001e, + MyCSS_TOKEN_TYPE_COMMENT = 0x001f, + MyCSS_TOKEN_TYPE_UNICODE_RANGE = 0x0020, + MyCSS_TOKEN_TYPE_EOF = 0x0021, + MyCSS_TOKEN_TYPE_LAST_ENTRY = 0x0022 +} +typedef mycss_token_type_t; + +// an+b +typedef struct mycss_an_plus_b mycss_an_plus_b_t; +typedef struct mycss_an_plus_b_entry mycss_an_plus_b_entry_t; + +// result +enum mycss_stylesheet_entry_type { + MyCSS_RESULT_ENTRY_TYPE_UNDEF = 0x00, + MyCSS_RESULT_ENTRY_TYPE_GOOD = 0x01, + MyCSS_RESULT_ENTRY_TYPE_BAD = 0x02 +} +typedef mycss_stylesheet_entry_type_t; + +// stylesheet +typedef struct mycss_stylesheet mycss_stylesheet_t; + +// mystring +typedef struct mycss_string_escaped_res mycss_string_escaped_res_t; +typedef struct mycss_string_res mycss_string_res_t; + +typedef size_t (*mycss_tokenizer_state_f)(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +typedef mycss_token_t * (*mycss_token_ready_callback_f)(mycss_entry_t* entry, mycss_token_t* token); +typedef size_t (*mycss_string_process_state_f)(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +typedef bool (*mycss_parser_token_f)(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +typedef bool (*mycss_an_plus_b_state_f)(mycss_entry_t* entry, mycss_an_plus_b_t* anb, mycss_an_plus_b_entry_t* anb_entry, mycss_token_t* token); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/include/mycss/mystring.h b/include/mycss/mystring.h new file mode 100644 index 0000000..7f109c0 --- /dev/null +++ b/include/mycss/mystring.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MYSTRING_H +#define MyHTML_MyCSS_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +enum mycss_string_process_state { + MyCSS_STRING_PROCESS_STATE_DATA = 0x00, + MyCSS_STRING_PROCESS_STATE_ESCAPED = 0x01, + MyCSS_STRING_PROCESS_STATE_LAST_ENTRY = 0x02 +} +typedef mycss_string_process_state_t; + +struct mycss_string_escaped_res { + unsigned short consumed; + size_t code_point; +}; + +struct mycss_string_res { + mycss_string_escaped_res_t escaped; + mycss_string_process_state_t state; + + myhtml_encoding_t encoding; + myhtml_encoding_result_t encoding_res; + bool case_insensitive; +}; + +size_t mycss_string_data_process(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out_res); + +size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); + +void mycss_string_res_clean(mycss_string_res_t* res); +void mycss_string_escaped_res_clean(mycss_string_escaped_res_t* res); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MYSTRING_H */ diff --git a/include/mycss/namespace/init.h b/include/mycss/namespace/init.h new file mode 100644 index 0000000..79d9486 --- /dev/null +++ b/include/mycss/namespace/init.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_INIT_H +#define MyHTML_MyCSS_NAMESPACE_INIT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +mycss_namespace_t * mycss_namespace_create(void); +mycss_status_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns); +void mycss_namespace_clean(mycss_namespace_t* ns); +mycss_status_t mycss_namespace_clean_all(mycss_namespace_t* ns); +mycss_namespace_t * mycss_namespace_destroy(mycss_namespace_t* ns, bool self_destroy); + +mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mycss_status_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mycss_namespace_stylesheet_t * mycss_namespace_stylesheet_destroy(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, bool self_destroy); + +mycss_status_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns); +void mycss_namespace_stylesheet_append_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_namespace_entry_t* ns_entry); +void mycss_namespace_stylesheet_destroy_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); + +mycss_namespace_entry_t * mycss_namespace_entry_create(mycss_namespace_t* ns); +void mycss_namespace_entry_clean(mycss_namespace_entry_t* ns_entry); +mycss_namespace_entry_t * mycss_namespace_entry_destroy(mycss_namespace_entry_t* ns_entry, mycss_entry_t* entry, bool self_destroy); + +void mycss_namespace_entry_append_to_current(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry); + +const char * mycss_namespace_name_by_id(mycss_namespace_t* ns, mctree_t* name_tree, size_t ns_id, size_t* length); +mycss_namespace_entry_t * mycss_namespace_entry_by_name(mycss_namespace_t *ns, mctree_t* name_tree, const char* ns_name, size_t length, bool case_insensitive); +const char * mycss_namespace_name_by_entry(mycss_namespace_entry_t* ns_entry, mctree_t* name_tree, size_t* length, bool* is_default); + +void mycss_namespace_print(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, FILE* fh, bool with_vbar); +void mycss_namespace_print_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_INIT_H */ diff --git a/include/mycss/namespace/myosi.h b/include/mycss/namespace/myosi.h new file mode 100644 index 0000000..906ed18 --- /dev/null +++ b/include/mycss/namespace/myosi.h @@ -0,0 +1,74 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_MYOSI_H +#define MyHTML_MyCSS_NAMESPACE_MYOSI_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +typedef struct mycss_namespace mycss_namespace_t; +typedef struct mycss_namespace_entry mycss_namespace_entry_t; +typedef struct mycss_namespace_stylesheet mycss_namespace_stylesheet_t; + +struct mycss_namespace_entry { + myhtml_string_t* name; + myhtml_string_t* url; + + myhtml_namespace_t ns_id; + size_t mctree_id; + + mycss_namespace_entry_t* next; + mycss_namespace_entry_t* prev; +}; + +struct mycss_namespace_stylesheet { + mctree_t* name_tree; // tree for namespace names + + mycss_namespace_entry_t* entry_first; + + mycss_namespace_entry_t* entry_default; + mycss_namespace_entry_t entry_undef; + mycss_namespace_entry_t entry_any; + + size_t ns_id_counter; +}; + +struct mycss_namespace { + mycss_namespace_entry_t** entry; + mycss_namespace_entry_t* entry_last; + + mycss_namespace_stylesheet_t* ns_stylesheet; + + mcobject_t* mcobject_entries; +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_MYOSI_H */ diff --git a/include/mycss/namespace/parser.h b/include/mycss/namespace/parser.h new file mode 100644 index 0000000..bfec173 --- /dev/null +++ b/include/mycss/namespace/parser.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_PARSER_H +#define MyHTML_MyCSS_NAMESPACE_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +void mycss_namespace_parser_begin(mycss_entry_t* entry); + +void mycss_namespace_parser_name(mycss_entry_t* entry, mycss_token_t* token); +void mycss_namespace_parser_url(mycss_entry_t* entry, mycss_token_t* token); +void mycss_namespace_parser_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_namespace_parser_expectations_error(mycss_entry_t* entry, mycss_token_t* token); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_PARSER_H */ diff --git a/include/mycss/namespace/state.h b/include/mycss/namespace/state.h new file mode 100644 index 0000000..ee3003f --- /dev/null +++ b/include/mycss/namespace/state.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_STATE_H +#define MyHTML_MyCSS_NAMESPACE_STATE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +bool mycss_namespace_state_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_ident_string(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_ident_url(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_string(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_url(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_STATE_H */ diff --git a/include/mycss/parser.h b/include/mycss/parser.h new file mode 100644 index 0000000..f4c660c --- /dev/null +++ b/include/mycss/parser.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PARSER_H +#define MyHTML_MyCSS_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +mycss_token_t * mycss_parser_token_ready_callback_function(mycss_entry_t* entry, mycss_token_t* token); + +bool mycss_parser_token(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_parser_token_selector_list_end(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_parser_token_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_parser_token_drop_at_rule(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_parser_token_drop_at_rule_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PARSER_H */ diff --git a/include/mycss/property/const.h b/include/mycss/property/const.h new file mode 100644 index 0000000..7efc6b3 --- /dev/null +++ b/include/mycss/property/const.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_CONST_H +#define MyHTML_MyCSS_PROPERTY_CONST_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +enum mycss_property_type { + MyCSS_PROPERTY_TYPE_UNDEF = 0x0000, + MyCSS_PROPERTY_TYPE_HEIGHT = 0x0001, + MyCSS_PROPERTY_TYPE_WIDTH = 0x0002, + MyCSS_PROPERTY_TYPE_LAST_ENTRY = 0x0003 +} +typedef mycss_property_type_t; + +enum mycss_property_value { + MyCSS_PROPERTY_VALUE_UNDEF = 0x0000, + MyCSS_PROPERTY_VALUE_AUTO = 0x0001, + MyCSS_PROPERTY_VALUE_INHERIT = 0x0002, + MyCSS_PROPERTY_VALUE_LENGTH = 0x0003, + MyCSS_PROPERTY_VALUE_PERCENTAGE = 0x0004, + MyCSS_PROPERTY_VALUE_LAST_ENTRY = 0x0005 +} +typedef mycss_property_value_t; + +enum mycss_property_height { + MyCSS_PROPERTY_HEIGHT_AUTO = 0x0001, + MyCSS_PROPERTY_HEIGHT_INHERIT = 0x0002, + MyCSS_PROPERTY_HEIGHT_LENGTH = 0x0003, + MyCSS_PROPERTY_HEIGHT_PERCENTAGE = 0x0004 +} +typedef mycss_property_height_t; + +enum mycss_property_width { + MyCSS_PROPERTY_WIDTH_AUTO = 0x0001, + MyCSS_PROPERTY_WIDTH_INHERIT = 0x0002, + MyCSS_PROPERTY_WIDTH_LENGTH = 0x0003, + MyCSS_PROPERTY_WIDTH_PERCENTAGE = 0x0004 +} +typedef mycss_property_width_t; + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_CONST_H */ + + diff --git a/include/mycss/property/init.h b/include/mycss/property/init.h new file mode 100644 index 0000000..62a36c0 --- /dev/null +++ b/include/mycss/property/init.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_INIT_H +#define MyHTML_MyCSS_PROPERTY_INIT_H +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +const mycss_property_index_static_entry_t * mycss_property_index_entry_by_name(const char* name, size_t length); +mycss_property_type_t mycss_property_type_by_name(const char *name, size_t length); + +const mycss_property_value_index_static_entry_t * mycss_property_value_index_entry_by_name(const char* name, size_t length); +mycss_property_value_t mycss_property_value_type_by_name(const char *name, size_t length); + +void mycss_property_print(mycss_property_type_t prop_type, FILE* fh); +void mycss_property_value_print(unsigned int value_type, void* value, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_INIT_H */ diff --git a/include/mycss/property/myosi.h b/include/mycss/property/myosi.h new file mode 100644 index 0000000..1dce753 --- /dev/null +++ b/include/mycss/property/myosi.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_MYOSI_H +#define MyHTML_MyCSS_PROPERTY_MYOSI_H +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct mycss_property_index_static_entry { + const char* name; + size_t name_length; + + mycss_property_type_t type; + mycss_parser_token_f parser; + + size_t next; + size_t curr; +} +typedef mycss_property_index_static_entry_t; + +struct mycss_property_value_index_static_entry { + const char* name; + size_t name_length; + + mycss_property_value_t type; + + size_t next; + size_t curr; +} +typedef mycss_property_value_index_static_entry_t; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_MYOSI_H */ diff --git a/include/mycss/property/parser.h b/include/mycss/property/parser.h new file mode 100644 index 0000000..898bd38 --- /dev/null +++ b/include/mycss/property/parser.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_PARSER_H +#define MyHTML_MyCSS_PROPERTY_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +bool mycss_property_parser_width(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_property_parser_height(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_PARSER_H */ diff --git a/include/mycss/property/resources.h b/include/mycss/property/resources.h new file mode 100644 index 0000000..37cb6db --- /dev/null +++ b/include/mycss/property/resources.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_RESOURCES_H +#define MyHTML_MyCSS_PROPERTY_RESOURCES_H +#pragma once + +#define MyCSS_PROPERTY_STATIC_INDEX_FOR_SEARCH_SIZE 3 +#define MyCSS_PROPERTY_VALUE_STATIC_INDEX_FOR_SEARCH_SIZE 5 + +static const mycss_property_index_static_entry_t mycss_property_index_static_for_search[] = +{ + {NULL, 0, MyCSS_PROPERTY_TYPE_UNDEF, NULL, 0, 0}, + {"height", 6, MyCSS_PROPERTY_TYPE_HEIGHT, mycss_property_parser_height, 0, 1}, + {NULL, 0, MyCSS_PROPERTY_TYPE_UNDEF, NULL, 0, 0}, + {"width", 5, MyCSS_PROPERTY_TYPE_WIDTH, mycss_property_parser_width, 0, 3}, +}; + +static const mycss_property_value_index_static_entry_t mycss_property_value_index_static_for_search[] = +{ + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, + {"inherit", 7, MyCSS_PROPERTY_VALUE_INHERIT, 0, 1}, + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, + {"auto", 4, MyCSS_PROPERTY_VALUE_AUTO, 0, 4}, + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, +}; + +static const char * mycss_property_index_type_name[] = +{ + "", + "height", + "width", + "" +}; + +static const char * mycss_property_index_type_value[] = +{ + "", + "auto", + "inherit", + "length", + "percentage", + "" +}; + + +#endif /* MyHTML_MyCSS_PROPERTY_RESOURCES_H */ diff --git a/include/mycss/selectors/function.h b/include/mycss/selectors/function.h new file mode 100644 index 0000000..7f73f05 --- /dev/null +++ b/include/mycss/selectors/function.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_FUNCTION_H +#define MyHTML_MyCSS_SELECTORS_FUNCTION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +typedef void (*mycss_selectors_function_begin_f)(mycss_entry_t* entry, mycss_selectors_entry_t* selector); + +struct mycss_selectors_function_index { + mycss_parser_token_f parser; + mycss_parser_token_f switch_parser; +} +typedef mycss_selectors_function_index_t; + +struct mycss_selectots_function_begin_entry { + const char* name; + size_t length; + + mycss_selectors_function_begin_f func; + + size_t next; + size_t curr; +} +typedef mycss_selectots_function_begin_entry_t; + +mycss_selectors_function_begin_f mycss_function_begin_by_name(const char *name, size_t length); +const mycss_selectots_function_begin_entry_t * mycss_function_begin_entry_by_name(const char* name, size_t length); + +void mycss_selectors_function_begin_nth_child(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_not(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_dir(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_matches(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_lang(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_drop(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_of_type(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_last_column(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_current(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_last_child(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_last_of_type(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_has(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_column(mycss_entry_t* entry, mycss_selectors_entry_t* selector); + +void mycss_selectors_begin_unknown(mycss_entry_t* entry, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_FUNCTION_H */ diff --git a/include/mycss/selectors/function_parser.h b/include/mycss/selectors/function_parser.h new file mode 100644 index 0000000..f619dd3 --- /dev/null +++ b/include/mycss/selectors/function_parser.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_FUNCTION_PARSER_H +#define MyHTML_MyCSS_SELECTORS_FUNCTION_PARSER_H +#pragma once + +#define MyCSS_SELECTORS_FUNCTION_NAME_STATIC_SIZE 57 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +bool mycss_selectors_function_parser_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_unknown_parser(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_not_or_matches_or_current_parser(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_has(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_nth_with_selectors(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_nth_with_selectors_need_of(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_nth_with_selectors_need_of_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_nth_without_selectors(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_nth_without_selectors_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_drop(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_drop_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_drop_after_column(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_dir(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_dir_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_lang(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_lang_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_lang_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_FUNCTION_PARSER_H */ diff --git a/include/mycss/selectors/function_resource.h b/include/mycss/selectors/function_resource.h new file mode 100644 index 0000000..a3a369e --- /dev/null +++ b/include/mycss/selectors/function_resource.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_FUNCTION_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_FUNCTION_RESOURCE_H +#pragma once + +#define MyCSS_SELECTORS_FUNCTION_NAME_STATIC_SIZE 57 + +static const mycss_selectots_function_begin_entry_t mycss_selectors_function_begin_map_index[] = +{ + {NULL, 0, NULL, 0, 0}, + {"dir", 3, mycss_selectors_function_begin_dir, 0, 1}, + {NULL, 0, NULL, 0, 0}, + {"nth-of-type", 11, mycss_selectors_function_begin_nth_of_type, 0, 3}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"nth-last-column", 15, mycss_selectors_function_begin_nth_last_column, 0, 13}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"current", 7, mycss_selectors_function_begin_current, 0, 19}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"matches", 7, mycss_selectors_function_begin_matches, 0, 23}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"has", 3, mycss_selectors_function_begin_has, 0, 28}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"not", 3, mycss_selectors_function_begin_not, 0, 34}, + {"nth-last-of-type", 16, mycss_selectors_function_begin_nth_last_of_type, 0, 35}, + {NULL, 0, NULL, 0, 0}, + {"lang", 4, mycss_selectors_function_begin_lang, 0, 37}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"nth-last-child", 14, mycss_selectors_function_begin_nth_last_child, 0, 44}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"nth-column", 10, mycss_selectors_function_begin_nth_column, 0, 47}, + {NULL, 0, NULL, 0, 0}, + {"nth-child", 9, mycss_selectors_function_begin_nth_child, 0, 49}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"drop", 4, mycss_selectors_function_begin_drop, 0, 56}, + {NULL, 0, NULL, 0, 0}, +}; + +#endif /* MyHTML_MyCSS_SELECTORS_FUNCTION_RESOURCE_H */ + diff --git a/include/mycss/selectors/init.h b/include/mycss/selectors/init.h new file mode 100644 index 0000000..7f01ac6 --- /dev/null +++ b/include/mycss/selectors/init.h @@ -0,0 +1,66 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_INIT_H +#define MyHTML_MyCSS_SELECTORS_INIT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +mycss_selectors_t * mycss_selectors_create(void); +mycss_status_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors); +void mycss_selectors_clean(mycss_selectors_t* selectors); +mycss_status_t mycss_selectors_clean_all(mycss_selectors_t* selectors); +mycss_selectors_t * mycss_selectors_destroy(mycss_selectors_t* selectors, bool self_destroy); + +void mycss_selectors_entry_clean(mycss_selectors_entry_t* sel_entry); +mycss_selectors_entry_t * mycss_selectors_entry_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, bool self_destroy); + +void * mycss_selectors_entry_value_destroy(mycss_entry_t* entry, mycss_selectors_entry_t* selector_entry, bool destroy_self); + +mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); +mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); + +mycss_selectors_entry_t * mycss_selectors_entry_find_first(mycss_selectors_entry_t* selector); + +void mycss_selectors_print_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, FILE* fh); +void mycss_selectors_print_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh); +void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh); + +mycss_selectors_entry_t * mycss_selectors_entry_create(mycss_selectors_t* selectors); + +mycss_selectors_entry_t ** mycss_selectors_entry_list_create(mycss_selectors_t* selectors); +mycss_selectors_entry_t ** mycss_selectors_entry_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entry_t** list, size_t current_size); +mycss_selectors_entry_t ** mycss_selectors_entry_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t** list); + +mycss_selectors_entry_t * mycss_selectors_entry(mycss_selectors_t* selectors); +void mycss_selectors_entry_append_to_current(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_INIT_H */ diff --git a/include/mycss/selectors/list.h b/include/mycss/selectors/list.h new file mode 100644 index 0000000..a5a532a --- /dev/null +++ b/include/mycss/selectors/list.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_LIST_H +#define MyHTML_MyCSS_SELECTORS_LIST_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +struct mycss_selectors_list { + mycss_selectors_entry_t** selector_list; + size_t selector_list_length; + + mycss_declaration_entry_t* declaration_entry; + + mycss_selectors_flags_t flags; + + mycss_selectors_list_t* parent; + mycss_selectors_list_t* next; + mycss_selectors_list_t* prev; +}; + +mycss_selectors_list_t * mycss_selectors_list_create(mycss_selectors_t* selectors); +void mycss_selectors_list_clean(mycss_selectors_list_t* selector_list); +mycss_selectors_list_t * mycss_selectors_list_destroy(mycss_selectors_t* selectors, mycss_selectors_list_t* selector_list, bool self_destroy); + +mycss_selectors_list_t * mycss_selectors_list_append_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector); +mycss_selectors_entry_t * mycss_selectors_list_last_entry(mycss_selectors_list_t* list); +mycss_selectors_entry_t ** mycss_selectors_list_current_chain(mycss_selectors_list_t* list); + +void mycss_selectors_list_append_to_current(mycss_selectors_t* selectors, mycss_selectors_list_t* current_list); + +bool mycss_selectors_list_destroy_last_empty_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* list, bool destroy_found); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_LIST_H */ diff --git a/include/mycss/selectors/myosi.h b/include/mycss/selectors/myosi.h new file mode 100644 index 0000000..dabf932 --- /dev/null +++ b/include/mycss/selectors/myosi.h @@ -0,0 +1,228 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_MYOSI_H +#define MyHTML_MyCSS_SELECTORS_MYOSI_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycss_selectors mycss_selectors_t; +typedef struct mycss_selectors_entry mycss_selectors_entry_t; +typedef struct mycss_selectors_list mycss_selectors_list_t; + +#include +#include +#include +#include +#include + +typedef bool (*mycss_selectors_state_f)(mycss_entry_t* entry, mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_token_t* token); +typedef void (*mycss_callback_selector_done_f)(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); + +enum mycss_selectors_match { + MyCSS_SELECTORS_MATCH_EQUAL = 0x00, // = + MyCSS_SELECTORS_MATCH_INCLUDE = 0x01, // ~= + MyCSS_SELECTORS_MATCH_DASH = 0x02, // |= + MyCSS_SELECTORS_MATCH_PREFIX = 0x03, // ^= + MyCSS_SELECTORS_MATCH_SUFFIX = 0x04, // $= + MyCSS_SELECTORS_MATCH_SUBSTRING = 0x05, // *= + MyCSS_SELECTORS_MATCH_LAST_ENTRY = 0x06 +} +typedef mycss_selectors_match_t; + +enum mycss_selectors_combinator { + MyCSS_SELECTORS_COMBINATOR_UNDEF = 0x00, // two compound selectors [key=val].foo + MyCSS_SELECTORS_COMBINATOR_DESCENDANT = 0x01, // '>>' or WHITESPACE + MyCSS_SELECTORS_COMBINATOR_CHILD = 0x02, // '>' + MyCSS_SELECTORS_COMBINATOR_NEXT_SIBLING = 0x03, // '+' + MyCSS_SELECTORS_COMBINATOR_FOLLOWING_SIBLING = 0x04, // '~' + MyCSS_SELECTORS_COMBINATOR_COLUMN = 0x05, // '||' + MyCSS_SELECTORS_COMBINATOR_LAST_ENTRY = 0x06 +} +typedef mycss_selectors_combinator_t; + +enum mycss_selectors_mod { + MyCSS_SELECTORS_MOD_UNDEF = 0x00, + MyCSS_SELECTORS_MOD_I = 0x01 +} +typedef mycss_selectors_mod_t; + +enum mycss_selectors_flags { + MyCSS_SELECTORS_FLAGS_UNDEF = 0x00, + MyCSS_SELECTORS_FLAGS_SELECTOR_BAD = 0x01 +} +typedef mycss_selectors_flags_t; + +enum mycss_selectors_type { + MyCSS_SELECTORS_TYPE_UNDEF = 0x000, // tag name
= div in css + MyCSS_SELECTORS_TYPE_ELEMENT = 0x001, // tag name
= div in css + MyCSS_SELECTORS_TYPE_ID = 0x002, // #hash + MyCSS_SELECTORS_TYPE_CLASS = 0x003, // .class + MyCSS_SELECTORS_TYPE_ATTRIBUTE = 0x004, // [key=val], in html
+ MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION = 0x005, // :function(...) + MyCSS_SELECTORS_TYPE_PSEUDO_CLASS = 0x006, // :pseudo + MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION = 0x007, // ::function(...) + MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT = 0x008, // ::pseudo + MyCSS_SELECTORS_TYPE_LAST_ENTRY = 0x009 +} +typedef mycss_selectors_type_t; + +enum mycss_selectors_sub_type { + MyCSS_SELECTORS_SUB_TYPE_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_UNKNOWN = 0x01 +} +typedef mycss_selectors_sub_type_t; + +/* pseudo classes functions */ +enum mycss_selectors_sub_type_pseudo_class_function { + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_UNKNOWN = 0x01, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT = 0x02, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR = 0x03, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP = 0x04, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS = 0x05, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG = 0x06, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES = 0x07, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT = 0x08, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD = 0x09, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN = 0x0a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD = 0x0b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN = 0x0c, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE = 0x0d, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE = 0x0e, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY = 0x0f +} +typedef mycss_selectors_sub_type_pseudo_class_function_t; + +/* pseudo classes */ +enum mycss_selectors_sub_type_pseudo_class { + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNKNOWN = 0x01, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ACTIVE = 0x02, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ANY_LINK = 0x03, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_BLANK = 0x04, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CHECKED = 0x05, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CURRENT = 0x06, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DEFAULT = 0x07, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DISABLED = 0x08, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DROP = 0x09, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_EMPTY = 0x0a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ENABLED = 0x0b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_CHILD = 0x0c, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_OF_TYPE = 0x0d, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FOCUS = 0x0e, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUTURE = 0x0f, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_HOVER = 0x10, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_IN_RANGE = 0x11, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INDETERMINATE = 0x12, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INVALID = 0x13, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_CHILD = 0x14, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_OF_TYPE = 0x15, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LINK = 0x16, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_CHILD = 0x17, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_OF_TYPE = 0x18, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OPTIONAL = 0x19, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OUT_OF_RANGE = 0x1a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PAST = 0x1b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PLACEHOLDER_SHOWN = 0x1c, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_ONLY = 0x1d, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_WRITE = 0x1e, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_REQUIRED = 0x1f, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ROOT = 0x20, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_SCOPE = 0x21, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_TARGET = 0x22, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_USER_ERROR = 0x23, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VALID = 0x24, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VISITED = 0x25, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_ENTRY = 0x26 +} +typedef mycss_selectors_sub_type_pseudo_class_t; + +/* pseudo element */ +enum mycss_selectors_sub_type_pseudo_element { + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNKNOWN = 0x01, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_AFTER = 0x02, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BACKDROP = 0x03, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BEFORE = 0x04, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LETTER = 0x05, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LINE = 0x06, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_GRAMMAR_ERROR = 0x07, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_MARKER = 0x08, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_PLACEHOLDER = 0x09, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SELECTION = 0x0a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SPELLING_ERROR = 0x0b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_LAST_ENTRY = 0x0c +} +typedef mycss_selectors_sub_type_pseudo_element_t; + +enum mycss_selectors_function_drop_type { + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_UNDEF = 0x000, + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE = 0x001, + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_VALID = 0x002, + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID = 0x004, +} +typedef mycss_selectors_function_drop_type_t; + +struct mycss_selectors { + // refs + mycss_entry_t* ref_entry; + + mycss_selectors_entry_t** entry; + mycss_selectors_entry_t* entry_last; + + mycss_selectors_list_t** list; + mycss_selectors_list_t* list_last; + + mycss_selectors_combinator_t* combinator; + + mycss_token_type_t ending_token; + + mcobject_t* mcobject_entries; + mcobject_t* mcobject_list_entries; +}; + +struct mycss_selectors_entry { + mycss_selectors_type_t type; + int sub_type; + mycss_selectors_flags_t flags; + + mycss_namespace_entry_t* ns_entry; + + myhtml_string_t* key; + void* value; + + mycss_selectors_combinator_t combinator; + + /* TODO: experimental */ + void* node; + + mycss_selectors_entry_t* next; + mycss_selectors_entry_t* prev; +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_MYOSI_H */ diff --git a/include/mycss/selectors/myosi_resource.h b/include/mycss/selectors/myosi_resource.h new file mode 100644 index 0000000..70a0b6a --- /dev/null +++ b/include/mycss/selectors/myosi_resource.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_MYOSI_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_MYOSI_RESOURCE_H +#pragma once + +static const char mycss_selectors_resource_matcher_names_map[][3] = { + "=", "~=", "|=", "^=", "$=", "*=" +}; + +static const char mycss_selectors_resource_combinator_names_map[][3] = { + "", " ", ">", "+", "~", "||" +}; + +#endif /* MyHTML_MyCSS_SELECTORS_MYOSI_RESOURCE_H */ diff --git a/include/mycss/selectors/parser.h b/include/mycss/selectors/parser.h new file mode 100644 index 0000000..f8be137 --- /dev/null +++ b/include/mycss/selectors/parser.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_PARSER_H +#define MyHTML_MyCSS_SELECTORS_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include + +void mycss_selectors_parser_selector_begin(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_ident_type(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_ident_attr(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_namespace_ident(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_namespace_attr(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_after_namespace(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_id(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_class(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_value(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_modifier(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_class(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_class_function(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_class_function_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_element(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_element_function(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_element_function_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_expectations_error(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_bad_token(mycss_entry_t* entry, mycss_token_t* token); + +/* for set parent selector bad status if child selector is bad*/ +void mycss_selectors_parser_check_and_set_bad_parent_selector(mycss_entry_t* entry, mycss_selectors_list_t* selectors_list); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_PARSER_H */ diff --git a/include/mycss/selectors/pseudo.h b/include/mycss/selectors/pseudo.h new file mode 100644 index 0000000..470ba8d --- /dev/null +++ b/include/mycss/selectors/pseudo.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_PSEUDO_H +#define MyHTML_MyCSS_SELECTORS_PSEUDO_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct mycss_selectots_pseudo_begin_entry { + const char* name; + size_t length; + + int sub_type; + + size_t next; + size_t curr; +} +typedef mycss_selectots_pseudo_begin_entry_t; + + +mycss_selectors_sub_type_pseudo_class_t mycss_pseudo_class_by_name(const char *name, size_t length); +mycss_selectors_sub_type_pseudo_element_t mycss_pseudo_element_by_name(const char *name, size_t length); +const mycss_selectots_pseudo_begin_entry_t * mycss_pseudo_begin_entry_by_name(const char* name, size_t length, size_t static_size, const mycss_selectots_pseudo_begin_entry_t* pseudo); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_PSEUDO_H */ diff --git a/include/mycss/selectors/pseudo_resource.h b/include/mycss/selectors/pseudo_resource.h new file mode 100644 index 0000000..4bb9994 --- /dev/null +++ b/include/mycss/selectors/pseudo_resource.h @@ -0,0 +1,161 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + */ + +#ifndef MyHTML_MyCSS_SELECTORS_PSEUDO_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_PSEUDO_RESOURCE_H +#pragma once + +#define MyCSS_SELECTORS_PSEUDO_CLASS_NAME_STATIC_SIZE 73 +#define MyCSS_SELECTORS_PSEUDO_ELEMENT_NAME_STATIC_SIZE 41 + +static const mycss_selectots_pseudo_begin_entry_t mycss_selectors_pseudo_class_begin_map_index[] = +{ + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"placeholder-shown", 17, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PLACEHOLDER_SHOWN, 0, 4}, + {"empty", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_EMPTY, 74, 5}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"last-of-type", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_OF_TYPE, 0, 8}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"user-error", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_USER_ERROR, 0, 10}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"in-range", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_IN_RANGE, 0, 15}, + {"link", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LINK, 75, 16}, + {"blank", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_BLANK, 76, 17}, + {"active", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ACTIVE, 0, 18}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"read-write", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_WRITE, 0, 20}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"checked", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CHECKED, 77, 24}, + {"default", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DEFAULT, 0, 25}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"focus", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FOCUS, 78, 32}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"last-child", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_CHILD, 0, 34}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"enabled", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ENABLED, 0, 37}, + {"visited", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VISITED, 0, 38}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"scope", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_SCOPE, 79, 41}, + {"indeterminate", 13, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INDETERMINATE, 0, 42}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"root", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ROOT, 80, 45}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"read-only", 9, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_ONLY, 0, 47}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"drop", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DROP, 0, 52}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"future", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUTURE, 0, 55}, + {"optional", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OPTIONAL, 0, 56}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"invalid", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INVALID, 0, 63}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"past", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PAST, 81, 66}, + {"only-of-type", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_OF_TYPE, 82, 67}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"target", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_TARGET, 0, 72}, + {"first-child", 11, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_CHILD, 0, 73}, + {"hover", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_HOVER, 0, 74}, + {"current", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CURRENT, 0, 75}, + {"valid", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VALID, 0, 76}, + {"required", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_REQUIRED, 0, 77}, + {"any-link", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ANY_LINK, 0, 78}, + {"only-child", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_CHILD, 0, 79}, + {"first-of-type", 13, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_OF_TYPE, 0, 80}, + {"disabled", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DISABLED, 0, 81}, + {"out-of-range", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OUT_OF_RANGE, 0, 82}, +}; + +static const mycss_selectots_pseudo_begin_entry_t mycss_selectors_pseudo_element_begin_map_index[] = +{ + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"grammar-error", 13, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_GRAMMAR_ERROR, 0, 4}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"first-letter", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LETTER, 0, 14}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"marker", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_MARKER, 0, 19}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"before", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BEFORE, 0, 21}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"after", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_AFTER, 0, 23}, + {"placeholder", 11, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_PLACEHOLDER, 0, 24}, + {"spelling-error", 14, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SPELLING_ERROR, 0, 25}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"backdrop", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BACKDROP, 0, 28}, + {"first-line", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LINE, 0, 29}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"selection", 9, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SELECTION, 0, 35}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, +}; + +#endif /* MyHTML_MyCSS_SELECTORS_PSEUDO_RESOURCE_H */ diff --git a/include/mycss/selectors/state.h b/include/mycss/selectors/state.h new file mode 100644 index 0000000..5753e7a --- /dev/null +++ b/include/mycss/selectors/state.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_STATE_H +#define MyHTML_MyCSS_SELECTORS_STATE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +void mycss_selectors_state_end(mycss_entry_t* entry); +bool mycss_selectors_state_function_skip_all(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_drop(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_combinator(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_combinator_greater_than(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_complex_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_compound_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_need_selector_or_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_comma_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_need_ending_or_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_relative_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_simple_selector_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket_ident_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon_colon(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon_colon_function(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon_function(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_full_stop(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_ident_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_shared_after_attr_modifier(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_shared_after_attribute_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_left_bracket_after_wq_name_attr(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_shared_after_attr_matcher(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_STATE_H */ diff --git a/include/mycss/selectors/value.h b/include/mycss/selectors/value.h new file mode 100644 index 0000000..35c93cc --- /dev/null +++ b/include/mycss/selectors/value.h @@ -0,0 +1,107 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_VALUE_H +#define MyHTML_MyCSS_SELECTORS_VALUE_H +#pragma once + +#define mycss_selector_value_attribute(obj) ((mycss_selectors_object_attribute_t*)(obj)) +#define mycss_selector_value_string(obj) ((myhtml_string_t*)(obj)) +#define mycss_selector_value_an_plus_b(obj) ((mycss_an_plus_b_entry_t*)(obj)) +#define mycss_selector_value_drop(obj) ((mycss_selectors_function_drop_type_t)(obj)) +#define mycss_selector_value_lang(obj) ((mycss_selectors_value_lang_t*)(obj)) +#define mycss_selector_value_function(obj) ((mycss_result_entry_t*)(obj)) +#define mycss_selector_value_destroy(entry, type, sub_type, value, self_destroy) (mycss_selectors_value_destroy_map[type](entry, type, sub_type, value, self_destroy)) + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +typedef void * (*mycss_selectors_value_destroy_f)(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +typedef void * (*mycss_selectors_value_function_destroy_f)(mycss_entry_t* entry, void* value, bool self_destroy); + +struct mycss_selectors_value_attribute { + myhtml_string_t* value; + + mycss_selectors_match_t match; + mycss_selectors_mod_t mod; +} +typedef mycss_selectors_object_attribute_t; + +struct mycss_selectors_value_lang { + myhtml_string_t str; + struct mycss_selectors_value_lang* next; +} +typedef mycss_selectors_value_lang_t; + + +/* create */ +void * mycss_selectors_value_undef_create(mycss_entry_t* entry, bool set_clean); +mycss_selectors_object_attribute_t * mycss_selectors_value_attribute_create(mycss_entry_t* entry, bool set_clean); + +/* destroy */ +void * mycss_selectors_value_undef_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_id_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_class_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_element_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_attribute_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); + +/* pseudo class function create */ +void * mycss_selectors_value_pseudo_class_function_undef_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_current_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_dir_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_drop_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_has_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_lang_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_matches_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_not_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_child_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_column_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_last_child_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_last_column_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_last_of_type_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_of_type_create(mycss_entry_t* entry, bool set_clean); + +/* pseudo class function destroy */ +void * mycss_selectors_value_pseudo_class_function_undef_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_current_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_dir_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_drop_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_has_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_lang_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_matches_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_not_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_child_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_column_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_last_child_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_last_column_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_last_of_type_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_of_type_destroy(mycss_entry_t* entry, void* value, bool self_destroy); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_VALUE_H */ diff --git a/include/mycss/selectors/value_resource.h b/include/mycss/selectors/value_resource.h new file mode 100644 index 0000000..f40fdb0 --- /dev/null +++ b/include/mycss/selectors/value_resource.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_VALUE_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_VALUE_RESOURCE_H +#pragma once + +#include + +static const mycss_selectors_value_destroy_f mycss_selectors_value_destroy_map[MyCSS_SELECTORS_TYPE_LAST_ENTRY] = { + mycss_selectors_value_undef_destroy, /* MyCSS_SELECTORS_TYPE_UNDEF */ + mycss_selectors_value_element_destroy, /* MyCSS_SELECTORS_TYPE_ELEMENT */ + mycss_selectors_value_id_destroy, /* MyCSS_SELECTORS_TYPE_ID */ + mycss_selectors_value_class_destroy, /* MyCSS_SELECTORS_TYPE_CLASS */ + mycss_selectors_value_attribute_destroy, /* MyCSS_SELECTORS_TYPE_ATTRIBUTE */ + mycss_selectors_value_pseudo_class_function_destroy, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION */ + mycss_selectors_value_undef_destroy, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS */ + mycss_selectors_value_undef_destroy, /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION */ + mycss_selectors_value_undef_destroy /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT */ +}; + +static const mycss_selectors_value_function_destroy_f mycss_selectors_value_function_destroy_map[MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY] = { + mycss_selectors_value_pseudo_class_function_undef_destroy, + mycss_selectors_value_pseudo_class_function_undef_destroy, + mycss_selectors_value_pseudo_class_function_current_destroy, + mycss_selectors_value_pseudo_class_function_dir_destroy, + mycss_selectors_value_pseudo_class_function_drop_destroy, + mycss_selectors_value_pseudo_class_function_has_destroy, + mycss_selectors_value_pseudo_class_function_lang_destroy, + mycss_selectors_value_pseudo_class_function_matches_destroy, + mycss_selectors_value_pseudo_class_function_not_destroy, + mycss_selectors_value_pseudo_class_function_nth_child_destroy, + mycss_selectors_value_pseudo_class_function_nth_column_destroy, + mycss_selectors_value_pseudo_class_function_nth_last_child_destroy, + mycss_selectors_value_pseudo_class_function_nth_last_column_destroy, + mycss_selectors_value_pseudo_class_function_nth_last_of_type_destroy, + mycss_selectors_value_pseudo_class_function_nth_of_type_destroy, +}; + +#endif /* MyHTML_MyCSS_SELECTORS_VALUE_RESOURCE_H */ diff --git a/include/mycss/stylesheet.h b/include/mycss/stylesheet.h new file mode 100644 index 0000000..a2b6d13 --- /dev/null +++ b/include/mycss/stylesheet.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_STYLESHEET_H +#define MyHTML_MyCSS_STYLESHEET_H +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct mycss_stylesheet { + mycss_entry_t* entry; /* refs */ + + mycss_namespace_stylesheet_t ns_stylesheet; + mycss_selectors_list_t* sel_list_first; + + mycss_stylesheet_t* child; + mycss_stylesheet_t* parent; + mycss_stylesheet_t* next; + mycss_stylesheet_t* prev; +}; + +mycss_stylesheet_t * mycss_stylesheet_create(void); +mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry); +mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet); +mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bool self_destroy); + +void mycss_stylesheet_print(mycss_stylesheet_t* stylesheet, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* MyHTML_MyCSS_STYLESHEET_H */ diff --git a/include/mycss/tokenizer.h b/include/mycss/tokenizer.h new file mode 100644 index 0000000..1fa7609 --- /dev/null +++ b/include/mycss/tokenizer.h @@ -0,0 +1,140 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_H +#define MyHTML_MyCSS_TOKENIZER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#define MyCSS_TOKEN_READY_CALLBACK_FUNCTION(ENTRY, TOKEN) \ + ++ENTRY->token_counter; \ + if(ENTRY->token_ready_callback) \ + (void)ENTRY->token_ready_callback(ENTRY, TOKEN) + +#define MyCSS_TOKEN_READY_CALLBACK_FUNCTION_WITH_REPLACE(ENTRY, TOKEN) \ + ++ENTRY->token_counter; \ + if(ENTRY->token_ready_callback) \ + TOKEN = ENTRY->token_ready_callback(ENTRY, TOKEN) + +struct mycss_token { + mycss_token_type_t type; + size_t begin; + size_t length; + + const char* data; +}; + +mycss_status_t mycss_tokenizer_state_init(mycss_t* mycss); +void mycss_tokenizer_state_destroy(mycss_t* mycss); + +mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length); +mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length); +mycss_status_t mycss_tokenizer_end(mycss_entry_t* entry); + +size_t mycss_tokenizer_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_set_current_buffer_for_continue(mycss_entry_t* entry, size_t css_offset, size_t css_minus_offset); +size_t mycss_tokenizer_token_strcasecmp(mycss_entry_t* entry, mycss_token_t* token, const char* to, size_t to_length); + + +size_t mycss_tokenizer_state_quotation_mark(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_quotation_mark_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_number_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_number_sign_name_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_number_sign_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_dollar_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_apostrophe(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_apostrophe_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_left_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_right_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_asterisk(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_plus_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_plus_sign_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_comma(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_hyphen_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_solidus_comment_end(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_colon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_semicolon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_less_than_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_less_than_sign_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_less_than_sign_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_commercial_at(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_left_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_reverse_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_right_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_circumflex_accent(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_left_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_right_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_letter_u(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_letter_u_next(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_name_start_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_vertical_line(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_tilde(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_delim_single_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/include/mycss/tokenizer_end.h b/include/mycss/tokenizer_end.h new file mode 100644 index 0000000..f7c4e61 --- /dev/null +++ b/include/mycss/tokenizer_end.h @@ -0,0 +1,125 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_END_H +#define MyHTML_MyCSS_TOKENIZER_END_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +size_t mycss_tokenizer_end_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_state_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_quotation_mark(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_quotation_mark_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_number_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_number_sign_name_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_number_sign_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_dollar_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_apostrophe(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_apostrophe_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_left_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_right_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_asterisk(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_plus_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_plus_sign_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_comma(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_solidus_comment_end(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_colon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_semicolon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_less_than_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_less_than_sign_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_less_than_sign_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_left_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_reverse_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_right_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_circumflex_accent(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_left_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_right_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_letter_u(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_letter_u_next(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_name_start_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_vertical_line(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_tilde(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_delim_single_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +// Global +size_t mycss_tokenizer_end_global_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_numeric(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_numeric_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_numeric_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_numeric_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_number_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_dot(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_e(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_e_plus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_e_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_ident(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_url_string_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_url_after(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_url_after_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_url_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_bad_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_name(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_string_double_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_string_double_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_string_single_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_string_single_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_unicode_range_before(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_unicode_range(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_unicode_range_question(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_unicode_range_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_TOKENIZER_END_H */ diff --git a/include/mycss/tokenizer_global.h b/include/mycss/tokenizer_global.h new file mode 100644 index 0000000..4a9d5da --- /dev/null +++ b/include/mycss/tokenizer_global.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_GLOBAL_H +#define MyHTML_MyCSS_TOKENIZER_GLOBAL_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +size_t mycss_tokenizer_global_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_numeric(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_numeric_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_numeric_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_numeric_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_number_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_dot(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_e(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_e_plus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_e_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_ident(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_url_string_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_url_after(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_url_after_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_url_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_bad_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_name(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_string_double_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_double_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_double_quoted_rsolidus_r(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_single_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_single_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_single_quoted_rsolidus_r(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_unicode_range_before(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_unicode_range(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_unicode_range_question(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_unicode_range_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_TOKENIZER_GLOBAL_H */ diff --git a/include/mycss/tokenizer_resource.h b/include/mycss/tokenizer_resource.h new file mode 100644 index 0000000..623a904 --- /dev/null +++ b/include/mycss/tokenizer_resource.h @@ -0,0 +1,362 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_RESOURCE_H +#define MyHTML_MyCSS_TOKENIZER_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +// +// generated by Perl script utils/mycss_first_char.pl +static const mycss_tokenizer_state_t mycss_begin_chars_state_map[] = { + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_QUOTATION_MARK, // U+0022 QUOTATION MARK (") + MyCSS_TOKENIZER_STATE_NUMBER_SIGN, // U+0023 NUMBER SIGN (#) + MyCSS_TOKENIZER_STATE_DOLLAR_SIGN, // U+0024 DOLLAR SIGN ($) + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_APOSTROPHE, // U+0027 APOSTROPHE (') + MyCSS_TOKENIZER_STATE_LEFT_PARENTHESIS, // U+0028 LEFT PARENTHESIS (() + MyCSS_TOKENIZER_STATE_RIGHT_PARENTHESIS, // U+0029 RIGHT PARENTHESIS ()) + MyCSS_TOKENIZER_STATE_ASTERISK, // U+002A ASTERISK (*) + MyCSS_TOKENIZER_STATE_PLUS_SIGN, // U+002B PLUS SIGN (+) + MyCSS_TOKENIZER_STATE_COMMA, // U+002C COMMA (,) + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS, // U+002D HYPHEN-MINUS (-) + MyCSS_TOKENIZER_STATE_FULL_STOP, // U+002E FULL STOP (.) + MyCSS_TOKENIZER_STATE_SOLIDUS, // U+002F SOLIDUS (/) + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_COLON, // U+003A COLON (:) + MyCSS_TOKENIZER_STATE_SEMICOLON, // U+003B SEMICOLON (;) + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN, // U+003C LESS-THAN SIGN (<) + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT, // U+0040 COMMERCIAL AT (@) + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LETTER_U, // name-start code point and LATIN CAPITAL AND SMALL LETTER U + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LEFT_SQUARE_BRACKET, // U+005B LEFT SQUARE BRACKET ([) + MyCSS_TOKENIZER_STATE_REVERSE_SOLIDUS, // U+005C REVERSE SOLIDUS () + MyCSS_TOKENIZER_STATE_RIGHT_SQUARE_BRACKET, // U+005D RIGHT SQUARE BRACKET (]) + MyCSS_TOKENIZER_STATE_CIRCUMFLEX_ACCENT, // U+005E CIRCUMFLEX ACCENT (^) + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LETTER_U, // name-start code point and LATIN CAPITAL AND SMALL LETTER U + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LEFT_CURLY_BRACKET, // U+007B LEFT CURLY BRACKET ({) + MyCSS_TOKENIZER_STATE_VERTICAL_LINE, // U+007C VERTICAL LINE (|) + MyCSS_TOKENIZER_STATE_RIGHT_CURLY_BRACKET, // U+007D RIGHT CURLY BRACKET (}) + MyCSS_TOKENIZER_STATE_TILDE, // U+007E TILDE (~) + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT // name-start code point +}; + +static const unsigned char mycss_chars_name_code_point_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, + 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, + 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, + 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +}; + +static const char mycss_token_type_description[][32] = +{ + "UNDEF", + "WHITESPACE", + "IDENT", + "FUNCTION", + "AT_KEYWORD", + "HASH", + "STRING", + "URL", + "NUMBER", + "DIMENSION", + "PERCENTAGE", + "INCLUDE_MATCH", + "DASH_MATCH", + "PREFIX_MATCH", + "SUFFIX_MATCH", + "SUBSTRING_MATCH", + "COLUMN", + "CDO", + "CDC", + "BAD_STRING", + "DELIM", + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + "COMMA", + "COLON", + "SEMICOLON", + "LEFT_SQUARE_BRACKET", + "RIGHT_SQUARE_BRACKET", + "LEFT_CURLY_BRACKET", + "RIGHT_CURLY_BRACKET", + "BAD_URL", + "COMMENT", + "UNICODE_RANGE", + "END_OF_FILE", + "" +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_TOKENIZER_RESOURCE_H */ diff --git a/include/mycss/values/consume.h b/include/mycss/values/consume.h new file mode 100644 index 0000000..0f721f7 --- /dev/null +++ b/include/mycss/values/consume.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_CONSUME_H +#define MyHTML_MyCSS_VALUES_CONSUME_H +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +bool mycss_values_consume_length(mycss_entry_t* entry, mycss_token_t* token); +bool mycss_values_consume_percentage(mycss_entry_t* entry, mycss_token_t* token); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_CONSUME_H */ diff --git a/include/mycss/values/resources.h b/include/mycss/values/resources.h new file mode 100644 index 0000000..1c7efd4 --- /dev/null +++ b/include/mycss/values/resources.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_RESOURCES_H +#define MyHTML_MyCSS_VALUES_RESOURCES_H +#pragma once + + + +#endif /* MyHTML_MyCSS_VALUES_RESOURCES_H */ diff --git a/include/mycss/values/serialization.h b/include/mycss/values/serialization.h new file mode 100644 index 0000000..98819f8 --- /dev/null +++ b/include/mycss/values/serialization.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_SERIALIZATION_H +#define MyHTML_MyCSS_VALUES_SERIALIZATION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void mycss_serialization_length(mycss_values_length_t* value, FILE* fh); +void mycss_serialization_percentage(mycss_values_percentage_t* value, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_SERIALIZATION_H */ diff --git a/include/mycss/values/units.h b/include/mycss/values/units.h new file mode 100644 index 0000000..7c75c5b --- /dev/null +++ b/include/mycss/values/units.h @@ -0,0 +1,94 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_UNITS_H +#define MyHTML_MyCSS_VALUES_UNITS_H +#pragma once + +#include +#include + +#define mycss_units_is_angel_type(type) (type >= 1 && type <= 4) +#define mycss_units_is_frequency_type(type) (type >= 5 && type <= 6) +#define mycss_units_is_length_type(type) (type >= 7 && type <= 24) +#define mycss_units_is_length_absolute_type(type) (type >= 7 && type <= 13) +#define mycss_units_is_length_relative_type(type) (type >= 14 && type <= 24) +#define mycss_units_is_resolution_type(type) (type >= 25 && type <= 27) +#define mycss_units_is_time_type(type) (type >= 28 && type <= 29) + +#ifdef __cplusplus +extern "C" { +#endif + +enum mycss_units_type { + MyCSS_UNIT_TYPE_UNDEF = 0x00, + MyCSS_UNIT_TYPE_DEG = 0x01, + MyCSS_UNIT_TYPE_GRAD = 0x02, + MyCSS_UNIT_TYPE_RAD = 0x03, + MyCSS_UNIT_TYPE_TURN = 0x04, + MyCSS_UNIT_TYPE_HZ = 0x05, + MyCSS_UNIT_TYPE_KHZ = 0x06, + MyCSS_UNIT_TYPE_CM = 0x07, + MyCSS_UNIT_TYPE_IN = 0x08, + MyCSS_UNIT_TYPE_MM = 0x09, + MyCSS_UNIT_TYPE_PC = 0x0a, + MyCSS_UNIT_TYPE_PT = 0x0b, + MyCSS_UNIT_TYPE_PX = 0x0c, + MyCSS_UNIT_TYPE_Q = 0x0d, + MyCSS_UNIT_TYPE_CH = 0x0e, + MyCSS_UNIT_TYPE_EM = 0x0f, + MyCSS_UNIT_TYPE_EX = 0x10, + MyCSS_UNIT_TYPE_IC = 0x11, + MyCSS_UNIT_TYPE_REM = 0x12, + MyCSS_UNIT_TYPE_VB = 0x13, + MyCSS_UNIT_TYPE_VH = 0x14, + MyCSS_UNIT_TYPE_VI = 0x15, + MyCSS_UNIT_TYPE_VMAX = 0x16, + MyCSS_UNIT_TYPE_VMIN = 0x17, + MyCSS_UNIT_TYPE_VW = 0x18, + MyCSS_UNIT_TYPE_DPCM = 0x19, + MyCSS_UNIT_TYPE_DPI = 0x1a, + MyCSS_UNIT_TYPE_DPPX = 0x1b, + MyCSS_UNIT_TYPE_MS = 0x1c, + MyCSS_UNIT_TYPE_S = 0x1d, + MyCSS_UNIT_TYPE_LAST_ENTRY = 0x1e, +} +typedef mycss_units_type_t; + +struct mycss_units_index_static_entry { + const char* name; + size_t name_length; + + mycss_units_type_t unit_type; + + size_t next; + size_t curr; +} +typedef mycss_units_index_static_entry_t; + + +mycss_units_type_t mycss_units_type_by_name(const char *name, size_t length); +const mycss_units_index_static_entry_t * mycss_units_index_entry_by_name(const char* name, size_t length); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_UNITS_H */ diff --git a/include/mycss/values/units_resources.h b/include/mycss/values/units_resources.h new file mode 100644 index 0000000..7d7c8e1 --- /dev/null +++ b/include/mycss/values/units_resources.h @@ -0,0 +1,237 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_UNITS_RESOURCES_H +#define MyHTML_MyCSS_VALUES_UNITS_RESOURCES_H +#pragma once + +#define MyCSS_UNITS_STATIC_INDEX_FOR_SEARCH_SIZE 199 + +static const char * mycss_units_index_name[31] = { + "", "deg", "grad", "rad", "turn", "Hz", "kHz", "cm", "in", "mm", "pc", + "pt", "px", "q", "ch", "em", "ex", "ic", "rem", "vb", "vh", + "vi", "vmax", "vmin", "vw", "dpcm", "dpi", "dppx", "ms", "s", NULL +}; + +static const mycss_units_index_static_entry_t mycss_units_index_static_for_search[] = +{ + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"grad", 4, MyCSS_UNIT_TYPE_GRAD, 0, 8}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"px", 2, MyCSS_UNIT_TYPE_PX, 0, 16}, + {"in", 2, MyCSS_UNIT_TYPE_IN, 0, 17}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"dpcm", 4, MyCSS_UNIT_TYPE_DPCM, 0, 20}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vw", 2, MyCSS_UNIT_TYPE_VW, 0, 26}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"q", 1, MyCSS_UNIT_TYPE_Q, 0, 34}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"dppx", 4, MyCSS_UNIT_TYPE_DPPX, 0, 42}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vb", 2, MyCSS_UNIT_TYPE_VB, 0, 45}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"deg", 3, MyCSS_UNIT_TYPE_DEG, 0, 56}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"dpi", 3, MyCSS_UNIT_TYPE_DPI, 0, 59}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"rem", 3, MyCSS_UNIT_TYPE_REM, 0, 66}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vh", 2, MyCSS_UNIT_TYPE_VH, 0, 68}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"mm", 2, MyCSS_UNIT_TYPE_MM, 0, 82}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"pc", 2, MyCSS_UNIT_TYPE_PC, 0, 88}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"cm", 2, MyCSS_UNIT_TYPE_CM, 0, 91}, + {"s", 1, MyCSS_UNIT_TYPE_S, 0, 92}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"ic", 2, MyCSS_UNIT_TYPE_IC, 0, 95}, + {"ch", 2, MyCSS_UNIT_TYPE_CH, 0, 96}, + {"turn", 4, MyCSS_UNIT_TYPE_TURN, 0, 97}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"Hz", 2, MyCSS_UNIT_TYPE_HZ, 0, 104}, + {"vi", 2, MyCSS_UNIT_TYPE_VI, 0, 105}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"pt", 2, MyCSS_UNIT_TYPE_PT, 0, 115}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vmax", 4, MyCSS_UNIT_TYPE_VMAX, 0, 125}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"em", 2, MyCSS_UNIT_TYPE_EM, 0, 129}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"kHz", 3, MyCSS_UNIT_TYPE_KHZ, 0, 159}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"ex", 2, MyCSS_UNIT_TYPE_EX, 0, 162}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"rad", 3, MyCSS_UNIT_TYPE_RAD, 0, 172}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vmin", 4, MyCSS_UNIT_TYPE_VMIN, 0, 181}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"ms", 2, MyCSS_UNIT_TYPE_MS, 0, 196}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, +}; + +#endif /* MyHTML_MyCSS_VALUES_UNITS_RESOURCES_H */ diff --git a/include/mycss/values/values.h b/include/mycss/values/values.h new file mode 100644 index 0000000..b68b45f --- /dev/null +++ b/include/mycss/values/values.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_VALUES_H +#define MyHTML_MyCSS_VALUES_VALUES_H +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct mycss_values_length { + union { + int i; + float f; + }; + + bool is_float; + mycss_units_type_t type; +} +typedef mycss_values_length_t; + +struct mycss_values_percentage { + union { + int i; + float f; + }; + + bool is_float; +} +typedef mycss_values_percentage_t; + + +void * mycss_values_create(mycss_entry_t* entry, size_t size); +void * mycss_values_destroy(mycss_entry_t* entry, void* value); + +void * mycss_values_entry(mycss_entry_t* entry); +void mycss_values_entry_set(mycss_entry_t* entry, void** value); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_VALUES_H */ diff --git a/include/myhtml/api.h b/include/myhtml/api.h new file mode 100644 index 0000000..9bbe049 --- /dev/null +++ b/include/myhtml/api.h @@ -0,0 +1,2648 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyHTML_API_H +#define MyHTML_MyHTML_API_H +#pragma once + +/** + * @file myhtml/api.h + * + * Fast C/C++ HTML 5 Parser. Using threads. + * With possibility of a Single Mode. + * + * C99 and POSIX Threads! No dependencies! + * + * By https://html.spec.whatwg.org/ specification. + * + */ + +#define MyHTML_VERSION_MAJOR 1 +#define MyHTML_VERSION_MINOR 0 +#define MyHTML_VERSION_PATCH 3 + +#include +#include +#include + +#if defined(_MSC_VER) +# define MyHTML_DEPRECATED(func, message) __declspec(deprecated(message)) func +#elif defined(__GNUC__) || defined(__INTEL_COMPILER) +# define MyHTML_DEPRECATED(func, message) func __attribute__((deprecated(message))) +#else +# define MyHTML_DEPRECATED(func, message) func +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * encodings type + */ +enum myhtml_encoding_list { + MyHTML_ENCODING_DEFAULT = 0x00, +// MyHTML_ENCODING_AUTO = 0x01, // future +// MyHTML_ENCODING_CUSTOM = 0x02, // future + MyHTML_ENCODING_UTF_8 = 0x00, // default encoding + MyHTML_ENCODING_UTF_16LE = 0x04, + MyHTML_ENCODING_UTF_16BE = 0x05, + MyHTML_ENCODING_X_USER_DEFINED = 0x06, + MyHTML_ENCODING_BIG5 = 0x07, + MyHTML_ENCODING_EUC_KR = 0x08, + MyHTML_ENCODING_GB18030 = 0x09, + MyHTML_ENCODING_IBM866 = 0x0a, + MyHTML_ENCODING_ISO_8859_10 = 0x0b, + MyHTML_ENCODING_ISO_8859_13 = 0x0c, + MyHTML_ENCODING_ISO_8859_14 = 0x0d, + MyHTML_ENCODING_ISO_8859_15 = 0x0e, + MyHTML_ENCODING_ISO_8859_16 = 0x0f, + MyHTML_ENCODING_ISO_8859_2 = 0x10, + MyHTML_ENCODING_ISO_8859_3 = 0x11, + MyHTML_ENCODING_ISO_8859_4 = 0x12, + MyHTML_ENCODING_ISO_8859_5 = 0x13, + MyHTML_ENCODING_ISO_8859_6 = 0x14, + MyHTML_ENCODING_ISO_8859_7 = 0x15, + MyHTML_ENCODING_ISO_8859_8 = 0x16, + MyHTML_ENCODING_KOI8_R = 0x17, + MyHTML_ENCODING_KOI8_U = 0x18, + MyHTML_ENCODING_MACINTOSH = 0x19, + MyHTML_ENCODING_WINDOWS_1250 = 0x1a, + MyHTML_ENCODING_WINDOWS_1251 = 0x1b, + MyHTML_ENCODING_WINDOWS_1252 = 0x1c, + MyHTML_ENCODING_WINDOWS_1253 = 0x1d, + MyHTML_ENCODING_WINDOWS_1254 = 0x1e, + MyHTML_ENCODING_WINDOWS_1255 = 0x1f, + MyHTML_ENCODING_WINDOWS_1256 = 0x20, + MyHTML_ENCODING_WINDOWS_1257 = 0x21, + MyHTML_ENCODING_WINDOWS_1258 = 0x22, + MyHTML_ENCODING_WINDOWS_874 = 0x23, + MyHTML_ENCODING_X_MAC_CYRILLIC = 0x24, + MyHTML_ENCODING_ISO_2022_JP = 0x25, + MyHTML_ENCODING_GBK = 0x26, + MyHTML_ENCODING_SHIFT_JIS = 0x27, + MyHTML_ENCODING_EUC_JP = 0x28, + MyHTML_ENCODING_ISO_8859_8_I = 0x29, + MyHTML_ENCODING_LAST_ENTRY = 0x2a +} +typedef myhtml_encoding_t; + +/** + * @struct basic tag ids + */ +enum myhtml_tags { + MyHTML_TAG__UNDEF = 0x000, + MyHTML_TAG__TEXT = 0x001, + MyHTML_TAG__COMMENT = 0x002, + MyHTML_TAG__DOCTYPE = 0x003, + MyHTML_TAG_A = 0x004, + MyHTML_TAG_ABBR = 0x005, + MyHTML_TAG_ACRONYM = 0x006, + MyHTML_TAG_ADDRESS = 0x007, + MyHTML_TAG_ANNOTATION_XML = 0x008, + MyHTML_TAG_APPLET = 0x009, + MyHTML_TAG_AREA = 0x00a, + MyHTML_TAG_ARTICLE = 0x00b, + MyHTML_TAG_ASIDE = 0x00c, + MyHTML_TAG_AUDIO = 0x00d, + MyHTML_TAG_B = 0x00e, + MyHTML_TAG_BASE = 0x00f, + MyHTML_TAG_BASEFONT = 0x010, + MyHTML_TAG_BDI = 0x011, + MyHTML_TAG_BDO = 0x012, + MyHTML_TAG_BGSOUND = 0x013, + MyHTML_TAG_BIG = 0x014, + MyHTML_TAG_BLINK = 0x015, + MyHTML_TAG_BLOCKQUOTE = 0x016, + MyHTML_TAG_BODY = 0x017, + MyHTML_TAG_BR = 0x018, + MyHTML_TAG_BUTTON = 0x019, + MyHTML_TAG_CANVAS = 0x01a, + MyHTML_TAG_CAPTION = 0x01b, + MyHTML_TAG_CENTER = 0x01c, + MyHTML_TAG_CITE = 0x01d, + MyHTML_TAG_CODE = 0x01e, + MyHTML_TAG_COL = 0x01f, + MyHTML_TAG_COLGROUP = 0x020, + MyHTML_TAG_COMMAND = 0x021, + MyHTML_TAG_COMMENT = 0x022, + MyHTML_TAG_DATALIST = 0x023, + MyHTML_TAG_DD = 0x024, + MyHTML_TAG_DEL = 0x025, + MyHTML_TAG_DETAILS = 0x026, + MyHTML_TAG_DFN = 0x027, + MyHTML_TAG_DIALOG = 0x028, + MyHTML_TAG_DIR = 0x029, + MyHTML_TAG_DIV = 0x02a, + MyHTML_TAG_DL = 0x02b, + MyHTML_TAG_DT = 0x02c, + MyHTML_TAG_EM = 0x02d, + MyHTML_TAG_EMBED = 0x02e, + MyHTML_TAG_FIELDSET = 0x02f, + MyHTML_TAG_FIGCAPTION = 0x030, + MyHTML_TAG_FIGURE = 0x031, + MyHTML_TAG_FONT = 0x032, + MyHTML_TAG_FOOTER = 0x033, + MyHTML_TAG_FORM = 0x034, + MyHTML_TAG_FRAME = 0x035, + MyHTML_TAG_FRAMESET = 0x036, + MyHTML_TAG_H1 = 0x037, + MyHTML_TAG_H2 = 0x038, + MyHTML_TAG_H3 = 0x039, + MyHTML_TAG_H4 = 0x03a, + MyHTML_TAG_H5 = 0x03b, + MyHTML_TAG_H6 = 0x03c, + MyHTML_TAG_HEAD = 0x03d, + MyHTML_TAG_HEADER = 0x03e, + MyHTML_TAG_HGROUP = 0x03f, + MyHTML_TAG_HR = 0x040, + MyHTML_TAG_HTML = 0x041, + MyHTML_TAG_I = 0x042, + MyHTML_TAG_IFRAME = 0x043, + MyHTML_TAG_IMAGE = 0x044, + MyHTML_TAG_IMG = 0x045, + MyHTML_TAG_INPUT = 0x046, + MyHTML_TAG_INS = 0x047, + MyHTML_TAG_ISINDEX = 0x048, + MyHTML_TAG_KBD = 0x049, + MyHTML_TAG_KEYGEN = 0x04a, + MyHTML_TAG_LABEL = 0x04b, + MyHTML_TAG_LEGEND = 0x04c, + MyHTML_TAG_LI = 0x04d, + MyHTML_TAG_LINK = 0x04e, + MyHTML_TAG_LISTING = 0x04f, + MyHTML_TAG_MAIN = 0x050, + MyHTML_TAG_MAP = 0x051, + MyHTML_TAG_MARK = 0x052, + MyHTML_TAG_MARQUEE = 0x053, + MyHTML_TAG_MENU = 0x054, + MyHTML_TAG_MENUITEM = 0x055, + MyHTML_TAG_META = 0x056, + MyHTML_TAG_METER = 0x057, + MyHTML_TAG_MTEXT = 0x058, + MyHTML_TAG_NAV = 0x059, + MyHTML_TAG_NOBR = 0x05a, + MyHTML_TAG_NOEMBED = 0x05b, + MyHTML_TAG_NOFRAMES = 0x05c, + MyHTML_TAG_NOSCRIPT = 0x05d, + MyHTML_TAG_OBJECT = 0x05e, + MyHTML_TAG_OL = 0x05f, + MyHTML_TAG_OPTGROUP = 0x060, + MyHTML_TAG_OPTION = 0x061, + MyHTML_TAG_OUTPUT = 0x062, + MyHTML_TAG_P = 0x063, + MyHTML_TAG_PARAM = 0x064, + MyHTML_TAG_PLAINTEXT = 0x065, + MyHTML_TAG_PRE = 0x066, + MyHTML_TAG_PROGRESS = 0x067, + MyHTML_TAG_Q = 0x068, + MyHTML_TAG_RB = 0x069, + MyHTML_TAG_RP = 0x06a, + MyHTML_TAG_RT = 0x06b, + MyHTML_TAG_RTC = 0x06c, + MyHTML_TAG_RUBY = 0x06d, + MyHTML_TAG_S = 0x06e, + MyHTML_TAG_SAMP = 0x06f, + MyHTML_TAG_SCRIPT = 0x070, + MyHTML_TAG_SECTION = 0x071, + MyHTML_TAG_SELECT = 0x072, + MyHTML_TAG_SMALL = 0x073, + MyHTML_TAG_SOURCE = 0x074, + MyHTML_TAG_SPAN = 0x075, + MyHTML_TAG_STRIKE = 0x076, + MyHTML_TAG_STRONG = 0x077, + MyHTML_TAG_STYLE = 0x078, + MyHTML_TAG_SUB = 0x079, + MyHTML_TAG_SUMMARY = 0x07a, + MyHTML_TAG_SUP = 0x07b, + MyHTML_TAG_SVG = 0x07c, + MyHTML_TAG_TABLE = 0x07d, + MyHTML_TAG_TBODY = 0x07e, + MyHTML_TAG_TD = 0x07f, + MyHTML_TAG_TEMPLATE = 0x080, + MyHTML_TAG_TEXTAREA = 0x081, + MyHTML_TAG_TFOOT = 0x082, + MyHTML_TAG_TH = 0x083, + MyHTML_TAG_THEAD = 0x084, + MyHTML_TAG_TIME = 0x085, + MyHTML_TAG_TITLE = 0x086, + MyHTML_TAG_TR = 0x087, + MyHTML_TAG_TRACK = 0x088, + MyHTML_TAG_TT = 0x089, + MyHTML_TAG_U = 0x08a, + MyHTML_TAG_UL = 0x08b, + MyHTML_TAG_VAR = 0x08c, + MyHTML_TAG_VIDEO = 0x08d, + MyHTML_TAG_WBR = 0x08e, + MyHTML_TAG_XMP = 0x08f, + MyHTML_TAG_ALTGLYPH = 0x090, + MyHTML_TAG_ALTGLYPHDEF = 0x091, + MyHTML_TAG_ALTGLYPHITEM = 0x092, + MyHTML_TAG_ANIMATE = 0x093, + MyHTML_TAG_ANIMATECOLOR = 0x094, + MyHTML_TAG_ANIMATEMOTION = 0x095, + MyHTML_TAG_ANIMATETRANSFORM = 0x096, + MyHTML_TAG_CIRCLE = 0x097, + MyHTML_TAG_CLIPPATH = 0x098, + MyHTML_TAG_COLOR_PROFILE = 0x099, + MyHTML_TAG_CURSOR = 0x09a, + MyHTML_TAG_DEFS = 0x09b, + MyHTML_TAG_DESC = 0x09c, + MyHTML_TAG_ELLIPSE = 0x09d, + MyHTML_TAG_FEBLEND = 0x09e, + MyHTML_TAG_FECOLORMATRIX = 0x09f, + MyHTML_TAG_FECOMPONENTTRANSFER = 0x0a0, + MyHTML_TAG_FECOMPOSITE = 0x0a1, + MyHTML_TAG_FECONVOLVEMATRIX = 0x0a2, + MyHTML_TAG_FEDIFFUSELIGHTING = 0x0a3, + MyHTML_TAG_FEDISPLACEMENTMAP = 0x0a4, + MyHTML_TAG_FEDISTANTLIGHT = 0x0a5, + MyHTML_TAG_FEDROPSHADOW = 0x0a6, + MyHTML_TAG_FEFLOOD = 0x0a7, + MyHTML_TAG_FEFUNCA = 0x0a8, + MyHTML_TAG_FEFUNCB = 0x0a9, + MyHTML_TAG_FEFUNCG = 0x0aa, + MyHTML_TAG_FEFUNCR = 0x0ab, + MyHTML_TAG_FEGAUSSIANBLUR = 0x0ac, + MyHTML_TAG_FEIMAGE = 0x0ad, + MyHTML_TAG_FEMERGE = 0x0ae, + MyHTML_TAG_FEMERGENODE = 0x0af, + MyHTML_TAG_FEMORPHOLOGY = 0x0b0, + MyHTML_TAG_FEOFFSET = 0x0b1, + MyHTML_TAG_FEPOINTLIGHT = 0x0b2, + MyHTML_TAG_FESPECULARLIGHTING = 0x0b3, + MyHTML_TAG_FESPOTLIGHT = 0x0b4, + MyHTML_TAG_FETILE = 0x0b5, + MyHTML_TAG_FETURBULENCE = 0x0b6, + MyHTML_TAG_FILTER = 0x0b7, + MyHTML_TAG_FONT_FACE = 0x0b8, + MyHTML_TAG_FONT_FACE_FORMAT = 0x0b9, + MyHTML_TAG_FONT_FACE_NAME = 0x0ba, + MyHTML_TAG_FONT_FACE_SRC = 0x0bb, + MyHTML_TAG_FONT_FACE_URI = 0x0bc, + MyHTML_TAG_FOREIGNOBJECT = 0x0bd, + MyHTML_TAG_G = 0x0be, + MyHTML_TAG_GLYPH = 0x0bf, + MyHTML_TAG_GLYPHREF = 0x0c0, + MyHTML_TAG_HKERN = 0x0c1, + MyHTML_TAG_LINE = 0x0c2, + MyHTML_TAG_LINEARGRADIENT = 0x0c3, + MyHTML_TAG_MARKER = 0x0c4, + MyHTML_TAG_MASK = 0x0c5, + MyHTML_TAG_METADATA = 0x0c6, + MyHTML_TAG_MISSING_GLYPH = 0x0c7, + MyHTML_TAG_MPATH = 0x0c8, + MyHTML_TAG_PATH = 0x0c9, + MyHTML_TAG_PATTERN = 0x0ca, + MyHTML_TAG_POLYGON = 0x0cb, + MyHTML_TAG_POLYLINE = 0x0cc, + MyHTML_TAG_RADIALGRADIENT = 0x0cd, + MyHTML_TAG_RECT = 0x0ce, + MyHTML_TAG_SET = 0x0cf, + MyHTML_TAG_STOP = 0x0d0, + MyHTML_TAG_SWITCH = 0x0d1, + MyHTML_TAG_SYMBOL = 0x0d2, + MyHTML_TAG_TEXT = 0x0d3, + MyHTML_TAG_TEXTPATH = 0x0d4, + MyHTML_TAG_TREF = 0x0d5, + MyHTML_TAG_TSPAN = 0x0d6, + MyHTML_TAG_USE = 0x0d7, + MyHTML_TAG_VIEW = 0x0d8, + MyHTML_TAG_VKERN = 0x0d9, + MyHTML_TAG_MATH = 0x0da, + MyHTML_TAG_MACTION = 0x0db, + MyHTML_TAG_MALIGNGROUP = 0x0dc, + MyHTML_TAG_MALIGNMARK = 0x0dd, + MyHTML_TAG_MENCLOSE = 0x0de, + MyHTML_TAG_MERROR = 0x0df, + MyHTML_TAG_MFENCED = 0x0e0, + MyHTML_TAG_MFRAC = 0x0e1, + MyHTML_TAG_MGLYPH = 0x0e2, + MyHTML_TAG_MI = 0x0e3, + MyHTML_TAG_MLABELEDTR = 0x0e4, + MyHTML_TAG_MLONGDIV = 0x0e5, + MyHTML_TAG_MMULTISCRIPTS = 0x0e6, + MyHTML_TAG_MN = 0x0e7, + MyHTML_TAG_MO = 0x0e8, + MyHTML_TAG_MOVER = 0x0e9, + MyHTML_TAG_MPADDED = 0x0ea, + MyHTML_TAG_MPHANTOM = 0x0eb, + MyHTML_TAG_MROOT = 0x0ec, + MyHTML_TAG_MROW = 0x0ed, + MyHTML_TAG_MS = 0x0ee, + MyHTML_TAG_MSCARRIES = 0x0ef, + MyHTML_TAG_MSCARRY = 0x0f0, + MyHTML_TAG_MSGROUP = 0x0f1, + MyHTML_TAG_MSLINE = 0x0f2, + MyHTML_TAG_MSPACE = 0x0f3, + MyHTML_TAG_MSQRT = 0x0f4, + MyHTML_TAG_MSROW = 0x0f5, + MyHTML_TAG_MSTACK = 0x0f6, + MyHTML_TAG_MSTYLE = 0x0f7, + MyHTML_TAG_MSUB = 0x0f8, + MyHTML_TAG_MSUP = 0x0f9, + MyHTML_TAG_MSUBSUP = 0x0fa, + MyHTML_TAG__END_OF_FILE = 0x0fb, + MyHTML_TAG_FIRST_ENTRY = MyHTML_TAG__TEXT, + MyHTML_TAG_LAST_ENTRY = 0x0fc +}; + +/** + * @struct myhtml statuses + */ +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum myhtml_status { + MyHTML_STATUS_OK = 0x0000, + MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0001, + MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, + MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, + MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, + MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, + MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, + MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, + MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, + MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, + MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, + MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, + MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, + MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, + MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, + MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, + MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, + MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, + MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, + MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, + MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, + MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, + MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 +} +typedef myhtml_status_t; + +#define MYHTML_FAILED(_status_) ((_status_) != MyHTML_STATUS_OK) + +/** + * @struct myhtml namespace + */ +enum myhtml_namespace { + MyHTML_NAMESPACE_UNDEF = 0x00, + MyHTML_NAMESPACE_HTML = 0x01, + MyHTML_NAMESPACE_MATHML = 0x02, + MyHTML_NAMESPACE_SVG = 0x03, + MyHTML_NAMESPACE_XLINK = 0x04, + MyHTML_NAMESPACE_XML = 0x05, + MyHTML_NAMESPACE_XMLNS = 0x06, + + /* MyHTML_NAMESPACE_ANY == MyHTML_NAMESPACE_LAST_ENTRY */ + MyHTML_NAMESPACE_ANY = 0x07, + MyHTML_NAMESPACE_LAST_ENTRY = 0x07 +} +typedef myhtml_namespace_t; + +/** + * @struct myhtml options + */ +enum myhtml_options { + MyHTML_OPTIONS_DEFAULT = 0x00, + MyHTML_OPTIONS_PARSE_MODE_SINGLE = 0x01, + MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE = 0x02, + MyHTML_OPTIONS_PARSE_MODE_SEPARATELY = 0x04 +}; + +/** + * @struct myhtml_tree parse flags + */ +enum myhtml_tree_parse_flags { + MyHTML_TREE_PARSE_FLAGS_CLEAN = 0x000, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE = 0x001, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_PROCESS_TOKEN = 0x003, + MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN = 0x004, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE = 0x008, +} +typedef myhtml_tree_parse_flags_t; + +/** + * @struct myhtml_t MyHTML + * + * Basic structure. Create once for using many times. +*/ +typedef struct myhtml myhtml_t; + +/** + * @struct myhtml_tree_t MyHTML_TREE + * + * Secondary structure. Create once for using many times. + */ +typedef struct myhtml_tree myhtml_tree_t; + +typedef struct myhtml_token_attr myhtml_tree_attr_t; +typedef struct myhtml_tree_node myhtml_tree_node_t; + +/** + * MyHTML_TAG + * + */ +typedef size_t myhtml_tag_id_t; + +typedef struct myhtml_tag_index_node myhtml_tag_index_node_t; +typedef struct myhtml_tag_index_entry myhtml_tag_index_entry_t; +typedef struct myhtml_tag_index myhtml_tag_index_t; + +typedef struct myhtml_tag myhtml_tag_t; + +/** + * MCHAR_ASYNC structures + * + */ +typedef struct mchar_async mchar_async_t; + +/** + * MyHTML_INCOMING structures + * + */ +typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; + +/** + * MyHTML_STRING structures + * + */ +struct myhtml_string { + char* data; + size_t size; + size_t length; + + mchar_async_t *mchar; + size_t node_idx; +} +typedef myhtml_string_t; + +/** + * @struct myhtml_collection_t + */ +struct myhtml_collection { + myhtml_tree_node_t **list; + size_t size; + size_t length; +} +typedef myhtml_collection_t; + +/** + * @struct myhtml_position_t + */ +struct myhtml_position { + size_t begin; + size_t length; +} +typedef myhtml_position_t; + +/** + * @struct myhtml_token_node_t + */ +typedef struct myhtml_token_node myhtml_token_node_t; + +/** + * @struct myhtml_version_t + */ +struct myhtml_version { + int major; + int minor; + int patch; +} +typedef myhtml_version_t; + +// callback functions +typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); +typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); + +/*********************************************************************************** + * + * MyHTML + * + ***********************************************************************************/ + +/** + * Create a MyHTML structure + * + * @return myhtml_t* if successful, otherwise an NULL value. + */ +myhtml_t* +myhtml_create(void); + +/** + * Allocating and Initialization resources for a MyHTML structure + * + * @param[in] myhtml_t* + * @param[in] work options, how many threads will be. + * Default: MyHTML_OPTIONS_PARSE_MODE_SEPARATELY + * + * @param[in] thread count, it depends on the choice of work options + * Default: 1 + * + * @param[in] queue size for a tokens. Dynamically increasing the specified number here. Default: 4096 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status value. + */ +myhtml_status_t +myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, + size_t thread_count, size_t queue_size); + +/** + * Clears queue and threads resources + * + * @param[in] myhtml_t* + */ +void +myhtml_clean(myhtml_t* myhtml); + +/** + * Destroy of a MyHTML structure + * + * @param[in] myhtml_t* + * @return NULL if successful, otherwise an MyHTML structure. + */ +myhtml_t* +myhtml_destroy(myhtml_t* myhtml); + +/** + * Parsing HTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size); + +/** + * Parsing fragment of HTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * Parsing HTML in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size); + +/** + * Parsing fragment of HTML in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * Parsing HTML chunk. For end parsing call myhtml_parse_chunk_end function + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); + +/** + * Parsing chunk of fragment HTML. For end parsing call myhtml_parse_chunk_end function + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html,size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * Parsing HTML chunk in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); + +/** + * Parsing chunk of fragment of HTML in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * End of parsing HTML chunks + * + * @param[in] myhtml_tree_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_end(myhtml_tree_t* tree); + +/*********************************************************************************** + * + * MyHTML_TREE + * + ***********************************************************************************/ + +/** + * Create a MyHTML_TREE structure + * + * @return myhtml_tree_t* if successful, otherwise an NULL value. + */ +myhtml_tree_t* +myhtml_tree_create(void); + +/** + * Allocating and Initialization resources for a MyHTML_TREE structure + * + * @param[in] myhtml_tree_t* + * @param[in] workmyhtml_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); + +/** + * Get Parse Flags of Tree + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_parse_flags_t + */ +myhtml_tree_parse_flags_t +myhtml_tree_parse_flags(myhtml_tree_t* tree); + +/** + * Set Parse Flags for Tree + * See enum myhtml_tree_parse_flags in this file + * + * @example myhtml_tree_parse_flags_set(tree, MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE| + * MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE| + * MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN); + * + * @param[in] myhtml_tree_t* + * @param[in] parse flags. You can combine their + */ +void +myhtml_tree_parse_flags_set(myhtml_tree_t* tree, myhtml_tree_parse_flags_t parse_flags); + +/** + * Clears resources before new parsing + * + * @param[in] myhtml_tree_t* + */ +void +myhtml_tree_clean(myhtml_tree_t* tree); + +/** + * Add child node to node. If children already exists it will be added to the last + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* The node to which we add child node + * @param[in] myhtml_tree_node_t* The node which adds + */ +void +myhtml_tree_node_add_child(myhtml_tree_t* tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); + +/** + * Add a node immediately before the existing node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* add for this node + * @param[in] myhtml_tree_node_t* add this node + */ +void +myhtml_tree_node_insert_before(myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); + +/** + * Add a node immediately after the existing node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* add for this node + * @param[in] myhtml_tree_node_t* add this node + */ +void +myhtml_tree_node_insert_after(myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); + +/** + * Destroy of a MyHTML_TREE structure + * + * @param[in] myhtml_tree_t* + * + * @return NULL if successful, otherwise an MyHTML_TREE structure + */ +myhtml_tree_t* +myhtml_tree_destroy(myhtml_tree_t* tree); + +/** + * Get myhtml_t* from a myhtml_tree_t* + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_t* if exists, otherwise a NULL value + */ +myhtml_t* +myhtml_tree_get_myhtml(myhtml_tree_t* tree); + +/** + * Get myhtml_tag_t* from a myhtml_tree_t* + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tag_t* if exists, otherwise a NULL value + */ +myhtml_tag_t* +myhtml_tree_get_tag(myhtml_tree_t* tree); + +/** + * Get myhtml_tag_index_t* from a myhtml_tree_t* + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tag_index_t* if exists, otherwise a NULL value + */ +myhtml_tag_index_t* +myhtml_tree_get_tag_index(myhtml_tree_t* tree); + +/** + * Get Tree Document (Root of Tree) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_document(myhtml_tree_t* tree); + +/** + * Get node HTML (Document -> HTML, Root of HTML Document) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_node_html(myhtml_tree_t* tree); + +/** + * Get node HEAD (Document -> HTML -> HEAD) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_node_head(myhtml_tree_t* tree); + +/** + * Get node BODY (Document -> HTML -> BODY) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_node_body(myhtml_tree_t* tree); + +/** + * Get mchar_async_t object + * + * @param[in] myhtml_tree_t* + * + * @return mchar_async_t* if exists, otherwise a NULL value + */ +mchar_async_t* +myhtml_tree_get_mchar(myhtml_tree_t* tree); + +/** + * Get node_id from main thread for mchar_async_t object + * + * @param[in] myhtml_tree_t* + * + * @return size_t, node id + */ +size_t +myhtml_tree_get_mchar_node_id(myhtml_tree_t* tree); + +/** + * Print tree of a node. Print including current node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] file handle, for example use stdout + * @param[in] tab (\t) increment for pretty print, set 0 + */ +void +myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, + FILE* out, size_t inc); + +/** + * Print tree of a node. Print excluding current node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] file handle, for example use stdout + * @param[in] tab (\t) increment for pretty print, set 0 + */ +void +myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, + FILE* out, size_t inc); + +/** + * Print a node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] file handle, for example use stdout + */ +void +myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out); + +/** + * Get first Incoming Buffer + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_incoming_buffer_t* if successful, otherwise a NULL value + */ +myhtml_incoming_buffer_t* +myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); + +/*********************************************************************************** + * + * MyHTML_NODE + * + ***********************************************************************************/ + +/** + * Get first (begin) node of tree + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_first(myhtml_tree_t* tree); + +/** + * Get nodes by tag id + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] tag id + * @param[out] status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, + myhtml_tag_id_t tag_id, myhtml_status_t *status); + +/** + * Get nodes by tag name + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] tag name + * @param[in] tag name length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, + const char* name, size_t length, myhtml_status_t *status); + +/** + * Get nodes by attribute key + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] find key + * @param[in] find key length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, + myhtml_tree_node_t* scope_node, + const char* key, size_t key_len, myhtml_status_t* status); + +/** + * Get nodes by attribute value; exactly equal; like a [foo="bar"] + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; whitespace separated; like a [foo~="bar"] + * + * @example if value="bar" and node attr value="lalala bar bebebe", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; value begins exactly with the string; like a [foo^="bar"] + * + * @example if value="bar" and node attr value="barmumumu", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + + +/** + * Get nodes by attribute value; value ends exactly with the string; like a [foo$="bar"] + * + * @example if value="bar" and node attr value="mumumubar", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; value contains the substring; like a [foo*="bar"] + * + * @example if value="bar" and node attr value="bububarmumu", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; attribute value is a hyphen-separated list of values beginning; + * like a [foo|="bar"] + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] optional; status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by tag id in node scope + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] node for search tag_id in children nodes + * @param[in] tag_id for search + * @param[out] status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, + myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, + myhtml_status_t *status); + +/** + * Get nodes by tag name in node scope + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] node for search tag_id in children nodes + * @param[in] tag name + * @param[in] tag name length + * @param[out] status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, + myhtml_tree_node_t *node, const char* html, size_t length, + myhtml_status_t *status); + +/** + * Get next sibling node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_next(myhtml_tree_node_t *node); + +/** + * Get previous sibling node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_prev(myhtml_tree_node_t *node); + +/** + * Get parent node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_parent(myhtml_tree_node_t *node); + +/** + * Get child (first child) of node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_child(myhtml_tree_node_t *node); + +/** + * Get last child of node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_last_child(myhtml_tree_node_t *node); + +/** + * Create new node + * + * @param[in] myhtml_tree_t* + * @param[in] tag id, see enum myhtml_tags + * @param[in] enum myhtml_namespace + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_create(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, + enum myhtml_namespace ns); + +/** + * Release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + */ +void +myhtml_node_free(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +/** + * Remove node of tree + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_remove(myhtml_tree_node_t *node); + +/** + * Remove node of tree and release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + */ +void +myhtml_node_delete(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +/** + * Remove nodes of tree recursively and release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + */ +void +myhtml_node_delete_recursive(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +/** + * The appropriate place for inserting a node. Insertion with validation. + * If try insert node to node, then node inserted before
node + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_insert_to_appropriate_place(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Append to target node as last child. Insertion without validation. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_append_child(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Append sibling node after target node. Insertion without validation. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_insert_after(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Append sibling node before target node. Insertion without validation. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_insert_before(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Add text for a node with convert character encoding. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] text + * @param[in] text length + * @param[in] character encoding + * + * @return myhtml_string_t* if successful, otherwise a NULL value + */ +myhtml_string_t* +myhtml_node_text_set(myhtml_tree_t* tree, myhtml_tree_node_t *node, + const char* text, size_t length, myhtml_encoding_t encoding); + +/** + * Add text for a node with convert character encoding. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] text + * @param[in] text length + * @param[in] character encoding + * + * @return myhtml_string_t* if successful, otherwise a NULL value + */ +myhtml_string_t* +myhtml_node_text_set_with_charef(myhtml_tree_t* tree, myhtml_tree_node_t *node, + const char* text, size_t length, myhtml_encoding_t encoding); + +/** + * Get token node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_token_node_t* + */ +myhtml_token_node_t* +myhtml_node_token(myhtml_tree_node_t *node); + +/** + * Get node namespace + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_namespace_t + */ +myhtml_namespace_t +myhtml_node_namespace(myhtml_tree_node_t *node); + +/** + * Set node namespace + * + * @param[in] myhtml_tree_node_t* + * @param[in] myhtml_namespace_t + */ +void +myhtml_node_namespace_set(myhtml_tree_node_t *node, myhtml_namespace_t ns); + +/** + * Get node tag id + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tag_id_t + */ +myhtml_tag_id_t +myhtml_node_tag_id(myhtml_tree_node_t *node); + +/** + * Node has self-closing flag? + * + * @param[in] myhtml_tree_node_t* + * + * @return true or false (1 or 0) + */ +bool +myhtml_node_is_close_self(myhtml_tree_node_t *node); + +/** + * Get first attribute of a node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_node_attribute_first(myhtml_tree_node_t *node); + +/** + * Get last attribute of a node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_node_attribute_last(myhtml_tree_node_t *node); + +/** + * Get text of a node. Only for a MyHTML_TAG__TEXT or MyHTML_TAG__COMMENT tags + * + * @param[in] myhtml_tree_node_t* + * @param[out] optional, text length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_node_text(myhtml_tree_node_t *node, size_t *length); + +/** + * Get myhtml_string_t object by Tree node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_node_string(myhtml_tree_node_t *node); + +/** + * Get raw position for Tree Node in Incoming Buffer + * + * @example <[BEGIN]div[LENGTH] attr=lalala> + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t + */ +myhtml_position_t +myhtml_node_raw_pasition(myhtml_tree_node_t *node); + +/** + * Get element position for Tree Node in Incoming Buffer + * + * @example [BEGIN]
[LENGTH] + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t + */ +myhtml_position_t +myhtml_node_element_pasition(myhtml_tree_node_t *node); + +/*********************************************************************************** + * + * MyHTML_ATTRIBUTE + * + ***********************************************************************************/ + +/** + * Get next sibling attribute of one node + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_next(myhtml_tree_attr_t *attr); + +/** + * Get previous sibling attribute of one node + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_prev(myhtml_tree_attr_t *attr); + +/** + * Get attribute namespace + * + * @param[in] myhtml_tree_attr_t* + * + * @return enum myhtml_namespace + */ +myhtml_namespace_t +myhtml_attribute_namespace(myhtml_tree_attr_t *attr); + +/** + * Set attribute namespace + * + * @param[in] myhtml_tree_attr_t* + * @param[in] myhtml_namespace_t + */ +void +myhtml_attribute_namespace_set(myhtml_tree_attr_t *attr, myhtml_namespace_t ns); + +/** + * Get attribute key + * + * @param[in] myhtml_tree_attr_t* + * @param[out] optional, name length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_attribute_key(myhtml_tree_attr_t *attr, size_t *length); + +/** + * Get attribute value + * + * @param[in] myhtml_tree_attr_t* + * @param[out] optional, value length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); + +/** + * Get attribute key string + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_attribute_key_string(myhtml_tree_attr_t* attr); + +/** + * Get attribute value string + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_attribute_value_string(myhtml_tree_attr_t* attr); + +/** + * Get attribute by key + * + * @param[in] myhtml_tree_node_t* + * @param[in] attr key name + * @param[in] attr key name length + * + * @return myhtml_tree_attr_t* if exists, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_by_key(myhtml_tree_node_t *node, + const char *key, size_t key_len); + +/** + * Added attribute to tree node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] attr key name + * @param[in] attr key name length + * @param[in] attr value name + * @param[in] attr value name length + * @param[in] character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * + * @return created myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_add(myhtml_tree_t *tree, myhtml_tree_node_t *node, + const char *key, size_t key_len, + const char *value, size_t value_len, + myhtml_encoding_t encoding); + +/** + * Remove attribute reference. Not release the resources + * + * @param[in] myhtml_tree_node_t* + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_remove(myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); + +/** + * Remove attribute by key reference. Not release the resources + * + * @param[in] myhtml_tree_node_t* + * @param[in] attr key name + * @param[in] attr key name length + * + * @return myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_remove_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); + +/** + * Remove attribute and release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] myhtml_tree_attr_t* + * + */ +void +myhtml_attribute_delete(myhtml_tree_t *tree, myhtml_tree_node_t *node, + myhtml_tree_attr_t *attr); + +/** + * Release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +void +myhtml_attribute_free(myhtml_tree_t *tree, myhtml_tree_attr_t *attr); + +/** + * Get raw position for Attribute Key in Incoming Buffer + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_attribute_key_raw_position(myhtml_tree_attr_t *attr); + +/** + * Get raw position for Attribute Value in Incoming Buffer + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr); + +/*********************************************************************************** + * + * MyHTML_TOKEN_NODE + * + ***********************************************************************************/ + +/** + * Get token node tag id + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_tag_id_t + */ +myhtml_tag_id_t +myhtml_token_node_tag_id(myhtml_token_node_t *token_node); + +/** + * Get raw position for Token Node in Incoming Buffer + * + * @example <[BEGIN]div[LENGTH] attr=lalala> + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_token_node_raw_pasition(myhtml_token_node_t *token_node); + +/** + * Get element position for Token Node in Incoming Buffer + * + * @example [BEGIN]
[LENGTH] + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_token_node_element_pasition(myhtml_token_node_t *token_node); + +/** + * Get first attribute of a token node + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_token_node_attribute_first(myhtml_token_node_t *token_node); + +/** + * Get last attribute of a token node + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_token_node_attribute_last(myhtml_token_node_t *token_node); + +/** + * Get text of a token node. Only for a MyHTML_TAG__TEXT or MyHTML_TAG__COMMENT tags + * + * @param[in] myhtml_token_node_t* + * @param[out] optional, text length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); + +/** + * Get myhtml_string_t object by token node + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_token_node_string(myhtml_token_node_t *token_node); + +/** + * Token node has self-closing flag? + * + * @param[in] myhtml_tree_node_t* + * + * @return true or false (1 or 0) + */ +bool +myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); + +/** + * Wait for process token all parsing stage. Need if you use thread mode + * + * @param[in] myhtml_token_node_t* + */ +void +myhtml_token_node_wait_for_done(myhtml_token_node_t* node); + +/*********************************************************************************** + * + * MyHTML_TAG + * + ***********************************************************************************/ + +/** + * Get tag name by tag id + * + * @param[in] myhtml_tree_t* + * @param[in] tag id + * @param[out] optional, name length + * + * @return const char* if exists, otherwise a NULL value + */ +const char* +myhtml_tag_name_by_id(myhtml_tree_t* tree, + myhtml_tag_id_t tag_id, size_t *length); + +/** + * Get tag id by name + * + * @param[in] myhtml_tree_t* + * @param[in] tag name + * @param[in] tag name length + * + * @return tag id + */ +myhtml_tag_id_t +myhtml_tag_id_by_name(myhtml_tree_t* tree, + const char *tag_name, size_t length); + +/*********************************************************************************** + * + * MyHTML_TAG_INDEX + * + ***********************************************************************************/ + +/** + * Create tag index structure + * + * @return myhtml_tag_index_t* if successful, otherwise a NULL value + */ +myhtml_tag_index_t* +myhtml_tag_index_create(void); + +/** + * Allocating and Initialization resources for a tag index structure + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status. + */ +myhtml_status_t +myhtml_tag_index_init(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index); + +/** + * Clears tag index + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * + */ +void +myhtml_tag_index_clean(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index); + +/** + * Free allocated resources + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * + * @return NULL if successful, otherwise an myhtml_tag_index_t* structure + */ +myhtml_tag_index_t* +myhtml_tag_index_destroy(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index); + +/** + * Adds myhtml_tree_node_t* to tag index + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tree_node_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status. + */ +myhtml_status_t +myhtml_tag_index_add(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index, myhtml_tree_node_t* node); + +/** + * Get root tag index. Is the initial entry for a tag. It contains statistics and other items by tag + * + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tag_id_t + * + * @return myhtml_tag_index_entry_t* if successful, otherwise a NULL value. + */ +myhtml_tag_index_entry_t* +myhtml_tag_index_entry(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/** + * Get first index node for tag + * + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tag_id_t + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_first(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/** + * Get last index node for tag + * + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tag_id_t + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_last(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/** + * Get next index node for tag, by index node + * + * @param[in] myhtml_tag_index_node_t* + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_next(myhtml_tag_index_node_t *index_node); + +/** + * Get previous index node for tag, by index node + * + * @param[in] myhtml_tag_index_node_t* + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_prev(myhtml_tag_index_node_t *index_node); + +/** + * Get myhtml_tree_node_t* by myhtml_tag_index_node_t* + * + * @param[in] myhtml_tag_index_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise a NULL value. + */ +myhtml_tree_node_t* +myhtml_tag_index_tree_node(myhtml_tag_index_node_t *index_node); + +/** + * Get count of elements in index by tag id + * + * @param[in] myhtml_tag_index_t* + * @param[in] tag id + * + * @return count of elements + */ +size_t +myhtml_tag_index_entry_count(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/*********************************************************************************** + * + * MyHTML_COLLECTION + * + ***********************************************************************************/ + +/** + * Create collection + * + * @param[in] list size + * @param[out] optional, status of operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_collection_create(size_t size, myhtml_status_t *status); + +/** + * Clears collection + * + * @param[in] myhtml_collection_t* + */ +void +myhtml_collection_clean(myhtml_collection_t *collection); + +/** + * Destroy allocated resources + * + * @param[in] myhtml_collection_t* + * + * @return NULL if successful, otherwise an myhtml_collection_t* structure + */ +myhtml_collection_t* +myhtml_collection_destroy(myhtml_collection_t *collection); + +/** + * Check size by length and increase if necessary + * + * @param[in] myhtml_collection_t* + * @param[in] need nodes + * @param[in] upto_length: count for up if nodes not exists + * (current length + need + upto_length + 1) + * + * @return NULL if successful, otherwise an myhtml_collection_t* structure + */ +myhtml_status_t +myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); + +/*********************************************************************************** + * + * MyHTML_ENCODING + * + ***********************************************************************************/ + +/** + * Set character encoding for input stream + * + * @param[in] myhtml_tree_t* + * @param[in] Input character encoding + * + */ +void +myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); + +/** + * Get character encoding for current stream + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_encoding_t + */ +myhtml_encoding_t +myhtml_encoding_get(myhtml_tree_t* tree); + +/** + * Convert Unicode Codepoint to UTF-8 + * + * @param[in] Codepoint + * @param[in] Data to set characters. Minimum data length is 1 bytes, maximum is 4 byte + * data length must be always available 4 bytes + * + * @return size character set + */ +size_t +myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); + +/** + * Convert Unicode Codepoint to UTF-16LE + * + * I advise not to use UTF-16! Use UTF-8 and be happy! + * + * @param[in] Codepoint + * @param[in] Data to set characters. Data length is 2 or 4 bytes + * data length must be always available 4 bytes + * + * @return size character set + */ +size_t +myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); + +/** + * Detect character encoding + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * and Russians: windows-1251, koi8-r, iso-8859-5, x-mac-cyrillic, ibm866 + * Other in progress + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Russian character encoding + * + * Now available for detect windows-1251, koi8-r, iso-8859-5, x-mac-cyrillic, ibm866 + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Unicode character encoding + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Unicode character encoding by BOM + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Unicode character encoding by BOM. Cut BOM if will be found + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * @param[out] new text position + * @param[out] new size position + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, + const char **new_text, size_t *new_size); + +/** + * Detect encoding by name + * Names like: windows-1258 return MyHTML_ENCODING_WINDOWS_1258 + * cp1251 or windows-1251 return MyHTML_ENCODING_WINDOWS_1251 + * + * See https://encoding.spec.whatwg.org/#names-and-labels + * + * @param[in] name + * @param[in] name length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); + +/*********************************************************************************** + * + * MyHTML_STRING + * + ***********************************************************************************/ + +/** + * Init myhtml_string_t structure + * + * @param[in] mchar_async_t*. It can be obtained from myhtml_tree_t object + * (see myhtml_tree_get_mchar function) or create manualy + * For each Tree creates its object, I recommend to use it (myhtml_tree_get_mchar). + * + * @param[in] node_id. For all threads (and Main thread) identifier that is unique. + * if created mchar_async_t object manually you know it, if not then take from the Tree + * (see myhtml_tree_get_mchar_node_id) + * + * @param[in] myhtml_string_t*. It can be obtained from myhtml_tree_node_t object + * (see myhtml_node_string function) or create manualy + * + * @param[in] data size. Set the size you want for char* + * + * @return char* of the size if successful, otherwise a NULL value + */ +char* +myhtml_string_init(mchar_async_t *mchar, size_t node_id, + myhtml_string_t* str, size_t size); + +/** + * Increase the current size for myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] data size. Set the new size you want for myhtml_string_t object + * + * @return char* of the size if successful, otherwise a NULL value + */ +char* +myhtml_string_realloc(myhtml_string_t *str, size_t new_size); + +/** + * Clean myhtml_string_t object. In reality, data length set to 0 + * Equivalently: myhtml_string_length_set(str, 0); + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + */ +void +myhtml_string_clean(myhtml_string_t* str); + +/** + * Clean myhtml_string_t object. Equivalently: memset(str, 0, sizeof(myhtml_string_t)) + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + */ +void +myhtml_string_clean_all(myhtml_string_t* str); + +/** + * Release all resources for myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] call free function for current object or not + * + * @return NULL if destroy_obj set true, otherwise a current myhtml_string_t object + */ +myhtml_string_t* +myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); + +/** + * Get data (char*) from a myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * + * @return char* if exists, otherwise a NULL value + */ +char* +myhtml_string_data(myhtml_string_t *str); + +/** + * Get data length from a myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * + * @return data length + */ +size_t +myhtml_string_length(myhtml_string_t *str); + +/** + * Get data size from a myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * + * @return data size + */ +size_t +myhtml_string_size(myhtml_string_t *str); + +/** + * Set data (char *) for a myhtml_string_t object. + * + * Attention!!! Attention!!! Attention!!! + * + * You can assign only that it has been allocated from functions: + * myhtml_string_data_alloc + * myhtml_string_data_realloc + * or obtained manually created from mchar_async_t object + * + * Attention!!! Do not try set chat* from allocated by malloc or realloc!!! + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] you data to want assign + * + * @return assigned data if successful, otherwise a NULL value + */ +char* +myhtml_string_data_set(myhtml_string_t *str, char *data); + +/** + * Set data size for a myhtml_string_t object. + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] you size to want assign + * + * @return assigned size + */ +size_t +myhtml_string_size_set(myhtml_string_t *str, size_t size); + +/** + * Set data length for a myhtml_string_t object. + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] you length to want assign + * + * @return assigned length + */ +size_t +myhtml_string_length_set(myhtml_string_t *str, size_t length); + +/** + * Allocate data (char*) from a mchar_async_t object + * + * @param[in] mchar_async_t*. See description for myhtml_string_init function + * @param[in] node id. See description for myhtml_string_init function + * @param[in] you size to want assign + * + * @return data if successful, otherwise a NULL value + */ +char* +myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); + +/** + * Allocate data (char*) from a mchar_async_t object + * + * @param[in] mchar_async_t*. See description for myhtml_string_init function + * @param[in] node id. See description for myhtml_string_init function + * @param[in] old data + * @param[in] how much data is copied from the old data to new data + * @param[in] new size + * + * @return data if successful, otherwise a NULL value + */ +char* +myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, + char *data, size_t len_to_copy, size_t size); + +/** + * Release allocated data + * + * @param[in] mchar_async_t*. See description for myhtml_string_init function + * @param[in] node id. See description for myhtml_string_init function + * @param[in] data to release + * + * @return data if successful, otherwise a NULL value + */ +void +myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); + +/*********************************************************************************** + * + * MyHTML_INCOMING + * + * @description + * For example, three buffer: + * 1) Data: "bebebe"; Prev: 0; Next: 2; Size: 6; Length: 6; Offset: 0 + * 2) Data: "lalala-lululu"; Prev: 1; Next: 3; Size: 13; Length: 13; Offset: 6 + * 3) Data: "huy"; Prev: 2; Next: 0; Size: 3; Length: 1; Offset: 19 + * + ***********************************************************************************/ + +/** + * Get Incoming Buffer by position + * + * @param[in] current myhtml_incoming_buffer_t* + * @param[in] begin position + * + * @return myhtml_incoming_buffer_t if successful, otherwise a NULL value + */ +myhtml_incoming_buffer_t* +myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); + +/** + * Get data of Incoming Buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return const char* if successful, otherwise a NULL value + */ +const char* +myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get data length of Incoming Buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get data size of Incoming Buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get data offset of Incoming Buffer. Global position of begin Incoming Buffer. + * See description for MyHTML_INCOMING title + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get Relative Position for Incoming Buffer. + * Incoming Buffer should be prepared by myhtml_incoming_buffer_find_by_position + * + * @param[in] myhtml_incoming_buffer_t* + * @param[in] global begin + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); + +/** + * This function returns number of available data by Incoming Buffer + * Incoming buffer may be incomplete. See myhtml_incoming_buffer_next + * + * @param[in] myhtml_incoming_buffer_t* + * @param[in] global begin + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, + size_t relative_begin, size_t length); + +/** + * Get next buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return myhtml_incoming_buffer_t* + */ +myhtml_incoming_buffer_t* +myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get prev buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return myhtml_incoming_buffer_t* + */ +myhtml_incoming_buffer_t* +myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); + +/*********************************************************************************** + * + * MyHTML_NAMESPACE + * + ***********************************************************************************/ + +/** + * Get namespace text by namespace type (id) + * + * @param[in] myhtml_namespace_t + * @param[out] optional, length of returned text + * + * @return text if successful, otherwise a NULL value + */ +const char* +myhtml_namespace_name_by_id(myhtml_namespace_t ns, size_t *length); + +/** + * Get namespace type (id) by namespace text + * + * @param[in] const char*, namespace text + * @param[in] size of namespace text + * @param[out] detected namespace type (id) + * + * @return true if detect, otherwise false + */ +bool +myhtml_namespace_id_by_name(const char *name, size_t length, myhtml_namespace_t *ns); + +/*********************************************************************************** + * + * MyHTML_CALLBACK + * + ***********************************************************************************/ + +/** + * Get current callback for tokens before processing + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_token_f + */ +myhtml_callback_token_f +myhtml_callback_before_token_done(myhtml_tree_t* tree); + +/** + * Get current callback for tokens after processing + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_token_f + */ +myhtml_callback_token_f +myhtml_callback_after_token_done(myhtml_tree_t* tree); + +/** + * Set callback for tokens before processing + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_token_f callback function + */ +void +myhtml_callback_before_token_done_set(myhtml_tree_t* tree, myhtml_callback_token_f func, void* ctx); + +/** + * Set callback for tokens after processing + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_token_f callback function + */ +void +myhtml_callback_after_token_done_set(myhtml_tree_t* tree, myhtml_callback_token_f func, void* ctx); + +/** + * Get current callback for tree node after inserted + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_tree_node_f + */ +myhtml_callback_tree_node_f +myhtml_callback_tree_node_insert(myhtml_tree_t* tree); + +/** + * Get current callback for tree node after removed + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_tree_node_f + */ +myhtml_callback_tree_node_f +myhtml_callback_tree_node_remove(myhtml_tree_t* tree); + +/** + * Set callback for tree node after inserted + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * Warning!!! + * If you well access to attributes or text for node and you using thread mode then + * you need wait for token processing done. See myhtml_token_node_wait_for_done + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_tree_node_f callback function + */ +void +myhtml_callback_tree_node_insert_set(myhtml_tree_t* tree, myhtml_callback_tree_node_f func, void* ctx); + +/** + * Set callback for tree node after removed + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * Warning!!! + * If you well access to attributes or text for node and you using thread mode then + * you need wait for token processing done. See myhtml_token_node_wait_for_done + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_tree_node_f callback function + */ +void +myhtml_callback_tree_node_remove_set(myhtml_tree_t* tree, myhtml_callback_tree_node_f func, void* ctx); + +/*********************************************************************************** + * + * MyHTML_UTILS + * + ***********************************************************************************/ + +/** + * Compare two strings ignoring case + * + * @param[in] myhtml_collection_t* + * @param[in] count of add nodes + * + * @return 0 if match, otherwise index of break position + */ +size_t +myhtml_strcasecmp(const char* str1, const char* str2); + +/** + * Compare two strings ignoring case of the first n characters + * + * @param[in] myhtml_collection_t* + * @param[in] count of add nodes + * + * @return 0 if match, otherwise index of break position + */ +size_t +myhtml_strncasecmp(const char* str1, const char* str2, size_t size); + +/*********************************************************************************** + * + * MyHTML_VERSION + * + ***********************************************************************************/ + +/** + * Get current version + * + * @return myhtml_version_t + */ +myhtml_version_t +myhtml_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_api.h */ diff --git a/include/myhtml/api_encoding.h b/include/myhtml/api_encoding.h new file mode 100644 index 0000000..a8dff01 --- /dev/null +++ b/include/myhtml/api_encoding.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_API_ENCODING_H +#define MyHTML_API_ENCODING_H +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum myhtml_encoding_status { + MyHTML_ENCODING_STATUS_OK = 0x00, + MyHTML_ENCODING_STATUS_ERROR = 0x01, + MyHTML_ENCODING_STATUS_CONTINUE = 0x02, + MyHTML_ENCODING_STATUS_DONE = 0x04 +} +typedef myhtml_encoding_status_t; + +struct myhtml_encoding_result { + unsigned long first; + unsigned long second; + unsigned long third; + unsigned long result; + unsigned long result_aux; + unsigned long flag; +} +typedef myhtml_encoding_result_t; + +typedef myhtml_encoding_status_t +(*myhtml_encoding_custom_f)(unsigned const char byte, myhtml_encoding_result_t *res); + +/*********************************************************************************** + * + * MyHTML_ENCODING + * + ***********************************************************************************/ + +/** + * Clean myhtml_encoding_result_t. Use this function before and after text decode + * + * @param[in] myhtml_encoding_result_t* + */ +void +myhtml_encoding_result_clean(myhtml_encoding_result_t *res); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* api_encoding_h */ diff --git a/include/myhtml/callback.h b/include/myhtml/callback.h new file mode 100644 index 0000000..c29dbe6 --- /dev/null +++ b/include/myhtml/callback.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_CALLBACK_H +#define MyHTML_CALLBACK_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* callback functions */ +myhtml_callback_token_f myhtml_callback_before_token_done(myhtml_tree_t *tree); +myhtml_callback_token_f myhtml_callback_after_token_done(myhtml_tree_t *tree); +void myhtml_callback_before_token_done_set(myhtml_tree_t *tree, myhtml_callback_token_f func, void* ctx); +void myhtml_callback_after_token_done_set(myhtml_tree_t *tree, myhtml_callback_token_f func, void* ctx); + +myhtml_callback_tree_node_f myhtml_callback_tree_node_insert(myhtml_tree_t *tree); +myhtml_callback_tree_node_f myhtml_callback_tree_node_remove(myhtml_tree_t *tree); +void myhtml_callback_tree_node_insert_set(myhtml_tree_t *tree, myhtml_callback_tree_node_f func, void* ctx); +void myhtml_callback_tree_node_remove_set(myhtml_tree_t *tree, myhtml_callback_tree_node_f func, void* ctx); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_CALLBACK_H */ diff --git a/include/myhtml/charef.h b/include/myhtml/charef.h new file mode 100644 index 0000000..d98dfc6 --- /dev/null +++ b/include/myhtml/charef.h @@ -0,0 +1,56 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_CHAREF_H +#define MyHTML_CHAREF_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct charef_entry { + unsigned char ch; + size_t next; + size_t cur_pos; + size_t codepoints[2]; + size_t codepoints_len; +} +typedef charef_entry_t; + +struct charef_entry_result { + const charef_entry_t *curr_entry; + const charef_entry_t *last_entry; + size_t last_offset; + int is_done; +} +typedef charef_entry_result_t; + +const charef_entry_t * myhtml_charef_find(const char *begin, size_t *offset, size_t size, size_t *data_size); +const charef_entry_t * myhtml_charef_find_by_pos(size_t pos, const char *begin, size_t *offset, size_t size, charef_entry_result_t *result); +const charef_entry_t * myhtml_charef_get_first_position(const char begin); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* charef_h */ diff --git a/include/myhtml/charef_resource.h b/include/myhtml/charef_resource.h new file mode 100644 index 0000000..79c2086 --- /dev/null +++ b/include/myhtml/charef_resource.h @@ -0,0 +1,5957 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_CHAREF_RESOURCE_H +#define MyHTML_CHAREF_RESOURCE_H +#pragma once + +static const charef_entry_t named_character_references[] = { + {'\0', 0, 0, {0}, 0},{'\0', 0, 1, {0}, 0},{'\0', 0, 2, {0}, 0}, + {'\0', 0, 3, {0}, 0},{'\0', 0, 4, {0}, 0},{'\0', 0, 5, {0}, 0}, + {'\0', 0, 6, {0}, 0},{'\0', 0, 7, {0}, 0},{'\0', 0, 8, {0}, 0}, + {'\0', 0, 9, {0}, 0},{'\0', 0, 10, {0}, 0},{'\0', 0, 11, {0}, 0}, + {'\0', 0, 12, {0}, 0},{'\0', 0, 13, {0}, 0},{'\0', 0, 14, {0}, 0}, + {'\0', 0, 15, {0}, 0},{'\0', 0, 16, {0}, 0},{'\0', 0, 17, {0}, 0}, + {'\0', 0, 18, {0}, 0},{'\0', 0, 19, {0}, 0},{'\0', 0, 20, {0}, 0}, + {'\0', 0, 21, {0}, 0},{'\0', 0, 22, {0}, 0},{'\0', 0, 23, {0}, 0}, + {'\0', 0, 24, {0}, 0},{'\0', 0, 25, {0}, 0},{'\0', 0, 26, {0}, 0}, + {'\0', 0, 27, {0}, 0},{'\0', 0, 28, {0}, 0},{'\0', 0, 29, {0}, 0}, + {'\0', 0, 30, {0}, 0},{'\0', 0, 31, {0}, 0},{'\0', 0, 32, {0}, 0}, + {'\0', 0, 33, {0}, 0},{'\0', 0, 34, {0}, 0},{'\0', 0, 35, {0}, 0}, + {'\0', 0, 36, {0}, 0},{'\0', 0, 37, {0}, 0},{'\0', 0, 38, {0}, 0}, + {'\0', 0, 39, {0}, 0},{'\0', 0, 40, {0}, 0},{'\0', 0, 41, {0}, 0}, + {'\0', 0, 42, {0}, 0},{'\0', 0, 43, {0}, 0},{'\0', 0, 44, {0}, 0}, + {'\0', 0, 45, {0}, 0},{'\0', 0, 46, {0}, 0},{'\0', 0, 47, {0}, 0}, + {'\0', 0, 48, {0}, 0},{'\0', 0, 49, {0}, 0},{'\0', 0, 50, {0}, 0}, + {'\0', 0, 51, {0}, 0},{'\0', 0, 52, {0}, 0},{'\0', 0, 53, {0}, 0}, + {'\0', 0, 54, {0}, 0},{'\0', 0, 55, {0}, 0},{'\0', 0, 56, {0}, 0}, + {'\0', 0, 57, {0}, 0},{'\0', 0, 58, {0}, 0},{'\0', 0, 59, {0}, 0}, + {'\0', 0, 60, {0}, 0},{'\0', 0, 61, {0}, 0},{'\0', 0, 62, {0}, 0}, + {'\0', 0, 63, {0}, 0},{'\0', 0, 64, {0}, 0},{'A', 257, 65, {0}, 0}, + {'B', 427, 66, {0}, 0},{'C', 536, 67, {0}, 0},{'D', 1001, 68, {0}, 0}, + {'E', 1702, 69, {0}, 0},{'F', 1970, 70, {0}, 0},{'G', 2085, 71, {0}, 0}, + {'H', 2279, 72, {0}, 0},{'I', 2422, 73, {0}, 0},{'J', 2648, 74, {0}, 0}, + {'K', 2698, 75, {0}, 0},{'L', 2755, 76, {0}, 0},{'M', 3555, 77, {0}, 0}, + {'N', 3641, 78, {0}, 0},{'O', 4701, 79, {0}, 0},{'P', 4941, 80, {0}, 0}, + {'Q', 5129, 81, {0}, 0},{'R', 5156, 82, {0}, 0},{'S', 5709, 83, {0}, 0}, + {'T', 6142, 84, {0}, 0},{'U', 6353, 85, {0}, 0},{'V', 6748, 86, {0}, 0}, + {'W', 6904, 87, {0}, 0},{'X', 6942, 88, {0}, 0},{'Y', 6965, 89, {0}, 0}, + {'Z', 7036, 90, {0}, 0},{'\0', 0, 91, {0}, 0},{'\0', 0, 92, {0}, 0}, + {'\0', 0, 93, {0}, 0},{'\0', 0, 94, {0}, 0},{'\0', 0, 95, {0}, 0}, + {'\0', 0, 96, {0}, 0},{'a', 7127, 97, {0}, 0},{'b', 7476, 98, {0}, 0}, + {'c', 8214, 99, {0}, 0},{'d', 8891, 100, {0}, 0},{'e', 9436, 101, {0}, 0}, + {'f', 9869, 102, {0}, 0},{'g', 10104, 103, {0}, 0},{'h', 10454, 104, {0}, 0}, + {'i', 10713, 105, {0}, 0},{'j', 11048, 106, {0}, 0},{'k', 11107, 107, {0}, 0}, + {'l', 11178, 108, {0}, 0},{'m', 12315, 109, {0}, 0},{'n', 12577, 110, {0}, 0}, + {'o', 13611, 111, {0}, 0},{'p', 13957, 112, {0}, 0},{'q', 14382, 113, {0}, 0}, + {'r', 14465, 114, {0}, 0},{'s', 15232, 115, {0}, 0},{'t', 16185, 116, {0}, 0}, + {'u', 16630, 117, {0}, 0},{'v', 17016, 118, {0}, 0},{'w', 17365, 119, {0}, 0}, + {'x', 17437, 120, {0}, 0},{'y', 17618, 121, {0}, 0},{'z', 17688, 122, {0}, 0}, + {'\0', 0, 123, {0}, 0},{'\0', 0, 124, {0}, 0},{'\0', 0, 125, {0}, 0}, + {'\0', 0, 126, {0}, 0},{'\0', 0, 127, {0}, 0},{'\0', 0, 128, {0}, 0}, + {'\0', 0, 129, {0}, 0},{'\0', 0, 130, {0}, 0},{'\0', 0, 131, {0}, 0}, + {'\0', 0, 132, {0}, 0},{'\0', 0, 133, {0}, 0},{'\0', 0, 134, {0}, 0}, + {'\0', 0, 135, {0}, 0},{'\0', 0, 136, {0}, 0},{'\0', 0, 137, {0}, 0}, + {'\0', 0, 138, {0}, 0},{'\0', 0, 139, {0}, 0},{'\0', 0, 140, {0}, 0}, + {'\0', 0, 141, {0}, 0},{'\0', 0, 142, {0}, 0},{'\0', 0, 143, {0}, 0}, + {'\0', 0, 144, {0}, 0},{'\0', 0, 145, {0}, 0},{'\0', 0, 146, {0}, 0}, + {'\0', 0, 147, {0}, 0},{'\0', 0, 148, {0}, 0},{'\0', 0, 149, {0}, 0}, + {'\0', 0, 150, {0}, 0},{'\0', 0, 151, {0}, 0},{'\0', 0, 152, {0}, 0}, + {'\0', 0, 153, {0}, 0},{'\0', 0, 154, {0}, 0},{'\0', 0, 155, {0}, 0}, + {'\0', 0, 156, {0}, 0},{'\0', 0, 157, {0}, 0},{'\0', 0, 158, {0}, 0}, + {'\0', 0, 159, {0}, 0},{'\0', 0, 160, {0}, 0},{'\0', 0, 161, {0}, 0}, + {'\0', 0, 162, {0}, 0},{'\0', 0, 163, {0}, 0},{'\0', 0, 164, {0}, 0}, + {'\0', 0, 165, {0}, 0},{'\0', 0, 166, {0}, 0},{'\0', 0, 167, {0}, 0}, + {'\0', 0, 168, {0}, 0},{'\0', 0, 169, {0}, 0},{'\0', 0, 170, {0}, 0}, + {'\0', 0, 171, {0}, 0},{'\0', 0, 172, {0}, 0},{'\0', 0, 173, {0}, 0}, + {'\0', 0, 174, {0}, 0},{'\0', 0, 175, {0}, 0},{'\0', 0, 176, {0}, 0}, + {'\0', 0, 177, {0}, 0},{'\0', 0, 178, {0}, 0},{'\0', 0, 179, {0}, 0}, + {'\0', 0, 180, {0}, 0},{'\0', 0, 181, {0}, 0},{'\0', 0, 182, {0}, 0}, + {'\0', 0, 183, {0}, 0},{'\0', 0, 184, {0}, 0},{'\0', 0, 185, {0}, 0}, + {'\0', 0, 186, {0}, 0},{'\0', 0, 187, {0}, 0},{'\0', 0, 188, {0}, 0}, + {'\0', 0, 189, {0}, 0},{'\0', 0, 190, {0}, 0},{'\0', 0, 191, {0}, 0}, + {'\0', 0, 192, {0}, 0},{'\0', 0, 193, {0}, 0},{'\0', 0, 194, {0}, 0}, + {'\0', 0, 195, {0}, 0},{'\0', 0, 196, {0}, 0},{'\0', 0, 197, {0}, 0}, + {'\0', 0, 198, {0}, 0},{'\0', 0, 199, {0}, 0},{'\0', 0, 200, {0}, 0}, + {'\0', 0, 201, {0}, 0},{'\0', 0, 202, {0}, 0},{'\0', 0, 203, {0}, 0}, + {'\0', 0, 204, {0}, 0},{'\0', 0, 205, {0}, 0},{'\0', 0, 206, {0}, 0}, + {'\0', 0, 207, {0}, 0},{'\0', 0, 208, {0}, 0},{'\0', 0, 209, {0}, 0}, + {'\0', 0, 210, {0}, 0},{'\0', 0, 211, {0}, 0},{'\0', 0, 212, {0}, 0}, + {'\0', 0, 213, {0}, 0},{'\0', 0, 214, {0}, 0},{'\0', 0, 215, {0}, 0}, + {'\0', 0, 216, {0}, 0},{'\0', 0, 217, {0}, 0},{'\0', 0, 218, {0}, 0}, + {'\0', 0, 219, {0}, 0},{'\0', 0, 220, {0}, 0},{'\0', 0, 221, {0}, 0}, + {'\0', 0, 222, {0}, 0},{'\0', 0, 223, {0}, 0},{'\0', 0, 224, {0}, 0}, + {'\0', 0, 225, {0}, 0},{'\0', 0, 226, {0}, 0},{'\0', 0, 227, {0}, 0}, + {'\0', 0, 228, {0}, 0},{'\0', 0, 229, {0}, 0},{'\0', 0, 230, {0}, 0}, + {'\0', 0, 231, {0}, 0},{'\0', 0, 232, {0}, 0},{'\0', 0, 233, {0}, 0}, + {'\0', 0, 234, {0}, 0},{'\0', 0, 235, {0}, 0},{'\0', 0, 236, {0}, 0}, + {'\0', 0, 237, {0}, 0},{'\0', 0, 238, {0}, 0},{'\0', 0, 239, {0}, 0}, + {'\0', 0, 240, {0}, 0},{'\0', 0, 241, {0}, 0},{'\0', 0, 242, {0}, 0}, + {'\0', 0, 243, {0}, 0},{'\0', 0, 244, {0}, 0},{'\0', 0, 245, {0}, 0}, + {'\0', 0, 246, {0}, 0},{'\0', 0, 247, {0}, 0},{'\0', 0, 248, {0}, 0}, + {'\0', 0, 249, {0}, 0},{'\0', 0, 250, {0}, 0},{'\0', 0, 251, {0}, 0}, + {'\0', 0, 252, {0}, 0},{'\0', 0, 253, {0}, 0},{'\0', 0, 254, {0}, 0}, + {'\0', 0, 255, {0}, 0},{'\0', 0, 256, {0}, 0},{'E', 274, 257, {0}, 0}, + {'M', 282, 258, {0}, 0},{'a', 286, 259, {0}, 0},{'b', 296, 260, {0}, 0}, + {'c', 306, 261, {0}, 0},{'f', 317, 262, {0}, 0},{'g', 321, 263, {0}, 0}, + {'l', 331, 264, {0}, 0},{'m', 339, 265, {0}, 0},{'n', 347, 266, {0}, 0}, + {'o', 351, 267, {0}, 0},{'p', 364, 268, {0}, 0},{'r', 388, 269, {0}, 0}, + {'s', 396, 270, {0}, 0},{'t', 411, 271, {0}, 0},{'u', 421, 272, {0}, 0}, + {'\0', 0, 273, {0}, 0},{'l', 276, 274, {0}, 0},{'\0', 0, 275, {0}, 0}, + {'i', 278, 276, {0}, 0},{'\0', 0, 277, {0}, 0},{'g', 280, 278, {198}, 1}, + {'\0', 0, 279, {0}, 0},{';', 0, 280, {198}, 1},{'\0', 0, 281, {0}, 0}, + {'P', 284, 282, {38}, 1},{'\0', 0, 283, {0}, 0},{';', 0, 284, {38}, 1}, + {'\0', 0, 285, {0}, 0},{'c', 288, 286, {0}, 0},{'\0', 0, 287, {0}, 0}, + {'u', 290, 288, {0}, 0},{'\0', 0, 289, {0}, 0},{'t', 292, 290, {0}, 0}, + {'\0', 0, 291, {0}, 0},{'e', 294, 292, {193}, 1},{'\0', 0, 293, {0}, 0}, + {';', 0, 294, {193}, 1},{'\0', 0, 295, {0}, 0},{'r', 298, 296, {0}, 0}, + {'\0', 0, 297, {0}, 0},{'e', 300, 298, {0}, 0},{'\0', 0, 299, {0}, 0}, + {'v', 302, 300, {0}, 0},{'\0', 0, 301, {0}, 0},{'e', 304, 302, {0}, 0}, + {'\0', 0, 303, {0}, 0},{';', 0, 304, {258}, 1},{'\0', 0, 305, {0}, 0}, + {'i', 309, 306, {0}, 0},{'y', 315, 307, {0}, 0},{'\0', 0, 308, {0}, 0}, + {'r', 311, 309, {0}, 0},{'\0', 0, 310, {0}, 0},{'c', 313, 311, {194}, 1}, + {'\0', 0, 312, {0}, 0},{';', 0, 313, {194}, 1},{'\0', 0, 314, {0}, 0}, + {';', 0, 315, {1040}, 1},{'\0', 0, 316, {0}, 0},{'r', 319, 317, {0}, 0}, + {'\0', 0, 318, {0}, 0},{';', 0, 319, {120068}, 1},{'\0', 0, 320, {0}, 0}, + {'r', 323, 321, {0}, 0},{'\0', 0, 322, {0}, 0},{'a', 325, 323, {0}, 0}, + {'\0', 0, 324, {0}, 0},{'v', 327, 325, {0}, 0},{'\0', 0, 326, {0}, 0}, + {'e', 329, 327, {192}, 1},{'\0', 0, 328, {0}, 0},{';', 0, 329, {192}, 1}, + {'\0', 0, 330, {0}, 0},{'p', 333, 331, {0}, 0},{'\0', 0, 332, {0}, 0}, + {'h', 335, 333, {0}, 0},{'\0', 0, 334, {0}, 0},{'a', 337, 335, {0}, 0}, + {'\0', 0, 336, {0}, 0},{';', 0, 337, {913}, 1},{'\0', 0, 338, {0}, 0}, + {'a', 341, 339, {0}, 0},{'\0', 0, 340, {0}, 0},{'c', 343, 341, {0}, 0}, + {'\0', 0, 342, {0}, 0},{'r', 345, 343, {0}, 0},{'\0', 0, 344, {0}, 0}, + {';', 0, 345, {256}, 1},{'\0', 0, 346, {0}, 0},{'d', 349, 347, {0}, 0}, + {'\0', 0, 348, {0}, 0},{';', 0, 349, {10835}, 1},{'\0', 0, 350, {0}, 0}, + {'g', 354, 351, {0}, 0},{'p', 360, 352, {0}, 0},{'\0', 0, 353, {0}, 0}, + {'o', 356, 354, {0}, 0},{'\0', 0, 355, {0}, 0},{'n', 358, 356, {0}, 0}, + {'\0', 0, 357, {0}, 0},{';', 0, 358, {260}, 1},{'\0', 0, 359, {0}, 0}, + {'f', 362, 360, {0}, 0},{'\0', 0, 361, {0}, 0},{';', 0, 362, {120120}, 1}, + {'\0', 0, 363, {0}, 0},{'p', 366, 364, {0}, 0},{'\0', 0, 365, {0}, 0}, + {'l', 368, 366, {0}, 0},{'\0', 0, 367, {0}, 0},{'y', 370, 368, {0}, 0}, + {'\0', 0, 369, {0}, 0},{'F', 372, 370, {0}, 0},{'\0', 0, 371, {0}, 0}, + {'u', 374, 372, {0}, 0},{'\0', 0, 373, {0}, 0},{'n', 376, 374, {0}, 0}, + {'\0', 0, 375, {0}, 0},{'c', 378, 376, {0}, 0},{'\0', 0, 377, {0}, 0}, + {'t', 380, 378, {0}, 0},{'\0', 0, 379, {0}, 0},{'i', 382, 380, {0}, 0}, + {'\0', 0, 381, {0}, 0},{'o', 384, 382, {0}, 0},{'\0', 0, 383, {0}, 0}, + {'n', 386, 384, {0}, 0},{'\0', 0, 385, {0}, 0},{';', 0, 386, {8289}, 1}, + {'\0', 0, 387, {0}, 0},{'i', 390, 388, {0}, 0},{'\0', 0, 389, {0}, 0}, + {'n', 392, 390, {0}, 0},{'\0', 0, 391, {0}, 0},{'g', 394, 392, {197}, 1}, + {'\0', 0, 393, {0}, 0},{';', 0, 394, {197}, 1},{'\0', 0, 395, {0}, 0}, + {'c', 399, 396, {0}, 0},{'s', 403, 397, {0}, 0},{'\0', 0, 398, {0}, 0}, + {'r', 401, 399, {0}, 0},{'\0', 0, 400, {0}, 0},{';', 0, 401, {119964}, 1}, + {'\0', 0, 402, {0}, 0},{'i', 405, 403, {0}, 0},{'\0', 0, 404, {0}, 0}, + {'g', 407, 405, {0}, 0},{'\0', 0, 406, {0}, 0},{'n', 409, 407, {0}, 0}, + {'\0', 0, 408, {0}, 0},{';', 0, 409, {8788}, 1},{'\0', 0, 410, {0}, 0}, + {'i', 413, 411, {0}, 0},{'\0', 0, 412, {0}, 0},{'l', 415, 413, {0}, 0}, + {'\0', 0, 414, {0}, 0},{'d', 417, 415, {0}, 0},{'\0', 0, 416, {0}, 0}, + {'e', 419, 417, {195}, 1},{'\0', 0, 418, {0}, 0},{';', 0, 419, {195}, 1}, + {'\0', 0, 420, {0}, 0},{'m', 423, 421, {0}, 0},{'\0', 0, 422, {0}, 0}, + {'l', 425, 423, {196}, 1},{'\0', 0, 424, {0}, 0},{';', 0, 425, {196}, 1}, + {'\0', 0, 426, {0}, 0},{'a', 436, 427, {0}, 0},{'c', 464, 428, {0}, 0}, + {'e', 468, 429, {0}, 0},{'f', 502, 430, {0}, 0},{'o', 506, 431, {0}, 0}, + {'r', 512, 432, {0}, 0},{'s', 520, 433, {0}, 0},{'u', 526, 434, {0}, 0}, + {'\0', 0, 435, {0}, 0},{'c', 439, 436, {0}, 0},{'r', 453, 437, {0}, 0}, + {'\0', 0, 438, {0}, 0},{'k', 441, 439, {0}, 0},{'\0', 0, 440, {0}, 0}, + {'s', 443, 441, {0}, 0},{'\0', 0, 442, {0}, 0},{'l', 445, 443, {0}, 0}, + {'\0', 0, 444, {0}, 0},{'a', 447, 445, {0}, 0},{'\0', 0, 446, {0}, 0}, + {'s', 449, 447, {0}, 0},{'\0', 0, 448, {0}, 0},{'h', 451, 449, {0}, 0}, + {'\0', 0, 450, {0}, 0},{';', 0, 451, {8726}, 1},{'\0', 0, 452, {0}, 0}, + {'v', 456, 453, {0}, 0},{'w', 458, 454, {0}, 0},{'\0', 0, 455, {0}, 0}, + {';', 0, 456, {10983}, 1},{'\0', 0, 457, {0}, 0},{'e', 460, 458, {0}, 0}, + {'\0', 0, 459, {0}, 0},{'d', 462, 460, {0}, 0},{'\0', 0, 461, {0}, 0}, + {';', 0, 462, {8966}, 1},{'\0', 0, 463, {0}, 0},{'y', 466, 464, {0}, 0}, + {'\0', 0, 465, {0}, 0},{';', 0, 466, {1041}, 1},{'\0', 0, 467, {0}, 0}, + {'c', 472, 468, {0}, 0},{'r', 482, 469, {0}, 0},{'t', 498, 470, {0}, 0}, + {'\0', 0, 471, {0}, 0},{'a', 474, 472, {0}, 0},{'\0', 0, 473, {0}, 0}, + {'u', 476, 474, {0}, 0},{'\0', 0, 475, {0}, 0},{'s', 478, 476, {0}, 0}, + {'\0', 0, 477, {0}, 0},{'e', 480, 478, {0}, 0},{'\0', 0, 479, {0}, 0}, + {';', 0, 480, {8757}, 1},{'\0', 0, 481, {0}, 0},{'n', 484, 482, {0}, 0}, + {'\0', 0, 483, {0}, 0},{'o', 486, 484, {0}, 0},{'\0', 0, 485, {0}, 0}, + {'u', 488, 486, {0}, 0},{'\0', 0, 487, {0}, 0},{'l', 490, 488, {0}, 0}, + {'\0', 0, 489, {0}, 0},{'l', 492, 490, {0}, 0},{'\0', 0, 491, {0}, 0}, + {'i', 494, 492, {0}, 0},{'\0', 0, 493, {0}, 0},{'s', 496, 494, {0}, 0}, + {'\0', 0, 495, {0}, 0},{';', 0, 496, {8492}, 1},{'\0', 0, 497, {0}, 0}, + {'a', 500, 498, {0}, 0},{'\0', 0, 499, {0}, 0},{';', 0, 500, {914}, 1}, + {'\0', 0, 501, {0}, 0},{'r', 504, 502, {0}, 0},{'\0', 0, 503, {0}, 0}, + {';', 0, 504, {120069}, 1},{'\0', 0, 505, {0}, 0},{'p', 508, 506, {0}, 0}, + {'\0', 0, 507, {0}, 0},{'f', 510, 508, {0}, 0},{'\0', 0, 509, {0}, 0}, + {';', 0, 510, {120121}, 1},{'\0', 0, 511, {0}, 0},{'e', 514, 512, {0}, 0}, + {'\0', 0, 513, {0}, 0},{'v', 516, 514, {0}, 0},{'\0', 0, 515, {0}, 0}, + {'e', 518, 516, {0}, 0},{'\0', 0, 517, {0}, 0},{';', 0, 518, {728}, 1}, + {'\0', 0, 519, {0}, 0},{'c', 522, 520, {0}, 0},{'\0', 0, 521, {0}, 0}, + {'r', 524, 522, {0}, 0},{'\0', 0, 523, {0}, 0},{';', 0, 524, {8492}, 1}, + {'\0', 0, 525, {0}, 0},{'m', 528, 526, {0}, 0},{'\0', 0, 527, {0}, 0}, + {'p', 530, 528, {0}, 0},{'\0', 0, 529, {0}, 0},{'e', 532, 530, {0}, 0}, + {'\0', 0, 531, {0}, 0},{'q', 534, 532, {0}, 0},{'\0', 0, 533, {0}, 0}, + {';', 0, 534, {8782}, 1},{'\0', 0, 535, {0}, 0},{'H', 551, 536, {0}, 0}, + {'O', 557, 537, {0}, 0},{'a', 563, 538, {0}, 0},{'c', 622, 539, {0}, 0}, + {'d', 659, 540, {0}, 0},{'e', 665, 541, {0}, 0},{'f', 692, 542, {0}, 0}, + {'h', 696, 543, {0}, 0},{'i', 700, 544, {0}, 0},{'l', 747, 545, {0}, 0}, + {'o', 841, 546, {0}, 0},{'r', 976, 547, {0}, 0},{'s', 984, 548, {0}, 0}, + {'u', 990, 549, {0}, 0},{'\0', 0, 550, {0}, 0},{'c', 553, 551, {0}, 0}, + {'\0', 0, 552, {0}, 0},{'y', 555, 553, {0}, 0},{'\0', 0, 554, {0}, 0}, + {';', 0, 555, {1063}, 1},{'\0', 0, 556, {0}, 0},{'P', 559, 557, {0}, 0}, + {'\0', 0, 558, {0}, 0},{'Y', 561, 559, {169}, 1},{'\0', 0, 560, {0}, 0}, + {';', 0, 561, {169}, 1},{'\0', 0, 562, {0}, 0},{'c', 567, 563, {0}, 0}, + {'p', 575, 564, {0}, 0},{'y', 612, 565, {0}, 0},{'\0', 0, 566, {0}, 0}, + {'u', 569, 567, {0}, 0},{'\0', 0, 568, {0}, 0},{'t', 571, 569, {0}, 0}, + {'\0', 0, 570, {0}, 0},{'e', 573, 571, {0}, 0},{'\0', 0, 572, {0}, 0}, + {';', 0, 573, {262}, 1},{'\0', 0, 574, {0}, 0},{';', 0, 575, {8914}, 1}, + {'i', 578, 576, {0}, 0},{'\0', 0, 577, {0}, 0},{'t', 580, 578, {0}, 0}, + {'\0', 0, 579, {0}, 0},{'a', 582, 580, {0}, 0},{'\0', 0, 581, {0}, 0}, + {'l', 584, 582, {0}, 0},{'\0', 0, 583, {0}, 0},{'D', 586, 584, {0}, 0}, + {'\0', 0, 585, {0}, 0},{'i', 588, 586, {0}, 0},{'\0', 0, 587, {0}, 0}, + {'f', 590, 588, {0}, 0},{'\0', 0, 589, {0}, 0},{'f', 592, 590, {0}, 0}, + {'\0', 0, 591, {0}, 0},{'e', 594, 592, {0}, 0},{'\0', 0, 593, {0}, 0}, + {'r', 596, 594, {0}, 0},{'\0', 0, 595, {0}, 0},{'e', 598, 596, {0}, 0}, + {'\0', 0, 597, {0}, 0},{'n', 600, 598, {0}, 0},{'\0', 0, 599, {0}, 0}, + {'t', 602, 600, {0}, 0},{'\0', 0, 601, {0}, 0},{'i', 604, 602, {0}, 0}, + {'\0', 0, 603, {0}, 0},{'a', 606, 604, {0}, 0},{'\0', 0, 605, {0}, 0}, + {'l', 608, 606, {0}, 0},{'\0', 0, 607, {0}, 0},{'D', 610, 608, {0}, 0}, + {'\0', 0, 609, {0}, 0},{';', 0, 610, {8517}, 1},{'\0', 0, 611, {0}, 0}, + {'l', 614, 612, {0}, 0},{'\0', 0, 613, {0}, 0},{'e', 616, 614, {0}, 0}, + {'\0', 0, 615, {0}, 0},{'y', 618, 616, {0}, 0},{'\0', 0, 617, {0}, 0}, + {'s', 620, 618, {0}, 0},{'\0', 0, 619, {0}, 0},{';', 0, 620, {8493}, 1}, + {'\0', 0, 621, {0}, 0},{'a', 627, 622, {0}, 0},{'e', 635, 623, {0}, 0}, + {'i', 643, 624, {0}, 0},{'o', 649, 625, {0}, 0},{'\0', 0, 626, {0}, 0}, + {'r', 629, 627, {0}, 0},{'\0', 0, 628, {0}, 0},{'o', 631, 629, {0}, 0}, + {'\0', 0, 630, {0}, 0},{'n', 633, 631, {0}, 0},{'\0', 0, 632, {0}, 0}, + {';', 0, 633, {268}, 1},{'\0', 0, 634, {0}, 0},{'d', 637, 635, {0}, 0}, + {'\0', 0, 636, {0}, 0},{'i', 639, 637, {0}, 0},{'\0', 0, 638, {0}, 0}, + {'l', 641, 639, {199}, 1},{'\0', 0, 640, {0}, 0},{';', 0, 641, {199}, 1}, + {'\0', 0, 642, {0}, 0},{'r', 645, 643, {0}, 0},{'\0', 0, 644, {0}, 0}, + {'c', 647, 645, {0}, 0},{'\0', 0, 646, {0}, 0},{';', 0, 647, {264}, 1}, + {'\0', 0, 648, {0}, 0},{'n', 651, 649, {0}, 0},{'\0', 0, 650, {0}, 0}, + {'i', 653, 651, {0}, 0},{'\0', 0, 652, {0}, 0},{'n', 655, 653, {0}, 0}, + {'\0', 0, 654, {0}, 0},{'t', 657, 655, {0}, 0},{'\0', 0, 656, {0}, 0}, + {';', 0, 657, {8752}, 1},{'\0', 0, 658, {0}, 0},{'o', 661, 659, {0}, 0}, + {'\0', 0, 660, {0}, 0},{'t', 663, 661, {0}, 0},{'\0', 0, 662, {0}, 0}, + {';', 0, 663, {266}, 1},{'\0', 0, 664, {0}, 0},{'d', 668, 665, {0}, 0}, + {'n', 678, 666, {0}, 0},{'\0', 0, 667, {0}, 0},{'i', 670, 668, {0}, 0}, + {'\0', 0, 669, {0}, 0},{'l', 672, 670, {0}, 0},{'\0', 0, 671, {0}, 0}, + {'l', 674, 672, {0}, 0},{'\0', 0, 673, {0}, 0},{'a', 676, 674, {0}, 0}, + {'\0', 0, 675, {0}, 0},{';', 0, 676, {184}, 1},{'\0', 0, 677, {0}, 0}, + {'t', 680, 678, {0}, 0},{'\0', 0, 679, {0}, 0},{'e', 682, 680, {0}, 0}, + {'\0', 0, 681, {0}, 0},{'r', 684, 682, {0}, 0},{'\0', 0, 683, {0}, 0}, + {'D', 686, 684, {0}, 0},{'\0', 0, 685, {0}, 0},{'o', 688, 686, {0}, 0}, + {'\0', 0, 687, {0}, 0},{'t', 690, 688, {0}, 0},{'\0', 0, 689, {0}, 0}, + {';', 0, 690, {183}, 1},{'\0', 0, 691, {0}, 0},{'r', 694, 692, {0}, 0}, + {'\0', 0, 693, {0}, 0},{';', 0, 694, {8493}, 1},{'\0', 0, 695, {0}, 0}, + {'i', 698, 696, {0}, 0},{'\0', 0, 697, {0}, 0},{';', 0, 698, {935}, 1}, + {'\0', 0, 699, {0}, 0},{'r', 702, 700, {0}, 0},{'\0', 0, 701, {0}, 0}, + {'c', 704, 702, {0}, 0},{'\0', 0, 703, {0}, 0},{'l', 706, 704, {0}, 0}, + {'\0', 0, 705, {0}, 0},{'e', 708, 706, {0}, 0},{'\0', 0, 707, {0}, 0}, + {'D', 713, 708, {0}, 0},{'M', 719, 709, {0}, 0},{'P', 729, 710, {0}, 0}, + {'T', 737, 711, {0}, 0},{'\0', 0, 712, {0}, 0},{'o', 715, 713, {0}, 0}, + {'\0', 0, 714, {0}, 0},{'t', 717, 715, {0}, 0},{'\0', 0, 716, {0}, 0}, + {';', 0, 717, {8857}, 1},{'\0', 0, 718, {0}, 0},{'i', 721, 719, {0}, 0}, + {'\0', 0, 720, {0}, 0},{'n', 723, 721, {0}, 0},{'\0', 0, 722, {0}, 0}, + {'u', 725, 723, {0}, 0},{'\0', 0, 724, {0}, 0},{'s', 727, 725, {0}, 0}, + {'\0', 0, 726, {0}, 0},{';', 0, 727, {8854}, 1},{'\0', 0, 728, {0}, 0}, + {'l', 731, 729, {0}, 0},{'\0', 0, 730, {0}, 0},{'u', 733, 731, {0}, 0}, + {'\0', 0, 732, {0}, 0},{'s', 735, 733, {0}, 0},{'\0', 0, 734, {0}, 0}, + {';', 0, 735, {8853}, 1},{'\0', 0, 736, {0}, 0},{'i', 739, 737, {0}, 0}, + {'\0', 0, 738, {0}, 0},{'m', 741, 739, {0}, 0},{'\0', 0, 740, {0}, 0}, + {'e', 743, 741, {0}, 0},{'\0', 0, 742, {0}, 0},{'s', 745, 743, {0}, 0}, + {'\0', 0, 744, {0}, 0},{';', 0, 745, {8855}, 1},{'\0', 0, 746, {0}, 0}, + {'o', 749, 747, {0}, 0},{'\0', 0, 748, {0}, 0},{'c', 752, 749, {0}, 0}, + {'s', 794, 750, {0}, 0},{'\0', 0, 751, {0}, 0},{'k', 754, 752, {0}, 0}, + {'\0', 0, 753, {0}, 0},{'w', 756, 754, {0}, 0},{'\0', 0, 755, {0}, 0}, + {'i', 758, 756, {0}, 0},{'\0', 0, 757, {0}, 0},{'s', 760, 758, {0}, 0}, + {'\0', 0, 759, {0}, 0},{'e', 762, 760, {0}, 0},{'\0', 0, 761, {0}, 0}, + {'C', 764, 762, {0}, 0},{'\0', 0, 763, {0}, 0},{'o', 766, 764, {0}, 0}, + {'\0', 0, 765, {0}, 0},{'n', 768, 766, {0}, 0},{'\0', 0, 767, {0}, 0}, + {'t', 770, 768, {0}, 0},{'\0', 0, 769, {0}, 0},{'o', 772, 770, {0}, 0}, + {'\0', 0, 771, {0}, 0},{'u', 774, 772, {0}, 0},{'\0', 0, 773, {0}, 0}, + {'r', 776, 774, {0}, 0},{'\0', 0, 775, {0}, 0},{'I', 778, 776, {0}, 0}, + {'\0', 0, 777, {0}, 0},{'n', 780, 778, {0}, 0},{'\0', 0, 779, {0}, 0}, + {'t', 782, 780, {0}, 0},{'\0', 0, 781, {0}, 0},{'e', 784, 782, {0}, 0}, + {'\0', 0, 783, {0}, 0},{'g', 786, 784, {0}, 0},{'\0', 0, 785, {0}, 0}, + {'r', 788, 786, {0}, 0},{'\0', 0, 787, {0}, 0},{'a', 790, 788, {0}, 0}, + {'\0', 0, 789, {0}, 0},{'l', 792, 790, {0}, 0},{'\0', 0, 791, {0}, 0}, + {';', 0, 792, {8754}, 1},{'\0', 0, 793, {0}, 0},{'e', 796, 794, {0}, 0}, + {'\0', 0, 795, {0}, 0},{'C', 798, 796, {0}, 0},{'\0', 0, 797, {0}, 0}, + {'u', 800, 798, {0}, 0},{'\0', 0, 799, {0}, 0},{'r', 802, 800, {0}, 0}, + {'\0', 0, 801, {0}, 0},{'l', 804, 802, {0}, 0},{'\0', 0, 803, {0}, 0}, + {'y', 806, 804, {0}, 0},{'\0', 0, 805, {0}, 0},{'D', 809, 806, {0}, 0}, + {'Q', 831, 807, {0}, 0},{'\0', 0, 808, {0}, 0},{'o', 811, 809, {0}, 0}, + {'\0', 0, 810, {0}, 0},{'u', 813, 811, {0}, 0},{'\0', 0, 812, {0}, 0}, + {'b', 815, 813, {0}, 0},{'\0', 0, 814, {0}, 0},{'l', 817, 815, {0}, 0}, + {'\0', 0, 816, {0}, 0},{'e', 819, 817, {0}, 0},{'\0', 0, 818, {0}, 0}, + {'Q', 821, 819, {0}, 0},{'\0', 0, 820, {0}, 0},{'u', 823, 821, {0}, 0}, + {'\0', 0, 822, {0}, 0},{'o', 825, 823, {0}, 0},{'\0', 0, 824, {0}, 0}, + {'t', 827, 825, {0}, 0},{'\0', 0, 826, {0}, 0},{'e', 829, 827, {0}, 0}, + {'\0', 0, 828, {0}, 0},{';', 0, 829, {8221}, 1},{'\0', 0, 830, {0}, 0}, + {'u', 833, 831, {0}, 0},{'\0', 0, 832, {0}, 0},{'o', 835, 833, {0}, 0}, + {'\0', 0, 834, {0}, 0},{'t', 837, 835, {0}, 0},{'\0', 0, 836, {0}, 0}, + {'e', 839, 837, {0}, 0},{'\0', 0, 838, {0}, 0},{';', 0, 839, {8217}, 1}, + {'\0', 0, 840, {0}, 0},{'l', 846, 841, {0}, 0},{'n', 855, 842, {0}, 0}, + {'p', 901, 843, {0}, 0},{'u', 918, 844, {0}, 0},{'\0', 0, 845, {0}, 0}, + {'o', 848, 846, {0}, 0},{'\0', 0, 847, {0}, 0},{'n', 850, 848, {0}, 0}, + {'\0', 0, 849, {0}, 0},{';', 0, 850, {8759}, 1},{'e', 853, 851, {0}, 0}, + {'\0', 0, 852, {0}, 0},{';', 0, 853, {10868}, 1},{'\0', 0, 854, {0}, 0}, + {'g', 859, 855, {0}, 0},{'i', 871, 856, {0}, 0},{'t', 877, 857, {0}, 0}, + {'\0', 0, 858, {0}, 0},{'r', 861, 859, {0}, 0},{'\0', 0, 860, {0}, 0}, + {'u', 863, 861, {0}, 0},{'\0', 0, 862, {0}, 0},{'e', 865, 863, {0}, 0}, + {'\0', 0, 864, {0}, 0},{'n', 867, 865, {0}, 0},{'\0', 0, 866, {0}, 0}, + {'t', 869, 867, {0}, 0},{'\0', 0, 868, {0}, 0},{';', 0, 869, {8801}, 1}, + {'\0', 0, 870, {0}, 0},{'n', 873, 871, {0}, 0},{'\0', 0, 872, {0}, 0}, + {'t', 875, 873, {0}, 0},{'\0', 0, 874, {0}, 0},{';', 0, 875, {8751}, 1}, + {'\0', 0, 876, {0}, 0},{'o', 879, 877, {0}, 0},{'\0', 0, 878, {0}, 0}, + {'u', 881, 879, {0}, 0},{'\0', 0, 880, {0}, 0},{'r', 883, 881, {0}, 0}, + {'\0', 0, 882, {0}, 0},{'I', 885, 883, {0}, 0},{'\0', 0, 884, {0}, 0}, + {'n', 887, 885, {0}, 0},{'\0', 0, 886, {0}, 0},{'t', 889, 887, {0}, 0}, + {'\0', 0, 888, {0}, 0},{'e', 891, 889, {0}, 0},{'\0', 0, 890, {0}, 0}, + {'g', 893, 891, {0}, 0},{'\0', 0, 892, {0}, 0},{'r', 895, 893, {0}, 0}, + {'\0', 0, 894, {0}, 0},{'a', 897, 895, {0}, 0},{'\0', 0, 896, {0}, 0}, + {'l', 899, 897, {0}, 0},{'\0', 0, 898, {0}, 0},{';', 0, 899, {8750}, 1}, + {'\0', 0, 900, {0}, 0},{'f', 904, 901, {0}, 0},{'r', 906, 902, {0}, 0}, + {'\0', 0, 903, {0}, 0},{';', 0, 904, {8450}, 1},{'\0', 0, 905, {0}, 0}, + {'o', 908, 906, {0}, 0},{'\0', 0, 907, {0}, 0},{'d', 910, 908, {0}, 0}, + {'\0', 0, 909, {0}, 0},{'u', 912, 910, {0}, 0},{'\0', 0, 911, {0}, 0}, + {'c', 914, 912, {0}, 0},{'\0', 0, 913, {0}, 0},{'t', 916, 914, {0}, 0}, + {'\0', 0, 915, {0}, 0},{';', 0, 916, {8720}, 1},{'\0', 0, 917, {0}, 0}, + {'n', 920, 918, {0}, 0},{'\0', 0, 919, {0}, 0},{'t', 922, 920, {0}, 0}, + {'\0', 0, 921, {0}, 0},{'e', 924, 922, {0}, 0},{'\0', 0, 923, {0}, 0}, + {'r', 926, 924, {0}, 0},{'\0', 0, 925, {0}, 0},{'C', 928, 926, {0}, 0}, + {'\0', 0, 927, {0}, 0},{'l', 930, 928, {0}, 0},{'\0', 0, 929, {0}, 0}, + {'o', 932, 930, {0}, 0},{'\0', 0, 931, {0}, 0},{'c', 934, 932, {0}, 0}, + {'\0', 0, 933, {0}, 0},{'k', 936, 934, {0}, 0},{'\0', 0, 935, {0}, 0}, + {'w', 938, 936, {0}, 0},{'\0', 0, 937, {0}, 0},{'i', 940, 938, {0}, 0}, + {'\0', 0, 939, {0}, 0},{'s', 942, 940, {0}, 0},{'\0', 0, 941, {0}, 0}, + {'e', 944, 942, {0}, 0},{'\0', 0, 943, {0}, 0},{'C', 946, 944, {0}, 0}, + {'\0', 0, 945, {0}, 0},{'o', 948, 946, {0}, 0},{'\0', 0, 947, {0}, 0}, + {'n', 950, 948, {0}, 0},{'\0', 0, 949, {0}, 0},{'t', 952, 950, {0}, 0}, + {'\0', 0, 951, {0}, 0},{'o', 954, 952, {0}, 0},{'\0', 0, 953, {0}, 0}, + {'u', 956, 954, {0}, 0},{'\0', 0, 955, {0}, 0},{'r', 958, 956, {0}, 0}, + {'\0', 0, 957, {0}, 0},{'I', 960, 958, {0}, 0},{'\0', 0, 959, {0}, 0}, + {'n', 962, 960, {0}, 0},{'\0', 0, 961, {0}, 0},{'t', 964, 962, {0}, 0}, + {'\0', 0, 963, {0}, 0},{'e', 966, 964, {0}, 0},{'\0', 0, 965, {0}, 0}, + {'g', 968, 966, {0}, 0},{'\0', 0, 967, {0}, 0},{'r', 970, 968, {0}, 0}, + {'\0', 0, 969, {0}, 0},{'a', 972, 970, {0}, 0},{'\0', 0, 971, {0}, 0}, + {'l', 974, 972, {0}, 0},{'\0', 0, 973, {0}, 0},{';', 0, 974, {8755}, 1}, + {'\0', 0, 975, {0}, 0},{'o', 978, 976, {0}, 0},{'\0', 0, 977, {0}, 0}, + {'s', 980, 978, {0}, 0},{'\0', 0, 979, {0}, 0},{'s', 982, 980, {0}, 0}, + {'\0', 0, 981, {0}, 0},{';', 0, 982, {10799}, 1},{'\0', 0, 983, {0}, 0}, + {'c', 986, 984, {0}, 0},{'\0', 0, 985, {0}, 0},{'r', 988, 986, {0}, 0}, + {'\0', 0, 987, {0}, 0},{';', 0, 988, {119966}, 1},{'\0', 0, 989, {0}, 0}, + {'p', 992, 990, {0}, 0},{'\0', 0, 991, {0}, 0},{';', 0, 992, {8915}, 1}, + {'C', 995, 993, {0}, 0},{'\0', 0, 994, {0}, 0},{'a', 997, 995, {0}, 0}, + {'\0', 0, 996, {0}, 0},{'p', 999, 997, {0}, 0},{'\0', 0, 998, {0}, 0}, + {';', 0, 999, {8781}, 1},{'\0', 0, 1000, {0}, 0},{'D', 1013, 1001, {0}, 0}, + {'J', 1028, 1002, {0}, 0},{'S', 1034, 1003, {0}, 0},{'Z', 1040, 1004, {0}, 0}, + {'a', 1046, 1005, {0}, 0},{'c', 1068, 1006, {0}, 0},{'e', 1081, 1007, {0}, 0}, + {'f', 1090, 1008, {0}, 0},{'i', 1094, 1009, {0}, 0},{'o', 1204, 1010, {0}, 0}, + {'s', 1687, 1011, {0}, 0},{'\0', 0, 1012, {0}, 0},{';', 0, 1013, {8517}, 1}, + {'o', 1016, 1014, {0}, 0},{'\0', 0, 1015, {0}, 0},{'t', 1018, 1016, {0}, 0}, + {'\0', 0, 1017, {0}, 0},{'r', 1020, 1018, {0}, 0},{'\0', 0, 1019, {0}, 0}, + {'a', 1022, 1020, {0}, 0},{'\0', 0, 1021, {0}, 0},{'h', 1024, 1022, {0}, 0}, + {'\0', 0, 1023, {0}, 0},{'d', 1026, 1024, {0}, 0},{'\0', 0, 1025, {0}, 0}, + {';', 0, 1026, {10513}, 1},{'\0', 0, 1027, {0}, 0},{'c', 1030, 1028, {0}, 0}, + {'\0', 0, 1029, {0}, 0},{'y', 1032, 1030, {0}, 0},{'\0', 0, 1031, {0}, 0}, + {';', 0, 1032, {1026}, 1},{'\0', 0, 1033, {0}, 0},{'c', 1036, 1034, {0}, 0}, + {'\0', 0, 1035, {0}, 0},{'y', 1038, 1036, {0}, 0},{'\0', 0, 1037, {0}, 0}, + {';', 0, 1038, {1029}, 1},{'\0', 0, 1039, {0}, 0},{'c', 1042, 1040, {0}, 0}, + {'\0', 0, 1041, {0}, 0},{'y', 1044, 1042, {0}, 0},{'\0', 0, 1043, {0}, 0}, + {';', 0, 1044, {1039}, 1},{'\0', 0, 1045, {0}, 0},{'g', 1050, 1046, {0}, 0}, + {'r', 1058, 1047, {0}, 0},{'s', 1062, 1048, {0}, 0},{'\0', 0, 1049, {0}, 0}, + {'g', 1052, 1050, {0}, 0},{'\0', 0, 1051, {0}, 0},{'e', 1054, 1052, {0}, 0}, + {'\0', 0, 1053, {0}, 0},{'r', 1056, 1054, {0}, 0},{'\0', 0, 1055, {0}, 0}, + {';', 0, 1056, {8225}, 1},{'\0', 0, 1057, {0}, 0},{'r', 1060, 1058, {0}, 0}, + {'\0', 0, 1059, {0}, 0},{';', 0, 1060, {8609}, 1},{'\0', 0, 1061, {0}, 0}, + {'h', 1064, 1062, {0}, 0},{'\0', 0, 1063, {0}, 0},{'v', 1066, 1064, {0}, 0}, + {'\0', 0, 1065, {0}, 0},{';', 0, 1066, {10980}, 1},{'\0', 0, 1067, {0}, 0}, + {'a', 1071, 1068, {0}, 0},{'y', 1079, 1069, {0}, 0},{'\0', 0, 1070, {0}, 0}, + {'r', 1073, 1071, {0}, 0},{'\0', 0, 1072, {0}, 0},{'o', 1075, 1073, {0}, 0}, + {'\0', 0, 1074, {0}, 0},{'n', 1077, 1075, {0}, 0},{'\0', 0, 1076, {0}, 0}, + {';', 0, 1077, {270}, 1},{'\0', 0, 1078, {0}, 0},{';', 0, 1079, {1044}, 1}, + {'\0', 0, 1080, {0}, 0},{'l', 1083, 1081, {0}, 0},{'\0', 0, 1082, {0}, 0}, + {';', 0, 1083, {8711}, 1},{'t', 1086, 1084, {0}, 0},{'\0', 0, 1085, {0}, 0}, + {'a', 1088, 1086, {0}, 0},{'\0', 0, 1087, {0}, 0},{';', 0, 1088, {916}, 1}, + {'\0', 0, 1089, {0}, 0},{'r', 1092, 1090, {0}, 0},{'\0', 0, 1091, {0}, 0}, + {';', 0, 1092, {120071}, 1},{'\0', 0, 1093, {0}, 0},{'a', 1097, 1094, {0}, 0}, + {'f', 1182, 1095, {0}, 0},{'\0', 0, 1096, {0}, 0},{'c', 1100, 1097, {0}, 0}, + {'m', 1174, 1098, {0}, 0},{'\0', 0, 1099, {0}, 0},{'r', 1102, 1100, {0}, 0}, + {'\0', 0, 1101, {0}, 0},{'i', 1104, 1102, {0}, 0},{'\0', 0, 1103, {0}, 0}, + {'t', 1106, 1104, {0}, 0},{'\0', 0, 1105, {0}, 0},{'i', 1108, 1106, {0}, 0}, + {'\0', 0, 1107, {0}, 0},{'c', 1110, 1108, {0}, 0},{'\0', 0, 1109, {0}, 0}, + {'a', 1112, 1110, {0}, 0},{'\0', 0, 1111, {0}, 0},{'l', 1114, 1112, {0}, 0}, + {'\0', 0, 1113, {0}, 0},{'A', 1119, 1114, {0}, 0},{'D', 1129, 1115, {0}, 0}, + {'G', 1154, 1116, {0}, 0},{'T', 1164, 1117, {0}, 0},{'\0', 0, 1118, {0}, 0}, + {'c', 1121, 1119, {0}, 0},{'\0', 0, 1120, {0}, 0},{'u', 1123, 1121, {0}, 0}, + {'\0', 0, 1122, {0}, 0},{'t', 1125, 1123, {0}, 0},{'\0', 0, 1124, {0}, 0}, + {'e', 1127, 1125, {0}, 0},{'\0', 0, 1126, {0}, 0},{';', 0, 1127, {180}, 1}, + {'\0', 0, 1128, {0}, 0},{'o', 1131, 1129, {0}, 0},{'\0', 0, 1130, {0}, 0}, + {'t', 1134, 1131, {0}, 0},{'u', 1136, 1132, {0}, 0},{'\0', 0, 1133, {0}, 0}, + {';', 0, 1134, {729}, 1},{'\0', 0, 1135, {0}, 0},{'b', 1138, 1136, {0}, 0}, + {'\0', 0, 1137, {0}, 0},{'l', 1140, 1138, {0}, 0},{'\0', 0, 1139, {0}, 0}, + {'e', 1142, 1140, {0}, 0},{'\0', 0, 1141, {0}, 0},{'A', 1144, 1142, {0}, 0}, + {'\0', 0, 1143, {0}, 0},{'c', 1146, 1144, {0}, 0},{'\0', 0, 1145, {0}, 0}, + {'u', 1148, 1146, {0}, 0},{'\0', 0, 1147, {0}, 0},{'t', 1150, 1148, {0}, 0}, + {'\0', 0, 1149, {0}, 0},{'e', 1152, 1150, {0}, 0},{'\0', 0, 1151, {0}, 0}, + {';', 0, 1152, {733}, 1},{'\0', 0, 1153, {0}, 0},{'r', 1156, 1154, {0}, 0}, + {'\0', 0, 1155, {0}, 0},{'a', 1158, 1156, {0}, 0},{'\0', 0, 1157, {0}, 0}, + {'v', 1160, 1158, {0}, 0},{'\0', 0, 1159, {0}, 0},{'e', 1162, 1160, {0}, 0}, + {'\0', 0, 1161, {0}, 0},{';', 0, 1162, {96}, 1},{'\0', 0, 1163, {0}, 0}, + {'i', 1166, 1164, {0}, 0},{'\0', 0, 1165, {0}, 0},{'l', 1168, 1166, {0}, 0}, + {'\0', 0, 1167, {0}, 0},{'d', 1170, 1168, {0}, 0},{'\0', 0, 1169, {0}, 0}, + {'e', 1172, 1170, {0}, 0},{'\0', 0, 1171, {0}, 0},{';', 0, 1172, {732}, 1}, + {'\0', 0, 1173, {0}, 0},{'o', 1176, 1174, {0}, 0},{'\0', 0, 1175, {0}, 0}, + {'n', 1178, 1176, {0}, 0},{'\0', 0, 1177, {0}, 0},{'d', 1180, 1178, {0}, 0}, + {'\0', 0, 1179, {0}, 0},{';', 0, 1180, {8900}, 1},{'\0', 0, 1181, {0}, 0}, + {'f', 1184, 1182, {0}, 0},{'\0', 0, 1183, {0}, 0},{'e', 1186, 1184, {0}, 0}, + {'\0', 0, 1185, {0}, 0},{'r', 1188, 1186, {0}, 0},{'\0', 0, 1187, {0}, 0}, + {'e', 1190, 1188, {0}, 0},{'\0', 0, 1189, {0}, 0},{'n', 1192, 1190, {0}, 0}, + {'\0', 0, 1191, {0}, 0},{'t', 1194, 1192, {0}, 0},{'\0', 0, 1193, {0}, 0}, + {'i', 1196, 1194, {0}, 0},{'\0', 0, 1195, {0}, 0},{'a', 1198, 1196, {0}, 0}, + {'\0', 0, 1197, {0}, 0},{'l', 1200, 1198, {0}, 0},{'\0', 0, 1199, {0}, 0}, + {'D', 1202, 1200, {0}, 0},{'\0', 0, 1201, {0}, 0},{';', 0, 1202, {8518}, 1}, + {'\0', 0, 1203, {0}, 0},{'p', 1209, 1204, {0}, 0},{'t', 1213, 1205, {0}, 0}, + {'u', 1233, 1206, {0}, 0},{'w', 1492, 1207, {0}, 0},{'\0', 0, 1208, {0}, 0}, + {'f', 1211, 1209, {0}, 0},{'\0', 0, 1210, {0}, 0},{';', 0, 1211, {120123}, 1}, + {'\0', 0, 1212, {0}, 0},{';', 0, 1213, {168}, 1},{'D', 1217, 1214, {0}, 0}, + {'E', 1223, 1215, {0}, 0},{'\0', 0, 1216, {0}, 0},{'o', 1219, 1217, {0}, 0}, + {'\0', 0, 1218, {0}, 0},{'t', 1221, 1219, {0}, 0},{'\0', 0, 1220, {0}, 0}, + {';', 0, 1221, {8412}, 1},{'\0', 0, 1222, {0}, 0},{'q', 1225, 1223, {0}, 0}, + {'\0', 0, 1224, {0}, 0},{'u', 1227, 1225, {0}, 0},{'\0', 0, 1226, {0}, 0}, + {'a', 1229, 1227, {0}, 0},{'\0', 0, 1228, {0}, 0},{'l', 1231, 1229, {0}, 0}, + {'\0', 0, 1230, {0}, 0},{';', 0, 1231, {8784}, 1},{'\0', 0, 1232, {0}, 0}, + {'b', 1235, 1233, {0}, 0},{'\0', 0, 1234, {0}, 0},{'l', 1237, 1235, {0}, 0}, + {'\0', 0, 1236, {0}, 0},{'e', 1239, 1237, {0}, 0},{'\0', 0, 1238, {0}, 0}, + {'C', 1246, 1239, {0}, 0},{'D', 1276, 1240, {0}, 0},{'L', 1297, 1241, {0}, 0}, + {'R', 1410, 1242, {0}, 0},{'U', 1437, 1243, {0}, 0},{'V', 1470, 1244, {0}, 0}, + {'\0', 0, 1245, {0}, 0},{'o', 1248, 1246, {0}, 0},{'\0', 0, 1247, {0}, 0}, + {'n', 1250, 1248, {0}, 0},{'\0', 0, 1249, {0}, 0},{'t', 1252, 1250, {0}, 0}, + {'\0', 0, 1251, {0}, 0},{'o', 1254, 1252, {0}, 0},{'\0', 0, 1253, {0}, 0}, + {'u', 1256, 1254, {0}, 0},{'\0', 0, 1255, {0}, 0},{'r', 1258, 1256, {0}, 0}, + {'\0', 0, 1257, {0}, 0},{'I', 1260, 1258, {0}, 0},{'\0', 0, 1259, {0}, 0}, + {'n', 1262, 1260, {0}, 0},{'\0', 0, 1261, {0}, 0},{'t', 1264, 1262, {0}, 0}, + {'\0', 0, 1263, {0}, 0},{'e', 1266, 1264, {0}, 0},{'\0', 0, 1265, {0}, 0}, + {'g', 1268, 1266, {0}, 0},{'\0', 0, 1267, {0}, 0},{'r', 1270, 1268, {0}, 0}, + {'\0', 0, 1269, {0}, 0},{'a', 1272, 1270, {0}, 0},{'\0', 0, 1271, {0}, 0}, + {'l', 1274, 1272, {0}, 0},{'\0', 0, 1273, {0}, 0},{';', 0, 1274, {8751}, 1}, + {'\0', 0, 1275, {0}, 0},{'o', 1278, 1276, {0}, 0},{'\0', 0, 1277, {0}, 0}, + {'t', 1281, 1278, {0}, 0},{'w', 1283, 1279, {0}, 0},{'\0', 0, 1280, {0}, 0}, + {';', 0, 1281, {168}, 1},{'\0', 0, 1282, {0}, 0},{'n', 1285, 1283, {0}, 0}, + {'\0', 0, 1284, {0}, 0},{'A', 1287, 1285, {0}, 0},{'\0', 0, 1286, {0}, 0}, + {'r', 1289, 1287, {0}, 0},{'\0', 0, 1288, {0}, 0},{'r', 1291, 1289, {0}, 0}, + {'\0', 0, 1290, {0}, 0},{'o', 1293, 1291, {0}, 0},{'\0', 0, 1292, {0}, 0}, + {'w', 1295, 1293, {0}, 0},{'\0', 0, 1294, {0}, 0},{';', 0, 1295, {8659}, 1}, + {'\0', 0, 1296, {0}, 0},{'e', 1300, 1297, {0}, 0},{'o', 1344, 1298, {0}, 0}, + {'\0', 0, 1299, {0}, 0},{'f', 1302, 1300, {0}, 0},{'\0', 0, 1301, {0}, 0}, + {'t', 1304, 1302, {0}, 0},{'\0', 0, 1303, {0}, 0},{'A', 1308, 1304, {0}, 0}, + {'R', 1318, 1305, {0}, 0},{'T', 1338, 1306, {0}, 0},{'\0', 0, 1307, {0}, 0}, + {'r', 1310, 1308, {0}, 0},{'\0', 0, 1309, {0}, 0},{'r', 1312, 1310, {0}, 0}, + {'\0', 0, 1311, {0}, 0},{'o', 1314, 1312, {0}, 0},{'\0', 0, 1313, {0}, 0}, + {'w', 1316, 1314, {0}, 0},{'\0', 0, 1315, {0}, 0},{';', 0, 1316, {8656}, 1}, + {'\0', 0, 1317, {0}, 0},{'i', 1320, 1318, {0}, 0},{'\0', 0, 1319, {0}, 0}, + {'g', 1322, 1320, {0}, 0},{'\0', 0, 1321, {0}, 0},{'h', 1324, 1322, {0}, 0}, + {'\0', 0, 1323, {0}, 0},{'t', 1326, 1324, {0}, 0},{'\0', 0, 1325, {0}, 0}, + {'A', 1328, 1326, {0}, 0},{'\0', 0, 1327, {0}, 0},{'r', 1330, 1328, {0}, 0}, + {'\0', 0, 1329, {0}, 0},{'r', 1332, 1330, {0}, 0},{'\0', 0, 1331, {0}, 0}, + {'o', 1334, 1332, {0}, 0},{'\0', 0, 1333, {0}, 0},{'w', 1336, 1334, {0}, 0}, + {'\0', 0, 1335, {0}, 0},{';', 0, 1336, {8660}, 1},{'\0', 0, 1337, {0}, 0}, + {'e', 1340, 1338, {0}, 0},{'\0', 0, 1339, {0}, 0},{'e', 1342, 1340, {0}, 0}, + {'\0', 0, 1341, {0}, 0},{';', 0, 1342, {10980}, 1},{'\0', 0, 1343, {0}, 0}, + {'n', 1346, 1344, {0}, 0},{'\0', 0, 1345, {0}, 0},{'g', 1348, 1346, {0}, 0}, + {'\0', 0, 1347, {0}, 0},{'L', 1351, 1348, {0}, 0},{'R', 1390, 1349, {0}, 0}, + {'\0', 0, 1350, {0}, 0},{'e', 1353, 1351, {0}, 0},{'\0', 0, 1352, {0}, 0}, + {'f', 1355, 1353, {0}, 0},{'\0', 0, 1354, {0}, 0},{'t', 1357, 1355, {0}, 0}, + {'\0', 0, 1356, {0}, 0},{'A', 1360, 1357, {0}, 0},{'R', 1370, 1358, {0}, 0}, + {'\0', 0, 1359, {0}, 0},{'r', 1362, 1360, {0}, 0},{'\0', 0, 1361, {0}, 0}, + {'r', 1364, 1362, {0}, 0},{'\0', 0, 1363, {0}, 0},{'o', 1366, 1364, {0}, 0}, + {'\0', 0, 1365, {0}, 0},{'w', 1368, 1366, {0}, 0},{'\0', 0, 1367, {0}, 0}, + {';', 0, 1368, {10232}, 1},{'\0', 0, 1369, {0}, 0},{'i', 1372, 1370, {0}, 0}, + {'\0', 0, 1371, {0}, 0},{'g', 1374, 1372, {0}, 0},{'\0', 0, 1373, {0}, 0}, + {'h', 1376, 1374, {0}, 0},{'\0', 0, 1375, {0}, 0},{'t', 1378, 1376, {0}, 0}, + {'\0', 0, 1377, {0}, 0},{'A', 1380, 1378, {0}, 0},{'\0', 0, 1379, {0}, 0}, + {'r', 1382, 1380, {0}, 0},{'\0', 0, 1381, {0}, 0},{'r', 1384, 1382, {0}, 0}, + {'\0', 0, 1383, {0}, 0},{'o', 1386, 1384, {0}, 0},{'\0', 0, 1385, {0}, 0}, + {'w', 1388, 1386, {0}, 0},{'\0', 0, 1387, {0}, 0},{';', 0, 1388, {10234}, 1}, + {'\0', 0, 1389, {0}, 0},{'i', 1392, 1390, {0}, 0},{'\0', 0, 1391, {0}, 0}, + {'g', 1394, 1392, {0}, 0},{'\0', 0, 1393, {0}, 0},{'h', 1396, 1394, {0}, 0}, + {'\0', 0, 1395, {0}, 0},{'t', 1398, 1396, {0}, 0},{'\0', 0, 1397, {0}, 0}, + {'A', 1400, 1398, {0}, 0},{'\0', 0, 1399, {0}, 0},{'r', 1402, 1400, {0}, 0}, + {'\0', 0, 1401, {0}, 0},{'r', 1404, 1402, {0}, 0},{'\0', 0, 1403, {0}, 0}, + {'o', 1406, 1404, {0}, 0},{'\0', 0, 1405, {0}, 0},{'w', 1408, 1406, {0}, 0}, + {'\0', 0, 1407, {0}, 0},{';', 0, 1408, {10233}, 1},{'\0', 0, 1409, {0}, 0}, + {'i', 1412, 1410, {0}, 0},{'\0', 0, 1411, {0}, 0},{'g', 1414, 1412, {0}, 0}, + {'\0', 0, 1413, {0}, 0},{'h', 1416, 1414, {0}, 0},{'\0', 0, 1415, {0}, 0}, + {'t', 1418, 1416, {0}, 0},{'\0', 0, 1417, {0}, 0},{'A', 1421, 1418, {0}, 0}, + {'T', 1431, 1419, {0}, 0},{'\0', 0, 1420, {0}, 0},{'r', 1423, 1421, {0}, 0}, + {'\0', 0, 1422, {0}, 0},{'r', 1425, 1423, {0}, 0},{'\0', 0, 1424, {0}, 0}, + {'o', 1427, 1425, {0}, 0},{'\0', 0, 1426, {0}, 0},{'w', 1429, 1427, {0}, 0}, + {'\0', 0, 1428, {0}, 0},{';', 0, 1429, {8658}, 1},{'\0', 0, 1430, {0}, 0}, + {'e', 1433, 1431, {0}, 0},{'\0', 0, 1432, {0}, 0},{'e', 1435, 1433, {0}, 0}, + {'\0', 0, 1434, {0}, 0},{';', 0, 1435, {8872}, 1},{'\0', 0, 1436, {0}, 0}, + {'p', 1439, 1437, {0}, 0},{'\0', 0, 1438, {0}, 0},{'A', 1442, 1439, {0}, 0}, + {'D', 1452, 1440, {0}, 0},{'\0', 0, 1441, {0}, 0},{'r', 1444, 1442, {0}, 0}, + {'\0', 0, 1443, {0}, 0},{'r', 1446, 1444, {0}, 0},{'\0', 0, 1445, {0}, 0}, + {'o', 1448, 1446, {0}, 0},{'\0', 0, 1447, {0}, 0},{'w', 1450, 1448, {0}, 0}, + {'\0', 0, 1449, {0}, 0},{';', 0, 1450, {8657}, 1},{'\0', 0, 1451, {0}, 0}, + {'o', 1454, 1452, {0}, 0},{'\0', 0, 1453, {0}, 0},{'w', 1456, 1454, {0}, 0}, + {'\0', 0, 1455, {0}, 0},{'n', 1458, 1456, {0}, 0},{'\0', 0, 1457, {0}, 0}, + {'A', 1460, 1458, {0}, 0},{'\0', 0, 1459, {0}, 0},{'r', 1462, 1460, {0}, 0}, + {'\0', 0, 1461, {0}, 0},{'r', 1464, 1462, {0}, 0},{'\0', 0, 1463, {0}, 0}, + {'o', 1466, 1464, {0}, 0},{'\0', 0, 1465, {0}, 0},{'w', 1468, 1466, {0}, 0}, + {'\0', 0, 1467, {0}, 0},{';', 0, 1468, {8661}, 1},{'\0', 0, 1469, {0}, 0}, + {'e', 1472, 1470, {0}, 0},{'\0', 0, 1471, {0}, 0},{'r', 1474, 1472, {0}, 0}, + {'\0', 0, 1473, {0}, 0},{'t', 1476, 1474, {0}, 0},{'\0', 0, 1475, {0}, 0}, + {'i', 1478, 1476, {0}, 0},{'\0', 0, 1477, {0}, 0},{'c', 1480, 1478, {0}, 0}, + {'\0', 0, 1479, {0}, 0},{'a', 1482, 1480, {0}, 0},{'\0', 0, 1481, {0}, 0}, + {'l', 1484, 1482, {0}, 0},{'\0', 0, 1483, {0}, 0},{'B', 1486, 1484, {0}, 0}, + {'\0', 0, 1485, {0}, 0},{'a', 1488, 1486, {0}, 0},{'\0', 0, 1487, {0}, 0}, + {'r', 1490, 1488, {0}, 0},{'\0', 0, 1489, {0}, 0},{';', 0, 1490, {8741}, 1}, + {'\0', 0, 1491, {0}, 0},{'n', 1494, 1492, {0}, 0},{'\0', 0, 1493, {0}, 0}, + {'A', 1501, 1494, {0}, 0},{'B', 1533, 1495, {0}, 0},{'L', 1543, 1496, {0}, 0}, + {'R', 1612, 1497, {0}, 0},{'T', 1660, 1498, {0}, 0},{'a', 1677, 1499, {0}, 0}, + {'\0', 0, 1500, {0}, 0},{'r', 1503, 1501, {0}, 0},{'\0', 0, 1502, {0}, 0}, + {'r', 1505, 1503, {0}, 0},{'\0', 0, 1504, {0}, 0},{'o', 1507, 1505, {0}, 0}, + {'\0', 0, 1506, {0}, 0},{'w', 1509, 1507, {0}, 0},{'\0', 0, 1508, {0}, 0}, + {';', 0, 1509, {8595}, 1},{'B', 1513, 1510, {0}, 0},{'U', 1519, 1511, {0}, 0}, + {'\0', 0, 1512, {0}, 0},{'a', 1515, 1513, {0}, 0},{'\0', 0, 1514, {0}, 0}, + {'r', 1517, 1515, {0}, 0},{'\0', 0, 1516, {0}, 0},{';', 0, 1517, {10515}, 1}, + {'\0', 0, 1518, {0}, 0},{'p', 1521, 1519, {0}, 0},{'\0', 0, 1520, {0}, 0}, + {'A', 1523, 1521, {0}, 0},{'\0', 0, 1522, {0}, 0},{'r', 1525, 1523, {0}, 0}, + {'\0', 0, 1524, {0}, 0},{'r', 1527, 1525, {0}, 0},{'\0', 0, 1526, {0}, 0}, + {'o', 1529, 1527, {0}, 0},{'\0', 0, 1528, {0}, 0},{'w', 1531, 1529, {0}, 0}, + {'\0', 0, 1530, {0}, 0},{';', 0, 1531, {8693}, 1},{'\0', 0, 1532, {0}, 0}, + {'r', 1535, 1533, {0}, 0},{'\0', 0, 1534, {0}, 0},{'e', 1537, 1535, {0}, 0}, + {'\0', 0, 1536, {0}, 0},{'v', 1539, 1537, {0}, 0},{'\0', 0, 1538, {0}, 0}, + {'e', 1541, 1539, {0}, 0},{'\0', 0, 1540, {0}, 0},{';', 0, 1541, {785}, 1}, + {'\0', 0, 1542, {0}, 0},{'e', 1545, 1543, {0}, 0},{'\0', 0, 1544, {0}, 0}, + {'f', 1547, 1545, {0}, 0},{'\0', 0, 1546, {0}, 0},{'t', 1549, 1547, {0}, 0}, + {'\0', 0, 1548, {0}, 0},{'R', 1553, 1549, {0}, 0},{'T', 1575, 1550, {0}, 0}, + {'V', 1593, 1551, {0}, 0},{'\0', 0, 1552, {0}, 0},{'i', 1555, 1553, {0}, 0}, + {'\0', 0, 1554, {0}, 0},{'g', 1557, 1555, {0}, 0},{'\0', 0, 1556, {0}, 0}, + {'h', 1559, 1557, {0}, 0},{'\0', 0, 1558, {0}, 0},{'t', 1561, 1559, {0}, 0}, + {'\0', 0, 1560, {0}, 0},{'V', 1563, 1561, {0}, 0},{'\0', 0, 1562, {0}, 0}, + {'e', 1565, 1563, {0}, 0},{'\0', 0, 1564, {0}, 0},{'c', 1567, 1565, {0}, 0}, + {'\0', 0, 1566, {0}, 0},{'t', 1569, 1567, {0}, 0},{'\0', 0, 1568, {0}, 0}, + {'o', 1571, 1569, {0}, 0},{'\0', 0, 1570, {0}, 0},{'r', 1573, 1571, {0}, 0}, + {'\0', 0, 1572, {0}, 0},{';', 0, 1573, {10576}, 1},{'\0', 0, 1574, {0}, 0}, + {'e', 1577, 1575, {0}, 0},{'\0', 0, 1576, {0}, 0},{'e', 1579, 1577, {0}, 0}, + {'\0', 0, 1578, {0}, 0},{'V', 1581, 1579, {0}, 0},{'\0', 0, 1580, {0}, 0}, + {'e', 1583, 1581, {0}, 0},{'\0', 0, 1582, {0}, 0},{'c', 1585, 1583, {0}, 0}, + {'\0', 0, 1584, {0}, 0},{'t', 1587, 1585, {0}, 0},{'\0', 0, 1586, {0}, 0}, + {'o', 1589, 1587, {0}, 0},{'\0', 0, 1588, {0}, 0},{'r', 1591, 1589, {0}, 0}, + {'\0', 0, 1590, {0}, 0},{';', 0, 1591, {10590}, 1},{'\0', 0, 1592, {0}, 0}, + {'e', 1595, 1593, {0}, 0},{'\0', 0, 1594, {0}, 0},{'c', 1597, 1595, {0}, 0}, + {'\0', 0, 1596, {0}, 0},{'t', 1599, 1597, {0}, 0},{'\0', 0, 1598, {0}, 0}, + {'o', 1601, 1599, {0}, 0},{'\0', 0, 1600, {0}, 0},{'r', 1603, 1601, {0}, 0}, + {'\0', 0, 1602, {0}, 0},{';', 0, 1603, {8637}, 1},{'B', 1606, 1604, {0}, 0}, + {'\0', 0, 1605, {0}, 0},{'a', 1608, 1606, {0}, 0},{'\0', 0, 1607, {0}, 0}, + {'r', 1610, 1608, {0}, 0},{'\0', 0, 1609, {0}, 0},{';', 0, 1610, {10582}, 1}, + {'\0', 0, 1611, {0}, 0},{'i', 1614, 1612, {0}, 0},{'\0', 0, 1613, {0}, 0}, + {'g', 1616, 1614, {0}, 0},{'\0', 0, 1615, {0}, 0},{'h', 1618, 1616, {0}, 0}, + {'\0', 0, 1617, {0}, 0},{'t', 1620, 1618, {0}, 0},{'\0', 0, 1619, {0}, 0}, + {'T', 1623, 1620, {0}, 0},{'V', 1641, 1621, {0}, 0},{'\0', 0, 1622, {0}, 0}, + {'e', 1625, 1623, {0}, 0},{'\0', 0, 1624, {0}, 0},{'e', 1627, 1625, {0}, 0}, + {'\0', 0, 1626, {0}, 0},{'V', 1629, 1627, {0}, 0},{'\0', 0, 1628, {0}, 0}, + {'e', 1631, 1629, {0}, 0},{'\0', 0, 1630, {0}, 0},{'c', 1633, 1631, {0}, 0}, + {'\0', 0, 1632, {0}, 0},{'t', 1635, 1633, {0}, 0},{'\0', 0, 1634, {0}, 0}, + {'o', 1637, 1635, {0}, 0},{'\0', 0, 1636, {0}, 0},{'r', 1639, 1637, {0}, 0}, + {'\0', 0, 1638, {0}, 0},{';', 0, 1639, {10591}, 1},{'\0', 0, 1640, {0}, 0}, + {'e', 1643, 1641, {0}, 0},{'\0', 0, 1642, {0}, 0},{'c', 1645, 1643, {0}, 0}, + {'\0', 0, 1644, {0}, 0},{'t', 1647, 1645, {0}, 0},{'\0', 0, 1646, {0}, 0}, + {'o', 1649, 1647, {0}, 0},{'\0', 0, 1648, {0}, 0},{'r', 1651, 1649, {0}, 0}, + {'\0', 0, 1650, {0}, 0},{';', 0, 1651, {8641}, 1},{'B', 1654, 1652, {0}, 0}, + {'\0', 0, 1653, {0}, 0},{'a', 1656, 1654, {0}, 0},{'\0', 0, 1655, {0}, 0}, + {'r', 1658, 1656, {0}, 0},{'\0', 0, 1657, {0}, 0},{';', 0, 1658, {10583}, 1}, + {'\0', 0, 1659, {0}, 0},{'e', 1662, 1660, {0}, 0},{'\0', 0, 1661, {0}, 0}, + {'e', 1664, 1662, {0}, 0},{'\0', 0, 1663, {0}, 0},{';', 0, 1664, {8868}, 1}, + {'A', 1667, 1665, {0}, 0},{'\0', 0, 1666, {0}, 0},{'r', 1669, 1667, {0}, 0}, + {'\0', 0, 1668, {0}, 0},{'r', 1671, 1669, {0}, 0},{'\0', 0, 1670, {0}, 0}, + {'o', 1673, 1671, {0}, 0},{'\0', 0, 1672, {0}, 0},{'w', 1675, 1673, {0}, 0}, + {'\0', 0, 1674, {0}, 0},{';', 0, 1675, {8615}, 1},{'\0', 0, 1676, {0}, 0}, + {'r', 1679, 1677, {0}, 0},{'\0', 0, 1678, {0}, 0},{'r', 1681, 1679, {0}, 0}, + {'\0', 0, 1680, {0}, 0},{'o', 1683, 1681, {0}, 0},{'\0', 0, 1682, {0}, 0}, + {'w', 1685, 1683, {0}, 0},{'\0', 0, 1684, {0}, 0},{';', 0, 1685, {8659}, 1}, + {'\0', 0, 1686, {0}, 0},{'c', 1690, 1687, {0}, 0},{'t', 1694, 1688, {0}, 0}, + {'\0', 0, 1689, {0}, 0},{'r', 1692, 1690, {0}, 0},{'\0', 0, 1691, {0}, 0}, + {';', 0, 1692, {119967}, 1},{'\0', 0, 1693, {0}, 0},{'r', 1696, 1694, {0}, 0}, + {'\0', 0, 1695, {0}, 0},{'o', 1698, 1696, {0}, 0},{'\0', 0, 1697, {0}, 0}, + {'k', 1700, 1698, {0}, 0},{'\0', 0, 1699, {0}, 0},{';', 0, 1700, {272}, 1}, + {'\0', 0, 1701, {0}, 0},{'N', 1719, 1702, {0}, 0},{'T', 1723, 1703, {0}, 0}, + {'a', 1727, 1704, {0}, 0},{'c', 1737, 1705, {0}, 0},{'d', 1757, 1706, {0}, 0}, + {'f', 1763, 1707, {0}, 0},{'g', 1767, 1708, {0}, 0},{'l', 1777, 1709, {0}, 0}, + {'m', 1789, 1710, {0}, 0},{'o', 1857, 1711, {0}, 0},{'p', 1870, 1712, {0}, 0}, + {'q', 1882, 1713, {0}, 0},{'s', 1918, 1714, {0}, 0},{'t', 1929, 1715, {0}, 0}, + {'u', 1933, 1716, {0}, 0},{'x', 1939, 1717, {0}, 0},{'\0', 0, 1718, {0}, 0}, + {'G', 1721, 1719, {0}, 0},{'\0', 0, 1720, {0}, 0},{';', 0, 1721, {330}, 1}, + {'\0', 0, 1722, {0}, 0},{'H', 1725, 1723, {208}, 1},{'\0', 0, 1724, {0}, 0}, + {';', 0, 1725, {208}, 1},{'\0', 0, 1726, {0}, 0},{'c', 1729, 1727, {0}, 0}, + {'\0', 0, 1728, {0}, 0},{'u', 1731, 1729, {0}, 0},{'\0', 0, 1730, {0}, 0}, + {'t', 1733, 1731, {0}, 0},{'\0', 0, 1732, {0}, 0},{'e', 1735, 1733, {201}, 1}, + {'\0', 0, 1734, {0}, 0},{';', 0, 1735, {201}, 1},{'\0', 0, 1736, {0}, 0}, + {'a', 1741, 1737, {0}, 0},{'i', 1749, 1738, {0}, 0},{'y', 1755, 1739, {0}, 0}, + {'\0', 0, 1740, {0}, 0},{'r', 1743, 1741, {0}, 0},{'\0', 0, 1742, {0}, 0}, + {'o', 1745, 1743, {0}, 0},{'\0', 0, 1744, {0}, 0},{'n', 1747, 1745, {0}, 0}, + {'\0', 0, 1746, {0}, 0},{';', 0, 1747, {282}, 1},{'\0', 0, 1748, {0}, 0}, + {'r', 1751, 1749, {0}, 0},{'\0', 0, 1750, {0}, 0},{'c', 1753, 1751, {202}, 1}, + {'\0', 0, 1752, {0}, 0},{';', 0, 1753, {202}, 1},{'\0', 0, 1754, {0}, 0}, + {';', 0, 1755, {1069}, 1},{'\0', 0, 1756, {0}, 0},{'o', 1759, 1757, {0}, 0}, + {'\0', 0, 1758, {0}, 0},{'t', 1761, 1759, {0}, 0},{'\0', 0, 1760, {0}, 0}, + {';', 0, 1761, {278}, 1},{'\0', 0, 1762, {0}, 0},{'r', 1765, 1763, {0}, 0}, + {'\0', 0, 1764, {0}, 0},{';', 0, 1765, {120072}, 1},{'\0', 0, 1766, {0}, 0}, + {'r', 1769, 1767, {0}, 0},{'\0', 0, 1768, {0}, 0},{'a', 1771, 1769, {0}, 0}, + {'\0', 0, 1770, {0}, 0},{'v', 1773, 1771, {0}, 0},{'\0', 0, 1772, {0}, 0}, + {'e', 1775, 1773, {200}, 1},{'\0', 0, 1774, {0}, 0},{';', 0, 1775, {200}, 1}, + {'\0', 0, 1776, {0}, 0},{'e', 1779, 1777, {0}, 0},{'\0', 0, 1778, {0}, 0}, + {'m', 1781, 1779, {0}, 0},{'\0', 0, 1780, {0}, 0},{'e', 1783, 1781, {0}, 0}, + {'\0', 0, 1782, {0}, 0},{'n', 1785, 1783, {0}, 0},{'\0', 0, 1784, {0}, 0}, + {'t', 1787, 1785, {0}, 0},{'\0', 0, 1786, {0}, 0},{';', 0, 1787, {8712}, 1}, + {'\0', 0, 1788, {0}, 0},{'a', 1792, 1789, {0}, 0},{'p', 1798, 1790, {0}, 0}, + {'\0', 0, 1791, {0}, 0},{'c', 1794, 1792, {0}, 0},{'\0', 0, 1793, {0}, 0}, + {'r', 1796, 1794, {0}, 0},{'\0', 0, 1795, {0}, 0},{';', 0, 1796, {274}, 1}, + {'\0', 0, 1797, {0}, 0},{'t', 1800, 1798, {0}, 0},{'\0', 0, 1799, {0}, 0}, + {'y', 1802, 1800, {0}, 0},{'\0', 0, 1801, {0}, 0},{'S', 1805, 1802, {0}, 0}, + {'V', 1827, 1803, {0}, 0},{'\0', 0, 1804, {0}, 0},{'m', 1807, 1805, {0}, 0}, + {'\0', 0, 1806, {0}, 0},{'a', 1809, 1807, {0}, 0},{'\0', 0, 1808, {0}, 0}, + {'l', 1811, 1809, {0}, 0},{'\0', 0, 1810, {0}, 0},{'l', 1813, 1811, {0}, 0}, + {'\0', 0, 1812, {0}, 0},{'S', 1815, 1813, {0}, 0},{'\0', 0, 1814, {0}, 0}, + {'q', 1817, 1815, {0}, 0},{'\0', 0, 1816, {0}, 0},{'u', 1819, 1817, {0}, 0}, + {'\0', 0, 1818, {0}, 0},{'a', 1821, 1819, {0}, 0},{'\0', 0, 1820, {0}, 0}, + {'r', 1823, 1821, {0}, 0},{'\0', 0, 1822, {0}, 0},{'e', 1825, 1823, {0}, 0}, + {'\0', 0, 1824, {0}, 0},{';', 0, 1825, {9723}, 1},{'\0', 0, 1826, {0}, 0}, + {'e', 1829, 1827, {0}, 0},{'\0', 0, 1828, {0}, 0},{'r', 1831, 1829, {0}, 0}, + {'\0', 0, 1830, {0}, 0},{'y', 1833, 1831, {0}, 0},{'\0', 0, 1832, {0}, 0}, + {'S', 1835, 1833, {0}, 0},{'\0', 0, 1834, {0}, 0},{'m', 1837, 1835, {0}, 0}, + {'\0', 0, 1836, {0}, 0},{'a', 1839, 1837, {0}, 0},{'\0', 0, 1838, {0}, 0}, + {'l', 1841, 1839, {0}, 0},{'\0', 0, 1840, {0}, 0},{'l', 1843, 1841, {0}, 0}, + {'\0', 0, 1842, {0}, 0},{'S', 1845, 1843, {0}, 0},{'\0', 0, 1844, {0}, 0}, + {'q', 1847, 1845, {0}, 0},{'\0', 0, 1846, {0}, 0},{'u', 1849, 1847, {0}, 0}, + {'\0', 0, 1848, {0}, 0},{'a', 1851, 1849, {0}, 0},{'\0', 0, 1850, {0}, 0}, + {'r', 1853, 1851, {0}, 0},{'\0', 0, 1852, {0}, 0},{'e', 1855, 1853, {0}, 0}, + {'\0', 0, 1854, {0}, 0},{';', 0, 1855, {9643}, 1},{'\0', 0, 1856, {0}, 0}, + {'g', 1860, 1857, {0}, 0},{'p', 1866, 1858, {0}, 0},{'\0', 0, 1859, {0}, 0}, + {'o', 1862, 1860, {0}, 0},{'\0', 0, 1861, {0}, 0},{'n', 1864, 1862, {0}, 0}, + {'\0', 0, 1863, {0}, 0},{';', 0, 1864, {280}, 1},{'\0', 0, 1865, {0}, 0}, + {'f', 1868, 1866, {0}, 0},{'\0', 0, 1867, {0}, 0},{';', 0, 1868, {120124}, 1}, + {'\0', 0, 1869, {0}, 0},{'s', 1872, 1870, {0}, 0},{'\0', 0, 1871, {0}, 0}, + {'i', 1874, 1872, {0}, 0},{'\0', 0, 1873, {0}, 0},{'l', 1876, 1874, {0}, 0}, + {'\0', 0, 1875, {0}, 0},{'o', 1878, 1876, {0}, 0},{'\0', 0, 1877, {0}, 0}, + {'n', 1880, 1878, {0}, 0},{'\0', 0, 1879, {0}, 0},{';', 0, 1880, {917}, 1}, + {'\0', 0, 1881, {0}, 0},{'u', 1884, 1882, {0}, 0},{'\0', 0, 1883, {0}, 0}, + {'a', 1887, 1884, {0}, 0},{'i', 1902, 1885, {0}, 0},{'\0', 0, 1886, {0}, 0}, + {'l', 1889, 1887, {0}, 0},{'\0', 0, 1888, {0}, 0},{';', 0, 1889, {10869}, 1}, + {'T', 1892, 1890, {0}, 0},{'\0', 0, 1891, {0}, 0},{'i', 1894, 1892, {0}, 0}, + {'\0', 0, 1893, {0}, 0},{'l', 1896, 1894, {0}, 0},{'\0', 0, 1895, {0}, 0}, + {'d', 1898, 1896, {0}, 0},{'\0', 0, 1897, {0}, 0},{'e', 1900, 1898, {0}, 0}, + {'\0', 0, 1899, {0}, 0},{';', 0, 1900, {8770}, 1},{'\0', 0, 1901, {0}, 0}, + {'l', 1904, 1902, {0}, 0},{'\0', 0, 1903, {0}, 0},{'i', 1906, 1904, {0}, 0}, + {'\0', 0, 1905, {0}, 0},{'b', 1908, 1906, {0}, 0},{'\0', 0, 1907, {0}, 0}, + {'r', 1910, 1908, {0}, 0},{'\0', 0, 1909, {0}, 0},{'i', 1912, 1910, {0}, 0}, + {'\0', 0, 1911, {0}, 0},{'u', 1914, 1912, {0}, 0},{'\0', 0, 1913, {0}, 0}, + {'m', 1916, 1914, {0}, 0},{'\0', 0, 1915, {0}, 0},{';', 0, 1916, {8652}, 1}, + {'\0', 0, 1917, {0}, 0},{'c', 1921, 1918, {0}, 0},{'i', 1925, 1919, {0}, 0}, + {'\0', 0, 1920, {0}, 0},{'r', 1923, 1921, {0}, 0},{'\0', 0, 1922, {0}, 0}, + {';', 0, 1923, {8496}, 1},{'\0', 0, 1924, {0}, 0},{'m', 1927, 1925, {0}, 0}, + {'\0', 0, 1926, {0}, 0},{';', 0, 1927, {10867}, 1},{'\0', 0, 1928, {0}, 0}, + {'a', 1931, 1929, {0}, 0},{'\0', 0, 1930, {0}, 0},{';', 0, 1931, {919}, 1}, + {'\0', 0, 1932, {0}, 0},{'m', 1935, 1933, {0}, 0},{'\0', 0, 1934, {0}, 0}, + {'l', 1937, 1935, {203}, 1},{'\0', 0, 1936, {0}, 0},{';', 0, 1937, {203}, 1}, + {'\0', 0, 1938, {0}, 0},{'i', 1942, 1939, {0}, 0},{'p', 1950, 1940, {0}, 0}, + {'\0', 0, 1941, {0}, 0},{'s', 1944, 1942, {0}, 0},{'\0', 0, 1943, {0}, 0}, + {'t', 1946, 1944, {0}, 0},{'\0', 0, 1945, {0}, 0},{'s', 1948, 1946, {0}, 0}, + {'\0', 0, 1947, {0}, 0},{';', 0, 1948, {8707}, 1},{'\0', 0, 1949, {0}, 0}, + {'o', 1952, 1950, {0}, 0},{'\0', 0, 1951, {0}, 0},{'n', 1954, 1952, {0}, 0}, + {'\0', 0, 1953, {0}, 0},{'e', 1956, 1954, {0}, 0},{'\0', 0, 1955, {0}, 0}, + {'n', 1958, 1956, {0}, 0},{'\0', 0, 1957, {0}, 0},{'t', 1960, 1958, {0}, 0}, + {'\0', 0, 1959, {0}, 0},{'i', 1962, 1960, {0}, 0},{'\0', 0, 1961, {0}, 0}, + {'a', 1964, 1962, {0}, 0},{'\0', 0, 1963, {0}, 0},{'l', 1966, 1964, {0}, 0}, + {'\0', 0, 1965, {0}, 0},{'E', 1968, 1966, {0}, 0},{'\0', 0, 1967, {0}, 0}, + {';', 0, 1968, {8519}, 1},{'\0', 0, 1969, {0}, 0},{'c', 1976, 1970, {0}, 0}, + {'f', 1980, 1971, {0}, 0},{'i', 1984, 1972, {0}, 0},{'o', 2047, 1973, {0}, 0}, + {'s', 2079, 1974, {0}, 0},{'\0', 0, 1975, {0}, 0},{'y', 1978, 1976, {0}, 0}, + {'\0', 0, 1977, {0}, 0},{';', 0, 1978, {1060}, 1},{'\0', 0, 1979, {0}, 0}, + {'r', 1982, 1980, {0}, 0},{'\0', 0, 1981, {0}, 0},{';', 0, 1982, {120073}, 1}, + {'\0', 0, 1983, {0}, 0},{'l', 1986, 1984, {0}, 0},{'\0', 0, 1985, {0}, 0}, + {'l', 1988, 1986, {0}, 0},{'\0', 0, 1987, {0}, 0},{'e', 1990, 1988, {0}, 0}, + {'\0', 0, 1989, {0}, 0},{'d', 1992, 1990, {0}, 0},{'\0', 0, 1991, {0}, 0}, + {'S', 1995, 1992, {0}, 0},{'V', 2017, 1993, {0}, 0},{'\0', 0, 1994, {0}, 0}, + {'m', 1997, 1995, {0}, 0},{'\0', 0, 1996, {0}, 0},{'a', 1999, 1997, {0}, 0}, + {'\0', 0, 1998, {0}, 0},{'l', 2001, 1999, {0}, 0},{'\0', 0, 2000, {0}, 0}, + {'l', 2003, 2001, {0}, 0},{'\0', 0, 2002, {0}, 0},{'S', 2005, 2003, {0}, 0}, + {'\0', 0, 2004, {0}, 0},{'q', 2007, 2005, {0}, 0},{'\0', 0, 2006, {0}, 0}, + {'u', 2009, 2007, {0}, 0},{'\0', 0, 2008, {0}, 0},{'a', 2011, 2009, {0}, 0}, + {'\0', 0, 2010, {0}, 0},{'r', 2013, 2011, {0}, 0},{'\0', 0, 2012, {0}, 0}, + {'e', 2015, 2013, {0}, 0},{'\0', 0, 2014, {0}, 0},{';', 0, 2015, {9724}, 1}, + {'\0', 0, 2016, {0}, 0},{'e', 2019, 2017, {0}, 0},{'\0', 0, 2018, {0}, 0}, + {'r', 2021, 2019, {0}, 0},{'\0', 0, 2020, {0}, 0},{'y', 2023, 2021, {0}, 0}, + {'\0', 0, 2022, {0}, 0},{'S', 2025, 2023, {0}, 0},{'\0', 0, 2024, {0}, 0}, + {'m', 2027, 2025, {0}, 0},{'\0', 0, 2026, {0}, 0},{'a', 2029, 2027, {0}, 0}, + {'\0', 0, 2028, {0}, 0},{'l', 2031, 2029, {0}, 0},{'\0', 0, 2030, {0}, 0}, + {'l', 2033, 2031, {0}, 0},{'\0', 0, 2032, {0}, 0},{'S', 2035, 2033, {0}, 0}, + {'\0', 0, 2034, {0}, 0},{'q', 2037, 2035, {0}, 0},{'\0', 0, 2036, {0}, 0}, + {'u', 2039, 2037, {0}, 0},{'\0', 0, 2038, {0}, 0},{'a', 2041, 2039, {0}, 0}, + {'\0', 0, 2040, {0}, 0},{'r', 2043, 2041, {0}, 0},{'\0', 0, 2042, {0}, 0}, + {'e', 2045, 2043, {0}, 0},{'\0', 0, 2044, {0}, 0},{';', 0, 2045, {9642}, 1}, + {'\0', 0, 2046, {0}, 0},{'p', 2051, 2047, {0}, 0},{'r', 2055, 2048, {0}, 0}, + {'u', 2063, 2049, {0}, 0},{'\0', 0, 2050, {0}, 0},{'f', 2053, 2051, {0}, 0}, + {'\0', 0, 2052, {0}, 0},{';', 0, 2053, {120125}, 1},{'\0', 0, 2054, {0}, 0}, + {'A', 2057, 2055, {0}, 0},{'\0', 0, 2056, {0}, 0},{'l', 2059, 2057, {0}, 0}, + {'\0', 0, 2058, {0}, 0},{'l', 2061, 2059, {0}, 0},{'\0', 0, 2060, {0}, 0}, + {';', 0, 2061, {8704}, 1},{'\0', 0, 2062, {0}, 0},{'r', 2065, 2063, {0}, 0}, + {'\0', 0, 2064, {0}, 0},{'i', 2067, 2065, {0}, 0},{'\0', 0, 2066, {0}, 0}, + {'e', 2069, 2067, {0}, 0},{'\0', 0, 2068, {0}, 0},{'r', 2071, 2069, {0}, 0}, + {'\0', 0, 2070, {0}, 0},{'t', 2073, 2071, {0}, 0},{'\0', 0, 2072, {0}, 0}, + {'r', 2075, 2073, {0}, 0},{'\0', 0, 2074, {0}, 0},{'f', 2077, 2075, {0}, 0}, + {'\0', 0, 2076, {0}, 0},{';', 0, 2077, {8497}, 1},{'\0', 0, 2078, {0}, 0}, + {'c', 2081, 2079, {0}, 0},{'\0', 0, 2080, {0}, 0},{'r', 2083, 2081, {0}, 0}, + {'\0', 0, 2082, {0}, 0},{';', 0, 2083, {8497}, 1},{'\0', 0, 2084, {0}, 0}, + {'J', 2098, 2085, {0}, 0},{'T', 2104, 2086, {62}, 1},{'a', 2106, 2087, {0}, 0}, + {'b', 2117, 2088, {0}, 0},{'c', 2127, 2089, {0}, 0},{'d', 2147, 2090, {0}, 0}, + {'f', 2153, 2091, {0}, 0},{'g', 2157, 2092, {0}, 0},{'o', 2159, 2093, {0}, 0}, + {'r', 2165, 2094, {0}, 0},{'s', 2271, 2095, {0}, 0},{'t', 2277, 2096, {0}, 0}, + {'\0', 0, 2097, {0}, 0},{'c', 2100, 2098, {0}, 0},{'\0', 0, 2099, {0}, 0}, + {'y', 2102, 2100, {0}, 0},{'\0', 0, 2101, {0}, 0},{';', 0, 2102, {1027}, 1}, + {'\0', 0, 2103, {0}, 0},{';', 0, 2104, {62}, 1},{'\0', 0, 2105, {0}, 0}, + {'m', 2108, 2106, {0}, 0},{'\0', 0, 2107, {0}, 0},{'m', 2110, 2108, {0}, 0}, + {'\0', 0, 2109, {0}, 0},{'a', 2112, 2110, {0}, 0},{'\0', 0, 2111, {0}, 0}, + {';', 0, 2112, {915}, 1},{'d', 2115, 2113, {0}, 0},{'\0', 0, 2114, {0}, 0}, + {';', 0, 2115, {988}, 1},{'\0', 0, 2116, {0}, 0},{'r', 2119, 2117, {0}, 0}, + {'\0', 0, 2118, {0}, 0},{'e', 2121, 2119, {0}, 0},{'\0', 0, 2120, {0}, 0}, + {'v', 2123, 2121, {0}, 0},{'\0', 0, 2122, {0}, 0},{'e', 2125, 2123, {0}, 0}, + {'\0', 0, 2124, {0}, 0},{';', 0, 2125, {286}, 1},{'\0', 0, 2126, {0}, 0}, + {'e', 2131, 2127, {0}, 0},{'i', 2139, 2128, {0}, 0},{'y', 2145, 2129, {0}, 0}, + {'\0', 0, 2130, {0}, 0},{'d', 2133, 2131, {0}, 0},{'\0', 0, 2132, {0}, 0}, + {'i', 2135, 2133, {0}, 0},{'\0', 0, 2134, {0}, 0},{'l', 2137, 2135, {0}, 0}, + {'\0', 0, 2136, {0}, 0},{';', 0, 2137, {290}, 1},{'\0', 0, 2138, {0}, 0}, + {'r', 2141, 2139, {0}, 0},{'\0', 0, 2140, {0}, 0},{'c', 2143, 2141, {0}, 0}, + {'\0', 0, 2142, {0}, 0},{';', 0, 2143, {284}, 1},{'\0', 0, 2144, {0}, 0}, + {';', 0, 2145, {1043}, 1},{'\0', 0, 2146, {0}, 0},{'o', 2149, 2147, {0}, 0}, + {'\0', 0, 2148, {0}, 0},{'t', 2151, 2149, {0}, 0},{'\0', 0, 2150, {0}, 0}, + {';', 0, 2151, {288}, 1},{'\0', 0, 2152, {0}, 0},{'r', 2155, 2153, {0}, 0}, + {'\0', 0, 2154, {0}, 0},{';', 0, 2155, {120074}, 1},{'\0', 0, 2156, {0}, 0}, + {';', 0, 2157, {8921}, 1},{'\0', 0, 2158, {0}, 0},{'p', 2161, 2159, {0}, 0}, + {'\0', 0, 2160, {0}, 0},{'f', 2163, 2161, {0}, 0},{'\0', 0, 2162, {0}, 0}, + {';', 0, 2163, {120126}, 1},{'\0', 0, 2164, {0}, 0},{'e', 2167, 2165, {0}, 0}, + {'\0', 0, 2166, {0}, 0},{'a', 2169, 2167, {0}, 0},{'\0', 0, 2168, {0}, 0}, + {'t', 2171, 2169, {0}, 0},{'\0', 0, 2170, {0}, 0},{'e', 2173, 2171, {0}, 0}, + {'\0', 0, 2172, {0}, 0},{'r', 2175, 2173, {0}, 0},{'\0', 0, 2174, {0}, 0}, + {'E', 2182, 2175, {0}, 0},{'F', 2201, 2176, {0}, 0},{'G', 2219, 2177, {0}, 0}, + {'L', 2233, 2178, {0}, 0},{'S', 2241, 2179, {0}, 0},{'T', 2261, 2180, {0}, 0}, + {'\0', 0, 2181, {0}, 0},{'q', 2184, 2182, {0}, 0},{'\0', 0, 2183, {0}, 0}, + {'u', 2186, 2184, {0}, 0},{'\0', 0, 2185, {0}, 0},{'a', 2188, 2186, {0}, 0}, + {'\0', 0, 2187, {0}, 0},{'l', 2190, 2188, {0}, 0},{'\0', 0, 2189, {0}, 0}, + {';', 0, 2190, {8805}, 1},{'L', 2193, 2191, {0}, 0},{'\0', 0, 2192, {0}, 0}, + {'e', 2195, 2193, {0}, 0},{'\0', 0, 2194, {0}, 0},{'s', 2197, 2195, {0}, 0}, + {'\0', 0, 2196, {0}, 0},{'s', 2199, 2197, {0}, 0},{'\0', 0, 2198, {0}, 0}, + {';', 0, 2199, {8923}, 1},{'\0', 0, 2200, {0}, 0},{'u', 2203, 2201, {0}, 0}, + {'\0', 0, 2202, {0}, 0},{'l', 2205, 2203, {0}, 0},{'\0', 0, 2204, {0}, 0}, + {'l', 2207, 2205, {0}, 0},{'\0', 0, 2206, {0}, 0},{'E', 2209, 2207, {0}, 0}, + {'\0', 0, 2208, {0}, 0},{'q', 2211, 2209, {0}, 0},{'\0', 0, 2210, {0}, 0}, + {'u', 2213, 2211, {0}, 0},{'\0', 0, 2212, {0}, 0},{'a', 2215, 2213, {0}, 0}, + {'\0', 0, 2214, {0}, 0},{'l', 2217, 2215, {0}, 0},{'\0', 0, 2216, {0}, 0}, + {';', 0, 2217, {8807}, 1},{'\0', 0, 2218, {0}, 0},{'r', 2221, 2219, {0}, 0}, + {'\0', 0, 2220, {0}, 0},{'e', 2223, 2221, {0}, 0},{'\0', 0, 2222, {0}, 0}, + {'a', 2225, 2223, {0}, 0},{'\0', 0, 2224, {0}, 0},{'t', 2227, 2225, {0}, 0}, + {'\0', 0, 2226, {0}, 0},{'e', 2229, 2227, {0}, 0},{'\0', 0, 2228, {0}, 0}, + {'r', 2231, 2229, {0}, 0},{'\0', 0, 2230, {0}, 0},{';', 0, 2231, {10914}, 1}, + {'\0', 0, 2232, {0}, 0},{'e', 2235, 2233, {0}, 0},{'\0', 0, 2234, {0}, 0}, + {'s', 2237, 2235, {0}, 0},{'\0', 0, 2236, {0}, 0},{'s', 2239, 2237, {0}, 0}, + {'\0', 0, 2238, {0}, 0},{';', 0, 2239, {8823}, 1},{'\0', 0, 2240, {0}, 0}, + {'l', 2243, 2241, {0}, 0},{'\0', 0, 2242, {0}, 0},{'a', 2245, 2243, {0}, 0}, + {'\0', 0, 2244, {0}, 0},{'n', 2247, 2245, {0}, 0},{'\0', 0, 2246, {0}, 0}, + {'t', 2249, 2247, {0}, 0},{'\0', 0, 2248, {0}, 0},{'E', 2251, 2249, {0}, 0}, + {'\0', 0, 2250, {0}, 0},{'q', 2253, 2251, {0}, 0},{'\0', 0, 2252, {0}, 0}, + {'u', 2255, 2253, {0}, 0},{'\0', 0, 2254, {0}, 0},{'a', 2257, 2255, {0}, 0}, + {'\0', 0, 2256, {0}, 0},{'l', 2259, 2257, {0}, 0},{'\0', 0, 2258, {0}, 0}, + {';', 0, 2259, {10878}, 1},{'\0', 0, 2260, {0}, 0},{'i', 2263, 2261, {0}, 0}, + {'\0', 0, 2262, {0}, 0},{'l', 2265, 2263, {0}, 0},{'\0', 0, 2264, {0}, 0}, + {'d', 2267, 2265, {0}, 0},{'\0', 0, 2266, {0}, 0},{'e', 2269, 2267, {0}, 0}, + {'\0', 0, 2268, {0}, 0},{';', 0, 2269, {8819}, 1},{'\0', 0, 2270, {0}, 0}, + {'c', 2273, 2271, {0}, 0},{'\0', 0, 2272, {0}, 0},{'r', 2275, 2273, {0}, 0}, + {'\0', 0, 2274, {0}, 0},{';', 0, 2275, {119970}, 1},{'\0', 0, 2276, {0}, 0}, + {';', 0, 2277, {8811}, 1},{'\0', 0, 2278, {0}, 0},{'A', 2288, 2279, {0}, 0}, + {'a', 2298, 2280, {0}, 0},{'c', 2309, 2281, {0}, 0},{'f', 2317, 2282, {0}, 0}, + {'i', 2321, 2283, {0}, 0},{'o', 2343, 2284, {0}, 0},{'s', 2374, 2285, {0}, 0}, + {'u', 2389, 2286, {0}, 0},{'\0', 0, 2287, {0}, 0},{'R', 2290, 2288, {0}, 0}, + {'\0', 0, 2289, {0}, 0},{'D', 2292, 2290, {0}, 0},{'\0', 0, 2291, {0}, 0}, + {'c', 2294, 2292, {0}, 0},{'\0', 0, 2293, {0}, 0},{'y', 2296, 2294, {0}, 0}, + {'\0', 0, 2295, {0}, 0},{';', 0, 2296, {1066}, 1},{'\0', 0, 2297, {0}, 0}, + {'c', 2301, 2298, {0}, 0},{'t', 2307, 2299, {0}, 0},{'\0', 0, 2300, {0}, 0}, + {'e', 2303, 2301, {0}, 0},{'\0', 0, 2302, {0}, 0},{'k', 2305, 2303, {0}, 0}, + {'\0', 0, 2304, {0}, 0},{';', 0, 2305, {711}, 1},{'\0', 0, 2306, {0}, 0}, + {';', 0, 2307, {94}, 1},{'\0', 0, 2308, {0}, 0},{'i', 2311, 2309, {0}, 0}, + {'\0', 0, 2310, {0}, 0},{'r', 2313, 2311, {0}, 0},{'\0', 0, 2312, {0}, 0}, + {'c', 2315, 2313, {0}, 0},{'\0', 0, 2314, {0}, 0},{';', 0, 2315, {292}, 1}, + {'\0', 0, 2316, {0}, 0},{'r', 2319, 2317, {0}, 0},{'\0', 0, 2318, {0}, 0}, + {';', 0, 2319, {8460}, 1},{'\0', 0, 2320, {0}, 0},{'l', 2323, 2321, {0}, 0}, + {'\0', 0, 2322, {0}, 0},{'b', 2325, 2323, {0}, 0},{'\0', 0, 2324, {0}, 0}, + {'e', 2327, 2325, {0}, 0},{'\0', 0, 2326, {0}, 0},{'r', 2329, 2327, {0}, 0}, + {'\0', 0, 2328, {0}, 0},{'t', 2331, 2329, {0}, 0},{'\0', 0, 2330, {0}, 0}, + {'S', 2333, 2331, {0}, 0},{'\0', 0, 2332, {0}, 0},{'p', 2335, 2333, {0}, 0}, + {'\0', 0, 2334, {0}, 0},{'a', 2337, 2335, {0}, 0},{'\0', 0, 2336, {0}, 0}, + {'c', 2339, 2337, {0}, 0},{'\0', 0, 2338, {0}, 0},{'e', 2341, 2339, {0}, 0}, + {'\0', 0, 2340, {0}, 0},{';', 0, 2341, {8459}, 1},{'\0', 0, 2342, {0}, 0}, + {'p', 2346, 2343, {0}, 0},{'r', 2350, 2344, {0}, 0},{'\0', 0, 2345, {0}, 0}, + {'f', 2348, 2346, {0}, 0},{'\0', 0, 2347, {0}, 0},{';', 0, 2348, {8461}, 1}, + {'\0', 0, 2349, {0}, 0},{'i', 2352, 2350, {0}, 0},{'\0', 0, 2351, {0}, 0}, + {'z', 2354, 2352, {0}, 0},{'\0', 0, 2353, {0}, 0},{'o', 2356, 2354, {0}, 0}, + {'\0', 0, 2355, {0}, 0},{'n', 2358, 2356, {0}, 0},{'\0', 0, 2357, {0}, 0}, + {'t', 2360, 2358, {0}, 0},{'\0', 0, 2359, {0}, 0},{'a', 2362, 2360, {0}, 0}, + {'\0', 0, 2361, {0}, 0},{'l', 2364, 2362, {0}, 0},{'\0', 0, 2363, {0}, 0}, + {'L', 2366, 2364, {0}, 0},{'\0', 0, 2365, {0}, 0},{'i', 2368, 2366, {0}, 0}, + {'\0', 0, 2367, {0}, 0},{'n', 2370, 2368, {0}, 0},{'\0', 0, 2369, {0}, 0}, + {'e', 2372, 2370, {0}, 0},{'\0', 0, 2371, {0}, 0},{';', 0, 2372, {9472}, 1}, + {'\0', 0, 2373, {0}, 0},{'c', 2377, 2374, {0}, 0},{'t', 2381, 2375, {0}, 0}, + {'\0', 0, 2376, {0}, 0},{'r', 2379, 2377, {0}, 0},{'\0', 0, 2378, {0}, 0}, + {';', 0, 2379, {8459}, 1},{'\0', 0, 2380, {0}, 0},{'r', 2383, 2381, {0}, 0}, + {'\0', 0, 2382, {0}, 0},{'o', 2385, 2383, {0}, 0},{'\0', 0, 2384, {0}, 0}, + {'k', 2387, 2385, {0}, 0},{'\0', 0, 2386, {0}, 0},{';', 0, 2387, {294}, 1}, + {'\0', 0, 2388, {0}, 0},{'m', 2391, 2389, {0}, 0},{'\0', 0, 2390, {0}, 0}, + {'p', 2393, 2391, {0}, 0},{'\0', 0, 2392, {0}, 0},{'D', 2396, 2393, {0}, 0}, + {'E', 2412, 2394, {0}, 0},{'\0', 0, 2395, {0}, 0},{'o', 2398, 2396, {0}, 0}, + {'\0', 0, 2397, {0}, 0},{'w', 2400, 2398, {0}, 0},{'\0', 0, 2399, {0}, 0}, + {'n', 2402, 2400, {0}, 0},{'\0', 0, 2401, {0}, 0},{'H', 2404, 2402, {0}, 0}, + {'\0', 0, 2403, {0}, 0},{'u', 2406, 2404, {0}, 0},{'\0', 0, 2405, {0}, 0}, + {'m', 2408, 2406, {0}, 0},{'\0', 0, 2407, {0}, 0},{'p', 2410, 2408, {0}, 0}, + {'\0', 0, 2409, {0}, 0},{';', 0, 2410, {8782}, 1},{'\0', 0, 2411, {0}, 0}, + {'q', 2414, 2412, {0}, 0},{'\0', 0, 2413, {0}, 0},{'u', 2416, 2414, {0}, 0}, + {'\0', 0, 2415, {0}, 0},{'a', 2418, 2416, {0}, 0},{'\0', 0, 2417, {0}, 0}, + {'l', 2420, 2418, {0}, 0},{'\0', 0, 2419, {0}, 0},{';', 0, 2420, {8783}, 1}, + {'\0', 0, 2421, {0}, 0},{'E', 2437, 2422, {0}, 0},{'J', 2443, 2423, {0}, 0}, + {'O', 2451, 2424, {0}, 0},{'a', 2457, 2425, {0}, 0},{'c', 2467, 2426, {0}, 0}, + {'d', 2478, 2427, {0}, 0},{'f', 2484, 2428, {0}, 0},{'g', 2488, 2429, {0}, 0}, + {'m', 2498, 2430, {0}, 0},{'n', 2533, 2431, {0}, 0},{'o', 2601, 2432, {0}, 0}, + {'s', 2619, 2433, {0}, 0},{'t', 2625, 2434, {0}, 0},{'u', 2635, 2435, {0}, 0}, + {'\0', 0, 2436, {0}, 0},{'c', 2439, 2437, {0}, 0},{'\0', 0, 2438, {0}, 0}, + {'y', 2441, 2439, {0}, 0},{'\0', 0, 2440, {0}, 0},{';', 0, 2441, {1045}, 1}, + {'\0', 0, 2442, {0}, 0},{'l', 2445, 2443, {0}, 0},{'\0', 0, 2444, {0}, 0}, + {'i', 2447, 2445, {0}, 0},{'\0', 0, 2446, {0}, 0},{'g', 2449, 2447, {0}, 0}, + {'\0', 0, 2448, {0}, 0},{';', 0, 2449, {306}, 1},{'\0', 0, 2450, {0}, 0}, + {'c', 2453, 2451, {0}, 0},{'\0', 0, 2452, {0}, 0},{'y', 2455, 2453, {0}, 0}, + {'\0', 0, 2454, {0}, 0},{';', 0, 2455, {1025}, 1},{'\0', 0, 2456, {0}, 0}, + {'c', 2459, 2457, {0}, 0},{'\0', 0, 2458, {0}, 0},{'u', 2461, 2459, {0}, 0}, + {'\0', 0, 2460, {0}, 0},{'t', 2463, 2461, {0}, 0},{'\0', 0, 2462, {0}, 0}, + {'e', 2465, 2463, {205}, 1},{'\0', 0, 2464, {0}, 0},{';', 0, 2465, {205}, 1}, + {'\0', 0, 2466, {0}, 0},{'i', 2470, 2467, {0}, 0},{'y', 2476, 2468, {0}, 0}, + {'\0', 0, 2469, {0}, 0},{'r', 2472, 2470, {0}, 0},{'\0', 0, 2471, {0}, 0}, + {'c', 2474, 2472, {206}, 1},{'\0', 0, 2473, {0}, 0},{';', 0, 2474, {206}, 1}, + {'\0', 0, 2475, {0}, 0},{';', 0, 2476, {1048}, 1},{'\0', 0, 2477, {0}, 0}, + {'o', 2480, 2478, {0}, 0},{'\0', 0, 2479, {0}, 0},{'t', 2482, 2480, {0}, 0}, + {'\0', 0, 2481, {0}, 0},{';', 0, 2482, {304}, 1},{'\0', 0, 2483, {0}, 0}, + {'r', 2486, 2484, {0}, 0},{'\0', 0, 2485, {0}, 0},{';', 0, 2486, {8465}, 1}, + {'\0', 0, 2487, {0}, 0},{'r', 2490, 2488, {0}, 0},{'\0', 0, 2489, {0}, 0}, + {'a', 2492, 2490, {0}, 0},{'\0', 0, 2491, {0}, 0},{'v', 2494, 2492, {0}, 0}, + {'\0', 0, 2493, {0}, 0},{'e', 2496, 2494, {204}, 1},{'\0', 0, 2495, {0}, 0}, + {';', 0, 2496, {204}, 1},{'\0', 0, 2497, {0}, 0},{';', 0, 2498, {8465}, 1}, + {'a', 2502, 2499, {0}, 0},{'p', 2523, 2500, {0}, 0},{'\0', 0, 2501, {0}, 0}, + {'c', 2505, 2502, {0}, 0},{'g', 2509, 2503, {0}, 0},{'\0', 0, 2504, {0}, 0}, + {'r', 2507, 2505, {0}, 0},{'\0', 0, 2506, {0}, 0},{';', 0, 2507, {298}, 1}, + {'\0', 0, 2508, {0}, 0},{'i', 2511, 2509, {0}, 0},{'\0', 0, 2510, {0}, 0}, + {'n', 2513, 2511, {0}, 0},{'\0', 0, 2512, {0}, 0},{'a', 2515, 2513, {0}, 0}, + {'\0', 0, 2514, {0}, 0},{'r', 2517, 2515, {0}, 0},{'\0', 0, 2516, {0}, 0}, + {'y', 2519, 2517, {0}, 0},{'\0', 0, 2518, {0}, 0},{'I', 2521, 2519, {0}, 0}, + {'\0', 0, 2520, {0}, 0},{';', 0, 2521, {8520}, 1},{'\0', 0, 2522, {0}, 0}, + {'l', 2525, 2523, {0}, 0},{'\0', 0, 2524, {0}, 0},{'i', 2527, 2525, {0}, 0}, + {'\0', 0, 2526, {0}, 0},{'e', 2529, 2527, {0}, 0},{'\0', 0, 2528, {0}, 0}, + {'s', 2531, 2529, {0}, 0},{'\0', 0, 2530, {0}, 0},{';', 0, 2531, {8658}, 1}, + {'\0', 0, 2532, {0}, 0},{'t', 2536, 2533, {0}, 0},{'v', 2566, 2534, {0}, 0}, + {'\0', 0, 2535, {0}, 0},{';', 0, 2536, {8748}, 1},{'e', 2539, 2537, {0}, 0}, + {'\0', 0, 2538, {0}, 0},{'g', 2542, 2539, {0}, 0},{'r', 2550, 2540, {0}, 0}, + {'\0', 0, 2541, {0}, 0},{'r', 2544, 2542, {0}, 0},{'\0', 0, 2543, {0}, 0}, + {'a', 2546, 2544, {0}, 0},{'\0', 0, 2545, {0}, 0},{'l', 2548, 2546, {0}, 0}, + {'\0', 0, 2547, {0}, 0},{';', 0, 2548, {8747}, 1},{'\0', 0, 2549, {0}, 0}, + {'s', 2552, 2550, {0}, 0},{'\0', 0, 2551, {0}, 0},{'e', 2554, 2552, {0}, 0}, + {'\0', 0, 2553, {0}, 0},{'c', 2556, 2554, {0}, 0},{'\0', 0, 2555, {0}, 0}, + {'t', 2558, 2556, {0}, 0},{'\0', 0, 2557, {0}, 0},{'i', 2560, 2558, {0}, 0}, + {'\0', 0, 2559, {0}, 0},{'o', 2562, 2560, {0}, 0},{'\0', 0, 2561, {0}, 0}, + {'n', 2564, 2562, {0}, 0},{'\0', 0, 2563, {0}, 0},{';', 0, 2564, {8898}, 1}, + {'\0', 0, 2565, {0}, 0},{'i', 2568, 2566, {0}, 0},{'\0', 0, 2567, {0}, 0}, + {'s', 2570, 2568, {0}, 0},{'\0', 0, 2569, {0}, 0},{'i', 2572, 2570, {0}, 0}, + {'\0', 0, 2571, {0}, 0},{'b', 2574, 2572, {0}, 0},{'\0', 0, 2573, {0}, 0}, + {'l', 2576, 2574, {0}, 0},{'\0', 0, 2575, {0}, 0},{'e', 2578, 2576, {0}, 0}, + {'\0', 0, 2577, {0}, 0},{'C', 2581, 2578, {0}, 0},{'T', 2591, 2579, {0}, 0}, + {'\0', 0, 2580, {0}, 0},{'o', 2583, 2581, {0}, 0},{'\0', 0, 2582, {0}, 0}, + {'m', 2585, 2583, {0}, 0},{'\0', 0, 2584, {0}, 0},{'m', 2587, 2585, {0}, 0}, + {'\0', 0, 2586, {0}, 0},{'a', 2589, 2587, {0}, 0},{'\0', 0, 2588, {0}, 0}, + {';', 0, 2589, {8291}, 1},{'\0', 0, 2590, {0}, 0},{'i', 2593, 2591, {0}, 0}, + {'\0', 0, 2592, {0}, 0},{'m', 2595, 2593, {0}, 0},{'\0', 0, 2594, {0}, 0}, + {'e', 2597, 2595, {0}, 0},{'\0', 0, 2596, {0}, 0},{'s', 2599, 2597, {0}, 0}, + {'\0', 0, 2598, {0}, 0},{';', 0, 2599, {8290}, 1},{'\0', 0, 2600, {0}, 0}, + {'g', 2605, 2601, {0}, 0},{'p', 2611, 2602, {0}, 0},{'t', 2615, 2603, {0}, 0}, + {'\0', 0, 2604, {0}, 0},{'o', 2607, 2605, {0}, 0},{'\0', 0, 2606, {0}, 0}, + {'n', 2609, 2607, {0}, 0},{'\0', 0, 2608, {0}, 0},{';', 0, 2609, {302}, 1}, + {'\0', 0, 2610, {0}, 0},{'f', 2613, 2611, {0}, 0},{'\0', 0, 2612, {0}, 0}, + {';', 0, 2613, {120128}, 1},{'\0', 0, 2614, {0}, 0},{'a', 2617, 2615, {0}, 0}, + {'\0', 0, 2616, {0}, 0},{';', 0, 2617, {921}, 1},{'\0', 0, 2618, {0}, 0}, + {'c', 2621, 2619, {0}, 0},{'\0', 0, 2620, {0}, 0},{'r', 2623, 2621, {0}, 0}, + {'\0', 0, 2622, {0}, 0},{';', 0, 2623, {8464}, 1},{'\0', 0, 2624, {0}, 0}, + {'i', 2627, 2625, {0}, 0},{'\0', 0, 2626, {0}, 0},{'l', 2629, 2627, {0}, 0}, + {'\0', 0, 2628, {0}, 0},{'d', 2631, 2629, {0}, 0},{'\0', 0, 2630, {0}, 0}, + {'e', 2633, 2631, {0}, 0},{'\0', 0, 2632, {0}, 0},{';', 0, 2633, {296}, 1}, + {'\0', 0, 2634, {0}, 0},{'k', 2638, 2635, {0}, 0},{'m', 2644, 2636, {0}, 0}, + {'\0', 0, 2637, {0}, 0},{'c', 2640, 2638, {0}, 0},{'\0', 0, 2639, {0}, 0}, + {'y', 2642, 2640, {0}, 0},{'\0', 0, 2641, {0}, 0},{';', 0, 2642, {1030}, 1}, + {'\0', 0, 2643, {0}, 0},{'l', 2646, 2644, {207}, 1},{'\0', 0, 2645, {0}, 0}, + {';', 0, 2646, {207}, 1},{'\0', 0, 2647, {0}, 0},{'c', 2654, 2648, {0}, 0}, + {'f', 2665, 2649, {0}, 0},{'o', 2669, 2650, {0}, 0},{'s', 2675, 2651, {0}, 0}, + {'u', 2690, 2652, {0}, 0},{'\0', 0, 2653, {0}, 0},{'i', 2657, 2654, {0}, 0}, + {'y', 2663, 2655, {0}, 0},{'\0', 0, 2656, {0}, 0},{'r', 2659, 2657, {0}, 0}, + {'\0', 0, 2658, {0}, 0},{'c', 2661, 2659, {0}, 0},{'\0', 0, 2660, {0}, 0}, + {';', 0, 2661, {308}, 1},{'\0', 0, 2662, {0}, 0},{';', 0, 2663, {1049}, 1}, + {'\0', 0, 2664, {0}, 0},{'r', 2667, 2665, {0}, 0},{'\0', 0, 2666, {0}, 0}, + {';', 0, 2667, {120077}, 1},{'\0', 0, 2668, {0}, 0},{'p', 2671, 2669, {0}, 0}, + {'\0', 0, 2670, {0}, 0},{'f', 2673, 2671, {0}, 0},{'\0', 0, 2672, {0}, 0}, + {';', 0, 2673, {120129}, 1},{'\0', 0, 2674, {0}, 0},{'c', 2678, 2675, {0}, 0}, + {'e', 2682, 2676, {0}, 0},{'\0', 0, 2677, {0}, 0},{'r', 2680, 2678, {0}, 0}, + {'\0', 0, 2679, {0}, 0},{';', 0, 2680, {119973}, 1},{'\0', 0, 2681, {0}, 0}, + {'r', 2684, 2682, {0}, 0},{'\0', 0, 2683, {0}, 0},{'c', 2686, 2684, {0}, 0}, + {'\0', 0, 2685, {0}, 0},{'y', 2688, 2686, {0}, 0},{'\0', 0, 2687, {0}, 0}, + {';', 0, 2688, {1032}, 1},{'\0', 0, 2689, {0}, 0},{'k', 2692, 2690, {0}, 0}, + {'\0', 0, 2691, {0}, 0},{'c', 2694, 2692, {0}, 0},{'\0', 0, 2693, {0}, 0}, + {'y', 2696, 2694, {0}, 0},{'\0', 0, 2695, {0}, 0},{';', 0, 2696, {1028}, 1}, + {'\0', 0, 2697, {0}, 0},{'H', 2706, 2698, {0}, 0},{'J', 2712, 2699, {0}, 0}, + {'a', 2718, 2700, {0}, 0},{'c', 2726, 2701, {0}, 0},{'f', 2739, 2702, {0}, 0}, + {'o', 2743, 2703, {0}, 0},{'s', 2749, 2704, {0}, 0},{'\0', 0, 2705, {0}, 0}, + {'c', 2708, 2706, {0}, 0},{'\0', 0, 2707, {0}, 0},{'y', 2710, 2708, {0}, 0}, + {'\0', 0, 2709, {0}, 0},{';', 0, 2710, {1061}, 1},{'\0', 0, 2711, {0}, 0}, + {'c', 2714, 2712, {0}, 0},{'\0', 0, 2713, {0}, 0},{'y', 2716, 2714, {0}, 0}, + {'\0', 0, 2715, {0}, 0},{';', 0, 2716, {1036}, 1},{'\0', 0, 2717, {0}, 0}, + {'p', 2720, 2718, {0}, 0},{'\0', 0, 2719, {0}, 0},{'p', 2722, 2720, {0}, 0}, + {'\0', 0, 2721, {0}, 0},{'a', 2724, 2722, {0}, 0},{'\0', 0, 2723, {0}, 0}, + {';', 0, 2724, {922}, 1},{'\0', 0, 2725, {0}, 0},{'e', 2729, 2726, {0}, 0}, + {'y', 2737, 2727, {0}, 0},{'\0', 0, 2728, {0}, 0},{'d', 2731, 2729, {0}, 0}, + {'\0', 0, 2730, {0}, 0},{'i', 2733, 2731, {0}, 0},{'\0', 0, 2732, {0}, 0}, + {'l', 2735, 2733, {0}, 0},{'\0', 0, 2734, {0}, 0},{';', 0, 2735, {310}, 1}, + {'\0', 0, 2736, {0}, 0},{';', 0, 2737, {1050}, 1},{'\0', 0, 2738, {0}, 0}, + {'r', 2741, 2739, {0}, 0},{'\0', 0, 2740, {0}, 0},{';', 0, 2741, {120078}, 1}, + {'\0', 0, 2742, {0}, 0},{'p', 2745, 2743, {0}, 0},{'\0', 0, 2744, {0}, 0}, + {'f', 2747, 2745, {0}, 0},{'\0', 0, 2746, {0}, 0},{';', 0, 2747, {120130}, 1}, + {'\0', 0, 2748, {0}, 0},{'c', 2751, 2749, {0}, 0},{'\0', 0, 2750, {0}, 0}, + {'r', 2753, 2751, {0}, 0},{'\0', 0, 2752, {0}, 0},{';', 0, 2753, {119974}, 1}, + {'\0', 0, 2754, {0}, 0},{'J', 2767, 2755, {0}, 0},{'T', 2773, 2756, {60}, 1}, + {'a', 2775, 2757, {0}, 0},{'c', 2821, 2758, {0}, 0},{'e', 2843, 2759, {0}, 0}, + {'f', 3324, 2760, {0}, 0},{'l', 3328, 2761, {0}, 0},{'m', 3347, 2762, {0}, 0}, + {'o', 3357, 2763, {0}, 0},{'s', 3535, 2764, {0}, 0},{'t', 3553, 2765, {0}, 0}, + {'\0', 0, 2766, {0}, 0},{'c', 2769, 2767, {0}, 0},{'\0', 0, 2768, {0}, 0}, + {'y', 2771, 2769, {0}, 0},{'\0', 0, 2770, {0}, 0},{';', 0, 2771, {1033}, 1}, + {'\0', 0, 2772, {0}, 0},{';', 0, 2773, {60}, 1},{'\0', 0, 2774, {0}, 0}, + {'c', 2781, 2775, {0}, 0},{'m', 2789, 2776, {0}, 0},{'n', 2797, 2777, {0}, 0}, + {'p', 2801, 2778, {0}, 0},{'r', 2817, 2779, {0}, 0},{'\0', 0, 2780, {0}, 0}, + {'u', 2783, 2781, {0}, 0},{'\0', 0, 2782, {0}, 0},{'t', 2785, 2783, {0}, 0}, + {'\0', 0, 2784, {0}, 0},{'e', 2787, 2785, {0}, 0},{'\0', 0, 2786, {0}, 0}, + {';', 0, 2787, {313}, 1},{'\0', 0, 2788, {0}, 0},{'b', 2791, 2789, {0}, 0}, + {'\0', 0, 2790, {0}, 0},{'d', 2793, 2791, {0}, 0},{'\0', 0, 2792, {0}, 0}, + {'a', 2795, 2793, {0}, 0},{'\0', 0, 2794, {0}, 0},{';', 0, 2795, {923}, 1}, + {'\0', 0, 2796, {0}, 0},{'g', 2799, 2797, {0}, 0},{'\0', 0, 2798, {0}, 0}, + {';', 0, 2799, {10218}, 1},{'\0', 0, 2800, {0}, 0},{'l', 2803, 2801, {0}, 0}, + {'\0', 0, 2802, {0}, 0},{'a', 2805, 2803, {0}, 0},{'\0', 0, 2804, {0}, 0}, + {'c', 2807, 2805, {0}, 0},{'\0', 0, 2806, {0}, 0},{'e', 2809, 2807, {0}, 0}, + {'\0', 0, 2808, {0}, 0},{'t', 2811, 2809, {0}, 0},{'\0', 0, 2810, {0}, 0}, + {'r', 2813, 2811, {0}, 0},{'\0', 0, 2812, {0}, 0},{'f', 2815, 2813, {0}, 0}, + {'\0', 0, 2814, {0}, 0},{';', 0, 2815, {8466}, 1},{'\0', 0, 2816, {0}, 0}, + {'r', 2819, 2817, {0}, 0},{'\0', 0, 2818, {0}, 0},{';', 0, 2819, {8606}, 1}, + {'\0', 0, 2820, {0}, 0},{'a', 2825, 2821, {0}, 0},{'e', 2833, 2822, {0}, 0}, + {'y', 2841, 2823, {0}, 0},{'\0', 0, 2824, {0}, 0},{'r', 2827, 2825, {0}, 0}, + {'\0', 0, 2826, {0}, 0},{'o', 2829, 2827, {0}, 0},{'\0', 0, 2828, {0}, 0}, + {'n', 2831, 2829, {0}, 0},{'\0', 0, 2830, {0}, 0},{';', 0, 2831, {317}, 1}, + {'\0', 0, 2832, {0}, 0},{'d', 2835, 2833, {0}, 0},{'\0', 0, 2834, {0}, 0}, + {'i', 2837, 2835, {0}, 0},{'\0', 0, 2836, {0}, 0},{'l', 2839, 2837, {0}, 0}, + {'\0', 0, 2838, {0}, 0},{';', 0, 2839, {315}, 1},{'\0', 0, 2840, {0}, 0}, + {';', 0, 2841, {1051}, 1},{'\0', 0, 2842, {0}, 0},{'f', 2846, 2843, {0}, 0}, + {'s', 3221, 2844, {0}, 0},{'\0', 0, 2845, {0}, 0},{'t', 2848, 2846, {0}, 0}, + {'\0', 0, 2847, {0}, 0},{'A', 2859, 2848, {0}, 0},{'C', 2920, 2849, {0}, 0}, + {'D', 2934, 2850, {0}, 0},{'F', 3003, 2851, {0}, 0},{'R', 3013, 2852, {0}, 0}, + {'T', 3046, 2853, {0}, 0},{'U', 3109, 2854, {0}, 0},{'V', 3172, 2855, {0}, 0}, + {'a', 3191, 2856, {0}, 0},{'r', 3201, 2857, {0}, 0},{'\0', 0, 2858, {0}, 0}, + {'n', 2862, 2859, {0}, 0},{'r', 2884, 2860, {0}, 0},{'\0', 0, 2861, {0}, 0}, + {'g', 2864, 2862, {0}, 0},{'\0', 0, 2863, {0}, 0},{'l', 2866, 2864, {0}, 0}, + {'\0', 0, 2865, {0}, 0},{'e', 2868, 2866, {0}, 0},{'\0', 0, 2867, {0}, 0}, + {'B', 2870, 2868, {0}, 0},{'\0', 0, 2869, {0}, 0},{'r', 2872, 2870, {0}, 0}, + {'\0', 0, 2871, {0}, 0},{'a', 2874, 2872, {0}, 0},{'\0', 0, 2873, {0}, 0}, + {'c', 2876, 2874, {0}, 0},{'\0', 0, 2875, {0}, 0},{'k', 2878, 2876, {0}, 0}, + {'\0', 0, 2877, {0}, 0},{'e', 2880, 2878, {0}, 0},{'\0', 0, 2879, {0}, 0}, + {'t', 2882, 2880, {0}, 0},{'\0', 0, 2881, {0}, 0},{';', 0, 2882, {10216}, 1}, + {'\0', 0, 2883, {0}, 0},{'r', 2886, 2884, {0}, 0},{'\0', 0, 2885, {0}, 0}, + {'o', 2888, 2886, {0}, 0},{'\0', 0, 2887, {0}, 0},{'w', 2890, 2888, {0}, 0}, + {'\0', 0, 2889, {0}, 0},{';', 0, 2890, {8592}, 1},{'B', 2894, 2891, {0}, 0}, + {'R', 2900, 2892, {0}, 0},{'\0', 0, 2893, {0}, 0},{'a', 2896, 2894, {0}, 0}, + {'\0', 0, 2895, {0}, 0},{'r', 2898, 2896, {0}, 0},{'\0', 0, 2897, {0}, 0}, + {';', 0, 2898, {8676}, 1},{'\0', 0, 2899, {0}, 0},{'i', 2902, 2900, {0}, 0}, + {'\0', 0, 2901, {0}, 0},{'g', 2904, 2902, {0}, 0},{'\0', 0, 2903, {0}, 0}, + {'h', 2906, 2904, {0}, 0},{'\0', 0, 2905, {0}, 0},{'t', 2908, 2906, {0}, 0}, + {'\0', 0, 2907, {0}, 0},{'A', 2910, 2908, {0}, 0},{'\0', 0, 2909, {0}, 0}, + {'r', 2912, 2910, {0}, 0},{'\0', 0, 2911, {0}, 0},{'r', 2914, 2912, {0}, 0}, + {'\0', 0, 2913, {0}, 0},{'o', 2916, 2914, {0}, 0},{'\0', 0, 2915, {0}, 0}, + {'w', 2918, 2916, {0}, 0},{'\0', 0, 2917, {0}, 0},{';', 0, 2918, {8646}, 1}, + {'\0', 0, 2919, {0}, 0},{'e', 2922, 2920, {0}, 0},{'\0', 0, 2921, {0}, 0}, + {'i', 2924, 2922, {0}, 0},{'\0', 0, 2923, {0}, 0},{'l', 2926, 2924, {0}, 0}, + {'\0', 0, 2925, {0}, 0},{'i', 2928, 2926, {0}, 0},{'\0', 0, 2927, {0}, 0}, + {'n', 2930, 2928, {0}, 0},{'\0', 0, 2929, {0}, 0},{'g', 2932, 2930, {0}, 0}, + {'\0', 0, 2931, {0}, 0},{';', 0, 2932, {8968}, 1},{'\0', 0, 2933, {0}, 0}, + {'o', 2936, 2934, {0}, 0},{'\0', 0, 2935, {0}, 0},{'u', 2939, 2936, {0}, 0}, + {'w', 2961, 2937, {0}, 0},{'\0', 0, 2938, {0}, 0},{'b', 2941, 2939, {0}, 0}, + {'\0', 0, 2940, {0}, 0},{'l', 2943, 2941, {0}, 0},{'\0', 0, 2942, {0}, 0}, + {'e', 2945, 2943, {0}, 0},{'\0', 0, 2944, {0}, 0},{'B', 2947, 2945, {0}, 0}, + {'\0', 0, 2946, {0}, 0},{'r', 2949, 2947, {0}, 0},{'\0', 0, 2948, {0}, 0}, + {'a', 2951, 2949, {0}, 0},{'\0', 0, 2950, {0}, 0},{'c', 2953, 2951, {0}, 0}, + {'\0', 0, 2952, {0}, 0},{'k', 2955, 2953, {0}, 0},{'\0', 0, 2954, {0}, 0}, + {'e', 2957, 2955, {0}, 0},{'\0', 0, 2956, {0}, 0},{'t', 2959, 2957, {0}, 0}, + {'\0', 0, 2958, {0}, 0},{';', 0, 2959, {10214}, 1},{'\0', 0, 2960, {0}, 0}, + {'n', 2963, 2961, {0}, 0},{'\0', 0, 2962, {0}, 0},{'T', 2966, 2963, {0}, 0}, + {'V', 2984, 2964, {0}, 0},{'\0', 0, 2965, {0}, 0},{'e', 2968, 2966, {0}, 0}, + {'\0', 0, 2967, {0}, 0},{'e', 2970, 2968, {0}, 0},{'\0', 0, 2969, {0}, 0}, + {'V', 2972, 2970, {0}, 0},{'\0', 0, 2971, {0}, 0},{'e', 2974, 2972, {0}, 0}, + {'\0', 0, 2973, {0}, 0},{'c', 2976, 2974, {0}, 0},{'\0', 0, 2975, {0}, 0}, + {'t', 2978, 2976, {0}, 0},{'\0', 0, 2977, {0}, 0},{'o', 2980, 2978, {0}, 0}, + {'\0', 0, 2979, {0}, 0},{'r', 2982, 2980, {0}, 0},{'\0', 0, 2981, {0}, 0}, + {';', 0, 2982, {10593}, 1},{'\0', 0, 2983, {0}, 0},{'e', 2986, 2984, {0}, 0}, + {'\0', 0, 2985, {0}, 0},{'c', 2988, 2986, {0}, 0},{'\0', 0, 2987, {0}, 0}, + {'t', 2990, 2988, {0}, 0},{'\0', 0, 2989, {0}, 0},{'o', 2992, 2990, {0}, 0}, + {'\0', 0, 2991, {0}, 0},{'r', 2994, 2992, {0}, 0},{'\0', 0, 2993, {0}, 0}, + {';', 0, 2994, {8643}, 1},{'B', 2997, 2995, {0}, 0},{'\0', 0, 2996, {0}, 0}, + {'a', 2999, 2997, {0}, 0},{'\0', 0, 2998, {0}, 0},{'r', 3001, 2999, {0}, 0}, + {'\0', 0, 3000, {0}, 0},{';', 0, 3001, {10585}, 1},{'\0', 0, 3002, {0}, 0}, + {'l', 3005, 3003, {0}, 0},{'\0', 0, 3004, {0}, 0},{'o', 3007, 3005, {0}, 0}, + {'\0', 0, 3006, {0}, 0},{'o', 3009, 3007, {0}, 0},{'\0', 0, 3008, {0}, 0}, + {'r', 3011, 3009, {0}, 0},{'\0', 0, 3010, {0}, 0},{';', 0, 3011, {8970}, 1}, + {'\0', 0, 3012, {0}, 0},{'i', 3015, 3013, {0}, 0},{'\0', 0, 3014, {0}, 0}, + {'g', 3017, 3015, {0}, 0},{'\0', 0, 3016, {0}, 0},{'h', 3019, 3017, {0}, 0}, + {'\0', 0, 3018, {0}, 0},{'t', 3021, 3019, {0}, 0},{'\0', 0, 3020, {0}, 0}, + {'A', 3024, 3021, {0}, 0},{'V', 3034, 3022, {0}, 0},{'\0', 0, 3023, {0}, 0}, + {'r', 3026, 3024, {0}, 0},{'\0', 0, 3025, {0}, 0},{'r', 3028, 3026, {0}, 0}, + {'\0', 0, 3027, {0}, 0},{'o', 3030, 3028, {0}, 0},{'\0', 0, 3029, {0}, 0}, + {'w', 3032, 3030, {0}, 0},{'\0', 0, 3031, {0}, 0},{';', 0, 3032, {8596}, 1}, + {'\0', 0, 3033, {0}, 0},{'e', 3036, 3034, {0}, 0},{'\0', 0, 3035, {0}, 0}, + {'c', 3038, 3036, {0}, 0},{'\0', 0, 3037, {0}, 0},{'t', 3040, 3038, {0}, 0}, + {'\0', 0, 3039, {0}, 0},{'o', 3042, 3040, {0}, 0},{'\0', 0, 3041, {0}, 0}, + {'r', 3044, 3042, {0}, 0},{'\0', 0, 3043, {0}, 0},{';', 0, 3044, {10574}, 1}, + {'\0', 0, 3045, {0}, 0},{'e', 3049, 3046, {0}, 0},{'r', 3077, 3047, {0}, 0}, + {'\0', 0, 3048, {0}, 0},{'e', 3051, 3049, {0}, 0},{'\0', 0, 3050, {0}, 0}, + {';', 0, 3051, {8867}, 1},{'A', 3055, 3052, {0}, 0},{'V', 3065, 3053, {0}, 0}, + {'\0', 0, 3054, {0}, 0},{'r', 3057, 3055, {0}, 0},{'\0', 0, 3056, {0}, 0}, + {'r', 3059, 3057, {0}, 0},{'\0', 0, 3058, {0}, 0},{'o', 3061, 3059, {0}, 0}, + {'\0', 0, 3060, {0}, 0},{'w', 3063, 3061, {0}, 0},{'\0', 0, 3062, {0}, 0}, + {';', 0, 3063, {8612}, 1},{'\0', 0, 3064, {0}, 0},{'e', 3067, 3065, {0}, 0}, + {'\0', 0, 3066, {0}, 0},{'c', 3069, 3067, {0}, 0},{'\0', 0, 3068, {0}, 0}, + {'t', 3071, 3069, {0}, 0},{'\0', 0, 3070, {0}, 0},{'o', 3073, 3071, {0}, 0}, + {'\0', 0, 3072, {0}, 0},{'r', 3075, 3073, {0}, 0},{'\0', 0, 3074, {0}, 0}, + {';', 0, 3075, {10586}, 1},{'\0', 0, 3076, {0}, 0},{'i', 3079, 3077, {0}, 0}, + {'\0', 0, 3078, {0}, 0},{'a', 3081, 3079, {0}, 0},{'\0', 0, 3080, {0}, 0}, + {'n', 3083, 3081, {0}, 0},{'\0', 0, 3082, {0}, 0},{'g', 3085, 3083, {0}, 0}, + {'\0', 0, 3084, {0}, 0},{'l', 3087, 3085, {0}, 0},{'\0', 0, 3086, {0}, 0}, + {'e', 3089, 3087, {0}, 0},{'\0', 0, 3088, {0}, 0},{';', 0, 3089, {8882}, 1}, + {'B', 3093, 3090, {0}, 0},{'E', 3099, 3091, {0}, 0},{'\0', 0, 3092, {0}, 0}, + {'a', 3095, 3093, {0}, 0},{'\0', 0, 3094, {0}, 0},{'r', 3097, 3095, {0}, 0}, + {'\0', 0, 3096, {0}, 0},{';', 0, 3097, {10703}, 1},{'\0', 0, 3098, {0}, 0}, + {'q', 3101, 3099, {0}, 0},{'\0', 0, 3100, {0}, 0},{'u', 3103, 3101, {0}, 0}, + {'\0', 0, 3102, {0}, 0},{'a', 3105, 3103, {0}, 0},{'\0', 0, 3104, {0}, 0}, + {'l', 3107, 3105, {0}, 0},{'\0', 0, 3106, {0}, 0},{';', 0, 3107, {8884}, 1}, + {'\0', 0, 3108, {0}, 0},{'p', 3111, 3109, {0}, 0},{'\0', 0, 3110, {0}, 0}, + {'D', 3115, 3111, {0}, 0},{'T', 3135, 3112, {0}, 0},{'V', 3153, 3113, {0}, 0}, + {'\0', 0, 3114, {0}, 0},{'o', 3117, 3115, {0}, 0},{'\0', 0, 3116, {0}, 0}, + {'w', 3119, 3117, {0}, 0},{'\0', 0, 3118, {0}, 0},{'n', 3121, 3119, {0}, 0}, + {'\0', 0, 3120, {0}, 0},{'V', 3123, 3121, {0}, 0},{'\0', 0, 3122, {0}, 0}, + {'e', 3125, 3123, {0}, 0},{'\0', 0, 3124, {0}, 0},{'c', 3127, 3125, {0}, 0}, + {'\0', 0, 3126, {0}, 0},{'t', 3129, 3127, {0}, 0},{'\0', 0, 3128, {0}, 0}, + {'o', 3131, 3129, {0}, 0},{'\0', 0, 3130, {0}, 0},{'r', 3133, 3131, {0}, 0}, + {'\0', 0, 3132, {0}, 0},{';', 0, 3133, {10577}, 1},{'\0', 0, 3134, {0}, 0}, + {'e', 3137, 3135, {0}, 0},{'\0', 0, 3136, {0}, 0},{'e', 3139, 3137, {0}, 0}, + {'\0', 0, 3138, {0}, 0},{'V', 3141, 3139, {0}, 0},{'\0', 0, 3140, {0}, 0}, + {'e', 3143, 3141, {0}, 0},{'\0', 0, 3142, {0}, 0},{'c', 3145, 3143, {0}, 0}, + {'\0', 0, 3144, {0}, 0},{'t', 3147, 3145, {0}, 0},{'\0', 0, 3146, {0}, 0}, + {'o', 3149, 3147, {0}, 0},{'\0', 0, 3148, {0}, 0},{'r', 3151, 3149, {0}, 0}, + {'\0', 0, 3150, {0}, 0},{';', 0, 3151, {10592}, 1},{'\0', 0, 3152, {0}, 0}, + {'e', 3155, 3153, {0}, 0},{'\0', 0, 3154, {0}, 0},{'c', 3157, 3155, {0}, 0}, + {'\0', 0, 3156, {0}, 0},{'t', 3159, 3157, {0}, 0},{'\0', 0, 3158, {0}, 0}, + {'o', 3161, 3159, {0}, 0},{'\0', 0, 3160, {0}, 0},{'r', 3163, 3161, {0}, 0}, + {'\0', 0, 3162, {0}, 0},{';', 0, 3163, {8639}, 1},{'B', 3166, 3164, {0}, 0}, + {'\0', 0, 3165, {0}, 0},{'a', 3168, 3166, {0}, 0},{'\0', 0, 3167, {0}, 0}, + {'r', 3170, 3168, {0}, 0},{'\0', 0, 3169, {0}, 0},{';', 0, 3170, {10584}, 1}, + {'\0', 0, 3171, {0}, 0},{'e', 3174, 3172, {0}, 0},{'\0', 0, 3173, {0}, 0}, + {'c', 3176, 3174, {0}, 0},{'\0', 0, 3175, {0}, 0},{'t', 3178, 3176, {0}, 0}, + {'\0', 0, 3177, {0}, 0},{'o', 3180, 3178, {0}, 0},{'\0', 0, 3179, {0}, 0}, + {'r', 3182, 3180, {0}, 0},{'\0', 0, 3181, {0}, 0},{';', 0, 3182, {8636}, 1}, + {'B', 3185, 3183, {0}, 0},{'\0', 0, 3184, {0}, 0},{'a', 3187, 3185, {0}, 0}, + {'\0', 0, 3186, {0}, 0},{'r', 3189, 3187, {0}, 0},{'\0', 0, 3188, {0}, 0}, + {';', 0, 3189, {10578}, 1},{'\0', 0, 3190, {0}, 0},{'r', 3193, 3191, {0}, 0}, + {'\0', 0, 3192, {0}, 0},{'r', 3195, 3193, {0}, 0},{'\0', 0, 3194, {0}, 0}, + {'o', 3197, 3195, {0}, 0},{'\0', 0, 3196, {0}, 0},{'w', 3199, 3197, {0}, 0}, + {'\0', 0, 3198, {0}, 0},{';', 0, 3199, {8656}, 1},{'\0', 0, 3200, {0}, 0}, + {'i', 3203, 3201, {0}, 0},{'\0', 0, 3202, {0}, 0},{'g', 3205, 3203, {0}, 0}, + {'\0', 0, 3204, {0}, 0},{'h', 3207, 3205, {0}, 0},{'\0', 0, 3206, {0}, 0}, + {'t', 3209, 3207, {0}, 0},{'\0', 0, 3208, {0}, 0},{'a', 3211, 3209, {0}, 0}, + {'\0', 0, 3210, {0}, 0},{'r', 3213, 3211, {0}, 0},{'\0', 0, 3212, {0}, 0}, + {'r', 3215, 3213, {0}, 0},{'\0', 0, 3214, {0}, 0},{'o', 3217, 3215, {0}, 0}, + {'\0', 0, 3216, {0}, 0},{'w', 3219, 3217, {0}, 0},{'\0', 0, 3218, {0}, 0}, + {';', 0, 3219, {8660}, 1},{'\0', 0, 3220, {0}, 0},{'s', 3223, 3221, {0}, 0}, + {'\0', 0, 3222, {0}, 0},{'E', 3230, 3223, {0}, 0},{'F', 3254, 3224, {0}, 0}, + {'G', 3272, 3225, {0}, 0},{'L', 3286, 3226, {0}, 0},{'S', 3294, 3227, {0}, 0}, + {'T', 3314, 3228, {0}, 0},{'\0', 0, 3229, {0}, 0},{'q', 3232, 3230, {0}, 0}, + {'\0', 0, 3231, {0}, 0},{'u', 3234, 3232, {0}, 0},{'\0', 0, 3233, {0}, 0}, + {'a', 3236, 3234, {0}, 0},{'\0', 0, 3235, {0}, 0},{'l', 3238, 3236, {0}, 0}, + {'\0', 0, 3237, {0}, 0},{'G', 3240, 3238, {0}, 0},{'\0', 0, 3239, {0}, 0}, + {'r', 3242, 3240, {0}, 0},{'\0', 0, 3241, {0}, 0},{'e', 3244, 3242, {0}, 0}, + {'\0', 0, 3243, {0}, 0},{'a', 3246, 3244, {0}, 0},{'\0', 0, 3245, {0}, 0}, + {'t', 3248, 3246, {0}, 0},{'\0', 0, 3247, {0}, 0},{'e', 3250, 3248, {0}, 0}, + {'\0', 0, 3249, {0}, 0},{'r', 3252, 3250, {0}, 0},{'\0', 0, 3251, {0}, 0}, + {';', 0, 3252, {8922}, 1},{'\0', 0, 3253, {0}, 0},{'u', 3256, 3254, {0}, 0}, + {'\0', 0, 3255, {0}, 0},{'l', 3258, 3256, {0}, 0},{'\0', 0, 3257, {0}, 0}, + {'l', 3260, 3258, {0}, 0},{'\0', 0, 3259, {0}, 0},{'E', 3262, 3260, {0}, 0}, + {'\0', 0, 3261, {0}, 0},{'q', 3264, 3262, {0}, 0},{'\0', 0, 3263, {0}, 0}, + {'u', 3266, 3264, {0}, 0},{'\0', 0, 3265, {0}, 0},{'a', 3268, 3266, {0}, 0}, + {'\0', 0, 3267, {0}, 0},{'l', 3270, 3268, {0}, 0},{'\0', 0, 3269, {0}, 0}, + {';', 0, 3270, {8806}, 1},{'\0', 0, 3271, {0}, 0},{'r', 3274, 3272, {0}, 0}, + {'\0', 0, 3273, {0}, 0},{'e', 3276, 3274, {0}, 0},{'\0', 0, 3275, {0}, 0}, + {'a', 3278, 3276, {0}, 0},{'\0', 0, 3277, {0}, 0},{'t', 3280, 3278, {0}, 0}, + {'\0', 0, 3279, {0}, 0},{'e', 3282, 3280, {0}, 0},{'\0', 0, 3281, {0}, 0}, + {'r', 3284, 3282, {0}, 0},{'\0', 0, 3283, {0}, 0},{';', 0, 3284, {8822}, 1}, + {'\0', 0, 3285, {0}, 0},{'e', 3288, 3286, {0}, 0},{'\0', 0, 3287, {0}, 0}, + {'s', 3290, 3288, {0}, 0},{'\0', 0, 3289, {0}, 0},{'s', 3292, 3290, {0}, 0}, + {'\0', 0, 3291, {0}, 0},{';', 0, 3292, {10913}, 1},{'\0', 0, 3293, {0}, 0}, + {'l', 3296, 3294, {0}, 0},{'\0', 0, 3295, {0}, 0},{'a', 3298, 3296, {0}, 0}, + {'\0', 0, 3297, {0}, 0},{'n', 3300, 3298, {0}, 0},{'\0', 0, 3299, {0}, 0}, + {'t', 3302, 3300, {0}, 0},{'\0', 0, 3301, {0}, 0},{'E', 3304, 3302, {0}, 0}, + {'\0', 0, 3303, {0}, 0},{'q', 3306, 3304, {0}, 0},{'\0', 0, 3305, {0}, 0}, + {'u', 3308, 3306, {0}, 0},{'\0', 0, 3307, {0}, 0},{'a', 3310, 3308, {0}, 0}, + {'\0', 0, 3309, {0}, 0},{'l', 3312, 3310, {0}, 0},{'\0', 0, 3311, {0}, 0}, + {';', 0, 3312, {10877}, 1},{'\0', 0, 3313, {0}, 0},{'i', 3316, 3314, {0}, 0}, + {'\0', 0, 3315, {0}, 0},{'l', 3318, 3316, {0}, 0},{'\0', 0, 3317, {0}, 0}, + {'d', 3320, 3318, {0}, 0},{'\0', 0, 3319, {0}, 0},{'e', 3322, 3320, {0}, 0}, + {'\0', 0, 3321, {0}, 0},{';', 0, 3322, {8818}, 1},{'\0', 0, 3323, {0}, 0}, + {'r', 3326, 3324, {0}, 0},{'\0', 0, 3325, {0}, 0},{';', 0, 3326, {120079}, 1}, + {'\0', 0, 3327, {0}, 0},{';', 0, 3328, {8920}, 1},{'e', 3331, 3329, {0}, 0}, + {'\0', 0, 3330, {0}, 0},{'f', 3333, 3331, {0}, 0},{'\0', 0, 3332, {0}, 0}, + {'t', 3335, 3333, {0}, 0},{'\0', 0, 3334, {0}, 0},{'a', 3337, 3335, {0}, 0}, + {'\0', 0, 3336, {0}, 0},{'r', 3339, 3337, {0}, 0},{'\0', 0, 3338, {0}, 0}, + {'r', 3341, 3339, {0}, 0},{'\0', 0, 3340, {0}, 0},{'o', 3343, 3341, {0}, 0}, + {'\0', 0, 3342, {0}, 0},{'w', 3345, 3343, {0}, 0},{'\0', 0, 3344, {0}, 0}, + {';', 0, 3345, {8666}, 1},{'\0', 0, 3346, {0}, 0},{'i', 3349, 3347, {0}, 0}, + {'\0', 0, 3348, {0}, 0},{'d', 3351, 3349, {0}, 0},{'\0', 0, 3350, {0}, 0}, + {'o', 3353, 3351, {0}, 0},{'\0', 0, 3352, {0}, 0},{'t', 3355, 3353, {0}, 0}, + {'\0', 0, 3354, {0}, 0},{';', 0, 3355, {319}, 1},{'\0', 0, 3356, {0}, 0}, + {'n', 3361, 3357, {0}, 0},{'p', 3486, 3358, {0}, 0},{'w', 3490, 3359, {0}, 0}, + {'\0', 0, 3360, {0}, 0},{'g', 3363, 3361, {0}, 0},{'\0', 0, 3362, {0}, 0}, + {'L', 3368, 3363, {0}, 0},{'R', 3407, 3364, {0}, 0},{'l', 3427, 3365, {0}, 0}, + {'r', 3466, 3366, {0}, 0},{'\0', 0, 3367, {0}, 0},{'e', 3370, 3368, {0}, 0}, + {'\0', 0, 3369, {0}, 0},{'f', 3372, 3370, {0}, 0},{'\0', 0, 3371, {0}, 0}, + {'t', 3374, 3372, {0}, 0},{'\0', 0, 3373, {0}, 0},{'A', 3377, 3374, {0}, 0}, + {'R', 3387, 3375, {0}, 0},{'\0', 0, 3376, {0}, 0},{'r', 3379, 3377, {0}, 0}, + {'\0', 0, 3378, {0}, 0},{'r', 3381, 3379, {0}, 0},{'\0', 0, 3380, {0}, 0}, + {'o', 3383, 3381, {0}, 0},{'\0', 0, 3382, {0}, 0},{'w', 3385, 3383, {0}, 0}, + {'\0', 0, 3384, {0}, 0},{';', 0, 3385, {10229}, 1},{'\0', 0, 3386, {0}, 0}, + {'i', 3389, 3387, {0}, 0},{'\0', 0, 3388, {0}, 0},{'g', 3391, 3389, {0}, 0}, + {'\0', 0, 3390, {0}, 0},{'h', 3393, 3391, {0}, 0},{'\0', 0, 3392, {0}, 0}, + {'t', 3395, 3393, {0}, 0},{'\0', 0, 3394, {0}, 0},{'A', 3397, 3395, {0}, 0}, + {'\0', 0, 3396, {0}, 0},{'r', 3399, 3397, {0}, 0},{'\0', 0, 3398, {0}, 0}, + {'r', 3401, 3399, {0}, 0},{'\0', 0, 3400, {0}, 0},{'o', 3403, 3401, {0}, 0}, + {'\0', 0, 3402, {0}, 0},{'w', 3405, 3403, {0}, 0},{'\0', 0, 3404, {0}, 0}, + {';', 0, 3405, {10231}, 1},{'\0', 0, 3406, {0}, 0},{'i', 3409, 3407, {0}, 0}, + {'\0', 0, 3408, {0}, 0},{'g', 3411, 3409, {0}, 0},{'\0', 0, 3410, {0}, 0}, + {'h', 3413, 3411, {0}, 0},{'\0', 0, 3412, {0}, 0},{'t', 3415, 3413, {0}, 0}, + {'\0', 0, 3414, {0}, 0},{'A', 3417, 3415, {0}, 0},{'\0', 0, 3416, {0}, 0}, + {'r', 3419, 3417, {0}, 0},{'\0', 0, 3418, {0}, 0},{'r', 3421, 3419, {0}, 0}, + {'\0', 0, 3420, {0}, 0},{'o', 3423, 3421, {0}, 0},{'\0', 0, 3422, {0}, 0}, + {'w', 3425, 3423, {0}, 0},{'\0', 0, 3424, {0}, 0},{';', 0, 3425, {10230}, 1}, + {'\0', 0, 3426, {0}, 0},{'e', 3429, 3427, {0}, 0},{'\0', 0, 3428, {0}, 0}, + {'f', 3431, 3429, {0}, 0},{'\0', 0, 3430, {0}, 0},{'t', 3433, 3431, {0}, 0}, + {'\0', 0, 3432, {0}, 0},{'a', 3436, 3433, {0}, 0},{'r', 3446, 3434, {0}, 0}, + {'\0', 0, 3435, {0}, 0},{'r', 3438, 3436, {0}, 0},{'\0', 0, 3437, {0}, 0}, + {'r', 3440, 3438, {0}, 0},{'\0', 0, 3439, {0}, 0},{'o', 3442, 3440, {0}, 0}, + {'\0', 0, 3441, {0}, 0},{'w', 3444, 3442, {0}, 0},{'\0', 0, 3443, {0}, 0}, + {';', 0, 3444, {10232}, 1},{'\0', 0, 3445, {0}, 0},{'i', 3448, 3446, {0}, 0}, + {'\0', 0, 3447, {0}, 0},{'g', 3450, 3448, {0}, 0},{'\0', 0, 3449, {0}, 0}, + {'h', 3452, 3450, {0}, 0},{'\0', 0, 3451, {0}, 0},{'t', 3454, 3452, {0}, 0}, + {'\0', 0, 3453, {0}, 0},{'a', 3456, 3454, {0}, 0},{'\0', 0, 3455, {0}, 0}, + {'r', 3458, 3456, {0}, 0},{'\0', 0, 3457, {0}, 0},{'r', 3460, 3458, {0}, 0}, + {'\0', 0, 3459, {0}, 0},{'o', 3462, 3460, {0}, 0},{'\0', 0, 3461, {0}, 0}, + {'w', 3464, 3462, {0}, 0},{'\0', 0, 3463, {0}, 0},{';', 0, 3464, {10234}, 1}, + {'\0', 0, 3465, {0}, 0},{'i', 3468, 3466, {0}, 0},{'\0', 0, 3467, {0}, 0}, + {'g', 3470, 3468, {0}, 0},{'\0', 0, 3469, {0}, 0},{'h', 3472, 3470, {0}, 0}, + {'\0', 0, 3471, {0}, 0},{'t', 3474, 3472, {0}, 0},{'\0', 0, 3473, {0}, 0}, + {'a', 3476, 3474, {0}, 0},{'\0', 0, 3475, {0}, 0},{'r', 3478, 3476, {0}, 0}, + {'\0', 0, 3477, {0}, 0},{'r', 3480, 3478, {0}, 0},{'\0', 0, 3479, {0}, 0}, + {'o', 3482, 3480, {0}, 0},{'\0', 0, 3481, {0}, 0},{'w', 3484, 3482, {0}, 0}, + {'\0', 0, 3483, {0}, 0},{';', 0, 3484, {10233}, 1},{'\0', 0, 3485, {0}, 0}, + {'f', 3488, 3486, {0}, 0},{'\0', 0, 3487, {0}, 0},{';', 0, 3488, {120131}, 1}, + {'\0', 0, 3489, {0}, 0},{'e', 3492, 3490, {0}, 0},{'\0', 0, 3491, {0}, 0}, + {'r', 3494, 3492, {0}, 0},{'\0', 0, 3493, {0}, 0},{'L', 3497, 3494, {0}, 0}, + {'R', 3515, 3495, {0}, 0},{'\0', 0, 3496, {0}, 0},{'e', 3499, 3497, {0}, 0}, + {'\0', 0, 3498, {0}, 0},{'f', 3501, 3499, {0}, 0},{'\0', 0, 3500, {0}, 0}, + {'t', 3503, 3501, {0}, 0},{'\0', 0, 3502, {0}, 0},{'A', 3505, 3503, {0}, 0}, + {'\0', 0, 3504, {0}, 0},{'r', 3507, 3505, {0}, 0},{'\0', 0, 3506, {0}, 0}, + {'r', 3509, 3507, {0}, 0},{'\0', 0, 3508, {0}, 0},{'o', 3511, 3509, {0}, 0}, + {'\0', 0, 3510, {0}, 0},{'w', 3513, 3511, {0}, 0},{'\0', 0, 3512, {0}, 0}, + {';', 0, 3513, {8601}, 1},{'\0', 0, 3514, {0}, 0},{'i', 3517, 3515, {0}, 0}, + {'\0', 0, 3516, {0}, 0},{'g', 3519, 3517, {0}, 0},{'\0', 0, 3518, {0}, 0}, + {'h', 3521, 3519, {0}, 0},{'\0', 0, 3520, {0}, 0},{'t', 3523, 3521, {0}, 0}, + {'\0', 0, 3522, {0}, 0},{'A', 3525, 3523, {0}, 0},{'\0', 0, 3524, {0}, 0}, + {'r', 3527, 3525, {0}, 0},{'\0', 0, 3526, {0}, 0},{'r', 3529, 3527, {0}, 0}, + {'\0', 0, 3528, {0}, 0},{'o', 3531, 3529, {0}, 0},{'\0', 0, 3530, {0}, 0}, + {'w', 3533, 3531, {0}, 0},{'\0', 0, 3532, {0}, 0},{';', 0, 3533, {8600}, 1}, + {'\0', 0, 3534, {0}, 0},{'c', 3539, 3535, {0}, 0},{'h', 3543, 3536, {0}, 0}, + {'t', 3545, 3537, {0}, 0},{'\0', 0, 3538, {0}, 0},{'r', 3541, 3539, {0}, 0}, + {'\0', 0, 3540, {0}, 0},{';', 0, 3541, {8466}, 1},{'\0', 0, 3542, {0}, 0}, + {';', 0, 3543, {8624}, 1},{'\0', 0, 3544, {0}, 0},{'r', 3547, 3545, {0}, 0}, + {'\0', 0, 3546, {0}, 0},{'o', 3549, 3547, {0}, 0},{'\0', 0, 3548, {0}, 0}, + {'k', 3551, 3549, {0}, 0},{'\0', 0, 3550, {0}, 0},{';', 0, 3551, {321}, 1}, + {'\0', 0, 3552, {0}, 0},{';', 0, 3553, {8810}, 1},{'\0', 0, 3554, {0}, 0}, + {'a', 3564, 3555, {0}, 0},{'c', 3568, 3556, {0}, 0},{'e', 3572, 3557, {0}, 0}, + {'f', 3607, 3558, {0}, 0},{'i', 3611, 3559, {0}, 0},{'o', 3627, 3560, {0}, 0}, + {'s', 3633, 3561, {0}, 0},{'u', 3639, 3562, {0}, 0},{'\0', 0, 3563, {0}, 0}, + {'p', 3566, 3564, {0}, 0},{'\0', 0, 3565, {0}, 0},{';', 0, 3566, {10501}, 1}, + {'\0', 0, 3567, {0}, 0},{'y', 3570, 3568, {0}, 0},{'\0', 0, 3569, {0}, 0}, + {';', 0, 3570, {1052}, 1},{'\0', 0, 3571, {0}, 0},{'d', 3575, 3572, {0}, 0}, + {'l', 3593, 3573, {0}, 0},{'\0', 0, 3574, {0}, 0},{'i', 3577, 3575, {0}, 0}, + {'\0', 0, 3576, {0}, 0},{'u', 3579, 3577, {0}, 0},{'\0', 0, 3578, {0}, 0}, + {'m', 3581, 3579, {0}, 0},{'\0', 0, 3580, {0}, 0},{'S', 3583, 3581, {0}, 0}, + {'\0', 0, 3582, {0}, 0},{'p', 3585, 3583, {0}, 0},{'\0', 0, 3584, {0}, 0}, + {'a', 3587, 3585, {0}, 0},{'\0', 0, 3586, {0}, 0},{'c', 3589, 3587, {0}, 0}, + {'\0', 0, 3588, {0}, 0},{'e', 3591, 3589, {0}, 0},{'\0', 0, 3590, {0}, 0}, + {';', 0, 3591, {8287}, 1},{'\0', 0, 3592, {0}, 0},{'l', 3595, 3593, {0}, 0}, + {'\0', 0, 3594, {0}, 0},{'i', 3597, 3595, {0}, 0},{'\0', 0, 3596, {0}, 0}, + {'n', 3599, 3597, {0}, 0},{'\0', 0, 3598, {0}, 0},{'t', 3601, 3599, {0}, 0}, + {'\0', 0, 3600, {0}, 0},{'r', 3603, 3601, {0}, 0},{'\0', 0, 3602, {0}, 0}, + {'f', 3605, 3603, {0}, 0},{'\0', 0, 3604, {0}, 0},{';', 0, 3605, {8499}, 1}, + {'\0', 0, 3606, {0}, 0},{'r', 3609, 3607, {0}, 0},{'\0', 0, 3608, {0}, 0}, + {';', 0, 3609, {120080}, 1},{'\0', 0, 3610, {0}, 0},{'n', 3613, 3611, {0}, 0}, + {'\0', 0, 3612, {0}, 0},{'u', 3615, 3613, {0}, 0},{'\0', 0, 3614, {0}, 0}, + {'s', 3617, 3615, {0}, 0},{'\0', 0, 3616, {0}, 0},{'P', 3619, 3617, {0}, 0}, + {'\0', 0, 3618, {0}, 0},{'l', 3621, 3619, {0}, 0},{'\0', 0, 3620, {0}, 0}, + {'u', 3623, 3621, {0}, 0},{'\0', 0, 3622, {0}, 0},{'s', 3625, 3623, {0}, 0}, + {'\0', 0, 3624, {0}, 0},{';', 0, 3625, {8723}, 1},{'\0', 0, 3626, {0}, 0}, + {'p', 3629, 3627, {0}, 0},{'\0', 0, 3628, {0}, 0},{'f', 3631, 3629, {0}, 0}, + {'\0', 0, 3630, {0}, 0},{';', 0, 3631, {120132}, 1},{'\0', 0, 3632, {0}, 0}, + {'c', 3635, 3633, {0}, 0},{'\0', 0, 3634, {0}, 0},{'r', 3637, 3635, {0}, 0}, + {'\0', 0, 3636, {0}, 0},{';', 0, 3637, {8499}, 1},{'\0', 0, 3638, {0}, 0}, + {';', 0, 3639, {924}, 1},{'\0', 0, 3640, {0}, 0},{'J', 3651, 3641, {0}, 0}, + {'a', 3657, 3642, {0}, 0},{'c', 3667, 3643, {0}, 0},{'e', 3689, 3644, {0}, 0}, + {'f', 3851, 3645, {0}, 0},{'o', 3855, 3646, {0}, 0},{'s', 4683, 3647, {0}, 0}, + {'t', 4689, 3648, {0}, 0},{'u', 4699, 3649, {0}, 0},{'\0', 0, 3650, {0}, 0}, + {'c', 3653, 3651, {0}, 0},{'\0', 0, 3652, {0}, 0},{'y', 3655, 3653, {0}, 0}, + {'\0', 0, 3654, {0}, 0},{';', 0, 3655, {1034}, 1},{'\0', 0, 3656, {0}, 0}, + {'c', 3659, 3657, {0}, 0},{'\0', 0, 3658, {0}, 0},{'u', 3661, 3659, {0}, 0}, + {'\0', 0, 3660, {0}, 0},{'t', 3663, 3661, {0}, 0},{'\0', 0, 3662, {0}, 0}, + {'e', 3665, 3663, {0}, 0},{'\0', 0, 3664, {0}, 0},{';', 0, 3665, {323}, 1}, + {'\0', 0, 3666, {0}, 0},{'a', 3671, 3667, {0}, 0},{'e', 3679, 3668, {0}, 0}, + {'y', 3687, 3669, {0}, 0},{'\0', 0, 3670, {0}, 0},{'r', 3673, 3671, {0}, 0}, + {'\0', 0, 3672, {0}, 0},{'o', 3675, 3673, {0}, 0},{'\0', 0, 3674, {0}, 0}, + {'n', 3677, 3675, {0}, 0},{'\0', 0, 3676, {0}, 0},{';', 0, 3677, {327}, 1}, + {'\0', 0, 3678, {0}, 0},{'d', 3681, 3679, {0}, 0},{'\0', 0, 3680, {0}, 0}, + {'i', 3683, 3681, {0}, 0},{'\0', 0, 3682, {0}, 0},{'l', 3685, 3683, {0}, 0}, + {'\0', 0, 3684, {0}, 0},{';', 0, 3685, {325}, 1},{'\0', 0, 3686, {0}, 0}, + {';', 0, 3687, {1053}, 1},{'\0', 0, 3688, {0}, 0},{'g', 3693, 3689, {0}, 0}, + {'s', 3788, 3690, {0}, 0},{'w', 3841, 3691, {0}, 0},{'\0', 0, 3692, {0}, 0}, + {'a', 3695, 3693, {0}, 0},{'\0', 0, 3694, {0}, 0},{'t', 3697, 3695, {0}, 0}, + {'\0', 0, 3696, {0}, 0},{'i', 3699, 3697, {0}, 0},{'\0', 0, 3698, {0}, 0}, + {'v', 3701, 3699, {0}, 0},{'\0', 0, 3700, {0}, 0},{'e', 3703, 3701, {0}, 0}, + {'\0', 0, 3702, {0}, 0},{'M', 3707, 3703, {0}, 0},{'T', 3729, 3704, {0}, 0}, + {'V', 3762, 3705, {0}, 0},{'\0', 0, 3706, {0}, 0},{'e', 3709, 3707, {0}, 0}, + {'\0', 0, 3708, {0}, 0},{'d', 3711, 3709, {0}, 0},{'\0', 0, 3710, {0}, 0}, + {'i', 3713, 3711, {0}, 0},{'\0', 0, 3712, {0}, 0},{'u', 3715, 3713, {0}, 0}, + {'\0', 0, 3714, {0}, 0},{'m', 3717, 3715, {0}, 0},{'\0', 0, 3716, {0}, 0}, + {'S', 3719, 3717, {0}, 0},{'\0', 0, 3718, {0}, 0},{'p', 3721, 3719, {0}, 0}, + {'\0', 0, 3720, {0}, 0},{'a', 3723, 3721, {0}, 0},{'\0', 0, 3722, {0}, 0}, + {'c', 3725, 3723, {0}, 0},{'\0', 0, 3724, {0}, 0},{'e', 3727, 3725, {0}, 0}, + {'\0', 0, 3726, {0}, 0},{';', 0, 3727, {8203}, 1},{'\0', 0, 3728, {0}, 0}, + {'h', 3731, 3729, {0}, 0},{'\0', 0, 3730, {0}, 0},{'i', 3733, 3731, {0}, 0}, + {'\0', 0, 3732, {0}, 0},{'c', 3736, 3733, {0}, 0},{'n', 3750, 3734, {0}, 0}, + {'\0', 0, 3735, {0}, 0},{'k', 3738, 3736, {0}, 0},{'\0', 0, 3737, {0}, 0}, + {'S', 3740, 3738, {0}, 0},{'\0', 0, 3739, {0}, 0},{'p', 3742, 3740, {0}, 0}, + {'\0', 0, 3741, {0}, 0},{'a', 3744, 3742, {0}, 0},{'\0', 0, 3743, {0}, 0}, + {'c', 3746, 3744, {0}, 0},{'\0', 0, 3745, {0}, 0},{'e', 3748, 3746, {0}, 0}, + {'\0', 0, 3747, {0}, 0},{';', 0, 3748, {8203}, 1},{'\0', 0, 3749, {0}, 0}, + {'S', 3752, 3750, {0}, 0},{'\0', 0, 3751, {0}, 0},{'p', 3754, 3752, {0}, 0}, + {'\0', 0, 3753, {0}, 0},{'a', 3756, 3754, {0}, 0},{'\0', 0, 3755, {0}, 0}, + {'c', 3758, 3756, {0}, 0},{'\0', 0, 3757, {0}, 0},{'e', 3760, 3758, {0}, 0}, + {'\0', 0, 3759, {0}, 0},{';', 0, 3760, {8203}, 1},{'\0', 0, 3761, {0}, 0}, + {'e', 3764, 3762, {0}, 0},{'\0', 0, 3763, {0}, 0},{'r', 3766, 3764, {0}, 0}, + {'\0', 0, 3765, {0}, 0},{'y', 3768, 3766, {0}, 0},{'\0', 0, 3767, {0}, 0}, + {'T', 3770, 3768, {0}, 0},{'\0', 0, 3769, {0}, 0},{'h', 3772, 3770, {0}, 0}, + {'\0', 0, 3771, {0}, 0},{'i', 3774, 3772, {0}, 0},{'\0', 0, 3773, {0}, 0}, + {'n', 3776, 3774, {0}, 0},{'\0', 0, 3775, {0}, 0},{'S', 3778, 3776, {0}, 0}, + {'\0', 0, 3777, {0}, 0},{'p', 3780, 3778, {0}, 0},{'\0', 0, 3779, {0}, 0}, + {'a', 3782, 3780, {0}, 0},{'\0', 0, 3781, {0}, 0},{'c', 3784, 3782, {0}, 0}, + {'\0', 0, 3783, {0}, 0},{'e', 3786, 3784, {0}, 0},{'\0', 0, 3785, {0}, 0}, + {';', 0, 3786, {8203}, 1},{'\0', 0, 3787, {0}, 0},{'t', 3790, 3788, {0}, 0}, + {'\0', 0, 3789, {0}, 0},{'e', 3792, 3790, {0}, 0},{'\0', 0, 3791, {0}, 0}, + {'d', 3794, 3792, {0}, 0},{'\0', 0, 3793, {0}, 0},{'G', 3797, 3794, {0}, 0}, + {'L', 3825, 3795, {0}, 0},{'\0', 0, 3796, {0}, 0},{'r', 3799, 3797, {0}, 0}, + {'\0', 0, 3798, {0}, 0},{'e', 3801, 3799, {0}, 0},{'\0', 0, 3800, {0}, 0}, + {'a', 3803, 3801, {0}, 0},{'\0', 0, 3802, {0}, 0},{'t', 3805, 3803, {0}, 0}, + {'\0', 0, 3804, {0}, 0},{'e', 3807, 3805, {0}, 0},{'\0', 0, 3806, {0}, 0}, + {'r', 3809, 3807, {0}, 0},{'\0', 0, 3808, {0}, 0},{'G', 3811, 3809, {0}, 0}, + {'\0', 0, 3810, {0}, 0},{'r', 3813, 3811, {0}, 0},{'\0', 0, 3812, {0}, 0}, + {'e', 3815, 3813, {0}, 0},{'\0', 0, 3814, {0}, 0},{'a', 3817, 3815, {0}, 0}, + {'\0', 0, 3816, {0}, 0},{'t', 3819, 3817, {0}, 0},{'\0', 0, 3818, {0}, 0}, + {'e', 3821, 3819, {0}, 0},{'\0', 0, 3820, {0}, 0},{'r', 3823, 3821, {0}, 0}, + {'\0', 0, 3822, {0}, 0},{';', 0, 3823, {8811}, 1},{'\0', 0, 3824, {0}, 0}, + {'e', 3827, 3825, {0}, 0},{'\0', 0, 3826, {0}, 0},{'s', 3829, 3827, {0}, 0}, + {'\0', 0, 3828, {0}, 0},{'s', 3831, 3829, {0}, 0},{'\0', 0, 3830, {0}, 0}, + {'L', 3833, 3831, {0}, 0},{'\0', 0, 3832, {0}, 0},{'e', 3835, 3833, {0}, 0}, + {'\0', 0, 3834, {0}, 0},{'s', 3837, 3835, {0}, 0},{'\0', 0, 3836, {0}, 0}, + {'s', 3839, 3837, {0}, 0},{'\0', 0, 3838, {0}, 0},{';', 0, 3839, {8810}, 1}, + {'\0', 0, 3840, {0}, 0},{'L', 3843, 3841, {0}, 0},{'\0', 0, 3842, {0}, 0}, + {'i', 3845, 3843, {0}, 0},{'\0', 0, 3844, {0}, 0},{'n', 3847, 3845, {0}, 0}, + {'\0', 0, 3846, {0}, 0},{'e', 3849, 3847, {0}, 0},{'\0', 0, 3848, {0}, 0}, + {';', 0, 3849, {10}, 1},{'\0', 0, 3850, {0}, 0},{'r', 3853, 3851, {0}, 0}, + {'\0', 0, 3852, {0}, 0},{';', 0, 3853, {120081}, 1},{'\0', 0, 3854, {0}, 0}, + {'B', 3860, 3855, {0}, 0},{'n', 3870, 3856, {0}, 0},{'p', 3898, 3857, {0}, 0}, + {'t', 3902, 3858, {0}, 0},{'\0', 0, 3859, {0}, 0},{'r', 3862, 3860, {0}, 0}, + {'\0', 0, 3861, {0}, 0},{'e', 3864, 3862, {0}, 0},{'\0', 0, 3863, {0}, 0}, + {'a', 3866, 3864, {0}, 0},{'\0', 0, 3865, {0}, 0},{'k', 3868, 3866, {0}, 0}, + {'\0', 0, 3867, {0}, 0},{';', 0, 3868, {8288}, 1},{'\0', 0, 3869, {0}, 0}, + {'B', 3872, 3870, {0}, 0},{'\0', 0, 3871, {0}, 0},{'r', 3874, 3872, {0}, 0}, + {'\0', 0, 3873, {0}, 0},{'e', 3876, 3874, {0}, 0},{'\0', 0, 3875, {0}, 0}, + {'a', 3878, 3876, {0}, 0},{'\0', 0, 3877, {0}, 0},{'k', 3880, 3878, {0}, 0}, + {'\0', 0, 3879, {0}, 0},{'i', 3882, 3880, {0}, 0},{'\0', 0, 3881, {0}, 0}, + {'n', 3884, 3882, {0}, 0},{'\0', 0, 3883, {0}, 0},{'g', 3886, 3884, {0}, 0}, + {'\0', 0, 3885, {0}, 0},{'S', 3888, 3886, {0}, 0},{'\0', 0, 3887, {0}, 0}, + {'p', 3890, 3888, {0}, 0},{'\0', 0, 3889, {0}, 0},{'a', 3892, 3890, {0}, 0}, + {'\0', 0, 3891, {0}, 0},{'c', 3894, 3892, {0}, 0},{'\0', 0, 3893, {0}, 0}, + {'e', 3896, 3894, {0}, 0},{'\0', 0, 3895, {0}, 0},{';', 0, 3896, {160}, 1}, + {'\0', 0, 3897, {0}, 0},{'f', 3900, 3898, {0}, 0},{'\0', 0, 3899, {0}, 0}, + {';', 0, 3900, {8469}, 1},{'\0', 0, 3901, {0}, 0},{';', 0, 3902, {10988}, 1}, + {'C', 3916, 3903, {0}, 0},{'D', 3945, 3904, {0}, 0},{'E', 3979, 3905, {0}, 0}, + {'G', 4024, 3906, {0}, 0},{'H', 4124, 3907, {0}, 0},{'L', 4159, 3908, {0}, 0}, + {'N', 4273, 3909, {0}, 0},{'P', 4330, 3910, {0}, 0},{'R', 4378, 3911, {0}, 0}, + {'S', 4449, 3912, {0}, 0},{'T', 4610, 3913, {0}, 0},{'V', 4661, 3914, {0}, 0}, + {'\0', 0, 3915, {0}, 0},{'o', 3919, 3916, {0}, 0},{'u', 3935, 3917, {0}, 0}, + {'\0', 0, 3918, {0}, 0},{'n', 3921, 3919, {0}, 0},{'\0', 0, 3920, {0}, 0}, + {'g', 3923, 3921, {0}, 0},{'\0', 0, 3922, {0}, 0},{'r', 3925, 3923, {0}, 0}, + {'\0', 0, 3924, {0}, 0},{'u', 3927, 3925, {0}, 0},{'\0', 0, 3926, {0}, 0}, + {'e', 3929, 3927, {0}, 0},{'\0', 0, 3928, {0}, 0},{'n', 3931, 3929, {0}, 0}, + {'\0', 0, 3930, {0}, 0},{'t', 3933, 3931, {0}, 0},{'\0', 0, 3932, {0}, 0}, + {';', 0, 3933, {8802}, 1},{'\0', 0, 3934, {0}, 0},{'p', 3937, 3935, {0}, 0}, + {'\0', 0, 3936, {0}, 0},{'C', 3939, 3937, {0}, 0},{'\0', 0, 3938, {0}, 0}, + {'a', 3941, 3939, {0}, 0},{'\0', 0, 3940, {0}, 0},{'p', 3943, 3941, {0}, 0}, + {'\0', 0, 3942, {0}, 0},{';', 0, 3943, {8813}, 1},{'\0', 0, 3944, {0}, 0}, + {'o', 3947, 3945, {0}, 0},{'\0', 0, 3946, {0}, 0},{'u', 3949, 3947, {0}, 0}, + {'\0', 0, 3948, {0}, 0},{'b', 3951, 3949, {0}, 0},{'\0', 0, 3950, {0}, 0}, + {'l', 3953, 3951, {0}, 0},{'\0', 0, 3952, {0}, 0},{'e', 3955, 3953, {0}, 0}, + {'\0', 0, 3954, {0}, 0},{'V', 3957, 3955, {0}, 0},{'\0', 0, 3956, {0}, 0}, + {'e', 3959, 3957, {0}, 0},{'\0', 0, 3958, {0}, 0},{'r', 3961, 3959, {0}, 0}, + {'\0', 0, 3960, {0}, 0},{'t', 3963, 3961, {0}, 0},{'\0', 0, 3962, {0}, 0}, + {'i', 3965, 3963, {0}, 0},{'\0', 0, 3964, {0}, 0},{'c', 3967, 3965, {0}, 0}, + {'\0', 0, 3966, {0}, 0},{'a', 3969, 3967, {0}, 0},{'\0', 0, 3968, {0}, 0}, + {'l', 3971, 3969, {0}, 0},{'\0', 0, 3970, {0}, 0},{'B', 3973, 3971, {0}, 0}, + {'\0', 0, 3972, {0}, 0},{'a', 3975, 3973, {0}, 0},{'\0', 0, 3974, {0}, 0}, + {'r', 3977, 3975, {0}, 0},{'\0', 0, 3976, {0}, 0},{';', 0, 3977, {8742}, 1}, + {'\0', 0, 3978, {0}, 0},{'l', 3983, 3979, {0}, 0},{'q', 3995, 3980, {0}, 0}, + {'x', 4014, 3981, {0}, 0},{'\0', 0, 3982, {0}, 0},{'e', 3985, 3983, {0}, 0}, + {'\0', 0, 3984, {0}, 0},{'m', 3987, 3985, {0}, 0},{'\0', 0, 3986, {0}, 0}, + {'e', 3989, 3987, {0}, 0},{'\0', 0, 3988, {0}, 0},{'n', 3991, 3989, {0}, 0}, + {'\0', 0, 3990, {0}, 0},{'t', 3993, 3991, {0}, 0},{'\0', 0, 3992, {0}, 0}, + {';', 0, 3993, {8713}, 1},{'\0', 0, 3994, {0}, 0},{'u', 3997, 3995, {0}, 0}, + {'\0', 0, 3996, {0}, 0},{'a', 3999, 3997, {0}, 0},{'\0', 0, 3998, {0}, 0}, + {'l', 4001, 3999, {0}, 0},{'\0', 0, 4000, {0}, 0},{';', 0, 4001, {8800}, 1}, + {'T', 4004, 4002, {0}, 0},{'\0', 0, 4003, {0}, 0},{'i', 4006, 4004, {0}, 0}, + {'\0', 0, 4005, {0}, 0},{'l', 4008, 4006, {0}, 0},{'\0', 0, 4007, {0}, 0}, + {'d', 4010, 4008, {0}, 0},{'\0', 0, 4009, {0}, 0},{'e', 4012, 4010, {0}, 0}, + {'\0', 0, 4011, {0}, 0},{';', 0, 4012, {8770,824}, 2},{'\0', 0, 4013, {0}, 0}, + {'i', 4016, 4014, {0}, 0},{'\0', 0, 4015, {0}, 0},{'s', 4018, 4016, {0}, 0}, + {'\0', 0, 4017, {0}, 0},{'t', 4020, 4018, {0}, 0},{'\0', 0, 4019, {0}, 0}, + {'s', 4022, 4020, {0}, 0},{'\0', 0, 4021, {0}, 0},{';', 0, 4022, {8708}, 1}, + {'\0', 0, 4023, {0}, 0},{'r', 4026, 4024, {0}, 0},{'\0', 0, 4025, {0}, 0}, + {'e', 4028, 4026, {0}, 0},{'\0', 0, 4027, {0}, 0},{'a', 4030, 4028, {0}, 0}, + {'\0', 0, 4029, {0}, 0},{'t', 4032, 4030, {0}, 0},{'\0', 0, 4031, {0}, 0}, + {'e', 4034, 4032, {0}, 0},{'\0', 0, 4033, {0}, 0},{'r', 4036, 4034, {0}, 0}, + {'\0', 0, 4035, {0}, 0},{';', 0, 4036, {8815}, 1},{'E', 4044, 4037, {0}, 0}, + {'F', 4054, 4038, {0}, 0},{'G', 4072, 4039, {0}, 0},{'L', 4086, 4040, {0}, 0}, + {'S', 4094, 4041, {0}, 0},{'T', 4114, 4042, {0}, 0},{'\0', 0, 4043, {0}, 0}, + {'q', 4046, 4044, {0}, 0},{'\0', 0, 4045, {0}, 0},{'u', 4048, 4046, {0}, 0}, + {'\0', 0, 4047, {0}, 0},{'a', 4050, 4048, {0}, 0},{'\0', 0, 4049, {0}, 0}, + {'l', 4052, 4050, {0}, 0},{'\0', 0, 4051, {0}, 0},{';', 0, 4052, {8817}, 1}, + {'\0', 0, 4053, {0}, 0},{'u', 4056, 4054, {0}, 0},{'\0', 0, 4055, {0}, 0}, + {'l', 4058, 4056, {0}, 0},{'\0', 0, 4057, {0}, 0},{'l', 4060, 4058, {0}, 0}, + {'\0', 0, 4059, {0}, 0},{'E', 4062, 4060, {0}, 0},{'\0', 0, 4061, {0}, 0}, + {'q', 4064, 4062, {0}, 0},{'\0', 0, 4063, {0}, 0},{'u', 4066, 4064, {0}, 0}, + {'\0', 0, 4065, {0}, 0},{'a', 4068, 4066, {0}, 0},{'\0', 0, 4067, {0}, 0}, + {'l', 4070, 4068, {0}, 0},{'\0', 0, 4069, {0}, 0},{';', 0, 4070, {8807,824}, 2}, + {'\0', 0, 4071, {0}, 0},{'r', 4074, 4072, {0}, 0},{'\0', 0, 4073, {0}, 0}, + {'e', 4076, 4074, {0}, 0},{'\0', 0, 4075, {0}, 0},{'a', 4078, 4076, {0}, 0}, + {'\0', 0, 4077, {0}, 0},{'t', 4080, 4078, {0}, 0},{'\0', 0, 4079, {0}, 0}, + {'e', 4082, 4080, {0}, 0},{'\0', 0, 4081, {0}, 0},{'r', 4084, 4082, {0}, 0}, + {'\0', 0, 4083, {0}, 0},{';', 0, 4084, {8811,824}, 2},{'\0', 0, 4085, {0}, 0}, + {'e', 4088, 4086, {0}, 0},{'\0', 0, 4087, {0}, 0},{'s', 4090, 4088, {0}, 0}, + {'\0', 0, 4089, {0}, 0},{'s', 4092, 4090, {0}, 0},{'\0', 0, 4091, {0}, 0}, + {';', 0, 4092, {8825}, 1},{'\0', 0, 4093, {0}, 0},{'l', 4096, 4094, {0}, 0}, + {'\0', 0, 4095, {0}, 0},{'a', 4098, 4096, {0}, 0},{'\0', 0, 4097, {0}, 0}, + {'n', 4100, 4098, {0}, 0},{'\0', 0, 4099, {0}, 0},{'t', 4102, 4100, {0}, 0}, + {'\0', 0, 4101, {0}, 0},{'E', 4104, 4102, {0}, 0},{'\0', 0, 4103, {0}, 0}, + {'q', 4106, 4104, {0}, 0},{'\0', 0, 4105, {0}, 0},{'u', 4108, 4106, {0}, 0}, + {'\0', 0, 4107, {0}, 0},{'a', 4110, 4108, {0}, 0},{'\0', 0, 4109, {0}, 0}, + {'l', 4112, 4110, {0}, 0},{'\0', 0, 4111, {0}, 0},{';', 0, 4112, {10878,824}, 2}, + {'\0', 0, 4113, {0}, 0},{'i', 4116, 4114, {0}, 0},{'\0', 0, 4115, {0}, 0}, + {'l', 4118, 4116, {0}, 0},{'\0', 0, 4117, {0}, 0},{'d', 4120, 4118, {0}, 0}, + {'\0', 0, 4119, {0}, 0},{'e', 4122, 4120, {0}, 0},{'\0', 0, 4121, {0}, 0}, + {';', 0, 4122, {8821}, 1},{'\0', 0, 4123, {0}, 0},{'u', 4126, 4124, {0}, 0}, + {'\0', 0, 4125, {0}, 0},{'m', 4128, 4126, {0}, 0},{'\0', 0, 4127, {0}, 0}, + {'p', 4130, 4128, {0}, 0},{'\0', 0, 4129, {0}, 0},{'D', 4133, 4130, {0}, 0}, + {'E', 4149, 4131, {0}, 0},{'\0', 0, 4132, {0}, 0},{'o', 4135, 4133, {0}, 0}, + {'\0', 0, 4134, {0}, 0},{'w', 4137, 4135, {0}, 0},{'\0', 0, 4136, {0}, 0}, + {'n', 4139, 4137, {0}, 0},{'\0', 0, 4138, {0}, 0},{'H', 4141, 4139, {0}, 0}, + {'\0', 0, 4140, {0}, 0},{'u', 4143, 4141, {0}, 0},{'\0', 0, 4142, {0}, 0}, + {'m', 4145, 4143, {0}, 0},{'\0', 0, 4144, {0}, 0},{'p', 4147, 4145, {0}, 0}, + {'\0', 0, 4146, {0}, 0},{';', 0, 4147, {8782,824}, 2},{'\0', 0, 4148, {0}, 0}, + {'q', 4151, 4149, {0}, 0},{'\0', 0, 4150, {0}, 0},{'u', 4153, 4151, {0}, 0}, + {'\0', 0, 4152, {0}, 0},{'a', 4155, 4153, {0}, 0},{'\0', 0, 4154, {0}, 0}, + {'l', 4157, 4155, {0}, 0},{'\0', 0, 4156, {0}, 0},{';', 0, 4157, {8783,824}, 2}, + {'\0', 0, 4158, {0}, 0},{'e', 4161, 4159, {0}, 0},{'\0', 0, 4160, {0}, 0}, + {'f', 4164, 4161, {0}, 0},{'s', 4202, 4162, {0}, 0},{'\0', 0, 4163, {0}, 0}, + {'t', 4166, 4164, {0}, 0},{'\0', 0, 4165, {0}, 0},{'T', 4168, 4166, {0}, 0}, + {'\0', 0, 4167, {0}, 0},{'r', 4170, 4168, {0}, 0},{'\0', 0, 4169, {0}, 0}, + {'i', 4172, 4170, {0}, 0},{'\0', 0, 4171, {0}, 0},{'a', 4174, 4172, {0}, 0}, + {'\0', 0, 4173, {0}, 0},{'n', 4176, 4174, {0}, 0},{'\0', 0, 4175, {0}, 0}, + {'g', 4178, 4176, {0}, 0},{'\0', 0, 4177, {0}, 0},{'l', 4180, 4178, {0}, 0}, + {'\0', 0, 4179, {0}, 0},{'e', 4182, 4180, {0}, 0},{'\0', 0, 4181, {0}, 0}, + {';', 0, 4182, {8938}, 1},{'B', 4186, 4183, {0}, 0},{'E', 4192, 4184, {0}, 0}, + {'\0', 0, 4185, {0}, 0},{'a', 4188, 4186, {0}, 0},{'\0', 0, 4187, {0}, 0}, + {'r', 4190, 4188, {0}, 0},{'\0', 0, 4189, {0}, 0},{';', 0, 4190, {10703,824}, 2}, + {'\0', 0, 4191, {0}, 0},{'q', 4194, 4192, {0}, 0},{'\0', 0, 4193, {0}, 0}, + {'u', 4196, 4194, {0}, 0},{'\0', 0, 4195, {0}, 0},{'a', 4198, 4196, {0}, 0}, + {'\0', 0, 4197, {0}, 0},{'l', 4200, 4198, {0}, 0},{'\0', 0, 4199, {0}, 0}, + {';', 0, 4200, {8940}, 1},{'\0', 0, 4201, {0}, 0},{'s', 4204, 4202, {0}, 0}, + {'\0', 0, 4203, {0}, 0},{';', 0, 4204, {8814}, 1},{'E', 4211, 4205, {0}, 0}, + {'G', 4221, 4206, {0}, 0},{'L', 4235, 4207, {0}, 0},{'S', 4243, 4208, {0}, 0}, + {'T', 4263, 4209, {0}, 0},{'\0', 0, 4210, {0}, 0},{'q', 4213, 4211, {0}, 0}, + {'\0', 0, 4212, {0}, 0},{'u', 4215, 4213, {0}, 0},{'\0', 0, 4214, {0}, 0}, + {'a', 4217, 4215, {0}, 0},{'\0', 0, 4216, {0}, 0},{'l', 4219, 4217, {0}, 0}, + {'\0', 0, 4218, {0}, 0},{';', 0, 4219, {8816}, 1},{'\0', 0, 4220, {0}, 0}, + {'r', 4223, 4221, {0}, 0},{'\0', 0, 4222, {0}, 0},{'e', 4225, 4223, {0}, 0}, + {'\0', 0, 4224, {0}, 0},{'a', 4227, 4225, {0}, 0},{'\0', 0, 4226, {0}, 0}, + {'t', 4229, 4227, {0}, 0},{'\0', 0, 4228, {0}, 0},{'e', 4231, 4229, {0}, 0}, + {'\0', 0, 4230, {0}, 0},{'r', 4233, 4231, {0}, 0},{'\0', 0, 4232, {0}, 0}, + {';', 0, 4233, {8824}, 1},{'\0', 0, 4234, {0}, 0},{'e', 4237, 4235, {0}, 0}, + {'\0', 0, 4236, {0}, 0},{'s', 4239, 4237, {0}, 0},{'\0', 0, 4238, {0}, 0}, + {'s', 4241, 4239, {0}, 0},{'\0', 0, 4240, {0}, 0},{';', 0, 4241, {8810,824}, 2}, + {'\0', 0, 4242, {0}, 0},{'l', 4245, 4243, {0}, 0},{'\0', 0, 4244, {0}, 0}, + {'a', 4247, 4245, {0}, 0},{'\0', 0, 4246, {0}, 0},{'n', 4249, 4247, {0}, 0}, + {'\0', 0, 4248, {0}, 0},{'t', 4251, 4249, {0}, 0},{'\0', 0, 4250, {0}, 0}, + {'E', 4253, 4251, {0}, 0},{'\0', 0, 4252, {0}, 0},{'q', 4255, 4253, {0}, 0}, + {'\0', 0, 4254, {0}, 0},{'u', 4257, 4255, {0}, 0},{'\0', 0, 4256, {0}, 0}, + {'a', 4259, 4257, {0}, 0},{'\0', 0, 4258, {0}, 0},{'l', 4261, 4259, {0}, 0}, + {'\0', 0, 4260, {0}, 0},{';', 0, 4261, {10877,824}, 2},{'\0', 0, 4262, {0}, 0}, + {'i', 4265, 4263, {0}, 0},{'\0', 0, 4264, {0}, 0},{'l', 4267, 4265, {0}, 0}, + {'\0', 0, 4266, {0}, 0},{'d', 4269, 4267, {0}, 0},{'\0', 0, 4268, {0}, 0}, + {'e', 4271, 4269, {0}, 0},{'\0', 0, 4270, {0}, 0},{';', 0, 4271, {8820}, 1}, + {'\0', 0, 4272, {0}, 0},{'e', 4275, 4273, {0}, 0},{'\0', 0, 4274, {0}, 0}, + {'s', 4277, 4275, {0}, 0},{'\0', 0, 4276, {0}, 0},{'t', 4279, 4277, {0}, 0}, + {'\0', 0, 4278, {0}, 0},{'e', 4281, 4279, {0}, 0},{'\0', 0, 4280, {0}, 0}, + {'d', 4283, 4281, {0}, 0},{'\0', 0, 4282, {0}, 0},{'G', 4286, 4283, {0}, 0}, + {'L', 4314, 4284, {0}, 0},{'\0', 0, 4285, {0}, 0},{'r', 4288, 4286, {0}, 0}, + {'\0', 0, 4287, {0}, 0},{'e', 4290, 4288, {0}, 0},{'\0', 0, 4289, {0}, 0}, + {'a', 4292, 4290, {0}, 0},{'\0', 0, 4291, {0}, 0},{'t', 4294, 4292, {0}, 0}, + {'\0', 0, 4293, {0}, 0},{'e', 4296, 4294, {0}, 0},{'\0', 0, 4295, {0}, 0}, + {'r', 4298, 4296, {0}, 0},{'\0', 0, 4297, {0}, 0},{'G', 4300, 4298, {0}, 0}, + {'\0', 0, 4299, {0}, 0},{'r', 4302, 4300, {0}, 0},{'\0', 0, 4301, {0}, 0}, + {'e', 4304, 4302, {0}, 0},{'\0', 0, 4303, {0}, 0},{'a', 4306, 4304, {0}, 0}, + {'\0', 0, 4305, {0}, 0},{'t', 4308, 4306, {0}, 0},{'\0', 0, 4307, {0}, 0}, + {'e', 4310, 4308, {0}, 0},{'\0', 0, 4309, {0}, 0},{'r', 4312, 4310, {0}, 0}, + {'\0', 0, 4311, {0}, 0},{';', 0, 4312, {10914,824}, 2},{'\0', 0, 4313, {0}, 0}, + {'e', 4316, 4314, {0}, 0},{'\0', 0, 4315, {0}, 0},{'s', 4318, 4316, {0}, 0}, + {'\0', 0, 4317, {0}, 0},{'s', 4320, 4318, {0}, 0},{'\0', 0, 4319, {0}, 0}, + {'L', 4322, 4320, {0}, 0},{'\0', 0, 4321, {0}, 0},{'e', 4324, 4322, {0}, 0}, + {'\0', 0, 4323, {0}, 0},{'s', 4326, 4324, {0}, 0},{'\0', 0, 4325, {0}, 0}, + {'s', 4328, 4326, {0}, 0},{'\0', 0, 4327, {0}, 0},{';', 0, 4328, {10913,824}, 2}, + {'\0', 0, 4329, {0}, 0},{'r', 4332, 4330, {0}, 0},{'\0', 0, 4331, {0}, 0}, + {'e', 4334, 4332, {0}, 0},{'\0', 0, 4333, {0}, 0},{'c', 4336, 4334, {0}, 0}, + {'\0', 0, 4335, {0}, 0},{'e', 4338, 4336, {0}, 0},{'\0', 0, 4337, {0}, 0}, + {'d', 4340, 4338, {0}, 0},{'\0', 0, 4339, {0}, 0},{'e', 4342, 4340, {0}, 0}, + {'\0', 0, 4341, {0}, 0},{'s', 4344, 4342, {0}, 0},{'\0', 0, 4343, {0}, 0}, + {';', 0, 4344, {8832}, 1},{'E', 4348, 4345, {0}, 0},{'S', 4358, 4346, {0}, 0}, + {'\0', 0, 4347, {0}, 0},{'q', 4350, 4348, {0}, 0},{'\0', 0, 4349, {0}, 0}, + {'u', 4352, 4350, {0}, 0},{'\0', 0, 4351, {0}, 0},{'a', 4354, 4352, {0}, 0}, + {'\0', 0, 4353, {0}, 0},{'l', 4356, 4354, {0}, 0},{'\0', 0, 4355, {0}, 0}, + {';', 0, 4356, {10927,824}, 2},{'\0', 0, 4357, {0}, 0},{'l', 4360, 4358, {0}, 0}, + {'\0', 0, 4359, {0}, 0},{'a', 4362, 4360, {0}, 0},{'\0', 0, 4361, {0}, 0}, + {'n', 4364, 4362, {0}, 0},{'\0', 0, 4363, {0}, 0},{'t', 4366, 4364, {0}, 0}, + {'\0', 0, 4365, {0}, 0},{'E', 4368, 4366, {0}, 0},{'\0', 0, 4367, {0}, 0}, + {'q', 4370, 4368, {0}, 0},{'\0', 0, 4369, {0}, 0},{'u', 4372, 4370, {0}, 0}, + {'\0', 0, 4371, {0}, 0},{'a', 4374, 4372, {0}, 0},{'\0', 0, 4373, {0}, 0}, + {'l', 4376, 4374, {0}, 0},{'\0', 0, 4375, {0}, 0},{';', 0, 4376, {8928}, 1}, + {'\0', 0, 4377, {0}, 0},{'e', 4381, 4378, {0}, 0},{'i', 4407, 4379, {0}, 0}, + {'\0', 0, 4380, {0}, 0},{'v', 4383, 4381, {0}, 0},{'\0', 0, 4382, {0}, 0}, + {'e', 4385, 4383, {0}, 0},{'\0', 0, 4384, {0}, 0},{'r', 4387, 4385, {0}, 0}, + {'\0', 0, 4386, {0}, 0},{'s', 4389, 4387, {0}, 0},{'\0', 0, 4388, {0}, 0}, + {'e', 4391, 4389, {0}, 0},{'\0', 0, 4390, {0}, 0},{'E', 4393, 4391, {0}, 0}, + {'\0', 0, 4392, {0}, 0},{'l', 4395, 4393, {0}, 0},{'\0', 0, 4394, {0}, 0}, + {'e', 4397, 4395, {0}, 0},{'\0', 0, 4396, {0}, 0},{'m', 4399, 4397, {0}, 0}, + {'\0', 0, 4398, {0}, 0},{'e', 4401, 4399, {0}, 0},{'\0', 0, 4400, {0}, 0}, + {'n', 4403, 4401, {0}, 0},{'\0', 0, 4402, {0}, 0},{'t', 4405, 4403, {0}, 0}, + {'\0', 0, 4404, {0}, 0},{';', 0, 4405, {8716}, 1},{'\0', 0, 4406, {0}, 0}, + {'g', 4409, 4407, {0}, 0},{'\0', 0, 4408, {0}, 0},{'h', 4411, 4409, {0}, 0}, + {'\0', 0, 4410, {0}, 0},{'t', 4413, 4411, {0}, 0},{'\0', 0, 4412, {0}, 0}, + {'T', 4415, 4413, {0}, 0},{'\0', 0, 4414, {0}, 0},{'r', 4417, 4415, {0}, 0}, + {'\0', 0, 4416, {0}, 0},{'i', 4419, 4417, {0}, 0},{'\0', 0, 4418, {0}, 0}, + {'a', 4421, 4419, {0}, 0},{'\0', 0, 4420, {0}, 0},{'n', 4423, 4421, {0}, 0}, + {'\0', 0, 4422, {0}, 0},{'g', 4425, 4423, {0}, 0},{'\0', 0, 4424, {0}, 0}, + {'l', 4427, 4425, {0}, 0},{'\0', 0, 4426, {0}, 0},{'e', 4429, 4427, {0}, 0}, + {'\0', 0, 4428, {0}, 0},{';', 0, 4429, {8939}, 1},{'B', 4433, 4430, {0}, 0}, + {'E', 4439, 4431, {0}, 0},{'\0', 0, 4432, {0}, 0},{'a', 4435, 4433, {0}, 0}, + {'\0', 0, 4434, {0}, 0},{'r', 4437, 4435, {0}, 0},{'\0', 0, 4436, {0}, 0}, + {';', 0, 4437, {10704,824}, 2},{'\0', 0, 4438, {0}, 0},{'q', 4441, 4439, {0}, 0}, + {'\0', 0, 4440, {0}, 0},{'u', 4443, 4441, {0}, 0},{'\0', 0, 4442, {0}, 0}, + {'a', 4445, 4443, {0}, 0},{'\0', 0, 4444, {0}, 0},{'l', 4447, 4445, {0}, 0}, + {'\0', 0, 4446, {0}, 0},{';', 0, 4447, {8941}, 1},{'\0', 0, 4448, {0}, 0}, + {'q', 4452, 4449, {0}, 0},{'u', 4509, 4450, {0}, 0},{'\0', 0, 4451, {0}, 0}, + {'u', 4454, 4452, {0}, 0},{'\0', 0, 4453, {0}, 0},{'a', 4456, 4454, {0}, 0}, + {'\0', 0, 4455, {0}, 0},{'r', 4458, 4456, {0}, 0},{'\0', 0, 4457, {0}, 0}, + {'e', 4460, 4458, {0}, 0},{'\0', 0, 4459, {0}, 0},{'S', 4462, 4460, {0}, 0}, + {'\0', 0, 4461, {0}, 0},{'u', 4464, 4462, {0}, 0},{'\0', 0, 4463, {0}, 0}, + {'b', 4467, 4464, {0}, 0},{'p', 4486, 4465, {0}, 0},{'\0', 0, 4466, {0}, 0}, + {'s', 4469, 4467, {0}, 0},{'\0', 0, 4468, {0}, 0},{'e', 4471, 4469, {0}, 0}, + {'\0', 0, 4470, {0}, 0},{'t', 4473, 4471, {0}, 0},{'\0', 0, 4472, {0}, 0}, + {';', 0, 4473, {8847,824}, 2},{'E', 4476, 4474, {0}, 0},{'\0', 0, 4475, {0}, 0}, + {'q', 4478, 4476, {0}, 0},{'\0', 0, 4477, {0}, 0},{'u', 4480, 4478, {0}, 0}, + {'\0', 0, 4479, {0}, 0},{'a', 4482, 4480, {0}, 0},{'\0', 0, 4481, {0}, 0}, + {'l', 4484, 4482, {0}, 0},{'\0', 0, 4483, {0}, 0},{';', 0, 4484, {8930}, 1}, + {'\0', 0, 4485, {0}, 0},{'e', 4488, 4486, {0}, 0},{'\0', 0, 4487, {0}, 0}, + {'r', 4490, 4488, {0}, 0},{'\0', 0, 4489, {0}, 0},{'s', 4492, 4490, {0}, 0}, + {'\0', 0, 4491, {0}, 0},{'e', 4494, 4492, {0}, 0},{'\0', 0, 4493, {0}, 0}, + {'t', 4496, 4494, {0}, 0},{'\0', 0, 4495, {0}, 0},{';', 0, 4496, {8848,824}, 2}, + {'E', 4499, 4497, {0}, 0},{'\0', 0, 4498, {0}, 0},{'q', 4501, 4499, {0}, 0}, + {'\0', 0, 4500, {0}, 0},{'u', 4503, 4501, {0}, 0},{'\0', 0, 4502, {0}, 0}, + {'a', 4505, 4503, {0}, 0},{'\0', 0, 4504, {0}, 0},{'l', 4507, 4505, {0}, 0}, + {'\0', 0, 4506, {0}, 0},{';', 0, 4507, {8931}, 1},{'\0', 0, 4508, {0}, 0}, + {'b', 4513, 4509, {0}, 0},{'c', 4532, 4510, {0}, 0},{'p', 4587, 4511, {0}, 0}, + {'\0', 0, 4512, {0}, 0},{'s', 4515, 4513, {0}, 0},{'\0', 0, 4514, {0}, 0}, + {'e', 4517, 4515, {0}, 0},{'\0', 0, 4516, {0}, 0},{'t', 4519, 4517, {0}, 0}, + {'\0', 0, 4518, {0}, 0},{';', 0, 4519, {8834,8402}, 2},{'E', 4522, 4520, {0}, 0}, + {'\0', 0, 4521, {0}, 0},{'q', 4524, 4522, {0}, 0},{'\0', 0, 4523, {0}, 0}, + {'u', 4526, 4524, {0}, 0},{'\0', 0, 4525, {0}, 0},{'a', 4528, 4526, {0}, 0}, + {'\0', 0, 4527, {0}, 0},{'l', 4530, 4528, {0}, 0},{'\0', 0, 4529, {0}, 0}, + {';', 0, 4530, {8840}, 1},{'\0', 0, 4531, {0}, 0},{'c', 4534, 4532, {0}, 0}, + {'\0', 0, 4533, {0}, 0},{'e', 4536, 4534, {0}, 0},{'\0', 0, 4535, {0}, 0}, + {'e', 4538, 4536, {0}, 0},{'\0', 0, 4537, {0}, 0},{'d', 4540, 4538, {0}, 0}, + {'\0', 0, 4539, {0}, 0},{'s', 4542, 4540, {0}, 0},{'\0', 0, 4541, {0}, 0}, + {';', 0, 4542, {8833}, 1},{'E', 4547, 4543, {0}, 0},{'S', 4557, 4544, {0}, 0}, + {'T', 4577, 4545, {0}, 0},{'\0', 0, 4546, {0}, 0},{'q', 4549, 4547, {0}, 0}, + {'\0', 0, 4548, {0}, 0},{'u', 4551, 4549, {0}, 0},{'\0', 0, 4550, {0}, 0}, + {'a', 4553, 4551, {0}, 0},{'\0', 0, 4552, {0}, 0},{'l', 4555, 4553, {0}, 0}, + {'\0', 0, 4554, {0}, 0},{';', 0, 4555, {10928,824}, 2},{'\0', 0, 4556, {0}, 0}, + {'l', 4559, 4557, {0}, 0},{'\0', 0, 4558, {0}, 0},{'a', 4561, 4559, {0}, 0}, + {'\0', 0, 4560, {0}, 0},{'n', 4563, 4561, {0}, 0},{'\0', 0, 4562, {0}, 0}, + {'t', 4565, 4563, {0}, 0},{'\0', 0, 4564, {0}, 0},{'E', 4567, 4565, {0}, 0}, + {'\0', 0, 4566, {0}, 0},{'q', 4569, 4567, {0}, 0},{'\0', 0, 4568, {0}, 0}, + {'u', 4571, 4569, {0}, 0},{'\0', 0, 4570, {0}, 0},{'a', 4573, 4571, {0}, 0}, + {'\0', 0, 4572, {0}, 0},{'l', 4575, 4573, {0}, 0},{'\0', 0, 4574, {0}, 0}, + {';', 0, 4575, {8929}, 1},{'\0', 0, 4576, {0}, 0},{'i', 4579, 4577, {0}, 0}, + {'\0', 0, 4578, {0}, 0},{'l', 4581, 4579, {0}, 0},{'\0', 0, 4580, {0}, 0}, + {'d', 4583, 4581, {0}, 0},{'\0', 0, 4582, {0}, 0},{'e', 4585, 4583, {0}, 0}, + {'\0', 0, 4584, {0}, 0},{';', 0, 4585, {8831,824}, 2},{'\0', 0, 4586, {0}, 0}, + {'e', 4589, 4587, {0}, 0},{'\0', 0, 4588, {0}, 0},{'r', 4591, 4589, {0}, 0}, + {'\0', 0, 4590, {0}, 0},{'s', 4593, 4591, {0}, 0},{'\0', 0, 4592, {0}, 0}, + {'e', 4595, 4593, {0}, 0},{'\0', 0, 4594, {0}, 0},{'t', 4597, 4595, {0}, 0}, + {'\0', 0, 4596, {0}, 0},{';', 0, 4597, {8835,8402}, 2},{'E', 4600, 4598, {0}, 0}, + {'\0', 0, 4599, {0}, 0},{'q', 4602, 4600, {0}, 0},{'\0', 0, 4601, {0}, 0}, + {'u', 4604, 4602, {0}, 0},{'\0', 0, 4603, {0}, 0},{'a', 4606, 4604, {0}, 0}, + {'\0', 0, 4605, {0}, 0},{'l', 4608, 4606, {0}, 0},{'\0', 0, 4607, {0}, 0}, + {';', 0, 4608, {8841}, 1},{'\0', 0, 4609, {0}, 0},{'i', 4612, 4610, {0}, 0}, + {'\0', 0, 4611, {0}, 0},{'l', 4614, 4612, {0}, 0},{'\0', 0, 4613, {0}, 0}, + {'d', 4616, 4614, {0}, 0},{'\0', 0, 4615, {0}, 0},{'e', 4618, 4616, {0}, 0}, + {'\0', 0, 4617, {0}, 0},{';', 0, 4618, {8769}, 1},{'E', 4623, 4619, {0}, 0}, + {'F', 4633, 4620, {0}, 0},{'T', 4651, 4621, {0}, 0},{'\0', 0, 4622, {0}, 0}, + {'q', 4625, 4623, {0}, 0},{'\0', 0, 4624, {0}, 0},{'u', 4627, 4625, {0}, 0}, + {'\0', 0, 4626, {0}, 0},{'a', 4629, 4627, {0}, 0},{'\0', 0, 4628, {0}, 0}, + {'l', 4631, 4629, {0}, 0},{'\0', 0, 4630, {0}, 0},{';', 0, 4631, {8772}, 1}, + {'\0', 0, 4632, {0}, 0},{'u', 4635, 4633, {0}, 0},{'\0', 0, 4634, {0}, 0}, + {'l', 4637, 4635, {0}, 0},{'\0', 0, 4636, {0}, 0},{'l', 4639, 4637, {0}, 0}, + {'\0', 0, 4638, {0}, 0},{'E', 4641, 4639, {0}, 0},{'\0', 0, 4640, {0}, 0}, + {'q', 4643, 4641, {0}, 0},{'\0', 0, 4642, {0}, 0},{'u', 4645, 4643, {0}, 0}, + {'\0', 0, 4644, {0}, 0},{'a', 4647, 4645, {0}, 0},{'\0', 0, 4646, {0}, 0}, + {'l', 4649, 4647, {0}, 0},{'\0', 0, 4648, {0}, 0},{';', 0, 4649, {8775}, 1}, + {'\0', 0, 4650, {0}, 0},{'i', 4653, 4651, {0}, 0},{'\0', 0, 4652, {0}, 0}, + {'l', 4655, 4653, {0}, 0},{'\0', 0, 4654, {0}, 0},{'d', 4657, 4655, {0}, 0}, + {'\0', 0, 4656, {0}, 0},{'e', 4659, 4657, {0}, 0},{'\0', 0, 4658, {0}, 0}, + {';', 0, 4659, {8777}, 1},{'\0', 0, 4660, {0}, 0},{'e', 4663, 4661, {0}, 0}, + {'\0', 0, 4662, {0}, 0},{'r', 4665, 4663, {0}, 0},{'\0', 0, 4664, {0}, 0}, + {'t', 4667, 4665, {0}, 0},{'\0', 0, 4666, {0}, 0},{'i', 4669, 4667, {0}, 0}, + {'\0', 0, 4668, {0}, 0},{'c', 4671, 4669, {0}, 0},{'\0', 0, 4670, {0}, 0}, + {'a', 4673, 4671, {0}, 0},{'\0', 0, 4672, {0}, 0},{'l', 4675, 4673, {0}, 0}, + {'\0', 0, 4674, {0}, 0},{'B', 4677, 4675, {0}, 0},{'\0', 0, 4676, {0}, 0}, + {'a', 4679, 4677, {0}, 0},{'\0', 0, 4678, {0}, 0},{'r', 4681, 4679, {0}, 0}, + {'\0', 0, 4680, {0}, 0},{';', 0, 4681, {8740}, 1},{'\0', 0, 4682, {0}, 0}, + {'c', 4685, 4683, {0}, 0},{'\0', 0, 4684, {0}, 0},{'r', 4687, 4685, {0}, 0}, + {'\0', 0, 4686, {0}, 0},{';', 0, 4687, {119977}, 1},{'\0', 0, 4688, {0}, 0}, + {'i', 4691, 4689, {0}, 0},{'\0', 0, 4690, {0}, 0},{'l', 4693, 4691, {0}, 0}, + {'\0', 0, 4692, {0}, 0},{'d', 4695, 4693, {0}, 0},{'\0', 0, 4694, {0}, 0}, + {'e', 4697, 4695, {209}, 1},{'\0', 0, 4696, {0}, 0},{';', 0, 4697, {209}, 1}, + {'\0', 0, 4698, {0}, 0},{';', 0, 4699, {925}, 1},{'\0', 0, 4700, {0}, 0}, + {'E', 4716, 4701, {0}, 0},{'a', 4724, 4702, {0}, 0},{'c', 4734, 4703, {0}, 0}, + {'d', 4745, 4704, {0}, 0},{'f', 4755, 4705, {0}, 0},{'g', 4759, 4706, {0}, 0}, + {'m', 4769, 4707, {0}, 0},{'o', 4795, 4708, {0}, 0},{'p', 4801, 4709, {0}, 0}, + {'r', 4850, 4710, {0}, 0},{'s', 4852, 4711, {0}, 0},{'t', 4867, 4712, {0}, 0}, + {'u', 4884, 4713, {0}, 0},{'v', 4890, 4714, {0}, 0},{'\0', 0, 4715, {0}, 0}, + {'l', 4718, 4716, {0}, 0},{'\0', 0, 4717, {0}, 0},{'i', 4720, 4718, {0}, 0}, + {'\0', 0, 4719, {0}, 0},{'g', 4722, 4720, {0}, 0},{'\0', 0, 4721, {0}, 0}, + {';', 0, 4722, {338}, 1},{'\0', 0, 4723, {0}, 0},{'c', 4726, 4724, {0}, 0}, + {'\0', 0, 4725, {0}, 0},{'u', 4728, 4726, {0}, 0},{'\0', 0, 4727, {0}, 0}, + {'t', 4730, 4728, {0}, 0},{'\0', 0, 4729, {0}, 0},{'e', 4732, 4730, {211}, 1}, + {'\0', 0, 4731, {0}, 0},{';', 0, 4732, {211}, 1},{'\0', 0, 4733, {0}, 0}, + {'i', 4737, 4734, {0}, 0},{'y', 4743, 4735, {0}, 0},{'\0', 0, 4736, {0}, 0}, + {'r', 4739, 4737, {0}, 0},{'\0', 0, 4738, {0}, 0},{'c', 4741, 4739, {212}, 1}, + {'\0', 0, 4740, {0}, 0},{';', 0, 4741, {212}, 1},{'\0', 0, 4742, {0}, 0}, + {';', 0, 4743, {1054}, 1},{'\0', 0, 4744, {0}, 0},{'b', 4747, 4745, {0}, 0}, + {'\0', 0, 4746, {0}, 0},{'l', 4749, 4747, {0}, 0},{'\0', 0, 4748, {0}, 0}, + {'a', 4751, 4749, {0}, 0},{'\0', 0, 4750, {0}, 0},{'c', 4753, 4751, {0}, 0}, + {'\0', 0, 4752, {0}, 0},{';', 0, 4753, {336}, 1},{'\0', 0, 4754, {0}, 0}, + {'r', 4757, 4755, {0}, 0},{'\0', 0, 4756, {0}, 0},{';', 0, 4757, {120082}, 1}, + {'\0', 0, 4758, {0}, 0},{'r', 4761, 4759, {0}, 0},{'\0', 0, 4760, {0}, 0}, + {'a', 4763, 4761, {0}, 0},{'\0', 0, 4762, {0}, 0},{'v', 4765, 4763, {0}, 0}, + {'\0', 0, 4764, {0}, 0},{'e', 4767, 4765, {210}, 1},{'\0', 0, 4766, {0}, 0}, + {';', 0, 4767, {210}, 1},{'\0', 0, 4768, {0}, 0},{'a', 4773, 4769, {0}, 0}, + {'e', 4779, 4770, {0}, 0},{'i', 4785, 4771, {0}, 0},{'\0', 0, 4772, {0}, 0}, + {'c', 4775, 4773, {0}, 0},{'\0', 0, 4774, {0}, 0},{'r', 4777, 4775, {0}, 0}, + {'\0', 0, 4776, {0}, 0},{';', 0, 4777, {332}, 1},{'\0', 0, 4778, {0}, 0}, + {'g', 4781, 4779, {0}, 0},{'\0', 0, 4780, {0}, 0},{'a', 4783, 4781, {0}, 0}, + {'\0', 0, 4782, {0}, 0},{';', 0, 4783, {937}, 1},{'\0', 0, 4784, {0}, 0}, + {'c', 4787, 4785, {0}, 0},{'\0', 0, 4786, {0}, 0},{'r', 4789, 4787, {0}, 0}, + {'\0', 0, 4788, {0}, 0},{'o', 4791, 4789, {0}, 0},{'\0', 0, 4790, {0}, 0}, + {'n', 4793, 4791, {0}, 0},{'\0', 0, 4792, {0}, 0},{';', 0, 4793, {927}, 1}, + {'\0', 0, 4794, {0}, 0},{'p', 4797, 4795, {0}, 0},{'\0', 0, 4796, {0}, 0}, + {'f', 4799, 4797, {0}, 0},{'\0', 0, 4798, {0}, 0},{';', 0, 4799, {120134}, 1}, + {'\0', 0, 4800, {0}, 0},{'e', 4803, 4801, {0}, 0},{'\0', 0, 4802, {0}, 0}, + {'n', 4805, 4803, {0}, 0},{'\0', 0, 4804, {0}, 0},{'C', 4807, 4805, {0}, 0}, + {'\0', 0, 4806, {0}, 0},{'u', 4809, 4807, {0}, 0},{'\0', 0, 4808, {0}, 0}, + {'r', 4811, 4809, {0}, 0},{'\0', 0, 4810, {0}, 0},{'l', 4813, 4811, {0}, 0}, + {'\0', 0, 4812, {0}, 0},{'y', 4815, 4813, {0}, 0},{'\0', 0, 4814, {0}, 0}, + {'D', 4818, 4815, {0}, 0},{'Q', 4840, 4816, {0}, 0},{'\0', 0, 4817, {0}, 0}, + {'o', 4820, 4818, {0}, 0},{'\0', 0, 4819, {0}, 0},{'u', 4822, 4820, {0}, 0}, + {'\0', 0, 4821, {0}, 0},{'b', 4824, 4822, {0}, 0},{'\0', 0, 4823, {0}, 0}, + {'l', 4826, 4824, {0}, 0},{'\0', 0, 4825, {0}, 0},{'e', 4828, 4826, {0}, 0}, + {'\0', 0, 4827, {0}, 0},{'Q', 4830, 4828, {0}, 0},{'\0', 0, 4829, {0}, 0}, + {'u', 4832, 4830, {0}, 0},{'\0', 0, 4831, {0}, 0},{'o', 4834, 4832, {0}, 0}, + {'\0', 0, 4833, {0}, 0},{'t', 4836, 4834, {0}, 0},{'\0', 0, 4835, {0}, 0}, + {'e', 4838, 4836, {0}, 0},{'\0', 0, 4837, {0}, 0},{';', 0, 4838, {8220}, 1}, + {'\0', 0, 4839, {0}, 0},{'u', 4842, 4840, {0}, 0},{'\0', 0, 4841, {0}, 0}, + {'o', 4844, 4842, {0}, 0},{'\0', 0, 4843, {0}, 0},{'t', 4846, 4844, {0}, 0}, + {'\0', 0, 4845, {0}, 0},{'e', 4848, 4846, {0}, 0},{'\0', 0, 4847, {0}, 0}, + {';', 0, 4848, {8216}, 1},{'\0', 0, 4849, {0}, 0},{';', 0, 4850, {10836}, 1}, + {'\0', 0, 4851, {0}, 0},{'c', 4855, 4852, {0}, 0},{'l', 4859, 4853, {0}, 0}, + {'\0', 0, 4854, {0}, 0},{'r', 4857, 4855, {0}, 0},{'\0', 0, 4856, {0}, 0}, + {';', 0, 4857, {119978}, 1},{'\0', 0, 4858, {0}, 0},{'a', 4861, 4859, {0}, 0}, + {'\0', 0, 4860, {0}, 0},{'s', 4863, 4861, {0}, 0},{'\0', 0, 4862, {0}, 0}, + {'h', 4865, 4863, {216}, 1},{'\0', 0, 4864, {0}, 0},{';', 0, 4865, {216}, 1}, + {'\0', 0, 4866, {0}, 0},{'i', 4869, 4867, {0}, 0},{'\0', 0, 4868, {0}, 0}, + {'l', 4872, 4869, {0}, 0},{'m', 4878, 4870, {0}, 0},{'\0', 0, 4871, {0}, 0}, + {'d', 4874, 4872, {0}, 0},{'\0', 0, 4873, {0}, 0},{'e', 4876, 4874, {213}, 1}, + {'\0', 0, 4875, {0}, 0},{';', 0, 4876, {213}, 1},{'\0', 0, 4877, {0}, 0}, + {'e', 4880, 4878, {0}, 0},{'\0', 0, 4879, {0}, 0},{'s', 4882, 4880, {0}, 0}, + {'\0', 0, 4881, {0}, 0},{';', 0, 4882, {10807}, 1},{'\0', 0, 4883, {0}, 0}, + {'m', 4886, 4884, {0}, 0},{'\0', 0, 4885, {0}, 0},{'l', 4888, 4886, {214}, 1}, + {'\0', 0, 4887, {0}, 0},{';', 0, 4888, {214}, 1},{'\0', 0, 4889, {0}, 0}, + {'e', 4892, 4890, {0}, 0},{'\0', 0, 4891, {0}, 0},{'r', 4894, 4892, {0}, 0}, + {'\0', 0, 4893, {0}, 0},{'B', 4897, 4894, {0}, 0},{'P', 4919, 4895, {0}, 0}, + {'\0', 0, 4896, {0}, 0},{'a', 4900, 4897, {0}, 0},{'r', 4904, 4898, {0}, 0}, + {'\0', 0, 4899, {0}, 0},{'r', 4902, 4900, {0}, 0},{'\0', 0, 4901, {0}, 0}, + {';', 0, 4902, {8254}, 1},{'\0', 0, 4903, {0}, 0},{'a', 4906, 4904, {0}, 0}, + {'\0', 0, 4905, {0}, 0},{'c', 4908, 4906, {0}, 0},{'\0', 0, 4907, {0}, 0}, + {'e', 4911, 4908, {0}, 0},{'k', 4913, 4909, {0}, 0},{'\0', 0, 4910, {0}, 0}, + {';', 0, 4911, {9182}, 1},{'\0', 0, 4912, {0}, 0},{'e', 4915, 4913, {0}, 0}, + {'\0', 0, 4914, {0}, 0},{'t', 4917, 4915, {0}, 0},{'\0', 0, 4916, {0}, 0}, + {';', 0, 4917, {9140}, 1},{'\0', 0, 4918, {0}, 0},{'a', 4921, 4919, {0}, 0}, + {'\0', 0, 4920, {0}, 0},{'r', 4923, 4921, {0}, 0},{'\0', 0, 4922, {0}, 0}, + {'e', 4925, 4923, {0}, 0},{'\0', 0, 4924, {0}, 0},{'n', 4927, 4925, {0}, 0}, + {'\0', 0, 4926, {0}, 0},{'t', 4929, 4927, {0}, 0},{'\0', 0, 4928, {0}, 0}, + {'h', 4931, 4929, {0}, 0},{'\0', 0, 4930, {0}, 0},{'e', 4933, 4931, {0}, 0}, + {'\0', 0, 4932, {0}, 0},{'s', 4935, 4933, {0}, 0},{'\0', 0, 4934, {0}, 0}, + {'i', 4937, 4935, {0}, 0},{'\0', 0, 4936, {0}, 0},{'s', 4939, 4937, {0}, 0}, + {'\0', 0, 4938, {0}, 0},{';', 0, 4939, {9180}, 1},{'\0', 0, 4940, {0}, 0}, + {'a', 4951, 4941, {0}, 0},{'c', 4965, 4942, {0}, 0},{'f', 4969, 4943, {0}, 0}, + {'h', 4973, 4944, {0}, 0},{'i', 4977, 4945, {0}, 0},{'l', 4979, 4946, {0}, 0}, + {'o', 4995, 4947, {0}, 0},{'r', 5024, 4948, {0}, 0},{'s', 5120, 4949, {0}, 0}, + {'\0', 0, 4950, {0}, 0},{'r', 4953, 4951, {0}, 0},{'\0', 0, 4952, {0}, 0}, + {'t', 4955, 4953, {0}, 0},{'\0', 0, 4954, {0}, 0},{'i', 4957, 4955, {0}, 0}, + {'\0', 0, 4956, {0}, 0},{'a', 4959, 4957, {0}, 0},{'\0', 0, 4958, {0}, 0}, + {'l', 4961, 4959, {0}, 0},{'\0', 0, 4960, {0}, 0},{'D', 4963, 4961, {0}, 0}, + {'\0', 0, 4962, {0}, 0},{';', 0, 4963, {8706}, 1},{'\0', 0, 4964, {0}, 0}, + {'y', 4967, 4965, {0}, 0},{'\0', 0, 4966, {0}, 0},{';', 0, 4967, {1055}, 1}, + {'\0', 0, 4968, {0}, 0},{'r', 4971, 4969, {0}, 0},{'\0', 0, 4970, {0}, 0}, + {';', 0, 4971, {120083}, 1},{'\0', 0, 4972, {0}, 0},{'i', 4975, 4973, {0}, 0}, + {'\0', 0, 4974, {0}, 0},{';', 0, 4975, {934}, 1},{'\0', 0, 4976, {0}, 0}, + {';', 0, 4977, {928}, 1},{'\0', 0, 4978, {0}, 0},{'u', 4981, 4979, {0}, 0}, + {'\0', 0, 4980, {0}, 0},{'s', 4983, 4981, {0}, 0},{'\0', 0, 4982, {0}, 0}, + {'M', 4985, 4983, {0}, 0},{'\0', 0, 4984, {0}, 0},{'i', 4987, 4985, {0}, 0}, + {'\0', 0, 4986, {0}, 0},{'n', 4989, 4987, {0}, 0},{'\0', 0, 4988, {0}, 0}, + {'u', 4991, 4989, {0}, 0},{'\0', 0, 4990, {0}, 0},{'s', 4993, 4991, {0}, 0}, + {'\0', 0, 4992, {0}, 0},{';', 0, 4993, {177}, 1},{'\0', 0, 4994, {0}, 0}, + {'i', 4998, 4995, {0}, 0},{'p', 5020, 4996, {0}, 0},{'\0', 0, 4997, {0}, 0}, + {'n', 5000, 4998, {0}, 0},{'\0', 0, 4999, {0}, 0},{'c', 5002, 5000, {0}, 0}, + {'\0', 0, 5001, {0}, 0},{'a', 5004, 5002, {0}, 0},{'\0', 0, 5003, {0}, 0}, + {'r', 5006, 5004, {0}, 0},{'\0', 0, 5005, {0}, 0},{'e', 5008, 5006, {0}, 0}, + {'\0', 0, 5007, {0}, 0},{'p', 5010, 5008, {0}, 0},{'\0', 0, 5009, {0}, 0}, + {'l', 5012, 5010, {0}, 0},{'\0', 0, 5011, {0}, 0},{'a', 5014, 5012, {0}, 0}, + {'\0', 0, 5013, {0}, 0},{'n', 5016, 5014, {0}, 0},{'\0', 0, 5015, {0}, 0}, + {'e', 5018, 5016, {0}, 0},{'\0', 0, 5017, {0}, 0},{';', 0, 5018, {8460}, 1}, + {'\0', 0, 5019, {0}, 0},{'f', 5022, 5020, {0}, 0},{'\0', 0, 5021, {0}, 0}, + {';', 0, 5022, {8473}, 1},{'\0', 0, 5023, {0}, 0},{';', 0, 5024, {10939}, 1}, + {'e', 5029, 5025, {0}, 0},{'i', 5084, 5026, {0}, 0},{'o', 5090, 5027, {0}, 0}, + {'\0', 0, 5028, {0}, 0},{'c', 5031, 5029, {0}, 0},{'\0', 0, 5030, {0}, 0}, + {'e', 5033, 5031, {0}, 0},{'\0', 0, 5032, {0}, 0},{'d', 5035, 5033, {0}, 0}, + {'\0', 0, 5034, {0}, 0},{'e', 5037, 5035, {0}, 0},{'\0', 0, 5036, {0}, 0}, + {'s', 5039, 5037, {0}, 0},{'\0', 0, 5038, {0}, 0},{';', 0, 5039, {8826}, 1}, + {'E', 5044, 5040, {0}, 0},{'S', 5054, 5041, {0}, 0},{'T', 5074, 5042, {0}, 0}, + {'\0', 0, 5043, {0}, 0},{'q', 5046, 5044, {0}, 0},{'\0', 0, 5045, {0}, 0}, + {'u', 5048, 5046, {0}, 0},{'\0', 0, 5047, {0}, 0},{'a', 5050, 5048, {0}, 0}, + {'\0', 0, 5049, {0}, 0},{'l', 5052, 5050, {0}, 0},{'\0', 0, 5051, {0}, 0}, + {';', 0, 5052, {10927}, 1},{'\0', 0, 5053, {0}, 0},{'l', 5056, 5054, {0}, 0}, + {'\0', 0, 5055, {0}, 0},{'a', 5058, 5056, {0}, 0},{'\0', 0, 5057, {0}, 0}, + {'n', 5060, 5058, {0}, 0},{'\0', 0, 5059, {0}, 0},{'t', 5062, 5060, {0}, 0}, + {'\0', 0, 5061, {0}, 0},{'E', 5064, 5062, {0}, 0},{'\0', 0, 5063, {0}, 0}, + {'q', 5066, 5064, {0}, 0},{'\0', 0, 5065, {0}, 0},{'u', 5068, 5066, {0}, 0}, + {'\0', 0, 5067, {0}, 0},{'a', 5070, 5068, {0}, 0},{'\0', 0, 5069, {0}, 0}, + {'l', 5072, 5070, {0}, 0},{'\0', 0, 5071, {0}, 0},{';', 0, 5072, {8828}, 1}, + {'\0', 0, 5073, {0}, 0},{'i', 5076, 5074, {0}, 0},{'\0', 0, 5075, {0}, 0}, + {'l', 5078, 5076, {0}, 0},{'\0', 0, 5077, {0}, 0},{'d', 5080, 5078, {0}, 0}, + {'\0', 0, 5079, {0}, 0},{'e', 5082, 5080, {0}, 0},{'\0', 0, 5081, {0}, 0}, + {';', 0, 5082, {8830}, 1},{'\0', 0, 5083, {0}, 0},{'m', 5086, 5084, {0}, 0}, + {'\0', 0, 5085, {0}, 0},{'e', 5088, 5086, {0}, 0},{'\0', 0, 5087, {0}, 0}, + {';', 0, 5088, {8243}, 1},{'\0', 0, 5089, {0}, 0},{'d', 5093, 5090, {0}, 0}, + {'p', 5101, 5091, {0}, 0},{'\0', 0, 5092, {0}, 0},{'u', 5095, 5093, {0}, 0}, + {'\0', 0, 5094, {0}, 0},{'c', 5097, 5095, {0}, 0},{'\0', 0, 5096, {0}, 0}, + {'t', 5099, 5097, {0}, 0},{'\0', 0, 5098, {0}, 0},{';', 0, 5099, {8719}, 1}, + {'\0', 0, 5100, {0}, 0},{'o', 5103, 5101, {0}, 0},{'\0', 0, 5102, {0}, 0}, + {'r', 5105, 5103, {0}, 0},{'\0', 0, 5104, {0}, 0},{'t', 5107, 5105, {0}, 0}, + {'\0', 0, 5106, {0}, 0},{'i', 5109, 5107, {0}, 0},{'\0', 0, 5108, {0}, 0}, + {'o', 5111, 5109, {0}, 0},{'\0', 0, 5110, {0}, 0},{'n', 5113, 5111, {0}, 0}, + {'\0', 0, 5112, {0}, 0},{';', 0, 5113, {8759}, 1},{'a', 5116, 5114, {0}, 0}, + {'\0', 0, 5115, {0}, 0},{'l', 5118, 5116, {0}, 0},{'\0', 0, 5117, {0}, 0}, + {';', 0, 5118, {8733}, 1},{'\0', 0, 5119, {0}, 0},{'c', 5123, 5120, {0}, 0}, + {'i', 5127, 5121, {0}, 0},{'\0', 0, 5122, {0}, 0},{'r', 5125, 5123, {0}, 0}, + {'\0', 0, 5124, {0}, 0},{';', 0, 5125, {119979}, 1},{'\0', 0, 5126, {0}, 0}, + {';', 0, 5127, {936}, 1},{'\0', 0, 5128, {0}, 0},{'U', 5134, 5129, {0}, 0}, + {'f', 5140, 5130, {0}, 0},{'o', 5144, 5131, {0}, 0},{'s', 5150, 5132, {0}, 0}, + {'\0', 0, 5133, {0}, 0},{'O', 5136, 5134, {0}, 0},{'\0', 0, 5135, {0}, 0}, + {'T', 5138, 5136, {34}, 1},{'\0', 0, 5137, {0}, 0},{';', 0, 5138, {34}, 1}, + {'\0', 0, 5139, {0}, 0},{'r', 5142, 5140, {0}, 0},{'\0', 0, 5141, {0}, 0}, + {';', 0, 5142, {120084}, 1},{'\0', 0, 5143, {0}, 0},{'p', 5146, 5144, {0}, 0}, + {'\0', 0, 5145, {0}, 0},{'f', 5148, 5146, {0}, 0},{'\0', 0, 5147, {0}, 0}, + {';', 0, 5148, {8474}, 1},{'\0', 0, 5149, {0}, 0},{'c', 5152, 5150, {0}, 0}, + {'\0', 0, 5151, {0}, 0},{'r', 5154, 5152, {0}, 0},{'\0', 0, 5153, {0}, 0}, + {';', 0, 5154, {119980}, 1},{'\0', 0, 5155, {0}, 0},{'B', 5169, 5156, {0}, 0}, + {'E', 5177, 5157, {0}, 0},{'a', 5181, 5158, {0}, 0},{'c', 5206, 5159, {0}, 0}, + {'e', 5228, 5160, {0}, 0},{'f', 5303, 5161, {0}, 0},{'h', 5307, 5162, {0}, 0}, + {'i', 5311, 5163, {0}, 0},{'o', 5633, 5164, {0}, 0},{'r', 5660, 5165, {0}, 0}, + {'s', 5680, 5166, {0}, 0},{'u', 5689, 5167, {0}, 0},{'\0', 0, 5168, {0}, 0}, + {'a', 5171, 5169, {0}, 0},{'\0', 0, 5170, {0}, 0},{'r', 5173, 5171, {0}, 0}, + {'\0', 0, 5172, {0}, 0},{'r', 5175, 5173, {0}, 0},{'\0', 0, 5174, {0}, 0}, + {';', 0, 5175, {10512}, 1},{'\0', 0, 5176, {0}, 0},{'G', 5179, 5177, {174}, 1}, + {'\0', 0, 5178, {0}, 0},{';', 0, 5179, {174}, 1},{'\0', 0, 5180, {0}, 0}, + {'c', 5185, 5181, {0}, 0},{'n', 5193, 5182, {0}, 0},{'r', 5197, 5183, {0}, 0}, + {'\0', 0, 5184, {0}, 0},{'u', 5187, 5185, {0}, 0},{'\0', 0, 5186, {0}, 0}, + {'t', 5189, 5187, {0}, 0},{'\0', 0, 5188, {0}, 0},{'e', 5191, 5189, {0}, 0}, + {'\0', 0, 5190, {0}, 0},{';', 0, 5191, {340}, 1},{'\0', 0, 5192, {0}, 0}, + {'g', 5195, 5193, {0}, 0},{'\0', 0, 5194, {0}, 0},{';', 0, 5195, {10219}, 1}, + {'\0', 0, 5196, {0}, 0},{'r', 5199, 5197, {0}, 0},{'\0', 0, 5198, {0}, 0}, + {';', 0, 5199, {8608}, 1},{'t', 5202, 5200, {0}, 0},{'\0', 0, 5201, {0}, 0}, + {'l', 5204, 5202, {0}, 0},{'\0', 0, 5203, {0}, 0},{';', 0, 5204, {10518}, 1}, + {'\0', 0, 5205, {0}, 0},{'a', 5210, 5206, {0}, 0},{'e', 5218, 5207, {0}, 0}, + {'y', 5226, 5208, {0}, 0},{'\0', 0, 5209, {0}, 0},{'r', 5212, 5210, {0}, 0}, + {'\0', 0, 5211, {0}, 0},{'o', 5214, 5212, {0}, 0},{'\0', 0, 5213, {0}, 0}, + {'n', 5216, 5214, {0}, 0},{'\0', 0, 5215, {0}, 0},{';', 0, 5216, {344}, 1}, + {'\0', 0, 5217, {0}, 0},{'d', 5220, 5218, {0}, 0},{'\0', 0, 5219, {0}, 0}, + {'i', 5222, 5220, {0}, 0},{'\0', 0, 5221, {0}, 0},{'l', 5224, 5222, {0}, 0}, + {'\0', 0, 5223, {0}, 0},{';', 0, 5224, {342}, 1},{'\0', 0, 5225, {0}, 0}, + {';', 0, 5226, {1056}, 1},{'\0', 0, 5227, {0}, 0},{';', 0, 5228, {8476}, 1}, + {'v', 5231, 5229, {0}, 0},{'\0', 0, 5230, {0}, 0},{'e', 5233, 5231, {0}, 0}, + {'\0', 0, 5232, {0}, 0},{'r', 5235, 5233, {0}, 0},{'\0', 0, 5234, {0}, 0}, + {'s', 5237, 5235, {0}, 0},{'\0', 0, 5236, {0}, 0},{'e', 5239, 5237, {0}, 0}, + {'\0', 0, 5238, {0}, 0},{'E', 5242, 5239, {0}, 0},{'U', 5277, 5240, {0}, 0}, + {'\0', 0, 5241, {0}, 0},{'l', 5245, 5242, {0}, 0},{'q', 5257, 5243, {0}, 0}, + {'\0', 0, 5244, {0}, 0},{'e', 5247, 5245, {0}, 0},{'\0', 0, 5246, {0}, 0}, + {'m', 5249, 5247, {0}, 0},{'\0', 0, 5248, {0}, 0},{'e', 5251, 5249, {0}, 0}, + {'\0', 0, 5250, {0}, 0},{'n', 5253, 5251, {0}, 0},{'\0', 0, 5252, {0}, 0}, + {'t', 5255, 5253, {0}, 0},{'\0', 0, 5254, {0}, 0},{';', 0, 5255, {8715}, 1}, + {'\0', 0, 5256, {0}, 0},{'u', 5259, 5257, {0}, 0},{'\0', 0, 5258, {0}, 0}, + {'i', 5261, 5259, {0}, 0},{'\0', 0, 5260, {0}, 0},{'l', 5263, 5261, {0}, 0}, + {'\0', 0, 5262, {0}, 0},{'i', 5265, 5263, {0}, 0},{'\0', 0, 5264, {0}, 0}, + {'b', 5267, 5265, {0}, 0},{'\0', 0, 5266, {0}, 0},{'r', 5269, 5267, {0}, 0}, + {'\0', 0, 5268, {0}, 0},{'i', 5271, 5269, {0}, 0},{'\0', 0, 5270, {0}, 0}, + {'u', 5273, 5271, {0}, 0},{'\0', 0, 5272, {0}, 0},{'m', 5275, 5273, {0}, 0}, + {'\0', 0, 5274, {0}, 0},{';', 0, 5275, {8651}, 1},{'\0', 0, 5276, {0}, 0}, + {'p', 5279, 5277, {0}, 0},{'\0', 0, 5278, {0}, 0},{'E', 5281, 5279, {0}, 0}, + {'\0', 0, 5280, {0}, 0},{'q', 5283, 5281, {0}, 0},{'\0', 0, 5282, {0}, 0}, + {'u', 5285, 5283, {0}, 0},{'\0', 0, 5284, {0}, 0},{'i', 5287, 5285, {0}, 0}, + {'\0', 0, 5286, {0}, 0},{'l', 5289, 5287, {0}, 0},{'\0', 0, 5288, {0}, 0}, + {'i', 5291, 5289, {0}, 0},{'\0', 0, 5290, {0}, 0},{'b', 5293, 5291, {0}, 0}, + {'\0', 0, 5292, {0}, 0},{'r', 5295, 5293, {0}, 0},{'\0', 0, 5294, {0}, 0}, + {'i', 5297, 5295, {0}, 0},{'\0', 0, 5296, {0}, 0},{'u', 5299, 5297, {0}, 0}, + {'\0', 0, 5298, {0}, 0},{'m', 5301, 5299, {0}, 0},{'\0', 0, 5300, {0}, 0}, + {';', 0, 5301, {10607}, 1},{'\0', 0, 5302, {0}, 0},{'r', 5305, 5303, {0}, 0}, + {'\0', 0, 5304, {0}, 0},{';', 0, 5305, {8476}, 1},{'\0', 0, 5306, {0}, 0}, + {'o', 5309, 5307, {0}, 0},{'\0', 0, 5308, {0}, 0},{';', 0, 5309, {929}, 1}, + {'\0', 0, 5310, {0}, 0},{'g', 5313, 5311, {0}, 0},{'\0', 0, 5312, {0}, 0}, + {'h', 5315, 5313, {0}, 0},{'\0', 0, 5314, {0}, 0},{'t', 5317, 5315, {0}, 0}, + {'\0', 0, 5316, {0}, 0},{'A', 5326, 5317, {0}, 0},{'C', 5385, 5318, {0}, 0}, + {'D', 5399, 5319, {0}, 0},{'F', 5468, 5320, {0}, 0},{'T', 5478, 5321, {0}, 0}, + {'U', 5541, 5322, {0}, 0},{'V', 5604, 5323, {0}, 0},{'a', 5623, 5324, {0}, 0}, + {'\0', 0, 5325, {0}, 0},{'n', 5329, 5326, {0}, 0},{'r', 5351, 5327, {0}, 0}, + {'\0', 0, 5328, {0}, 0},{'g', 5331, 5329, {0}, 0},{'\0', 0, 5330, {0}, 0}, + {'l', 5333, 5331, {0}, 0},{'\0', 0, 5332, {0}, 0},{'e', 5335, 5333, {0}, 0}, + {'\0', 0, 5334, {0}, 0},{'B', 5337, 5335, {0}, 0},{'\0', 0, 5336, {0}, 0}, + {'r', 5339, 5337, {0}, 0},{'\0', 0, 5338, {0}, 0},{'a', 5341, 5339, {0}, 0}, + {'\0', 0, 5340, {0}, 0},{'c', 5343, 5341, {0}, 0},{'\0', 0, 5342, {0}, 0}, + {'k', 5345, 5343, {0}, 0},{'\0', 0, 5344, {0}, 0},{'e', 5347, 5345, {0}, 0}, + {'\0', 0, 5346, {0}, 0},{'t', 5349, 5347, {0}, 0},{'\0', 0, 5348, {0}, 0}, + {';', 0, 5349, {10217}, 1},{'\0', 0, 5350, {0}, 0},{'r', 5353, 5351, {0}, 0}, + {'\0', 0, 5352, {0}, 0},{'o', 5355, 5353, {0}, 0},{'\0', 0, 5354, {0}, 0}, + {'w', 5357, 5355, {0}, 0},{'\0', 0, 5356, {0}, 0},{';', 0, 5357, {8594}, 1}, + {'B', 5361, 5358, {0}, 0},{'L', 5367, 5359, {0}, 0},{'\0', 0, 5360, {0}, 0}, + {'a', 5363, 5361, {0}, 0},{'\0', 0, 5362, {0}, 0},{'r', 5365, 5363, {0}, 0}, + {'\0', 0, 5364, {0}, 0},{';', 0, 5365, {8677}, 1},{'\0', 0, 5366, {0}, 0}, + {'e', 5369, 5367, {0}, 0},{'\0', 0, 5368, {0}, 0},{'f', 5371, 5369, {0}, 0}, + {'\0', 0, 5370, {0}, 0},{'t', 5373, 5371, {0}, 0},{'\0', 0, 5372, {0}, 0}, + {'A', 5375, 5373, {0}, 0},{'\0', 0, 5374, {0}, 0},{'r', 5377, 5375, {0}, 0}, + {'\0', 0, 5376, {0}, 0},{'r', 5379, 5377, {0}, 0},{'\0', 0, 5378, {0}, 0}, + {'o', 5381, 5379, {0}, 0},{'\0', 0, 5380, {0}, 0},{'w', 5383, 5381, {0}, 0}, + {'\0', 0, 5382, {0}, 0},{';', 0, 5383, {8644}, 1},{'\0', 0, 5384, {0}, 0}, + {'e', 5387, 5385, {0}, 0},{'\0', 0, 5386, {0}, 0},{'i', 5389, 5387, {0}, 0}, + {'\0', 0, 5388, {0}, 0},{'l', 5391, 5389, {0}, 0},{'\0', 0, 5390, {0}, 0}, + {'i', 5393, 5391, {0}, 0},{'\0', 0, 5392, {0}, 0},{'n', 5395, 5393, {0}, 0}, + {'\0', 0, 5394, {0}, 0},{'g', 5397, 5395, {0}, 0},{'\0', 0, 5396, {0}, 0}, + {';', 0, 5397, {8969}, 1},{'\0', 0, 5398, {0}, 0},{'o', 5401, 5399, {0}, 0}, + {'\0', 0, 5400, {0}, 0},{'u', 5404, 5401, {0}, 0},{'w', 5426, 5402, {0}, 0}, + {'\0', 0, 5403, {0}, 0},{'b', 5406, 5404, {0}, 0},{'\0', 0, 5405, {0}, 0}, + {'l', 5408, 5406, {0}, 0},{'\0', 0, 5407, {0}, 0},{'e', 5410, 5408, {0}, 0}, + {'\0', 0, 5409, {0}, 0},{'B', 5412, 5410, {0}, 0},{'\0', 0, 5411, {0}, 0}, + {'r', 5414, 5412, {0}, 0},{'\0', 0, 5413, {0}, 0},{'a', 5416, 5414, {0}, 0}, + {'\0', 0, 5415, {0}, 0},{'c', 5418, 5416, {0}, 0},{'\0', 0, 5417, {0}, 0}, + {'k', 5420, 5418, {0}, 0},{'\0', 0, 5419, {0}, 0},{'e', 5422, 5420, {0}, 0}, + {'\0', 0, 5421, {0}, 0},{'t', 5424, 5422, {0}, 0},{'\0', 0, 5423, {0}, 0}, + {';', 0, 5424, {10215}, 1},{'\0', 0, 5425, {0}, 0},{'n', 5428, 5426, {0}, 0}, + {'\0', 0, 5427, {0}, 0},{'T', 5431, 5428, {0}, 0},{'V', 5449, 5429, {0}, 0}, + {'\0', 0, 5430, {0}, 0},{'e', 5433, 5431, {0}, 0},{'\0', 0, 5432, {0}, 0}, + {'e', 5435, 5433, {0}, 0},{'\0', 0, 5434, {0}, 0},{'V', 5437, 5435, {0}, 0}, + {'\0', 0, 5436, {0}, 0},{'e', 5439, 5437, {0}, 0},{'\0', 0, 5438, {0}, 0}, + {'c', 5441, 5439, {0}, 0},{'\0', 0, 5440, {0}, 0},{'t', 5443, 5441, {0}, 0}, + {'\0', 0, 5442, {0}, 0},{'o', 5445, 5443, {0}, 0},{'\0', 0, 5444, {0}, 0}, + {'r', 5447, 5445, {0}, 0},{'\0', 0, 5446, {0}, 0},{';', 0, 5447, {10589}, 1}, + {'\0', 0, 5448, {0}, 0},{'e', 5451, 5449, {0}, 0},{'\0', 0, 5450, {0}, 0}, + {'c', 5453, 5451, {0}, 0},{'\0', 0, 5452, {0}, 0},{'t', 5455, 5453, {0}, 0}, + {'\0', 0, 5454, {0}, 0},{'o', 5457, 5455, {0}, 0},{'\0', 0, 5456, {0}, 0}, + {'r', 5459, 5457, {0}, 0},{'\0', 0, 5458, {0}, 0},{';', 0, 5459, {8642}, 1}, + {'B', 5462, 5460, {0}, 0},{'\0', 0, 5461, {0}, 0},{'a', 5464, 5462, {0}, 0}, + {'\0', 0, 5463, {0}, 0},{'r', 5466, 5464, {0}, 0},{'\0', 0, 5465, {0}, 0}, + {';', 0, 5466, {10581}, 1},{'\0', 0, 5467, {0}, 0},{'l', 5470, 5468, {0}, 0}, + {'\0', 0, 5469, {0}, 0},{'o', 5472, 5470, {0}, 0},{'\0', 0, 5471, {0}, 0}, + {'o', 5474, 5472, {0}, 0},{'\0', 0, 5473, {0}, 0},{'r', 5476, 5474, {0}, 0}, + {'\0', 0, 5475, {0}, 0},{';', 0, 5476, {8971}, 1},{'\0', 0, 5477, {0}, 0}, + {'e', 5481, 5478, {0}, 0},{'r', 5509, 5479, {0}, 0},{'\0', 0, 5480, {0}, 0}, + {'e', 5483, 5481, {0}, 0},{'\0', 0, 5482, {0}, 0},{';', 0, 5483, {8866}, 1}, + {'A', 5487, 5484, {0}, 0},{'V', 5497, 5485, {0}, 0},{'\0', 0, 5486, {0}, 0}, + {'r', 5489, 5487, {0}, 0},{'\0', 0, 5488, {0}, 0},{'r', 5491, 5489, {0}, 0}, + {'\0', 0, 5490, {0}, 0},{'o', 5493, 5491, {0}, 0},{'\0', 0, 5492, {0}, 0}, + {'w', 5495, 5493, {0}, 0},{'\0', 0, 5494, {0}, 0},{';', 0, 5495, {8614}, 1}, + {'\0', 0, 5496, {0}, 0},{'e', 5499, 5497, {0}, 0},{'\0', 0, 5498, {0}, 0}, + {'c', 5501, 5499, {0}, 0},{'\0', 0, 5500, {0}, 0},{'t', 5503, 5501, {0}, 0}, + {'\0', 0, 5502, {0}, 0},{'o', 5505, 5503, {0}, 0},{'\0', 0, 5504, {0}, 0}, + {'r', 5507, 5505, {0}, 0},{'\0', 0, 5506, {0}, 0},{';', 0, 5507, {10587}, 1}, + {'\0', 0, 5508, {0}, 0},{'i', 5511, 5509, {0}, 0},{'\0', 0, 5510, {0}, 0}, + {'a', 5513, 5511, {0}, 0},{'\0', 0, 5512, {0}, 0},{'n', 5515, 5513, {0}, 0}, + {'\0', 0, 5514, {0}, 0},{'g', 5517, 5515, {0}, 0},{'\0', 0, 5516, {0}, 0}, + {'l', 5519, 5517, {0}, 0},{'\0', 0, 5518, {0}, 0},{'e', 5521, 5519, {0}, 0}, + {'\0', 0, 5520, {0}, 0},{';', 0, 5521, {8883}, 1},{'B', 5525, 5522, {0}, 0}, + {'E', 5531, 5523, {0}, 0},{'\0', 0, 5524, {0}, 0},{'a', 5527, 5525, {0}, 0}, + {'\0', 0, 5526, {0}, 0},{'r', 5529, 5527, {0}, 0},{'\0', 0, 5528, {0}, 0}, + {';', 0, 5529, {10704}, 1},{'\0', 0, 5530, {0}, 0},{'q', 5533, 5531, {0}, 0}, + {'\0', 0, 5532, {0}, 0},{'u', 5535, 5533, {0}, 0},{'\0', 0, 5534, {0}, 0}, + {'a', 5537, 5535, {0}, 0},{'\0', 0, 5536, {0}, 0},{'l', 5539, 5537, {0}, 0}, + {'\0', 0, 5538, {0}, 0},{';', 0, 5539, {8885}, 1},{'\0', 0, 5540, {0}, 0}, + {'p', 5543, 5541, {0}, 0},{'\0', 0, 5542, {0}, 0},{'D', 5547, 5543, {0}, 0}, + {'T', 5567, 5544, {0}, 0},{'V', 5585, 5545, {0}, 0},{'\0', 0, 5546, {0}, 0}, + {'o', 5549, 5547, {0}, 0},{'\0', 0, 5548, {0}, 0},{'w', 5551, 5549, {0}, 0}, + {'\0', 0, 5550, {0}, 0},{'n', 5553, 5551, {0}, 0},{'\0', 0, 5552, {0}, 0}, + {'V', 5555, 5553, {0}, 0},{'\0', 0, 5554, {0}, 0},{'e', 5557, 5555, {0}, 0}, + {'\0', 0, 5556, {0}, 0},{'c', 5559, 5557, {0}, 0},{'\0', 0, 5558, {0}, 0}, + {'t', 5561, 5559, {0}, 0},{'\0', 0, 5560, {0}, 0},{'o', 5563, 5561, {0}, 0}, + {'\0', 0, 5562, {0}, 0},{'r', 5565, 5563, {0}, 0},{'\0', 0, 5564, {0}, 0}, + {';', 0, 5565, {10575}, 1},{'\0', 0, 5566, {0}, 0},{'e', 5569, 5567, {0}, 0}, + {'\0', 0, 5568, {0}, 0},{'e', 5571, 5569, {0}, 0},{'\0', 0, 5570, {0}, 0}, + {'V', 5573, 5571, {0}, 0},{'\0', 0, 5572, {0}, 0},{'e', 5575, 5573, {0}, 0}, + {'\0', 0, 5574, {0}, 0},{'c', 5577, 5575, {0}, 0},{'\0', 0, 5576, {0}, 0}, + {'t', 5579, 5577, {0}, 0},{'\0', 0, 5578, {0}, 0},{'o', 5581, 5579, {0}, 0}, + {'\0', 0, 5580, {0}, 0},{'r', 5583, 5581, {0}, 0},{'\0', 0, 5582, {0}, 0}, + {';', 0, 5583, {10588}, 1},{'\0', 0, 5584, {0}, 0},{'e', 5587, 5585, {0}, 0}, + {'\0', 0, 5586, {0}, 0},{'c', 5589, 5587, {0}, 0},{'\0', 0, 5588, {0}, 0}, + {'t', 5591, 5589, {0}, 0},{'\0', 0, 5590, {0}, 0},{'o', 5593, 5591, {0}, 0}, + {'\0', 0, 5592, {0}, 0},{'r', 5595, 5593, {0}, 0},{'\0', 0, 5594, {0}, 0}, + {';', 0, 5595, {8638}, 1},{'B', 5598, 5596, {0}, 0},{'\0', 0, 5597, {0}, 0}, + {'a', 5600, 5598, {0}, 0},{'\0', 0, 5599, {0}, 0},{'r', 5602, 5600, {0}, 0}, + {'\0', 0, 5601, {0}, 0},{';', 0, 5602, {10580}, 1},{'\0', 0, 5603, {0}, 0}, + {'e', 5606, 5604, {0}, 0},{'\0', 0, 5605, {0}, 0},{'c', 5608, 5606, {0}, 0}, + {'\0', 0, 5607, {0}, 0},{'t', 5610, 5608, {0}, 0},{'\0', 0, 5609, {0}, 0}, + {'o', 5612, 5610, {0}, 0},{'\0', 0, 5611, {0}, 0},{'r', 5614, 5612, {0}, 0}, + {'\0', 0, 5613, {0}, 0},{';', 0, 5614, {8640}, 1},{'B', 5617, 5615, {0}, 0}, + {'\0', 0, 5616, {0}, 0},{'a', 5619, 5617, {0}, 0},{'\0', 0, 5618, {0}, 0}, + {'r', 5621, 5619, {0}, 0},{'\0', 0, 5620, {0}, 0},{';', 0, 5621, {10579}, 1}, + {'\0', 0, 5622, {0}, 0},{'r', 5625, 5623, {0}, 0},{'\0', 0, 5624, {0}, 0}, + {'r', 5627, 5625, {0}, 0},{'\0', 0, 5626, {0}, 0},{'o', 5629, 5627, {0}, 0}, + {'\0', 0, 5628, {0}, 0},{'w', 5631, 5629, {0}, 0},{'\0', 0, 5630, {0}, 0}, + {';', 0, 5631, {8658}, 1},{'\0', 0, 5632, {0}, 0},{'p', 5636, 5633, {0}, 0}, + {'u', 5640, 5634, {0}, 0},{'\0', 0, 5635, {0}, 0},{'f', 5638, 5636, {0}, 0}, + {'\0', 0, 5637, {0}, 0},{';', 0, 5638, {8477}, 1},{'\0', 0, 5639, {0}, 0}, + {'n', 5642, 5640, {0}, 0},{'\0', 0, 5641, {0}, 0},{'d', 5644, 5642, {0}, 0}, + {'\0', 0, 5643, {0}, 0},{'I', 5646, 5644, {0}, 0},{'\0', 0, 5645, {0}, 0}, + {'m', 5648, 5646, {0}, 0},{'\0', 0, 5647, {0}, 0},{'p', 5650, 5648, {0}, 0}, + {'\0', 0, 5649, {0}, 0},{'l', 5652, 5650, {0}, 0},{'\0', 0, 5651, {0}, 0}, + {'i', 5654, 5652, {0}, 0},{'\0', 0, 5653, {0}, 0},{'e', 5656, 5654, {0}, 0}, + {'\0', 0, 5655, {0}, 0},{'s', 5658, 5656, {0}, 0},{'\0', 0, 5657, {0}, 0}, + {';', 0, 5658, {10608}, 1},{'\0', 0, 5659, {0}, 0},{'i', 5662, 5660, {0}, 0}, + {'\0', 0, 5661, {0}, 0},{'g', 5664, 5662, {0}, 0},{'\0', 0, 5663, {0}, 0}, + {'h', 5666, 5664, {0}, 0},{'\0', 0, 5665, {0}, 0},{'t', 5668, 5666, {0}, 0}, + {'\0', 0, 5667, {0}, 0},{'a', 5670, 5668, {0}, 0},{'\0', 0, 5669, {0}, 0}, + {'r', 5672, 5670, {0}, 0},{'\0', 0, 5671, {0}, 0},{'r', 5674, 5672, {0}, 0}, + {'\0', 0, 5673, {0}, 0},{'o', 5676, 5674, {0}, 0},{'\0', 0, 5675, {0}, 0}, + {'w', 5678, 5676, {0}, 0},{'\0', 0, 5677, {0}, 0},{';', 0, 5678, {8667}, 1}, + {'\0', 0, 5679, {0}, 0},{'c', 5683, 5680, {0}, 0},{'h', 5687, 5681, {0}, 0}, + {'\0', 0, 5682, {0}, 0},{'r', 5685, 5683, {0}, 0},{'\0', 0, 5684, {0}, 0}, + {';', 0, 5685, {8475}, 1},{'\0', 0, 5686, {0}, 0},{';', 0, 5687, {8625}, 1}, + {'\0', 0, 5688, {0}, 0},{'l', 5691, 5689, {0}, 0},{'\0', 0, 5690, {0}, 0}, + {'e', 5693, 5691, {0}, 0},{'\0', 0, 5692, {0}, 0},{'D', 5695, 5693, {0}, 0}, + {'\0', 0, 5694, {0}, 0},{'e', 5697, 5695, {0}, 0},{'\0', 0, 5696, {0}, 0}, + {'l', 5699, 5697, {0}, 0},{'\0', 0, 5698, {0}, 0},{'a', 5701, 5699, {0}, 0}, + {'\0', 0, 5700, {0}, 0},{'y', 5703, 5701, {0}, 0},{'\0', 0, 5702, {0}, 0}, + {'e', 5705, 5703, {0}, 0},{'\0', 0, 5704, {0}, 0},{'d', 5707, 5705, {0}, 0}, + {'\0', 0, 5706, {0}, 0},{';', 0, 5707, {10740}, 1},{'\0', 0, 5708, {0}, 0}, + {'H', 5723, 5709, {0}, 0},{'O', 5738, 5710, {0}, 0},{'a', 5748, 5711, {0}, 0}, + {'c', 5758, 5712, {0}, 0},{'f', 5788, 5713, {0}, 0},{'h', 5792, 5714, {0}, 0}, + {'i', 5873, 5715, {0}, 0},{'m', 5881, 5716, {0}, 0},{'o', 5901, 5717, {0}, 0}, + {'q', 5907, 5718, {0}, 0},{'s', 6006, 5719, {0}, 0},{'t', 6012, 5720, {0}, 0}, + {'u', 6018, 5721, {0}, 0},{'\0', 0, 5722, {0}, 0},{'C', 5726, 5723, {0}, 0}, + {'c', 5734, 5724, {0}, 0},{'\0', 0, 5725, {0}, 0},{'H', 5728, 5726, {0}, 0}, + {'\0', 0, 5727, {0}, 0},{'c', 5730, 5728, {0}, 0},{'\0', 0, 5729, {0}, 0}, + {'y', 5732, 5730, {0}, 0},{'\0', 0, 5731, {0}, 0},{';', 0, 5732, {1065}, 1}, + {'\0', 0, 5733, {0}, 0},{'y', 5736, 5734, {0}, 0},{'\0', 0, 5735, {0}, 0}, + {';', 0, 5736, {1064}, 1},{'\0', 0, 5737, {0}, 0},{'F', 5740, 5738, {0}, 0}, + {'\0', 0, 5739, {0}, 0},{'T', 5742, 5740, {0}, 0},{'\0', 0, 5741, {0}, 0}, + {'c', 5744, 5742, {0}, 0},{'\0', 0, 5743, {0}, 0},{'y', 5746, 5744, {0}, 0}, + {'\0', 0, 5745, {0}, 0},{';', 0, 5746, {1068}, 1},{'\0', 0, 5747, {0}, 0}, + {'c', 5750, 5748, {0}, 0},{'\0', 0, 5749, {0}, 0},{'u', 5752, 5750, {0}, 0}, + {'\0', 0, 5751, {0}, 0},{'t', 5754, 5752, {0}, 0},{'\0', 0, 5753, {0}, 0}, + {'e', 5756, 5754, {0}, 0},{'\0', 0, 5755, {0}, 0},{';', 0, 5756, {346}, 1}, + {'\0', 0, 5757, {0}, 0},{';', 0, 5758, {10940}, 1},{'a', 5764, 5759, {0}, 0}, + {'e', 5772, 5760, {0}, 0},{'i', 5780, 5761, {0}, 0},{'y', 5786, 5762, {0}, 0}, + {'\0', 0, 5763, {0}, 0},{'r', 5766, 5764, {0}, 0},{'\0', 0, 5765, {0}, 0}, + {'o', 5768, 5766, {0}, 0},{'\0', 0, 5767, {0}, 0},{'n', 5770, 5768, {0}, 0}, + {'\0', 0, 5769, {0}, 0},{';', 0, 5770, {352}, 1},{'\0', 0, 5771, {0}, 0}, + {'d', 5774, 5772, {0}, 0},{'\0', 0, 5773, {0}, 0},{'i', 5776, 5774, {0}, 0}, + {'\0', 0, 5775, {0}, 0},{'l', 5778, 5776, {0}, 0},{'\0', 0, 5777, {0}, 0}, + {';', 0, 5778, {350}, 1},{'\0', 0, 5779, {0}, 0},{'r', 5782, 5780, {0}, 0}, + {'\0', 0, 5781, {0}, 0},{'c', 5784, 5782, {0}, 0},{'\0', 0, 5783, {0}, 0}, + {';', 0, 5784, {348}, 1},{'\0', 0, 5785, {0}, 0},{';', 0, 5786, {1057}, 1}, + {'\0', 0, 5787, {0}, 0},{'r', 5790, 5788, {0}, 0},{'\0', 0, 5789, {0}, 0}, + {';', 0, 5790, {120086}, 1},{'\0', 0, 5791, {0}, 0},{'o', 5794, 5792, {0}, 0}, + {'\0', 0, 5793, {0}, 0},{'r', 5796, 5794, {0}, 0},{'\0', 0, 5795, {0}, 0}, + {'t', 5798, 5796, {0}, 0},{'\0', 0, 5797, {0}, 0},{'D', 5803, 5798, {0}, 0}, + {'L', 5821, 5799, {0}, 0},{'R', 5839, 5800, {0}, 0},{'U', 5859, 5801, {0}, 0}, + {'\0', 0, 5802, {0}, 0},{'o', 5805, 5803, {0}, 0},{'\0', 0, 5804, {0}, 0}, + {'w', 5807, 5805, {0}, 0},{'\0', 0, 5806, {0}, 0},{'n', 5809, 5807, {0}, 0}, + {'\0', 0, 5808, {0}, 0},{'A', 5811, 5809, {0}, 0},{'\0', 0, 5810, {0}, 0}, + {'r', 5813, 5811, {0}, 0},{'\0', 0, 5812, {0}, 0},{'r', 5815, 5813, {0}, 0}, + {'\0', 0, 5814, {0}, 0},{'o', 5817, 5815, {0}, 0},{'\0', 0, 5816, {0}, 0}, + {'w', 5819, 5817, {0}, 0},{'\0', 0, 5818, {0}, 0},{';', 0, 5819, {8595}, 1}, + {'\0', 0, 5820, {0}, 0},{'e', 5823, 5821, {0}, 0},{'\0', 0, 5822, {0}, 0}, + {'f', 5825, 5823, {0}, 0},{'\0', 0, 5824, {0}, 0},{'t', 5827, 5825, {0}, 0}, + {'\0', 0, 5826, {0}, 0},{'A', 5829, 5827, {0}, 0},{'\0', 0, 5828, {0}, 0}, + {'r', 5831, 5829, {0}, 0},{'\0', 0, 5830, {0}, 0},{'r', 5833, 5831, {0}, 0}, + {'\0', 0, 5832, {0}, 0},{'o', 5835, 5833, {0}, 0},{'\0', 0, 5834, {0}, 0}, + {'w', 5837, 5835, {0}, 0},{'\0', 0, 5836, {0}, 0},{';', 0, 5837, {8592}, 1}, + {'\0', 0, 5838, {0}, 0},{'i', 5841, 5839, {0}, 0},{'\0', 0, 5840, {0}, 0}, + {'g', 5843, 5841, {0}, 0},{'\0', 0, 5842, {0}, 0},{'h', 5845, 5843, {0}, 0}, + {'\0', 0, 5844, {0}, 0},{'t', 5847, 5845, {0}, 0},{'\0', 0, 5846, {0}, 0}, + {'A', 5849, 5847, {0}, 0},{'\0', 0, 5848, {0}, 0},{'r', 5851, 5849, {0}, 0}, + {'\0', 0, 5850, {0}, 0},{'r', 5853, 5851, {0}, 0},{'\0', 0, 5852, {0}, 0}, + {'o', 5855, 5853, {0}, 0},{'\0', 0, 5854, {0}, 0},{'w', 5857, 5855, {0}, 0}, + {'\0', 0, 5856, {0}, 0},{';', 0, 5857, {8594}, 1},{'\0', 0, 5858, {0}, 0}, + {'p', 5861, 5859, {0}, 0},{'\0', 0, 5860, {0}, 0},{'A', 5863, 5861, {0}, 0}, + {'\0', 0, 5862, {0}, 0},{'r', 5865, 5863, {0}, 0},{'\0', 0, 5864, {0}, 0}, + {'r', 5867, 5865, {0}, 0},{'\0', 0, 5866, {0}, 0},{'o', 5869, 5867, {0}, 0}, + {'\0', 0, 5868, {0}, 0},{'w', 5871, 5869, {0}, 0},{'\0', 0, 5870, {0}, 0}, + {';', 0, 5871, {8593}, 1},{'\0', 0, 5872, {0}, 0},{'g', 5875, 5873, {0}, 0}, + {'\0', 0, 5874, {0}, 0},{'m', 5877, 5875, {0}, 0},{'\0', 0, 5876, {0}, 0}, + {'a', 5879, 5877, {0}, 0},{'\0', 0, 5878, {0}, 0},{';', 0, 5879, {931}, 1}, + {'\0', 0, 5880, {0}, 0},{'a', 5883, 5881, {0}, 0},{'\0', 0, 5882, {0}, 0}, + {'l', 5885, 5883, {0}, 0},{'\0', 0, 5884, {0}, 0},{'l', 5887, 5885, {0}, 0}, + {'\0', 0, 5886, {0}, 0},{'C', 5889, 5887, {0}, 0},{'\0', 0, 5888, {0}, 0}, + {'i', 5891, 5889, {0}, 0},{'\0', 0, 5890, {0}, 0},{'r', 5893, 5891, {0}, 0}, + {'\0', 0, 5892, {0}, 0},{'c', 5895, 5893, {0}, 0},{'\0', 0, 5894, {0}, 0}, + {'l', 5897, 5895, {0}, 0},{'\0', 0, 5896, {0}, 0},{'e', 5899, 5897, {0}, 0}, + {'\0', 0, 5898, {0}, 0},{';', 0, 5899, {8728}, 1},{'\0', 0, 5900, {0}, 0}, + {'p', 5903, 5901, {0}, 0},{'\0', 0, 5902, {0}, 0},{'f', 5905, 5903, {0}, 0}, + {'\0', 0, 5904, {0}, 0},{';', 0, 5905, {120138}, 1},{'\0', 0, 5906, {0}, 0}, + {'r', 5910, 5907, {0}, 0},{'u', 5914, 5908, {0}, 0},{'\0', 0, 5909, {0}, 0}, + {'t', 5912, 5910, {0}, 0},{'\0', 0, 5911, {0}, 0},{';', 0, 5912, {8730}, 1}, + {'\0', 0, 5913, {0}, 0},{'a', 5916, 5914, {0}, 0},{'\0', 0, 5915, {0}, 0}, + {'r', 5918, 5916, {0}, 0},{'\0', 0, 5917, {0}, 0},{'e', 5920, 5918, {0}, 0}, + {'\0', 0, 5919, {0}, 0},{';', 0, 5920, {9633}, 1},{'I', 5925, 5921, {0}, 0}, + {'S', 5949, 5922, {0}, 0},{'U', 5996, 5923, {0}, 0},{'\0', 0, 5924, {0}, 0}, + {'n', 5927, 5925, {0}, 0},{'\0', 0, 5926, {0}, 0},{'t', 5929, 5927, {0}, 0}, + {'\0', 0, 5928, {0}, 0},{'e', 5931, 5929, {0}, 0},{'\0', 0, 5930, {0}, 0}, + {'r', 5933, 5931, {0}, 0},{'\0', 0, 5932, {0}, 0},{'s', 5935, 5933, {0}, 0}, + {'\0', 0, 5934, {0}, 0},{'e', 5937, 5935, {0}, 0},{'\0', 0, 5936, {0}, 0}, + {'c', 5939, 5937, {0}, 0},{'\0', 0, 5938, {0}, 0},{'t', 5941, 5939, {0}, 0}, + {'\0', 0, 5940, {0}, 0},{'i', 5943, 5941, {0}, 0},{'\0', 0, 5942, {0}, 0}, + {'o', 5945, 5943, {0}, 0},{'\0', 0, 5944, {0}, 0},{'n', 5947, 5945, {0}, 0}, + {'\0', 0, 5946, {0}, 0},{';', 0, 5947, {8851}, 1},{'\0', 0, 5948, {0}, 0}, + {'u', 5951, 5949, {0}, 0},{'\0', 0, 5950, {0}, 0},{'b', 5954, 5951, {0}, 0}, + {'p', 5973, 5952, {0}, 0},{'\0', 0, 5953, {0}, 0},{'s', 5956, 5954, {0}, 0}, + {'\0', 0, 5955, {0}, 0},{'e', 5958, 5956, {0}, 0},{'\0', 0, 5957, {0}, 0}, + {'t', 5960, 5958, {0}, 0},{'\0', 0, 5959, {0}, 0},{';', 0, 5960, {8847}, 1}, + {'E', 5963, 5961, {0}, 0},{'\0', 0, 5962, {0}, 0},{'q', 5965, 5963, {0}, 0}, + {'\0', 0, 5964, {0}, 0},{'u', 5967, 5965, {0}, 0},{'\0', 0, 5966, {0}, 0}, + {'a', 5969, 5967, {0}, 0},{'\0', 0, 5968, {0}, 0},{'l', 5971, 5969, {0}, 0}, + {'\0', 0, 5970, {0}, 0},{';', 0, 5971, {8849}, 1},{'\0', 0, 5972, {0}, 0}, + {'e', 5975, 5973, {0}, 0},{'\0', 0, 5974, {0}, 0},{'r', 5977, 5975, {0}, 0}, + {'\0', 0, 5976, {0}, 0},{'s', 5979, 5977, {0}, 0},{'\0', 0, 5978, {0}, 0}, + {'e', 5981, 5979, {0}, 0},{'\0', 0, 5980, {0}, 0},{'t', 5983, 5981, {0}, 0}, + {'\0', 0, 5982, {0}, 0},{';', 0, 5983, {8848}, 1},{'E', 5986, 5984, {0}, 0}, + {'\0', 0, 5985, {0}, 0},{'q', 5988, 5986, {0}, 0},{'\0', 0, 5987, {0}, 0}, + {'u', 5990, 5988, {0}, 0},{'\0', 0, 5989, {0}, 0},{'a', 5992, 5990, {0}, 0}, + {'\0', 0, 5991, {0}, 0},{'l', 5994, 5992, {0}, 0},{'\0', 0, 5993, {0}, 0}, + {';', 0, 5994, {8850}, 1},{'\0', 0, 5995, {0}, 0},{'n', 5998, 5996, {0}, 0}, + {'\0', 0, 5997, {0}, 0},{'i', 6000, 5998, {0}, 0},{'\0', 0, 5999, {0}, 0}, + {'o', 6002, 6000, {0}, 0},{'\0', 0, 6001, {0}, 0},{'n', 6004, 6002, {0}, 0}, + {'\0', 0, 6003, {0}, 0},{';', 0, 6004, {8852}, 1},{'\0', 0, 6005, {0}, 0}, + {'c', 6008, 6006, {0}, 0},{'\0', 0, 6007, {0}, 0},{'r', 6010, 6008, {0}, 0}, + {'\0', 0, 6009, {0}, 0},{';', 0, 6010, {119982}, 1},{'\0', 0, 6011, {0}, 0}, + {'a', 6014, 6012, {0}, 0},{'\0', 0, 6013, {0}, 0},{'r', 6016, 6014, {0}, 0}, + {'\0', 0, 6015, {0}, 0},{';', 0, 6016, {8902}, 1},{'\0', 0, 6017, {0}, 0}, + {'b', 6023, 6018, {0}, 0},{'c', 6043, 6019, {0}, 0},{'m', 6109, 6020, {0}, 0}, + {'p', 6111, 6021, {0}, 0},{'\0', 0, 6022, {0}, 0},{';', 0, 6023, {8912}, 1}, + {'s', 6026, 6024, {0}, 0},{'\0', 0, 6025, {0}, 0},{'e', 6028, 6026, {0}, 0}, + {'\0', 0, 6027, {0}, 0},{'t', 6030, 6028, {0}, 0},{'\0', 0, 6029, {0}, 0}, + {';', 0, 6030, {8912}, 1},{'E', 6033, 6031, {0}, 0},{'\0', 0, 6032, {0}, 0}, + {'q', 6035, 6033, {0}, 0},{'\0', 0, 6034, {0}, 0},{'u', 6037, 6035, {0}, 0}, + {'\0', 0, 6036, {0}, 0},{'a', 6039, 6037, {0}, 0},{'\0', 0, 6038, {0}, 0}, + {'l', 6041, 6039, {0}, 0},{'\0', 0, 6040, {0}, 0},{';', 0, 6041, {8838}, 1}, + {'\0', 0, 6042, {0}, 0},{'c', 6046, 6043, {0}, 0},{'h', 6099, 6044, {0}, 0}, + {'\0', 0, 6045, {0}, 0},{'e', 6048, 6046, {0}, 0},{'\0', 0, 6047, {0}, 0}, + {'e', 6050, 6048, {0}, 0},{'\0', 0, 6049, {0}, 0},{'d', 6052, 6050, {0}, 0}, + {'\0', 0, 6051, {0}, 0},{'s', 6054, 6052, {0}, 0},{'\0', 0, 6053, {0}, 0}, + {';', 0, 6054, {8827}, 1},{'E', 6059, 6055, {0}, 0},{'S', 6069, 6056, {0}, 0}, + {'T', 6089, 6057, {0}, 0},{'\0', 0, 6058, {0}, 0},{'q', 6061, 6059, {0}, 0}, + {'\0', 0, 6060, {0}, 0},{'u', 6063, 6061, {0}, 0},{'\0', 0, 6062, {0}, 0}, + {'a', 6065, 6063, {0}, 0},{'\0', 0, 6064, {0}, 0},{'l', 6067, 6065, {0}, 0}, + {'\0', 0, 6066, {0}, 0},{';', 0, 6067, {10928}, 1},{'\0', 0, 6068, {0}, 0}, + {'l', 6071, 6069, {0}, 0},{'\0', 0, 6070, {0}, 0},{'a', 6073, 6071, {0}, 0}, + {'\0', 0, 6072, {0}, 0},{'n', 6075, 6073, {0}, 0},{'\0', 0, 6074, {0}, 0}, + {'t', 6077, 6075, {0}, 0},{'\0', 0, 6076, {0}, 0},{'E', 6079, 6077, {0}, 0}, + {'\0', 0, 6078, {0}, 0},{'q', 6081, 6079, {0}, 0},{'\0', 0, 6080, {0}, 0}, + {'u', 6083, 6081, {0}, 0},{'\0', 0, 6082, {0}, 0},{'a', 6085, 6083, {0}, 0}, + {'\0', 0, 6084, {0}, 0},{'l', 6087, 6085, {0}, 0},{'\0', 0, 6086, {0}, 0}, + {';', 0, 6087, {8829}, 1},{'\0', 0, 6088, {0}, 0},{'i', 6091, 6089, {0}, 0}, + {'\0', 0, 6090, {0}, 0},{'l', 6093, 6091, {0}, 0},{'\0', 0, 6092, {0}, 0}, + {'d', 6095, 6093, {0}, 0},{'\0', 0, 6094, {0}, 0},{'e', 6097, 6095, {0}, 0}, + {'\0', 0, 6096, {0}, 0},{';', 0, 6097, {8831}, 1},{'\0', 0, 6098, {0}, 0}, + {'T', 6101, 6099, {0}, 0},{'\0', 0, 6100, {0}, 0},{'h', 6103, 6101, {0}, 0}, + {'\0', 0, 6102, {0}, 0},{'a', 6105, 6103, {0}, 0},{'\0', 0, 6104, {0}, 0}, + {'t', 6107, 6105, {0}, 0},{'\0', 0, 6106, {0}, 0},{';', 0, 6107, {8715}, 1}, + {'\0', 0, 6108, {0}, 0},{';', 0, 6109, {8721}, 1},{'\0', 0, 6110, {0}, 0}, + {';', 0, 6111, {8913}, 1},{'e', 6115, 6112, {0}, 0},{'s', 6136, 6113, {0}, 0}, + {'\0', 0, 6114, {0}, 0},{'r', 6117, 6115, {0}, 0},{'\0', 0, 6116, {0}, 0}, + {'s', 6119, 6117, {0}, 0},{'\0', 0, 6118, {0}, 0},{'e', 6121, 6119, {0}, 0}, + {'\0', 0, 6120, {0}, 0},{'t', 6123, 6121, {0}, 0},{'\0', 0, 6122, {0}, 0}, + {';', 0, 6123, {8835}, 1},{'E', 6126, 6124, {0}, 0},{'\0', 0, 6125, {0}, 0}, + {'q', 6128, 6126, {0}, 0},{'\0', 0, 6127, {0}, 0},{'u', 6130, 6128, {0}, 0}, + {'\0', 0, 6129, {0}, 0},{'a', 6132, 6130, {0}, 0},{'\0', 0, 6131, {0}, 0}, + {'l', 6134, 6132, {0}, 0},{'\0', 0, 6133, {0}, 0},{';', 0, 6134, {8839}, 1}, + {'\0', 0, 6135, {0}, 0},{'e', 6138, 6136, {0}, 0},{'\0', 0, 6137, {0}, 0}, + {'t', 6140, 6138, {0}, 0},{'\0', 0, 6139, {0}, 0},{';', 0, 6140, {8913}, 1}, + {'\0', 0, 6141, {0}, 0},{'H', 6154, 6142, {0}, 0},{'R', 6162, 6143, {0}, 0}, + {'S', 6170, 6144, {0}, 0},{'a', 6183, 6145, {0}, 0},{'c', 6190, 6146, {0}, 0}, + {'f', 6212, 6147, {0}, 0},{'h', 6216, 6148, {0}, 0},{'i', 6267, 6149, {0}, 0}, + {'o', 6316, 6150, {0}, 0},{'r', 6322, 6151, {0}, 0},{'s', 6338, 6152, {0}, 0}, + {'\0', 0, 6153, {0}, 0},{'O', 6156, 6154, {0}, 0},{'\0', 0, 6155, {0}, 0}, + {'R', 6158, 6156, {0}, 0},{'\0', 0, 6157, {0}, 0},{'N', 6160, 6158, {222}, 1}, + {'\0', 0, 6159, {0}, 0},{';', 0, 6160, {222}, 1},{'\0', 0, 6161, {0}, 0}, + {'A', 6164, 6162, {0}, 0},{'\0', 0, 6163, {0}, 0},{'D', 6166, 6164, {0}, 0}, + {'\0', 0, 6165, {0}, 0},{'E', 6168, 6166, {0}, 0},{'\0', 0, 6167, {0}, 0}, + {';', 0, 6168, {8482}, 1},{'\0', 0, 6169, {0}, 0},{'H', 6173, 6170, {0}, 0}, + {'c', 6179, 6171, {0}, 0},{'\0', 0, 6172, {0}, 0},{'c', 6175, 6173, {0}, 0}, + {'\0', 0, 6174, {0}, 0},{'y', 6177, 6175, {0}, 0},{'\0', 0, 6176, {0}, 0}, + {';', 0, 6177, {1035}, 1},{'\0', 0, 6178, {0}, 0},{'y', 6181, 6179, {0}, 0}, + {'\0', 0, 6180, {0}, 0},{';', 0, 6181, {1062}, 1},{'\0', 0, 6182, {0}, 0}, + {'b', 6186, 6183, {0}, 0},{'u', 6188, 6184, {0}, 0},{'\0', 0, 6185, {0}, 0}, + {';', 0, 6186, {9}, 1},{'\0', 0, 6187, {0}, 0},{';', 0, 6188, {932}, 1}, + {'\0', 0, 6189, {0}, 0},{'a', 6194, 6190, {0}, 0},{'e', 6202, 6191, {0}, 0}, + {'y', 6210, 6192, {0}, 0},{'\0', 0, 6193, {0}, 0},{'r', 6196, 6194, {0}, 0}, + {'\0', 0, 6195, {0}, 0},{'o', 6198, 6196, {0}, 0},{'\0', 0, 6197, {0}, 0}, + {'n', 6200, 6198, {0}, 0},{'\0', 0, 6199, {0}, 0},{';', 0, 6200, {356}, 1}, + {'\0', 0, 6201, {0}, 0},{'d', 6204, 6202, {0}, 0},{'\0', 0, 6203, {0}, 0}, + {'i', 6206, 6204, {0}, 0},{'\0', 0, 6205, {0}, 0},{'l', 6208, 6206, {0}, 0}, + {'\0', 0, 6207, {0}, 0},{';', 0, 6208, {354}, 1},{'\0', 0, 6209, {0}, 0}, + {';', 0, 6210, {1058}, 1},{'\0', 0, 6211, {0}, 0},{'r', 6214, 6212, {0}, 0}, + {'\0', 0, 6213, {0}, 0},{';', 0, 6214, {120087}, 1},{'\0', 0, 6215, {0}, 0}, + {'e', 6219, 6216, {0}, 0},{'i', 6238, 6217, {0}, 0},{'\0', 0, 6218, {0}, 0}, + {'r', 6222, 6219, {0}, 0},{'t', 6234, 6220, {0}, 0},{'\0', 0, 6221, {0}, 0}, + {'e', 6224, 6222, {0}, 0},{'\0', 0, 6223, {0}, 0},{'f', 6226, 6224, {0}, 0}, + {'\0', 0, 6225, {0}, 0},{'o', 6228, 6226, {0}, 0},{'\0', 0, 6227, {0}, 0}, + {'r', 6230, 6228, {0}, 0},{'\0', 0, 6229, {0}, 0},{'e', 6232, 6230, {0}, 0}, + {'\0', 0, 6231, {0}, 0},{';', 0, 6232, {8756}, 1},{'\0', 0, 6233, {0}, 0}, + {'a', 6236, 6234, {0}, 0},{'\0', 0, 6235, {0}, 0},{';', 0, 6236, {920}, 1}, + {'\0', 0, 6237, {0}, 0},{'c', 6241, 6238, {0}, 0},{'n', 6255, 6239, {0}, 0}, + {'\0', 0, 6240, {0}, 0},{'k', 6243, 6241, {0}, 0},{'\0', 0, 6242, {0}, 0}, + {'S', 6245, 6243, {0}, 0},{'\0', 0, 6244, {0}, 0},{'p', 6247, 6245, {0}, 0}, + {'\0', 0, 6246, {0}, 0},{'a', 6249, 6247, {0}, 0},{'\0', 0, 6248, {0}, 0}, + {'c', 6251, 6249, {0}, 0},{'\0', 0, 6250, {0}, 0},{'e', 6253, 6251, {0}, 0}, + {'\0', 0, 6252, {0}, 0},{';', 0, 6253, {8287,8202}, 2},{'\0', 0, 6254, {0}, 0}, + {'S', 6257, 6255, {0}, 0},{'\0', 0, 6256, {0}, 0},{'p', 6259, 6257, {0}, 0}, + {'\0', 0, 6258, {0}, 0},{'a', 6261, 6259, {0}, 0},{'\0', 0, 6260, {0}, 0}, + {'c', 6263, 6261, {0}, 0},{'\0', 0, 6262, {0}, 0},{'e', 6265, 6263, {0}, 0}, + {'\0', 0, 6264, {0}, 0},{';', 0, 6265, {8201}, 1},{'\0', 0, 6266, {0}, 0}, + {'l', 6269, 6267, {0}, 0},{'\0', 0, 6268, {0}, 0},{'d', 6271, 6269, {0}, 0}, + {'\0', 0, 6270, {0}, 0},{'e', 6273, 6271, {0}, 0},{'\0', 0, 6272, {0}, 0}, + {';', 0, 6273, {8764}, 1},{'E', 6278, 6274, {0}, 0},{'F', 6288, 6275, {0}, 0}, + {'T', 6306, 6276, {0}, 0},{'\0', 0, 6277, {0}, 0},{'q', 6280, 6278, {0}, 0}, + {'\0', 0, 6279, {0}, 0},{'u', 6282, 6280, {0}, 0},{'\0', 0, 6281, {0}, 0}, + {'a', 6284, 6282, {0}, 0},{'\0', 0, 6283, {0}, 0},{'l', 6286, 6284, {0}, 0}, + {'\0', 0, 6285, {0}, 0},{';', 0, 6286, {8771}, 1},{'\0', 0, 6287, {0}, 0}, + {'u', 6290, 6288, {0}, 0},{'\0', 0, 6289, {0}, 0},{'l', 6292, 6290, {0}, 0}, + {'\0', 0, 6291, {0}, 0},{'l', 6294, 6292, {0}, 0},{'\0', 0, 6293, {0}, 0}, + {'E', 6296, 6294, {0}, 0},{'\0', 0, 6295, {0}, 0},{'q', 6298, 6296, {0}, 0}, + {'\0', 0, 6297, {0}, 0},{'u', 6300, 6298, {0}, 0},{'\0', 0, 6299, {0}, 0}, + {'a', 6302, 6300, {0}, 0},{'\0', 0, 6301, {0}, 0},{'l', 6304, 6302, {0}, 0}, + {'\0', 0, 6303, {0}, 0},{';', 0, 6304, {8773}, 1},{'\0', 0, 6305, {0}, 0}, + {'i', 6308, 6306, {0}, 0},{'\0', 0, 6307, {0}, 0},{'l', 6310, 6308, {0}, 0}, + {'\0', 0, 6309, {0}, 0},{'d', 6312, 6310, {0}, 0},{'\0', 0, 6311, {0}, 0}, + {'e', 6314, 6312, {0}, 0},{'\0', 0, 6313, {0}, 0},{';', 0, 6314, {8776}, 1}, + {'\0', 0, 6315, {0}, 0},{'p', 6318, 6316, {0}, 0},{'\0', 0, 6317, {0}, 0}, + {'f', 6320, 6318, {0}, 0},{'\0', 0, 6319, {0}, 0},{';', 0, 6320, {120139}, 1}, + {'\0', 0, 6321, {0}, 0},{'i', 6324, 6322, {0}, 0},{'\0', 0, 6323, {0}, 0}, + {'p', 6326, 6324, {0}, 0},{'\0', 0, 6325, {0}, 0},{'l', 6328, 6326, {0}, 0}, + {'\0', 0, 6327, {0}, 0},{'e', 6330, 6328, {0}, 0},{'\0', 0, 6329, {0}, 0}, + {'D', 6332, 6330, {0}, 0},{'\0', 0, 6331, {0}, 0},{'o', 6334, 6332, {0}, 0}, + {'\0', 0, 6333, {0}, 0},{'t', 6336, 6334, {0}, 0},{'\0', 0, 6335, {0}, 0}, + {';', 0, 6336, {8411}, 1},{'\0', 0, 6337, {0}, 0},{'c', 6341, 6338, {0}, 0}, + {'t', 6345, 6339, {0}, 0},{'\0', 0, 6340, {0}, 0},{'r', 6343, 6341, {0}, 0}, + {'\0', 0, 6342, {0}, 0},{';', 0, 6343, {119983}, 1},{'\0', 0, 6344, {0}, 0}, + {'r', 6347, 6345, {0}, 0},{'\0', 0, 6346, {0}, 0},{'o', 6349, 6347, {0}, 0}, + {'\0', 0, 6348, {0}, 0},{'k', 6351, 6349, {0}, 0},{'\0', 0, 6350, {0}, 0}, + {';', 0, 6351, {358}, 1},{'\0', 0, 6352, {0}, 0},{'a', 6368, 6353, {0}, 0}, + {'b', 6392, 6354, {0}, 0},{'c', 6407, 6355, {0}, 0},{'d', 6418, 6356, {0}, 0}, + {'f', 6428, 6357, {0}, 0},{'g', 6432, 6358, {0}, 0},{'m', 6442, 6359, {0}, 0}, + {'n', 6450, 6360, {0}, 0},{'o', 6519, 6361, {0}, 0},{'p', 6532, 6362, {0}, 0}, + {'r', 6718, 6363, {0}, 0},{'s', 6726, 6364, {0}, 0},{'t', 6732, 6365, {0}, 0}, + {'u', 6742, 6366, {0}, 0},{'\0', 0, 6367, {0}, 0},{'c', 6371, 6368, {0}, 0}, + {'r', 6379, 6369, {0}, 0},{'\0', 0, 6370, {0}, 0},{'u', 6373, 6371, {0}, 0}, + {'\0', 0, 6372, {0}, 0},{'t', 6375, 6373, {0}, 0},{'\0', 0, 6374, {0}, 0}, + {'e', 6377, 6375, {218}, 1},{'\0', 0, 6376, {0}, 0},{';', 0, 6377, {218}, 1}, + {'\0', 0, 6378, {0}, 0},{'r', 6381, 6379, {0}, 0},{'\0', 0, 6380, {0}, 0}, + {';', 0, 6381, {8607}, 1},{'o', 6384, 6382, {0}, 0},{'\0', 0, 6383, {0}, 0}, + {'c', 6386, 6384, {0}, 0},{'\0', 0, 6385, {0}, 0},{'i', 6388, 6386, {0}, 0}, + {'\0', 0, 6387, {0}, 0},{'r', 6390, 6388, {0}, 0},{'\0', 0, 6389, {0}, 0}, + {';', 0, 6390, {10569}, 1},{'\0', 0, 6391, {0}, 0},{'r', 6394, 6392, {0}, 0}, + {'\0', 0, 6393, {0}, 0},{'c', 6397, 6394, {0}, 0},{'e', 6401, 6395, {0}, 0}, + {'\0', 0, 6396, {0}, 0},{'y', 6399, 6397, {0}, 0},{'\0', 0, 6398, {0}, 0}, + {';', 0, 6399, {1038}, 1},{'\0', 0, 6400, {0}, 0},{'v', 6403, 6401, {0}, 0}, + {'\0', 0, 6402, {0}, 0},{'e', 6405, 6403, {0}, 0},{'\0', 0, 6404, {0}, 0}, + {';', 0, 6405, {364}, 1},{'\0', 0, 6406, {0}, 0},{'i', 6410, 6407, {0}, 0}, + {'y', 6416, 6408, {0}, 0},{'\0', 0, 6409, {0}, 0},{'r', 6412, 6410, {0}, 0}, + {'\0', 0, 6411, {0}, 0},{'c', 6414, 6412, {219}, 1},{'\0', 0, 6413, {0}, 0}, + {';', 0, 6414, {219}, 1},{'\0', 0, 6415, {0}, 0},{';', 0, 6416, {1059}, 1}, + {'\0', 0, 6417, {0}, 0},{'b', 6420, 6418, {0}, 0},{'\0', 0, 6419, {0}, 0}, + {'l', 6422, 6420, {0}, 0},{'\0', 0, 6421, {0}, 0},{'a', 6424, 6422, {0}, 0}, + {'\0', 0, 6423, {0}, 0},{'c', 6426, 6424, {0}, 0},{'\0', 0, 6425, {0}, 0}, + {';', 0, 6426, {368}, 1},{'\0', 0, 6427, {0}, 0},{'r', 6430, 6428, {0}, 0}, + {'\0', 0, 6429, {0}, 0},{';', 0, 6430, {120088}, 1},{'\0', 0, 6431, {0}, 0}, + {'r', 6434, 6432, {0}, 0},{'\0', 0, 6433, {0}, 0},{'a', 6436, 6434, {0}, 0}, + {'\0', 0, 6435, {0}, 0},{'v', 6438, 6436, {0}, 0},{'\0', 0, 6437, {0}, 0}, + {'e', 6440, 6438, {217}, 1},{'\0', 0, 6439, {0}, 0},{';', 0, 6440, {217}, 1}, + {'\0', 0, 6441, {0}, 0},{'a', 6444, 6442, {0}, 0},{'\0', 0, 6443, {0}, 0}, + {'c', 6446, 6444, {0}, 0},{'\0', 0, 6445, {0}, 0},{'r', 6448, 6446, {0}, 0}, + {'\0', 0, 6447, {0}, 0},{';', 0, 6448, {362}, 1},{'\0', 0, 6449, {0}, 0}, + {'d', 6453, 6450, {0}, 0},{'i', 6504, 6451, {0}, 0},{'\0', 0, 6452, {0}, 0}, + {'e', 6455, 6453, {0}, 0},{'\0', 0, 6454, {0}, 0},{'r', 6457, 6455, {0}, 0}, + {'\0', 0, 6456, {0}, 0},{'B', 6460, 6457, {0}, 0},{'P', 6482, 6458, {0}, 0}, + {'\0', 0, 6459, {0}, 0},{'a', 6463, 6460, {0}, 0},{'r', 6467, 6461, {0}, 0}, + {'\0', 0, 6462, {0}, 0},{'r', 6465, 6463, {0}, 0},{'\0', 0, 6464, {0}, 0}, + {';', 0, 6465, {95}, 1},{'\0', 0, 6466, {0}, 0},{'a', 6469, 6467, {0}, 0}, + {'\0', 0, 6468, {0}, 0},{'c', 6471, 6469, {0}, 0},{'\0', 0, 6470, {0}, 0}, + {'e', 6474, 6471, {0}, 0},{'k', 6476, 6472, {0}, 0},{'\0', 0, 6473, {0}, 0}, + {';', 0, 6474, {9183}, 1},{'\0', 0, 6475, {0}, 0},{'e', 6478, 6476, {0}, 0}, + {'\0', 0, 6477, {0}, 0},{'t', 6480, 6478, {0}, 0},{'\0', 0, 6479, {0}, 0}, + {';', 0, 6480, {9141}, 1},{'\0', 0, 6481, {0}, 0},{'a', 6484, 6482, {0}, 0}, + {'\0', 0, 6483, {0}, 0},{'r', 6486, 6484, {0}, 0},{'\0', 0, 6485, {0}, 0}, + {'e', 6488, 6486, {0}, 0},{'\0', 0, 6487, {0}, 0},{'n', 6490, 6488, {0}, 0}, + {'\0', 0, 6489, {0}, 0},{'t', 6492, 6490, {0}, 0},{'\0', 0, 6491, {0}, 0}, + {'h', 6494, 6492, {0}, 0},{'\0', 0, 6493, {0}, 0},{'e', 6496, 6494, {0}, 0}, + {'\0', 0, 6495, {0}, 0},{'s', 6498, 6496, {0}, 0},{'\0', 0, 6497, {0}, 0}, + {'i', 6500, 6498, {0}, 0},{'\0', 0, 6499, {0}, 0},{'s', 6502, 6500, {0}, 0}, + {'\0', 0, 6501, {0}, 0},{';', 0, 6502, {9181}, 1},{'\0', 0, 6503, {0}, 0}, + {'o', 6506, 6504, {0}, 0},{'\0', 0, 6505, {0}, 0},{'n', 6508, 6506, {0}, 0}, + {'\0', 0, 6507, {0}, 0},{';', 0, 6508, {8899}, 1},{'P', 6511, 6509, {0}, 0}, + {'\0', 0, 6510, {0}, 0},{'l', 6513, 6511, {0}, 0},{'\0', 0, 6512, {0}, 0}, + {'u', 6515, 6513, {0}, 0},{'\0', 0, 6514, {0}, 0},{'s', 6517, 6515, {0}, 0}, + {'\0', 0, 6516, {0}, 0},{';', 0, 6517, {8846}, 1},{'\0', 0, 6518, {0}, 0}, + {'g', 6522, 6519, {0}, 0},{'p', 6528, 6520, {0}, 0},{'\0', 0, 6521, {0}, 0}, + {'o', 6524, 6522, {0}, 0},{'\0', 0, 6523, {0}, 0},{'n', 6526, 6524, {0}, 0}, + {'\0', 0, 6525, {0}, 0},{';', 0, 6526, {370}, 1},{'\0', 0, 6527, {0}, 0}, + {'f', 6530, 6528, {0}, 0},{'\0', 0, 6529, {0}, 0},{';', 0, 6530, {120140}, 1}, + {'\0', 0, 6531, {0}, 0},{'A', 6541, 6532, {0}, 0},{'D', 6577, 6533, {0}, 0}, + {'E', 6595, 6534, {0}, 0},{'T', 6617, 6535, {0}, 0},{'a', 6634, 6536, {0}, 0}, + {'d', 6644, 6537, {0}, 0},{'p', 6662, 6538, {0}, 0},{'s', 6707, 6539, {0}, 0}, + {'\0', 0, 6540, {0}, 0},{'r', 6543, 6541, {0}, 0},{'\0', 0, 6542, {0}, 0}, + {'r', 6545, 6543, {0}, 0},{'\0', 0, 6544, {0}, 0},{'o', 6547, 6545, {0}, 0}, + {'\0', 0, 6546, {0}, 0},{'w', 6549, 6547, {0}, 0},{'\0', 0, 6548, {0}, 0}, + {';', 0, 6549, {8593}, 1},{'B', 6553, 6550, {0}, 0},{'D', 6559, 6551, {0}, 0}, + {'\0', 0, 6552, {0}, 0},{'a', 6555, 6553, {0}, 0},{'\0', 0, 6554, {0}, 0}, + {'r', 6557, 6555, {0}, 0},{'\0', 0, 6556, {0}, 0},{';', 0, 6557, {10514}, 1}, + {'\0', 0, 6558, {0}, 0},{'o', 6561, 6559, {0}, 0},{'\0', 0, 6560, {0}, 0}, + {'w', 6563, 6561, {0}, 0},{'\0', 0, 6562, {0}, 0},{'n', 6565, 6563, {0}, 0}, + {'\0', 0, 6564, {0}, 0},{'A', 6567, 6565, {0}, 0},{'\0', 0, 6566, {0}, 0}, + {'r', 6569, 6567, {0}, 0},{'\0', 0, 6568, {0}, 0},{'r', 6571, 6569, {0}, 0}, + {'\0', 0, 6570, {0}, 0},{'o', 6573, 6571, {0}, 0},{'\0', 0, 6572, {0}, 0}, + {'w', 6575, 6573, {0}, 0},{'\0', 0, 6574, {0}, 0},{';', 0, 6575, {8645}, 1}, + {'\0', 0, 6576, {0}, 0},{'o', 6579, 6577, {0}, 0},{'\0', 0, 6578, {0}, 0}, + {'w', 6581, 6579, {0}, 0},{'\0', 0, 6580, {0}, 0},{'n', 6583, 6581, {0}, 0}, + {'\0', 0, 6582, {0}, 0},{'A', 6585, 6583, {0}, 0},{'\0', 0, 6584, {0}, 0}, + {'r', 6587, 6585, {0}, 0},{'\0', 0, 6586, {0}, 0},{'r', 6589, 6587, {0}, 0}, + {'\0', 0, 6588, {0}, 0},{'o', 6591, 6589, {0}, 0},{'\0', 0, 6590, {0}, 0}, + {'w', 6593, 6591, {0}, 0},{'\0', 0, 6592, {0}, 0},{';', 0, 6593, {8597}, 1}, + {'\0', 0, 6594, {0}, 0},{'q', 6597, 6595, {0}, 0},{'\0', 0, 6596, {0}, 0}, + {'u', 6599, 6597, {0}, 0},{'\0', 0, 6598, {0}, 0},{'i', 6601, 6599, {0}, 0}, + {'\0', 0, 6600, {0}, 0},{'l', 6603, 6601, {0}, 0},{'\0', 0, 6602, {0}, 0}, + {'i', 6605, 6603, {0}, 0},{'\0', 0, 6604, {0}, 0},{'b', 6607, 6605, {0}, 0}, + {'\0', 0, 6606, {0}, 0},{'r', 6609, 6607, {0}, 0},{'\0', 0, 6608, {0}, 0}, + {'i', 6611, 6609, {0}, 0},{'\0', 0, 6610, {0}, 0},{'u', 6613, 6611, {0}, 0}, + {'\0', 0, 6612, {0}, 0},{'m', 6615, 6613, {0}, 0},{'\0', 0, 6614, {0}, 0}, + {';', 0, 6615, {10606}, 1},{'\0', 0, 6616, {0}, 0},{'e', 6619, 6617, {0}, 0}, + {'\0', 0, 6618, {0}, 0},{'e', 6621, 6619, {0}, 0},{'\0', 0, 6620, {0}, 0}, + {';', 0, 6621, {8869}, 1},{'A', 6624, 6622, {0}, 0},{'\0', 0, 6623, {0}, 0}, + {'r', 6626, 6624, {0}, 0},{'\0', 0, 6625, {0}, 0},{'r', 6628, 6626, {0}, 0}, + {'\0', 0, 6627, {0}, 0},{'o', 6630, 6628, {0}, 0},{'\0', 0, 6629, {0}, 0}, + {'w', 6632, 6630, {0}, 0},{'\0', 0, 6631, {0}, 0},{';', 0, 6632, {8613}, 1}, + {'\0', 0, 6633, {0}, 0},{'r', 6636, 6634, {0}, 0},{'\0', 0, 6635, {0}, 0}, + {'r', 6638, 6636, {0}, 0},{'\0', 0, 6637, {0}, 0},{'o', 6640, 6638, {0}, 0}, + {'\0', 0, 6639, {0}, 0},{'w', 6642, 6640, {0}, 0},{'\0', 0, 6641, {0}, 0}, + {';', 0, 6642, {8657}, 1},{'\0', 0, 6643, {0}, 0},{'o', 6646, 6644, {0}, 0}, + {'\0', 0, 6645, {0}, 0},{'w', 6648, 6646, {0}, 0},{'\0', 0, 6647, {0}, 0}, + {'n', 6650, 6648, {0}, 0},{'\0', 0, 6649, {0}, 0},{'a', 6652, 6650, {0}, 0}, + {'\0', 0, 6651, {0}, 0},{'r', 6654, 6652, {0}, 0},{'\0', 0, 6653, {0}, 0}, + {'r', 6656, 6654, {0}, 0},{'\0', 0, 6655, {0}, 0},{'o', 6658, 6656, {0}, 0}, + {'\0', 0, 6657, {0}, 0},{'w', 6660, 6658, {0}, 0},{'\0', 0, 6659, {0}, 0}, + {';', 0, 6660, {8661}, 1},{'\0', 0, 6661, {0}, 0},{'e', 6664, 6662, {0}, 0}, + {'\0', 0, 6663, {0}, 0},{'r', 6666, 6664, {0}, 0},{'\0', 0, 6665, {0}, 0}, + {'L', 6669, 6666, {0}, 0},{'R', 6687, 6667, {0}, 0},{'\0', 0, 6668, {0}, 0}, + {'e', 6671, 6669, {0}, 0},{'\0', 0, 6670, {0}, 0},{'f', 6673, 6671, {0}, 0}, + {'\0', 0, 6672, {0}, 0},{'t', 6675, 6673, {0}, 0},{'\0', 0, 6674, {0}, 0}, + {'A', 6677, 6675, {0}, 0},{'\0', 0, 6676, {0}, 0},{'r', 6679, 6677, {0}, 0}, + {'\0', 0, 6678, {0}, 0},{'r', 6681, 6679, {0}, 0},{'\0', 0, 6680, {0}, 0}, + {'o', 6683, 6681, {0}, 0},{'\0', 0, 6682, {0}, 0},{'w', 6685, 6683, {0}, 0}, + {'\0', 0, 6684, {0}, 0},{';', 0, 6685, {8598}, 1},{'\0', 0, 6686, {0}, 0}, + {'i', 6689, 6687, {0}, 0},{'\0', 0, 6688, {0}, 0},{'g', 6691, 6689, {0}, 0}, + {'\0', 0, 6690, {0}, 0},{'h', 6693, 6691, {0}, 0},{'\0', 0, 6692, {0}, 0}, + {'t', 6695, 6693, {0}, 0},{'\0', 0, 6694, {0}, 0},{'A', 6697, 6695, {0}, 0}, + {'\0', 0, 6696, {0}, 0},{'r', 6699, 6697, {0}, 0},{'\0', 0, 6698, {0}, 0}, + {'r', 6701, 6699, {0}, 0},{'\0', 0, 6700, {0}, 0},{'o', 6703, 6701, {0}, 0}, + {'\0', 0, 6702, {0}, 0},{'w', 6705, 6703, {0}, 0},{'\0', 0, 6704, {0}, 0}, + {';', 0, 6705, {8599}, 1},{'\0', 0, 6706, {0}, 0},{'i', 6709, 6707, {0}, 0}, + {'\0', 0, 6708, {0}, 0},{';', 0, 6709, {978}, 1},{'l', 6712, 6710, {0}, 0}, + {'\0', 0, 6711, {0}, 0},{'o', 6714, 6712, {0}, 0},{'\0', 0, 6713, {0}, 0}, + {'n', 6716, 6714, {0}, 0},{'\0', 0, 6715, {0}, 0},{';', 0, 6716, {933}, 1}, + {'\0', 0, 6717, {0}, 0},{'i', 6720, 6718, {0}, 0},{'\0', 0, 6719, {0}, 0}, + {'n', 6722, 6720, {0}, 0},{'\0', 0, 6721, {0}, 0},{'g', 6724, 6722, {0}, 0}, + {'\0', 0, 6723, {0}, 0},{';', 0, 6724, {366}, 1},{'\0', 0, 6725, {0}, 0}, + {'c', 6728, 6726, {0}, 0},{'\0', 0, 6727, {0}, 0},{'r', 6730, 6728, {0}, 0}, + {'\0', 0, 6729, {0}, 0},{';', 0, 6730, {119984}, 1},{'\0', 0, 6731, {0}, 0}, + {'i', 6734, 6732, {0}, 0},{'\0', 0, 6733, {0}, 0},{'l', 6736, 6734, {0}, 0}, + {'\0', 0, 6735, {0}, 0},{'d', 6738, 6736, {0}, 0},{'\0', 0, 6737, {0}, 0}, + {'e', 6740, 6738, {0}, 0},{'\0', 0, 6739, {0}, 0},{';', 0, 6740, {360}, 1}, + {'\0', 0, 6741, {0}, 0},{'m', 6744, 6742, {0}, 0},{'\0', 0, 6743, {0}, 0}, + {'l', 6746, 6744, {220}, 1},{'\0', 0, 6745, {0}, 0},{';', 0, 6746, {220}, 1}, + {'\0', 0, 6747, {0}, 0},{'D', 6758, 6748, {0}, 0},{'b', 6766, 6749, {0}, 0}, + {'c', 6772, 6750, {0}, 0},{'d', 6776, 6751, {0}, 0},{'e', 6787, 6752, {0}, 0}, + {'f', 6878, 6753, {0}, 0},{'o', 6882, 6754, {0}, 0},{'s', 6888, 6755, {0}, 0}, + {'v', 6894, 6756, {0}, 0},{'\0', 0, 6757, {0}, 0},{'a', 6760, 6758, {0}, 0}, + {'\0', 0, 6759, {0}, 0},{'s', 6762, 6760, {0}, 0},{'\0', 0, 6761, {0}, 0}, + {'h', 6764, 6762, {0}, 0},{'\0', 0, 6763, {0}, 0},{';', 0, 6764, {8875}, 1}, + {'\0', 0, 6765, {0}, 0},{'a', 6768, 6766, {0}, 0},{'\0', 0, 6767, {0}, 0}, + {'r', 6770, 6768, {0}, 0},{'\0', 0, 6769, {0}, 0},{';', 0, 6770, {10987}, 1}, + {'\0', 0, 6771, {0}, 0},{'y', 6774, 6772, {0}, 0},{'\0', 0, 6773, {0}, 0}, + {';', 0, 6774, {1042}, 1},{'\0', 0, 6775, {0}, 0},{'a', 6778, 6776, {0}, 0}, + {'\0', 0, 6777, {0}, 0},{'s', 6780, 6778, {0}, 0},{'\0', 0, 6779, {0}, 0}, + {'h', 6782, 6780, {0}, 0},{'\0', 0, 6781, {0}, 0},{';', 0, 6782, {8873}, 1}, + {'l', 6785, 6783, {0}, 0},{'\0', 0, 6784, {0}, 0},{';', 0, 6785, {10982}, 1}, + {'\0', 0, 6786, {0}, 0},{'e', 6790, 6787, {0}, 0},{'r', 6792, 6788, {0}, 0}, + {'\0', 0, 6789, {0}, 0},{';', 0, 6790, {8897}, 1},{'\0', 0, 6791, {0}, 0}, + {'b', 6796, 6792, {0}, 0},{'t', 6802, 6793, {0}, 0},{'y', 6858, 6794, {0}, 0}, + {'\0', 0, 6795, {0}, 0},{'a', 6798, 6796, {0}, 0},{'\0', 0, 6797, {0}, 0}, + {'r', 6800, 6798, {0}, 0},{'\0', 0, 6799, {0}, 0},{';', 0, 6800, {8214}, 1}, + {'\0', 0, 6801, {0}, 0},{';', 0, 6802, {8214}, 1},{'i', 6805, 6803, {0}, 0}, + {'\0', 0, 6804, {0}, 0},{'c', 6807, 6805, {0}, 0},{'\0', 0, 6806, {0}, 0}, + {'a', 6809, 6807, {0}, 0},{'\0', 0, 6808, {0}, 0},{'l', 6811, 6809, {0}, 0}, + {'\0', 0, 6810, {0}, 0},{'B', 6816, 6811, {0}, 0},{'L', 6822, 6812, {0}, 0}, + {'S', 6830, 6813, {0}, 0},{'T', 6848, 6814, {0}, 0},{'\0', 0, 6815, {0}, 0}, + {'a', 6818, 6816, {0}, 0},{'\0', 0, 6817, {0}, 0},{'r', 6820, 6818, {0}, 0}, + {'\0', 0, 6819, {0}, 0},{';', 0, 6820, {8739}, 1},{'\0', 0, 6821, {0}, 0}, + {'i', 6824, 6822, {0}, 0},{'\0', 0, 6823, {0}, 0},{'n', 6826, 6824, {0}, 0}, + {'\0', 0, 6825, {0}, 0},{'e', 6828, 6826, {0}, 0},{'\0', 0, 6827, {0}, 0}, + {';', 0, 6828, {124}, 1},{'\0', 0, 6829, {0}, 0},{'e', 6832, 6830, {0}, 0}, + {'\0', 0, 6831, {0}, 0},{'p', 6834, 6832, {0}, 0},{'\0', 0, 6833, {0}, 0}, + {'a', 6836, 6834, {0}, 0},{'\0', 0, 6835, {0}, 0},{'r', 6838, 6836, {0}, 0}, + {'\0', 0, 6837, {0}, 0},{'a', 6840, 6838, {0}, 0},{'\0', 0, 6839, {0}, 0}, + {'t', 6842, 6840, {0}, 0},{'\0', 0, 6841, {0}, 0},{'o', 6844, 6842, {0}, 0}, + {'\0', 0, 6843, {0}, 0},{'r', 6846, 6844, {0}, 0},{'\0', 0, 6845, {0}, 0}, + {';', 0, 6846, {10072}, 1},{'\0', 0, 6847, {0}, 0},{'i', 6850, 6848, {0}, 0}, + {'\0', 0, 6849, {0}, 0},{'l', 6852, 6850, {0}, 0},{'\0', 0, 6851, {0}, 0}, + {'d', 6854, 6852, {0}, 0},{'\0', 0, 6853, {0}, 0},{'e', 6856, 6854, {0}, 0}, + {'\0', 0, 6855, {0}, 0},{';', 0, 6856, {8768}, 1},{'\0', 0, 6857, {0}, 0}, + {'T', 6860, 6858, {0}, 0},{'\0', 0, 6859, {0}, 0},{'h', 6862, 6860, {0}, 0}, + {'\0', 0, 6861, {0}, 0},{'i', 6864, 6862, {0}, 0},{'\0', 0, 6863, {0}, 0}, + {'n', 6866, 6864, {0}, 0},{'\0', 0, 6865, {0}, 0},{'S', 6868, 6866, {0}, 0}, + {'\0', 0, 6867, {0}, 0},{'p', 6870, 6868, {0}, 0},{'\0', 0, 6869, {0}, 0}, + {'a', 6872, 6870, {0}, 0},{'\0', 0, 6871, {0}, 0},{'c', 6874, 6872, {0}, 0}, + {'\0', 0, 6873, {0}, 0},{'e', 6876, 6874, {0}, 0},{'\0', 0, 6875, {0}, 0}, + {';', 0, 6876, {8202}, 1},{'\0', 0, 6877, {0}, 0},{'r', 6880, 6878, {0}, 0}, + {'\0', 0, 6879, {0}, 0},{';', 0, 6880, {120089}, 1},{'\0', 0, 6881, {0}, 0}, + {'p', 6884, 6882, {0}, 0},{'\0', 0, 6883, {0}, 0},{'f', 6886, 6884, {0}, 0}, + {'\0', 0, 6885, {0}, 0},{';', 0, 6886, {120141}, 1},{'\0', 0, 6887, {0}, 0}, + {'c', 6890, 6888, {0}, 0},{'\0', 0, 6889, {0}, 0},{'r', 6892, 6890, {0}, 0}, + {'\0', 0, 6891, {0}, 0},{';', 0, 6892, {119985}, 1},{'\0', 0, 6893, {0}, 0}, + {'d', 6896, 6894, {0}, 0},{'\0', 0, 6895, {0}, 0},{'a', 6898, 6896, {0}, 0}, + {'\0', 0, 6897, {0}, 0},{'s', 6900, 6898, {0}, 0},{'\0', 0, 6899, {0}, 0}, + {'h', 6902, 6900, {0}, 0},{'\0', 0, 6901, {0}, 0},{';', 0, 6902, {8874}, 1}, + {'\0', 0, 6903, {0}, 0},{'c', 6910, 6904, {0}, 0},{'e', 6918, 6905, {0}, 0}, + {'f', 6926, 6906, {0}, 0},{'o', 6930, 6907, {0}, 0},{'s', 6936, 6908, {0}, 0}, + {'\0', 0, 6909, {0}, 0},{'i', 6912, 6910, {0}, 0},{'\0', 0, 6911, {0}, 0}, + {'r', 6914, 6912, {0}, 0},{'\0', 0, 6913, {0}, 0},{'c', 6916, 6914, {0}, 0}, + {'\0', 0, 6915, {0}, 0},{';', 0, 6916, {372}, 1},{'\0', 0, 6917, {0}, 0}, + {'d', 6920, 6918, {0}, 0},{'\0', 0, 6919, {0}, 0},{'g', 6922, 6920, {0}, 0}, + {'\0', 0, 6921, {0}, 0},{'e', 6924, 6922, {0}, 0},{'\0', 0, 6923, {0}, 0}, + {';', 0, 6924, {8896}, 1},{'\0', 0, 6925, {0}, 0},{'r', 6928, 6926, {0}, 0}, + {'\0', 0, 6927, {0}, 0},{';', 0, 6928, {120090}, 1},{'\0', 0, 6929, {0}, 0}, + {'p', 6932, 6930, {0}, 0},{'\0', 0, 6931, {0}, 0},{'f', 6934, 6932, {0}, 0}, + {'\0', 0, 6933, {0}, 0},{';', 0, 6934, {120142}, 1},{'\0', 0, 6935, {0}, 0}, + {'c', 6938, 6936, {0}, 0},{'\0', 0, 6937, {0}, 0},{'r', 6940, 6938, {0}, 0}, + {'\0', 0, 6939, {0}, 0},{';', 0, 6940, {119986}, 1},{'\0', 0, 6941, {0}, 0}, + {'f', 6947, 6942, {0}, 0},{'i', 6951, 6943, {0}, 0},{'o', 6953, 6944, {0}, 0}, + {'s', 6959, 6945, {0}, 0},{'\0', 0, 6946, {0}, 0},{'r', 6949, 6947, {0}, 0}, + {'\0', 0, 6948, {0}, 0},{';', 0, 6949, {120091}, 1},{'\0', 0, 6950, {0}, 0}, + {';', 0, 6951, {926}, 1},{'\0', 0, 6952, {0}, 0},{'p', 6955, 6953, {0}, 0}, + {'\0', 0, 6954, {0}, 0},{'f', 6957, 6955, {0}, 0},{'\0', 0, 6956, {0}, 0}, + {';', 0, 6957, {120143}, 1},{'\0', 0, 6958, {0}, 0},{'c', 6961, 6959, {0}, 0}, + {'\0', 0, 6960, {0}, 0},{'r', 6963, 6961, {0}, 0},{'\0', 0, 6962, {0}, 0}, + {';', 0, 6963, {119987}, 1},{'\0', 0, 6964, {0}, 0},{'A', 6975, 6965, {0}, 0}, + {'I', 6981, 6966, {0}, 0},{'U', 6987, 6967, {0}, 0},{'a', 6993, 6968, {0}, 0}, + {'c', 7003, 6969, {0}, 0},{'f', 7014, 6970, {0}, 0},{'o', 7018, 6971, {0}, 0}, + {'s', 7024, 6972, {0}, 0},{'u', 7030, 6973, {0}, 0},{'\0', 0, 6974, {0}, 0}, + {'c', 6977, 6975, {0}, 0},{'\0', 0, 6976, {0}, 0},{'y', 6979, 6977, {0}, 0}, + {'\0', 0, 6978, {0}, 0},{';', 0, 6979, {1071}, 1},{'\0', 0, 6980, {0}, 0}, + {'c', 6983, 6981, {0}, 0},{'\0', 0, 6982, {0}, 0},{'y', 6985, 6983, {0}, 0}, + {'\0', 0, 6984, {0}, 0},{';', 0, 6985, {1031}, 1},{'\0', 0, 6986, {0}, 0}, + {'c', 6989, 6987, {0}, 0},{'\0', 0, 6988, {0}, 0},{'y', 6991, 6989, {0}, 0}, + {'\0', 0, 6990, {0}, 0},{';', 0, 6991, {1070}, 1},{'\0', 0, 6992, {0}, 0}, + {'c', 6995, 6993, {0}, 0},{'\0', 0, 6994, {0}, 0},{'u', 6997, 6995, {0}, 0}, + {'\0', 0, 6996, {0}, 0},{'t', 6999, 6997, {0}, 0},{'\0', 0, 6998, {0}, 0}, + {'e', 7001, 6999, {221}, 1},{'\0', 0, 7000, {0}, 0},{';', 0, 7001, {221}, 1}, + {'\0', 0, 7002, {0}, 0},{'i', 7006, 7003, {0}, 0},{'y', 7012, 7004, {0}, 0}, + {'\0', 0, 7005, {0}, 0},{'r', 7008, 7006, {0}, 0},{'\0', 0, 7007, {0}, 0}, + {'c', 7010, 7008, {0}, 0},{'\0', 0, 7009, {0}, 0},{';', 0, 7010, {374}, 1}, + {'\0', 0, 7011, {0}, 0},{';', 0, 7012, {1067}, 1},{'\0', 0, 7013, {0}, 0}, + {'r', 7016, 7014, {0}, 0},{'\0', 0, 7015, {0}, 0},{';', 0, 7016, {120092}, 1}, + {'\0', 0, 7017, {0}, 0},{'p', 7020, 7018, {0}, 0},{'\0', 0, 7019, {0}, 0}, + {'f', 7022, 7020, {0}, 0},{'\0', 0, 7021, {0}, 0},{';', 0, 7022, {120144}, 1}, + {'\0', 0, 7023, {0}, 0},{'c', 7026, 7024, {0}, 0},{'\0', 0, 7025, {0}, 0}, + {'r', 7028, 7026, {0}, 0},{'\0', 0, 7027, {0}, 0},{';', 0, 7028, {119988}, 1}, + {'\0', 0, 7029, {0}, 0},{'m', 7032, 7030, {0}, 0},{'\0', 0, 7031, {0}, 0}, + {'l', 7034, 7032, {0}, 0},{'\0', 0, 7033, {0}, 0},{';', 0, 7034, {376}, 1}, + {'\0', 0, 7035, {0}, 0},{'H', 7045, 7036, {0}, 0},{'a', 7051, 7037, {0}, 0}, + {'c', 7061, 7038, {0}, 0},{'d', 7074, 7039, {0}, 0},{'e', 7080, 7040, {0}, 0}, + {'f', 7111, 7041, {0}, 0},{'o', 7115, 7042, {0}, 0},{'s', 7121, 7043, {0}, 0}, + {'\0', 0, 7044, {0}, 0},{'c', 7047, 7045, {0}, 0},{'\0', 0, 7046, {0}, 0}, + {'y', 7049, 7047, {0}, 0},{'\0', 0, 7048, {0}, 0},{';', 0, 7049, {1046}, 1}, + {'\0', 0, 7050, {0}, 0},{'c', 7053, 7051, {0}, 0},{'\0', 0, 7052, {0}, 0}, + {'u', 7055, 7053, {0}, 0},{'\0', 0, 7054, {0}, 0},{'t', 7057, 7055, {0}, 0}, + {'\0', 0, 7056, {0}, 0},{'e', 7059, 7057, {0}, 0},{'\0', 0, 7058, {0}, 0}, + {';', 0, 7059, {377}, 1},{'\0', 0, 7060, {0}, 0},{'a', 7064, 7061, {0}, 0}, + {'y', 7072, 7062, {0}, 0},{'\0', 0, 7063, {0}, 0},{'r', 7066, 7064, {0}, 0}, + {'\0', 0, 7065, {0}, 0},{'o', 7068, 7066, {0}, 0},{'\0', 0, 7067, {0}, 0}, + {'n', 7070, 7068, {0}, 0},{'\0', 0, 7069, {0}, 0},{';', 0, 7070, {381}, 1}, + {'\0', 0, 7071, {0}, 0},{';', 0, 7072, {1047}, 1},{'\0', 0, 7073, {0}, 0}, + {'o', 7076, 7074, {0}, 0},{'\0', 0, 7075, {0}, 0},{'t', 7078, 7076, {0}, 0}, + {'\0', 0, 7077, {0}, 0},{';', 0, 7078, {379}, 1},{'\0', 0, 7079, {0}, 0}, + {'r', 7083, 7080, {0}, 0},{'t', 7107, 7081, {0}, 0},{'\0', 0, 7082, {0}, 0}, + {'o', 7085, 7083, {0}, 0},{'\0', 0, 7084, {0}, 0},{'W', 7087, 7085, {0}, 0}, + {'\0', 0, 7086, {0}, 0},{'i', 7089, 7087, {0}, 0},{'\0', 0, 7088, {0}, 0}, + {'d', 7091, 7089, {0}, 0},{'\0', 0, 7090, {0}, 0},{'t', 7093, 7091, {0}, 0}, + {'\0', 0, 7092, {0}, 0},{'h', 7095, 7093, {0}, 0},{'\0', 0, 7094, {0}, 0}, + {'S', 7097, 7095, {0}, 0},{'\0', 0, 7096, {0}, 0},{'p', 7099, 7097, {0}, 0}, + {'\0', 0, 7098, {0}, 0},{'a', 7101, 7099, {0}, 0},{'\0', 0, 7100, {0}, 0}, + {'c', 7103, 7101, {0}, 0},{'\0', 0, 7102, {0}, 0},{'e', 7105, 7103, {0}, 0}, + {'\0', 0, 7104, {0}, 0},{';', 0, 7105, {8203}, 1},{'\0', 0, 7106, {0}, 0}, + {'a', 7109, 7107, {0}, 0},{'\0', 0, 7108, {0}, 0},{';', 0, 7109, {918}, 1}, + {'\0', 0, 7110, {0}, 0},{'r', 7113, 7111, {0}, 0},{'\0', 0, 7112, {0}, 0}, + {';', 0, 7113, {8488}, 1},{'\0', 0, 7114, {0}, 0},{'p', 7117, 7115, {0}, 0}, + {'\0', 0, 7116, {0}, 0},{'f', 7119, 7117, {0}, 0},{'\0', 0, 7118, {0}, 0}, + {';', 0, 7119, {8484}, 1},{'\0', 0, 7120, {0}, 0},{'c', 7123, 7121, {0}, 0}, + {'\0', 0, 7122, {0}, 0},{'r', 7125, 7123, {0}, 0},{'\0', 0, 7124, {0}, 0}, + {';', 0, 7125, {119989}, 1},{'\0', 0, 7126, {0}, 0},{'a', 7144, 7127, {0}, 0}, + {'b', 7154, 7128, {0}, 0},{'c', 7164, 7129, {0}, 0},{'e', 7189, 7130, {0}, 0}, + {'f', 7197, 7131, {0}, 0},{'g', 7202, 7132, {0}, 0},{'l', 7212, 7133, {0}, 0}, + {'m', 7236, 7134, {0}, 0},{'n', 7252, 7135, {0}, 0},{'o', 7356, 7136, {0}, 0}, + {'p', 7369, 7137, {0}, 0},{'r', 7410, 7138, {0}, 0},{'s', 7418, 7139, {0}, 0}, + {'t', 7439, 7140, {0}, 0},{'u', 7449, 7141, {0}, 0},{'w', 7455, 7142, {0}, 0}, + {'\0', 0, 7143, {0}, 0},{'c', 7146, 7144, {0}, 0},{'\0', 0, 7145, {0}, 0}, + {'u', 7148, 7146, {0}, 0},{'\0', 0, 7147, {0}, 0},{'t', 7150, 7148, {0}, 0}, + {'\0', 0, 7149, {0}, 0},{'e', 7152, 7150, {225}, 1},{'\0', 0, 7151, {0}, 0}, + {';', 0, 7152, {225}, 1},{'\0', 0, 7153, {0}, 0},{'r', 7156, 7154, {0}, 0}, + {'\0', 0, 7155, {0}, 0},{'e', 7158, 7156, {0}, 0},{'\0', 0, 7157, {0}, 0}, + {'v', 7160, 7158, {0}, 0},{'\0', 0, 7159, {0}, 0},{'e', 7162, 7160, {0}, 0}, + {'\0', 0, 7161, {0}, 0},{';', 0, 7162, {259}, 1},{'\0', 0, 7163, {0}, 0}, + {';', 0, 7164, {8766}, 1},{'E', 7171, 7165, {0}, 0},{'d', 7173, 7166, {0}, 0}, + {'i', 7175, 7167, {0}, 0},{'u', 7181, 7168, {0}, 0},{'y', 7187, 7169, {0}, 0}, + {'\0', 0, 7170, {0}, 0},{';', 0, 7171, {8766,819}, 2},{'\0', 0, 7172, {0}, 0}, + {';', 0, 7173, {8767}, 1},{'\0', 0, 7174, {0}, 0},{'r', 7177, 7175, {0}, 0}, + {'\0', 0, 7176, {0}, 0},{'c', 7179, 7177, {226}, 1},{'\0', 0, 7178, {0}, 0}, + {';', 0, 7179, {226}, 1},{'\0', 0, 7180, {0}, 0},{'t', 7183, 7181, {0}, 0}, + {'\0', 0, 7182, {0}, 0},{'e', 7185, 7183, {180}, 1},{'\0', 0, 7184, {0}, 0}, + {';', 0, 7185, {180}, 1},{'\0', 0, 7186, {0}, 0},{';', 0, 7187, {1072}, 1}, + {'\0', 0, 7188, {0}, 0},{'l', 7191, 7189, {0}, 0},{'\0', 0, 7190, {0}, 0}, + {'i', 7193, 7191, {0}, 0},{'\0', 0, 7192, {0}, 0},{'g', 7195, 7193, {230}, 1}, + {'\0', 0, 7194, {0}, 0},{';', 0, 7195, {230}, 1},{'\0', 0, 7196, {0}, 0}, + {';', 0, 7197, {8289}, 1},{'r', 7200, 7198, {0}, 0},{'\0', 0, 7199, {0}, 0}, + {';', 0, 7200, {120094}, 1},{'\0', 0, 7201, {0}, 0},{'r', 7204, 7202, {0}, 0}, + {'\0', 0, 7203, {0}, 0},{'a', 7206, 7204, {0}, 0},{'\0', 0, 7205, {0}, 0}, + {'v', 7208, 7206, {0}, 0},{'\0', 0, 7207, {0}, 0},{'e', 7210, 7208, {224}, 1}, + {'\0', 0, 7209, {0}, 0},{';', 0, 7210, {224}, 1},{'\0', 0, 7211, {0}, 0}, + {'e', 7215, 7212, {0}, 0},{'p', 7230, 7213, {0}, 0},{'\0', 0, 7214, {0}, 0}, + {'f', 7218, 7215, {0}, 0},{'p', 7226, 7216, {0}, 0},{'\0', 0, 7217, {0}, 0}, + {'s', 7220, 7218, {0}, 0},{'\0', 0, 7219, {0}, 0},{'y', 7222, 7220, {0}, 0}, + {'\0', 0, 7221, {0}, 0},{'m', 7224, 7222, {0}, 0},{'\0', 0, 7223, {0}, 0}, + {';', 0, 7224, {8501}, 1},{'\0', 0, 7225, {0}, 0},{'h', 7228, 7226, {0}, 0}, + {'\0', 0, 7227, {0}, 0},{';', 0, 7228, {8501}, 1},{'\0', 0, 7229, {0}, 0}, + {'h', 7232, 7230, {0}, 0},{'\0', 0, 7231, {0}, 0},{'a', 7234, 7232, {0}, 0}, + {'\0', 0, 7233, {0}, 0},{';', 0, 7234, {945}, 1},{'\0', 0, 7235, {0}, 0}, + {'a', 7239, 7236, {0}, 0},{'p', 7250, 7237, {38}, 1},{'\0', 0, 7238, {0}, 0}, + {'c', 7242, 7239, {0}, 0},{'l', 7246, 7240, {0}, 0},{'\0', 0, 7241, {0}, 0}, + {'r', 7244, 7242, {0}, 0},{'\0', 0, 7243, {0}, 0},{';', 0, 7244, {257}, 1}, + {'\0', 0, 7245, {0}, 0},{'g', 7248, 7246, {0}, 0},{'\0', 0, 7247, {0}, 0}, + {';', 0, 7248, {10815}, 1},{'\0', 0, 7249, {0}, 0},{';', 0, 7250, {38}, 1}, + {'\0', 0, 7251, {0}, 0},{'d', 7255, 7252, {0}, 0},{'g', 7281, 7253, {0}, 0}, + {'\0', 0, 7254, {0}, 0},{';', 0, 7255, {8743}, 1},{'a', 7261, 7256, {0}, 0}, + {'d', 7267, 7257, {0}, 0},{'s', 7269, 7258, {0}, 0},{'v', 7279, 7259, {0}, 0}, + {'\0', 0, 7260, {0}, 0},{'n', 7263, 7261, {0}, 0},{'\0', 0, 7262, {0}, 0}, + {'d', 7265, 7263, {0}, 0},{'\0', 0, 7264, {0}, 0},{';', 0, 7265, {10837}, 1}, + {'\0', 0, 7266, {0}, 0},{';', 0, 7267, {10844}, 1},{'\0', 0, 7268, {0}, 0}, + {'l', 7271, 7269, {0}, 0},{'\0', 0, 7270, {0}, 0},{'o', 7273, 7271, {0}, 0}, + {'\0', 0, 7272, {0}, 0},{'p', 7275, 7273, {0}, 0},{'\0', 0, 7274, {0}, 0}, + {'e', 7277, 7275, {0}, 0},{'\0', 0, 7276, {0}, 0},{';', 0, 7277, {10840}, 1}, + {'\0', 0, 7278, {0}, 0},{';', 0, 7279, {10842}, 1},{'\0', 0, 7280, {0}, 0}, + {';', 0, 7281, {8736}, 1},{'e', 7289, 7282, {0}, 0},{'l', 7291, 7283, {0}, 0}, + {'m', 7295, 7284, {0}, 0},{'r', 7327, 7285, {0}, 0},{'s', 7339, 7286, {0}, 0}, + {'z', 7348, 7287, {0}, 0},{'\0', 0, 7288, {0}, 0},{';', 0, 7289, {10660}, 1}, + {'\0', 0, 7290, {0}, 0},{'e', 7293, 7291, {0}, 0},{'\0', 0, 7292, {0}, 0}, + {';', 0, 7293, {8736}, 1},{'\0', 0, 7294, {0}, 0},{'s', 7297, 7295, {0}, 0}, + {'\0', 0, 7296, {0}, 0},{'d', 7299, 7297, {0}, 0},{'\0', 0, 7298, {0}, 0}, + {';', 0, 7299, {8737}, 1},{'a', 7302, 7300, {0}, 0},{'\0', 0, 7301, {0}, 0}, + {'a', 7311, 7302, {0}, 0},{'b', 7313, 7303, {0}, 0},{'c', 7315, 7304, {0}, 0}, + {'d', 7317, 7305, {0}, 0},{'e', 7319, 7306, {0}, 0},{'f', 7321, 7307, {0}, 0}, + {'g', 7323, 7308, {0}, 0},{'h', 7325, 7309, {0}, 0},{'\0', 0, 7310, {0}, 0}, + {';', 0, 7311, {10664}, 1},{'\0', 0, 7312, {0}, 0},{';', 0, 7313, {10665}, 1}, + {'\0', 0, 7314, {0}, 0},{';', 0, 7315, {10666}, 1},{'\0', 0, 7316, {0}, 0}, + {';', 0, 7317, {10667}, 1},{'\0', 0, 7318, {0}, 0},{';', 0, 7319, {10668}, 1}, + {'\0', 0, 7320, {0}, 0},{';', 0, 7321, {10669}, 1},{'\0', 0, 7322, {0}, 0}, + {';', 0, 7323, {10670}, 1},{'\0', 0, 7324, {0}, 0},{';', 0, 7325, {10671}, 1}, + {'\0', 0, 7326, {0}, 0},{'t', 7329, 7327, {0}, 0},{'\0', 0, 7328, {0}, 0}, + {';', 0, 7329, {8735}, 1},{'v', 7332, 7330, {0}, 0},{'\0', 0, 7331, {0}, 0}, + {'b', 7334, 7332, {0}, 0},{'\0', 0, 7333, {0}, 0},{';', 0, 7334, {8894}, 1}, + {'d', 7337, 7335, {0}, 0},{'\0', 0, 7336, {0}, 0},{';', 0, 7337, {10653}, 1}, + {'\0', 0, 7338, {0}, 0},{'p', 7342, 7339, {0}, 0},{'t', 7346, 7340, {0}, 0}, + {'\0', 0, 7341, {0}, 0},{'h', 7344, 7342, {0}, 0},{'\0', 0, 7343, {0}, 0}, + {';', 0, 7344, {8738}, 1},{'\0', 0, 7345, {0}, 0},{';', 0, 7346, {197}, 1}, + {'\0', 0, 7347, {0}, 0},{'a', 7350, 7348, {0}, 0},{'\0', 0, 7349, {0}, 0}, + {'r', 7352, 7350, {0}, 0},{'\0', 0, 7351, {0}, 0},{'r', 7354, 7352, {0}, 0}, + {'\0', 0, 7353, {0}, 0},{';', 0, 7354, {9084}, 1},{'\0', 0, 7355, {0}, 0}, + {'g', 7359, 7356, {0}, 0},{'p', 7365, 7357, {0}, 0},{'\0', 0, 7358, {0}, 0}, + {'o', 7361, 7359, {0}, 0},{'\0', 0, 7360, {0}, 0},{'n', 7363, 7361, {0}, 0}, + {'\0', 0, 7362, {0}, 0},{';', 0, 7363, {261}, 1},{'\0', 0, 7364, {0}, 0}, + {'f', 7367, 7365, {0}, 0},{'\0', 0, 7366, {0}, 0},{';', 0, 7367, {120146}, 1}, + {'\0', 0, 7368, {0}, 0},{';', 0, 7369, {8776}, 1},{'E', 7377, 7370, {0}, 0}, + {'a', 7379, 7371, {0}, 0},{'e', 7387, 7372, {0}, 0},{'i', 7389, 7373, {0}, 0}, + {'o', 7393, 7374, {0}, 0},{'p', 7397, 7375, {0}, 0},{'\0', 0, 7376, {0}, 0}, + {';', 0, 7377, {10864}, 1},{'\0', 0, 7378, {0}, 0},{'c', 7381, 7379, {0}, 0}, + {'\0', 0, 7380, {0}, 0},{'i', 7383, 7381, {0}, 0},{'\0', 0, 7382, {0}, 0}, + {'r', 7385, 7383, {0}, 0},{'\0', 0, 7384, {0}, 0},{';', 0, 7385, {10863}, 1}, + {'\0', 0, 7386, {0}, 0},{';', 0, 7387, {8778}, 1},{'\0', 0, 7388, {0}, 0}, + {'d', 7391, 7389, {0}, 0},{'\0', 0, 7390, {0}, 0},{';', 0, 7391, {8779}, 1}, + {'\0', 0, 7392, {0}, 0},{'s', 7395, 7393, {0}, 0},{'\0', 0, 7394, {0}, 0}, + {';', 0, 7395, {39}, 1},{'\0', 0, 7396, {0}, 0},{'r', 7399, 7397, {0}, 0}, + {'\0', 0, 7398, {0}, 0},{'o', 7401, 7399, {0}, 0},{'\0', 0, 7400, {0}, 0}, + {'x', 7403, 7401, {0}, 0},{'\0', 0, 7402, {0}, 0},{';', 0, 7403, {8776}, 1}, + {'e', 7406, 7404, {0}, 0},{'\0', 0, 7405, {0}, 0},{'q', 7408, 7406, {0}, 0}, + {'\0', 0, 7407, {0}, 0},{';', 0, 7408, {8778}, 1},{'\0', 0, 7409, {0}, 0}, + {'i', 7412, 7410, {0}, 0},{'\0', 0, 7411, {0}, 0},{'n', 7414, 7412, {0}, 0}, + {'\0', 0, 7413, {0}, 0},{'g', 7416, 7414, {229}, 1},{'\0', 0, 7415, {0}, 0}, + {';', 0, 7416, {229}, 1},{'\0', 0, 7417, {0}, 0},{'c', 7422, 7418, {0}, 0}, + {'t', 7426, 7419, {0}, 0},{'y', 7428, 7420, {0}, 0},{'\0', 0, 7421, {0}, 0}, + {'r', 7424, 7422, {0}, 0},{'\0', 0, 7423, {0}, 0},{';', 0, 7424, {119990}, 1}, + {'\0', 0, 7425, {0}, 0},{';', 0, 7426, {42}, 1},{'\0', 0, 7427, {0}, 0}, + {'m', 7430, 7428, {0}, 0},{'\0', 0, 7429, {0}, 0},{'p', 7432, 7430, {0}, 0}, + {'\0', 0, 7431, {0}, 0},{';', 0, 7432, {8776}, 1},{'e', 7435, 7433, {0}, 0}, + {'\0', 0, 7434, {0}, 0},{'q', 7437, 7435, {0}, 0},{'\0', 0, 7436, {0}, 0}, + {';', 0, 7437, {8781}, 1},{'\0', 0, 7438, {0}, 0},{'i', 7441, 7439, {0}, 0}, + {'\0', 0, 7440, {0}, 0},{'l', 7443, 7441, {0}, 0},{'\0', 0, 7442, {0}, 0}, + {'d', 7445, 7443, {0}, 0},{'\0', 0, 7444, {0}, 0},{'e', 7447, 7445, {227}, 1}, + {'\0', 0, 7446, {0}, 0},{';', 0, 7447, {227}, 1},{'\0', 0, 7448, {0}, 0}, + {'m', 7451, 7449, {0}, 0},{'\0', 0, 7450, {0}, 0},{'l', 7453, 7451, {228}, 1}, + {'\0', 0, 7452, {0}, 0},{';', 0, 7453, {228}, 1},{'\0', 0, 7454, {0}, 0}, + {'c', 7458, 7455, {0}, 0},{'i', 7470, 7456, {0}, 0},{'\0', 0, 7457, {0}, 0}, + {'o', 7460, 7458, {0}, 0},{'\0', 0, 7459, {0}, 0},{'n', 7462, 7460, {0}, 0}, + {'\0', 0, 7461, {0}, 0},{'i', 7464, 7462, {0}, 0},{'\0', 0, 7463, {0}, 0}, + {'n', 7466, 7464, {0}, 0},{'\0', 0, 7465, {0}, 0},{'t', 7468, 7466, {0}, 0}, + {'\0', 0, 7467, {0}, 0},{';', 0, 7468, {8755}, 1},{'\0', 0, 7469, {0}, 0}, + {'n', 7472, 7470, {0}, 0},{'\0', 0, 7471, {0}, 0},{'t', 7474, 7472, {0}, 0}, + {'\0', 0, 7473, {0}, 0},{';', 0, 7474, {10769}, 1},{'\0', 0, 7475, {0}, 0}, + {'N', 7493, 7476, {0}, 0},{'a', 7499, 7477, {0}, 0},{'b', 7572, 7478, {0}, 0}, + {'c', 7587, 7479, {0}, 0},{'d', 7598, 7480, {0}, 0},{'e', 7606, 7481, {0}, 0}, + {'f', 7663, 7482, {0}, 0},{'i', 7667, 7483, {0}, 0},{'k', 7795, 7484, {0}, 0}, + {'l', 7805, 7485, {0}, 0},{'n', 7913, 7486, {0}, 0},{'o', 7931, 7487, {0}, 0}, + {'p', 8124, 7488, {0}, 0},{'r', 8134, 7489, {0}, 0},{'s', 8151, 7490, {0}, 0}, + {'u', 8189, 7491, {0}, 0},{'\0', 0, 7492, {0}, 0},{'o', 7495, 7493, {0}, 0}, + {'\0', 0, 7494, {0}, 0},{'t', 7497, 7495, {0}, 0},{'\0', 0, 7496, {0}, 0}, + {';', 0, 7497, {10989}, 1},{'\0', 0, 7498, {0}, 0},{'c', 7502, 7499, {0}, 0}, + {'r', 7552, 7500, {0}, 0},{'\0', 0, 7501, {0}, 0},{'k', 7504, 7502, {0}, 0}, + {'\0', 0, 7503, {0}, 0},{'c', 7509, 7504, {0}, 0},{'e', 7517, 7505, {0}, 0}, + {'p', 7531, 7506, {0}, 0},{'s', 7541, 7507, {0}, 0},{'\0', 0, 7508, {0}, 0}, + {'o', 7511, 7509, {0}, 0},{'\0', 0, 7510, {0}, 0},{'n', 7513, 7511, {0}, 0}, + {'\0', 0, 7512, {0}, 0},{'g', 7515, 7513, {0}, 0},{'\0', 0, 7514, {0}, 0}, + {';', 0, 7515, {8780}, 1},{'\0', 0, 7516, {0}, 0},{'p', 7519, 7517, {0}, 0}, + {'\0', 0, 7518, {0}, 0},{'s', 7521, 7519, {0}, 0},{'\0', 0, 7520, {0}, 0}, + {'i', 7523, 7521, {0}, 0},{'\0', 0, 7522, {0}, 0},{'l', 7525, 7523, {0}, 0}, + {'\0', 0, 7524, {0}, 0},{'o', 7527, 7525, {0}, 0},{'\0', 0, 7526, {0}, 0}, + {'n', 7529, 7527, {0}, 0},{'\0', 0, 7528, {0}, 0},{';', 0, 7529, {1014}, 1}, + {'\0', 0, 7530, {0}, 0},{'r', 7533, 7531, {0}, 0},{'\0', 0, 7532, {0}, 0}, + {'i', 7535, 7533, {0}, 0},{'\0', 0, 7534, {0}, 0},{'m', 7537, 7535, {0}, 0}, + {'\0', 0, 7536, {0}, 0},{'e', 7539, 7537, {0}, 0},{'\0', 0, 7538, {0}, 0}, + {';', 0, 7539, {8245}, 1},{'\0', 0, 7540, {0}, 0},{'i', 7543, 7541, {0}, 0}, + {'\0', 0, 7542, {0}, 0},{'m', 7545, 7543, {0}, 0},{'\0', 0, 7544, {0}, 0}, + {';', 0, 7545, {8765}, 1},{'e', 7548, 7546, {0}, 0},{'\0', 0, 7547, {0}, 0}, + {'q', 7550, 7548, {0}, 0},{'\0', 0, 7549, {0}, 0},{';', 0, 7550, {8909}, 1}, + {'\0', 0, 7551, {0}, 0},{'v', 7555, 7552, {0}, 0},{'w', 7561, 7553, {0}, 0}, + {'\0', 0, 7554, {0}, 0},{'e', 7557, 7555, {0}, 0},{'\0', 0, 7556, {0}, 0}, + {'e', 7559, 7557, {0}, 0},{'\0', 0, 7558, {0}, 0},{';', 0, 7559, {8893}, 1}, + {'\0', 0, 7560, {0}, 0},{'e', 7563, 7561, {0}, 0},{'\0', 0, 7562, {0}, 0}, + {'d', 7565, 7563, {0}, 0},{'\0', 0, 7564, {0}, 0},{';', 0, 7565, {8965}, 1}, + {'g', 7568, 7566, {0}, 0},{'\0', 0, 7567, {0}, 0},{'e', 7570, 7568, {0}, 0}, + {'\0', 0, 7569, {0}, 0},{';', 0, 7570, {8965}, 1},{'\0', 0, 7571, {0}, 0}, + {'r', 7574, 7572, {0}, 0},{'\0', 0, 7573, {0}, 0},{'k', 7576, 7574, {0}, 0}, + {'\0', 0, 7575, {0}, 0},{';', 0, 7576, {9141}, 1},{'t', 7579, 7577, {0}, 0}, + {'\0', 0, 7578, {0}, 0},{'b', 7581, 7579, {0}, 0},{'\0', 0, 7580, {0}, 0}, + {'r', 7583, 7581, {0}, 0},{'\0', 0, 7582, {0}, 0},{'k', 7585, 7583, {0}, 0}, + {'\0', 0, 7584, {0}, 0},{';', 0, 7585, {9142}, 1},{'\0', 0, 7586, {0}, 0}, + {'o', 7590, 7587, {0}, 0},{'y', 7596, 7588, {0}, 0},{'\0', 0, 7589, {0}, 0}, + {'n', 7592, 7590, {0}, 0},{'\0', 0, 7591, {0}, 0},{'g', 7594, 7592, {0}, 0}, + {'\0', 0, 7593, {0}, 0},{';', 0, 7594, {8780}, 1},{'\0', 0, 7595, {0}, 0}, + {';', 0, 7596, {1073}, 1},{'\0', 0, 7597, {0}, 0},{'q', 7600, 7598, {0}, 0}, + {'\0', 0, 7599, {0}, 0},{'u', 7602, 7600, {0}, 0},{'\0', 0, 7601, {0}, 0}, + {'o', 7604, 7602, {0}, 0},{'\0', 0, 7603, {0}, 0},{';', 0, 7604, {8222}, 1}, + {'\0', 0, 7605, {0}, 0},{'c', 7612, 7606, {0}, 0},{'m', 7623, 7607, {0}, 0}, + {'p', 7633, 7608, {0}, 0},{'r', 7639, 7609, {0}, 0},{'t', 7647, 7610, {0}, 0}, + {'\0', 0, 7611, {0}, 0},{'a', 7614, 7612, {0}, 0},{'\0', 0, 7613, {0}, 0}, + {'u', 7616, 7614, {0}, 0},{'\0', 0, 7615, {0}, 0},{'s', 7618, 7616, {0}, 0}, + {'\0', 0, 7617, {0}, 0},{';', 0, 7618, {8757}, 1},{'e', 7621, 7619, {0}, 0}, + {'\0', 0, 7620, {0}, 0},{';', 0, 7621, {8757}, 1},{'\0', 0, 7622, {0}, 0}, + {'p', 7625, 7623, {0}, 0},{'\0', 0, 7624, {0}, 0},{'t', 7627, 7625, {0}, 0}, + {'\0', 0, 7626, {0}, 0},{'y', 7629, 7627, {0}, 0},{'\0', 0, 7628, {0}, 0}, + {'v', 7631, 7629, {0}, 0},{'\0', 0, 7630, {0}, 0},{';', 0, 7631, {10672}, 1}, + {'\0', 0, 7632, {0}, 0},{'s', 7635, 7633, {0}, 0},{'\0', 0, 7634, {0}, 0}, + {'i', 7637, 7635, {0}, 0},{'\0', 0, 7636, {0}, 0},{';', 0, 7637, {1014}, 1}, + {'\0', 0, 7638, {0}, 0},{'n', 7641, 7639, {0}, 0},{'\0', 0, 7640, {0}, 0}, + {'o', 7643, 7641, {0}, 0},{'\0', 0, 7642, {0}, 0},{'u', 7645, 7643, {0}, 0}, + {'\0', 0, 7644, {0}, 0},{';', 0, 7645, {8492}, 1},{'\0', 0, 7646, {0}, 0}, + {'a', 7651, 7647, {0}, 0},{'h', 7653, 7648, {0}, 0},{'w', 7655, 7649, {0}, 0}, + {'\0', 0, 7650, {0}, 0},{';', 0, 7651, {946}, 1},{'\0', 0, 7652, {0}, 0}, + {';', 0, 7653, {8502}, 1},{'\0', 0, 7654, {0}, 0},{'e', 7657, 7655, {0}, 0}, + {'\0', 0, 7656, {0}, 0},{'e', 7659, 7657, {0}, 0},{'\0', 0, 7658, {0}, 0}, + {'n', 7661, 7659, {0}, 0},{'\0', 0, 7660, {0}, 0},{';', 0, 7661, {8812}, 1}, + {'\0', 0, 7662, {0}, 0},{'r', 7665, 7663, {0}, 0},{'\0', 0, 7664, {0}, 0}, + {';', 0, 7665, {120095}, 1},{'\0', 0, 7666, {0}, 0},{'g', 7669, 7667, {0}, 0}, + {'\0', 0, 7668, {0}, 0},{'c', 7677, 7669, {0}, 0},{'o', 7695, 7670, {0}, 0}, + {'s', 7723, 7671, {0}, 0},{'t', 7740, 7672, {0}, 0},{'u', 7769, 7673, {0}, 0}, + {'v', 7779, 7674, {0}, 0},{'w', 7785, 7675, {0}, 0},{'\0', 0, 7676, {0}, 0}, + {'a', 7681, 7677, {0}, 0},{'i', 7685, 7678, {0}, 0},{'u', 7691, 7679, {0}, 0}, + {'\0', 0, 7680, {0}, 0},{'p', 7683, 7681, {0}, 0},{'\0', 0, 7682, {0}, 0}, + {';', 0, 7683, {8898}, 1},{'\0', 0, 7684, {0}, 0},{'r', 7687, 7685, {0}, 0}, + {'\0', 0, 7686, {0}, 0},{'c', 7689, 7687, {0}, 0},{'\0', 0, 7688, {0}, 0}, + {';', 0, 7689, {9711}, 1},{'\0', 0, 7690, {0}, 0},{'p', 7693, 7691, {0}, 0}, + {'\0', 0, 7692, {0}, 0},{';', 0, 7693, {8899}, 1},{'\0', 0, 7694, {0}, 0}, + {'d', 7699, 7695, {0}, 0},{'p', 7705, 7696, {0}, 0},{'t', 7713, 7697, {0}, 0}, + {'\0', 0, 7698, {0}, 0},{'o', 7701, 7699, {0}, 0},{'\0', 0, 7700, {0}, 0}, + {'t', 7703, 7701, {0}, 0},{'\0', 0, 7702, {0}, 0},{';', 0, 7703, {10752}, 1}, + {'\0', 0, 7704, {0}, 0},{'l', 7707, 7705, {0}, 0},{'\0', 0, 7706, {0}, 0}, + {'u', 7709, 7707, {0}, 0},{'\0', 0, 7708, {0}, 0},{'s', 7711, 7709, {0}, 0}, + {'\0', 0, 7710, {0}, 0},{';', 0, 7711, {10753}, 1},{'\0', 0, 7712, {0}, 0}, + {'i', 7715, 7713, {0}, 0},{'\0', 0, 7714, {0}, 0},{'m', 7717, 7715, {0}, 0}, + {'\0', 0, 7716, {0}, 0},{'e', 7719, 7717, {0}, 0},{'\0', 0, 7718, {0}, 0}, + {'s', 7721, 7719, {0}, 0},{'\0', 0, 7720, {0}, 0},{';', 0, 7721, {10754}, 1}, + {'\0', 0, 7722, {0}, 0},{'q', 7726, 7723, {0}, 0},{'t', 7734, 7724, {0}, 0}, + {'\0', 0, 7725, {0}, 0},{'c', 7728, 7726, {0}, 0},{'\0', 0, 7727, {0}, 0}, + {'u', 7730, 7728, {0}, 0},{'\0', 0, 7729, {0}, 0},{'p', 7732, 7730, {0}, 0}, + {'\0', 0, 7731, {0}, 0},{';', 0, 7732, {10758}, 1},{'\0', 0, 7733, {0}, 0}, + {'a', 7736, 7734, {0}, 0},{'\0', 0, 7735, {0}, 0},{'r', 7738, 7736, {0}, 0}, + {'\0', 0, 7737, {0}, 0},{';', 0, 7738, {9733}, 1},{'\0', 0, 7739, {0}, 0}, + {'r', 7742, 7740, {0}, 0},{'\0', 0, 7741, {0}, 0},{'i', 7744, 7742, {0}, 0}, + {'\0', 0, 7743, {0}, 0},{'a', 7746, 7744, {0}, 0},{'\0', 0, 7745, {0}, 0}, + {'n', 7748, 7746, {0}, 0},{'\0', 0, 7747, {0}, 0},{'g', 7750, 7748, {0}, 0}, + {'\0', 0, 7749, {0}, 0},{'l', 7752, 7750, {0}, 0},{'\0', 0, 7751, {0}, 0}, + {'e', 7754, 7752, {0}, 0},{'\0', 0, 7753, {0}, 0},{'d', 7757, 7754, {0}, 0}, + {'u', 7765, 7755, {0}, 0},{'\0', 0, 7756, {0}, 0},{'o', 7759, 7757, {0}, 0}, + {'\0', 0, 7758, {0}, 0},{'w', 7761, 7759, {0}, 0},{'\0', 0, 7760, {0}, 0}, + {'n', 7763, 7761, {0}, 0},{'\0', 0, 7762, {0}, 0},{';', 0, 7763, {9661}, 1}, + {'\0', 0, 7764, {0}, 0},{'p', 7767, 7765, {0}, 0},{'\0', 0, 7766, {0}, 0}, + {';', 0, 7767, {9651}, 1},{'\0', 0, 7768, {0}, 0},{'p', 7771, 7769, {0}, 0}, + {'\0', 0, 7770, {0}, 0},{'l', 7773, 7771, {0}, 0},{'\0', 0, 7772, {0}, 0}, + {'u', 7775, 7773, {0}, 0},{'\0', 0, 7774, {0}, 0},{'s', 7777, 7775, {0}, 0}, + {'\0', 0, 7776, {0}, 0},{';', 0, 7777, {10756}, 1},{'\0', 0, 7778, {0}, 0}, + {'e', 7781, 7779, {0}, 0},{'\0', 0, 7780, {0}, 0},{'e', 7783, 7781, {0}, 0}, + {'\0', 0, 7782, {0}, 0},{';', 0, 7783, {8897}, 1},{'\0', 0, 7784, {0}, 0}, + {'e', 7787, 7785, {0}, 0},{'\0', 0, 7786, {0}, 0},{'d', 7789, 7787, {0}, 0}, + {'\0', 0, 7788, {0}, 0},{'g', 7791, 7789, {0}, 0},{'\0', 0, 7790, {0}, 0}, + {'e', 7793, 7791, {0}, 0},{'\0', 0, 7792, {0}, 0},{';', 0, 7793, {8896}, 1}, + {'\0', 0, 7794, {0}, 0},{'a', 7797, 7795, {0}, 0},{'\0', 0, 7796, {0}, 0}, + {'r', 7799, 7797, {0}, 0},{'\0', 0, 7798, {0}, 0},{'o', 7801, 7799, {0}, 0}, + {'\0', 0, 7800, {0}, 0},{'w', 7803, 7801, {0}, 0},{'\0', 0, 7802, {0}, 0}, + {';', 0, 7803, {10509}, 1},{'\0', 0, 7804, {0}, 0},{'a', 7809, 7805, {0}, 0}, + {'k', 7893, 7806, {0}, 0},{'o', 7907, 7807, {0}, 0},{'\0', 0, 7808, {0}, 0}, + {'c', 7812, 7809, {0}, 0},{'n', 7889, 7810, {0}, 0},{'\0', 0, 7811, {0}, 0}, + {'k', 7814, 7812, {0}, 0},{'\0', 0, 7813, {0}, 0},{'l', 7818, 7814, {0}, 0}, + {'s', 7832, 7815, {0}, 0},{'t', 7844, 7816, {0}, 0},{'\0', 0, 7817, {0}, 0}, + {'o', 7820, 7818, {0}, 0},{'\0', 0, 7819, {0}, 0},{'z', 7822, 7820, {0}, 0}, + {'\0', 0, 7821, {0}, 0},{'e', 7824, 7822, {0}, 0},{'\0', 0, 7823, {0}, 0}, + {'n', 7826, 7824, {0}, 0},{'\0', 0, 7825, {0}, 0},{'g', 7828, 7826, {0}, 0}, + {'\0', 0, 7827, {0}, 0},{'e', 7830, 7828, {0}, 0},{'\0', 0, 7829, {0}, 0}, + {';', 0, 7830, {10731}, 1},{'\0', 0, 7831, {0}, 0},{'q', 7834, 7832, {0}, 0}, + {'\0', 0, 7833, {0}, 0},{'u', 7836, 7834, {0}, 0},{'\0', 0, 7835, {0}, 0}, + {'a', 7838, 7836, {0}, 0},{'\0', 0, 7837, {0}, 0},{'r', 7840, 7838, {0}, 0}, + {'\0', 0, 7839, {0}, 0},{'e', 7842, 7840, {0}, 0},{'\0', 0, 7841, {0}, 0}, + {';', 0, 7842, {9642}, 1},{'\0', 0, 7843, {0}, 0},{'r', 7846, 7844, {0}, 0}, + {'\0', 0, 7845, {0}, 0},{'i', 7848, 7846, {0}, 0},{'\0', 0, 7847, {0}, 0}, + {'a', 7850, 7848, {0}, 0},{'\0', 0, 7849, {0}, 0},{'n', 7852, 7850, {0}, 0}, + {'\0', 0, 7851, {0}, 0},{'g', 7854, 7852, {0}, 0},{'\0', 0, 7853, {0}, 0}, + {'l', 7856, 7854, {0}, 0},{'\0', 0, 7855, {0}, 0},{'e', 7858, 7856, {0}, 0}, + {'\0', 0, 7857, {0}, 0},{';', 0, 7858, {9652}, 1},{'d', 7863, 7859, {0}, 0}, + {'l', 7871, 7860, {0}, 0},{'r', 7879, 7861, {0}, 0},{'\0', 0, 7862, {0}, 0}, + {'o', 7865, 7863, {0}, 0},{'\0', 0, 7864, {0}, 0},{'w', 7867, 7865, {0}, 0}, + {'\0', 0, 7866, {0}, 0},{'n', 7869, 7867, {0}, 0},{'\0', 0, 7868, {0}, 0}, + {';', 0, 7869, {9662}, 1},{'\0', 0, 7870, {0}, 0},{'e', 7873, 7871, {0}, 0}, + {'\0', 0, 7872, {0}, 0},{'f', 7875, 7873, {0}, 0},{'\0', 0, 7874, {0}, 0}, + {'t', 7877, 7875, {0}, 0},{'\0', 0, 7876, {0}, 0},{';', 0, 7877, {9666}, 1}, + {'\0', 0, 7878, {0}, 0},{'i', 7881, 7879, {0}, 0},{'\0', 0, 7880, {0}, 0}, + {'g', 7883, 7881, {0}, 0},{'\0', 0, 7882, {0}, 0},{'h', 7885, 7883, {0}, 0}, + {'\0', 0, 7884, {0}, 0},{'t', 7887, 7885, {0}, 0},{'\0', 0, 7886, {0}, 0}, + {';', 0, 7887, {9656}, 1},{'\0', 0, 7888, {0}, 0},{'k', 7891, 7889, {0}, 0}, + {'\0', 0, 7890, {0}, 0},{';', 0, 7891, {9251}, 1},{'\0', 0, 7892, {0}, 0}, + {'1', 7896, 7893, {0}, 0},{'3', 7903, 7894, {0}, 0},{'\0', 0, 7895, {0}, 0}, + {'2', 7899, 7896, {0}, 0},{'4', 7901, 7897, {0}, 0},{'\0', 0, 7898, {0}, 0}, + {';', 0, 7899, {9618}, 1},{'\0', 0, 7900, {0}, 0},{';', 0, 7901, {9617}, 1}, + {'\0', 0, 7902, {0}, 0},{'4', 7905, 7903, {0}, 0},{'\0', 0, 7904, {0}, 0}, + {';', 0, 7905, {9619}, 1},{'\0', 0, 7906, {0}, 0},{'c', 7909, 7907, {0}, 0}, + {'\0', 0, 7908, {0}, 0},{'k', 7911, 7909, {0}, 0},{'\0', 0, 7910, {0}, 0}, + {';', 0, 7911, {9608}, 1},{'\0', 0, 7912, {0}, 0},{'e', 7916, 7913, {0}, 0}, + {'o', 7927, 7914, {0}, 0},{'\0', 0, 7915, {0}, 0},{';', 0, 7916, {61,8421}, 2}, + {'q', 7919, 7917, {0}, 0},{'\0', 0, 7918, {0}, 0},{'u', 7921, 7919, {0}, 0}, + {'\0', 0, 7920, {0}, 0},{'i', 7923, 7921, {0}, 0},{'\0', 0, 7922, {0}, 0}, + {'v', 7925, 7923, {0}, 0},{'\0', 0, 7924, {0}, 0},{';', 0, 7925, {8801,8421}, 2}, + {'\0', 0, 7926, {0}, 0},{'t', 7929, 7927, {0}, 0},{'\0', 0, 7928, {0}, 0}, + {';', 0, 7929, {8976}, 1},{'\0', 0, 7930, {0}, 0},{'p', 7936, 7931, {0}, 0}, + {'t', 7940, 7932, {0}, 0},{'w', 7949, 7933, {0}, 0},{'x', 7957, 7934, {0}, 0}, + {'\0', 0, 7935, {0}, 0},{'f', 7938, 7936, {0}, 0},{'\0', 0, 7937, {0}, 0}, + {';', 0, 7938, {120147}, 1},{'\0', 0, 7939, {0}, 0},{';', 0, 7940, {8869}, 1}, + {'t', 7943, 7941, {0}, 0},{'\0', 0, 7942, {0}, 0},{'o', 7945, 7943, {0}, 0}, + {'\0', 0, 7944, {0}, 0},{'m', 7947, 7945, {0}, 0},{'\0', 0, 7946, {0}, 0}, + {';', 0, 7947, {8869}, 1},{'\0', 0, 7948, {0}, 0},{'t', 7951, 7949, {0}, 0}, + {'\0', 0, 7950, {0}, 0},{'i', 7953, 7951, {0}, 0},{'\0', 0, 7952, {0}, 0}, + {'e', 7955, 7953, {0}, 0},{'\0', 0, 7954, {0}, 0},{';', 0, 7955, {8904}, 1}, + {'\0', 0, 7956, {0}, 0},{'D', 7970, 7957, {0}, 0},{'H', 7983, 7958, {0}, 0}, + {'U', 7997, 7959, {0}, 0},{'V', 8010, 7960, {0}, 0},{'b', 8030, 7961, {0}, 0}, + {'d', 8036, 7962, {0}, 0},{'h', 8049, 7963, {0}, 0},{'m', 8063, 7964, {0}, 0}, + {'p', 8073, 7965, {0}, 0},{'t', 8081, 7966, {0}, 0},{'u', 8091, 7967, {0}, 0}, + {'v', 8104, 7968, {0}, 0},{'\0', 0, 7969, {0}, 0},{'L', 7975, 7970, {0}, 0}, + {'R', 7977, 7971, {0}, 0},{'l', 7979, 7972, {0}, 0},{'r', 7981, 7973, {0}, 0}, + {'\0', 0, 7974, {0}, 0},{';', 0, 7975, {9559}, 1},{'\0', 0, 7976, {0}, 0}, + {';', 0, 7977, {9556}, 1},{'\0', 0, 7978, {0}, 0},{';', 0, 7979, {9558}, 1}, + {'\0', 0, 7980, {0}, 0},{';', 0, 7981, {9555}, 1},{'\0', 0, 7982, {0}, 0}, + {';', 0, 7983, {9552}, 1},{'D', 7989, 7984, {0}, 0},{'U', 7991, 7985, {0}, 0}, + {'d', 7993, 7986, {0}, 0},{'u', 7995, 7987, {0}, 0},{'\0', 0, 7988, {0}, 0}, + {';', 0, 7989, {9574}, 1},{'\0', 0, 7990, {0}, 0},{';', 0, 7991, {9577}, 1}, + {'\0', 0, 7992, {0}, 0},{';', 0, 7993, {9572}, 1},{'\0', 0, 7994, {0}, 0}, + {';', 0, 7995, {9575}, 1},{'\0', 0, 7996, {0}, 0},{'L', 8002, 7997, {0}, 0}, + {'R', 8004, 7998, {0}, 0},{'l', 8006, 7999, {0}, 0},{'r', 8008, 8000, {0}, 0}, + {'\0', 0, 8001, {0}, 0},{';', 0, 8002, {9565}, 1},{'\0', 0, 8003, {0}, 0}, + {';', 0, 8004, {9562}, 1},{'\0', 0, 8005, {0}, 0},{';', 0, 8006, {9564}, 1}, + {'\0', 0, 8007, {0}, 0},{';', 0, 8008, {9561}, 1},{'\0', 0, 8009, {0}, 0}, + {';', 0, 8010, {9553}, 1},{'H', 8018, 8011, {0}, 0},{'L', 8020, 8012, {0}, 0}, + {'R', 8022, 8013, {0}, 0},{'h', 8024, 8014, {0}, 0},{'l', 8026, 8015, {0}, 0}, + {'r', 8028, 8016, {0}, 0},{'\0', 0, 8017, {0}, 0},{';', 0, 8018, {9580}, 1}, + {'\0', 0, 8019, {0}, 0},{';', 0, 8020, {9571}, 1},{'\0', 0, 8021, {0}, 0}, + {';', 0, 8022, {9568}, 1},{'\0', 0, 8023, {0}, 0},{';', 0, 8024, {9579}, 1}, + {'\0', 0, 8025, {0}, 0},{';', 0, 8026, {9570}, 1},{'\0', 0, 8027, {0}, 0}, + {';', 0, 8028, {9567}, 1},{'\0', 0, 8029, {0}, 0},{'o', 8032, 8030, {0}, 0}, + {'\0', 0, 8031, {0}, 0},{'x', 8034, 8032, {0}, 0},{'\0', 0, 8033, {0}, 0}, + {';', 0, 8034, {10697}, 1},{'\0', 0, 8035, {0}, 0},{'L', 8041, 8036, {0}, 0}, + {'R', 8043, 8037, {0}, 0},{'l', 8045, 8038, {0}, 0},{'r', 8047, 8039, {0}, 0}, + {'\0', 0, 8040, {0}, 0},{';', 0, 8041, {9557}, 1},{'\0', 0, 8042, {0}, 0}, + {';', 0, 8043, {9554}, 1},{'\0', 0, 8044, {0}, 0},{';', 0, 8045, {9488}, 1}, + {'\0', 0, 8046, {0}, 0},{';', 0, 8047, {9484}, 1},{'\0', 0, 8048, {0}, 0}, + {';', 0, 8049, {9472}, 1},{'D', 8055, 8050, {0}, 0},{'U', 8057, 8051, {0}, 0}, + {'d', 8059, 8052, {0}, 0},{'u', 8061, 8053, {0}, 0},{'\0', 0, 8054, {0}, 0}, + {';', 0, 8055, {9573}, 1},{'\0', 0, 8056, {0}, 0},{';', 0, 8057, {9576}, 1}, + {'\0', 0, 8058, {0}, 0},{';', 0, 8059, {9516}, 1},{'\0', 0, 8060, {0}, 0}, + {';', 0, 8061, {9524}, 1},{'\0', 0, 8062, {0}, 0},{'i', 8065, 8063, {0}, 0}, + {'\0', 0, 8064, {0}, 0},{'n', 8067, 8065, {0}, 0},{'\0', 0, 8066, {0}, 0}, + {'u', 8069, 8067, {0}, 0},{'\0', 0, 8068, {0}, 0},{'s', 8071, 8069, {0}, 0}, + {'\0', 0, 8070, {0}, 0},{';', 0, 8071, {8863}, 1},{'\0', 0, 8072, {0}, 0}, + {'l', 8075, 8073, {0}, 0},{'\0', 0, 8074, {0}, 0},{'u', 8077, 8075, {0}, 0}, + {'\0', 0, 8076, {0}, 0},{'s', 8079, 8077, {0}, 0},{'\0', 0, 8078, {0}, 0}, + {';', 0, 8079, {8862}, 1},{'\0', 0, 8080, {0}, 0},{'i', 8083, 8081, {0}, 0}, + {'\0', 0, 8082, {0}, 0},{'m', 8085, 8083, {0}, 0},{'\0', 0, 8084, {0}, 0}, + {'e', 8087, 8085, {0}, 0},{'\0', 0, 8086, {0}, 0},{'s', 8089, 8087, {0}, 0}, + {'\0', 0, 8088, {0}, 0},{';', 0, 8089, {8864}, 1},{'\0', 0, 8090, {0}, 0}, + {'L', 8096, 8091, {0}, 0},{'R', 8098, 8092, {0}, 0},{'l', 8100, 8093, {0}, 0}, + {'r', 8102, 8094, {0}, 0},{'\0', 0, 8095, {0}, 0},{';', 0, 8096, {9563}, 1}, + {'\0', 0, 8097, {0}, 0},{';', 0, 8098, {9560}, 1},{'\0', 0, 8099, {0}, 0}, + {';', 0, 8100, {9496}, 1},{'\0', 0, 8101, {0}, 0},{';', 0, 8102, {9492}, 1}, + {'\0', 0, 8103, {0}, 0},{';', 0, 8104, {9474}, 1},{'H', 8112, 8105, {0}, 0}, + {'L', 8114, 8106, {0}, 0},{'R', 8116, 8107, {0}, 0},{'h', 8118, 8108, {0}, 0}, + {'l', 8120, 8109, {0}, 0},{'r', 8122, 8110, {0}, 0},{'\0', 0, 8111, {0}, 0}, + {';', 0, 8112, {9578}, 1},{'\0', 0, 8113, {0}, 0},{';', 0, 8114, {9569}, 1}, + {'\0', 0, 8115, {0}, 0},{';', 0, 8116, {9566}, 1},{'\0', 0, 8117, {0}, 0}, + {';', 0, 8118, {9532}, 1},{'\0', 0, 8119, {0}, 0},{';', 0, 8120, {9508}, 1}, + {'\0', 0, 8121, {0}, 0},{';', 0, 8122, {9500}, 1},{'\0', 0, 8123, {0}, 0}, + {'r', 8126, 8124, {0}, 0},{'\0', 0, 8125, {0}, 0},{'i', 8128, 8126, {0}, 0}, + {'\0', 0, 8127, {0}, 0},{'m', 8130, 8128, {0}, 0},{'\0', 0, 8129, {0}, 0}, + {'e', 8132, 8130, {0}, 0},{'\0', 0, 8131, {0}, 0},{';', 0, 8132, {8245}, 1}, + {'\0', 0, 8133, {0}, 0},{'e', 8137, 8134, {0}, 0},{'v', 8143, 8135, {0}, 0}, + {'\0', 0, 8136, {0}, 0},{'v', 8139, 8137, {0}, 0},{'\0', 0, 8138, {0}, 0}, + {'e', 8141, 8139, {0}, 0},{'\0', 0, 8140, {0}, 0},{';', 0, 8141, {728}, 1}, + {'\0', 0, 8142, {0}, 0},{'b', 8145, 8143, {0}, 0},{'\0', 0, 8144, {0}, 0}, + {'a', 8147, 8145, {0}, 0},{'\0', 0, 8146, {0}, 0},{'r', 8149, 8147, {166}, 1}, + {'\0', 0, 8148, {0}, 0},{';', 0, 8149, {166}, 1},{'\0', 0, 8150, {0}, 0}, + {'c', 8156, 8151, {0}, 0},{'e', 8160, 8152, {0}, 0},{'i', 8166, 8153, {0}, 0}, + {'o', 8173, 8154, {0}, 0},{'\0', 0, 8155, {0}, 0},{'r', 8158, 8156, {0}, 0}, + {'\0', 0, 8157, {0}, 0},{';', 0, 8158, {119991}, 1},{'\0', 0, 8159, {0}, 0}, + {'m', 8162, 8160, {0}, 0},{'\0', 0, 8161, {0}, 0},{'i', 8164, 8162, {0}, 0}, + {'\0', 0, 8163, {0}, 0},{';', 0, 8164, {8271}, 1},{'\0', 0, 8165, {0}, 0}, + {'m', 8168, 8166, {0}, 0},{'\0', 0, 8167, {0}, 0},{';', 0, 8168, {8765}, 1}, + {'e', 8171, 8169, {0}, 0},{'\0', 0, 8170, {0}, 0},{';', 0, 8171, {8909}, 1}, + {'\0', 0, 8172, {0}, 0},{'l', 8175, 8173, {0}, 0},{'\0', 0, 8174, {0}, 0}, + {';', 0, 8175, {92}, 1},{'b', 8179, 8176, {0}, 0},{'h', 8181, 8177, {0}, 0}, + {'\0', 0, 8178, {0}, 0},{';', 0, 8179, {10693}, 1},{'\0', 0, 8180, {0}, 0}, + {'s', 8183, 8181, {0}, 0},{'\0', 0, 8182, {0}, 0},{'u', 8185, 8183, {0}, 0}, + {'\0', 0, 8184, {0}, 0},{'b', 8187, 8185, {0}, 0},{'\0', 0, 8186, {0}, 0}, + {';', 0, 8187, {10184}, 1},{'\0', 0, 8188, {0}, 0},{'l', 8192, 8189, {0}, 0}, + {'m', 8201, 8190, {0}, 0},{'\0', 0, 8191, {0}, 0},{'l', 8194, 8192, {0}, 0}, + {'\0', 0, 8193, {0}, 0},{';', 0, 8194, {8226}, 1},{'e', 8197, 8195, {0}, 0}, + {'\0', 0, 8196, {0}, 0},{'t', 8199, 8197, {0}, 0},{'\0', 0, 8198, {0}, 0}, + {';', 0, 8199, {8226}, 1},{'\0', 0, 8200, {0}, 0},{'p', 8203, 8201, {0}, 0}, + {'\0', 0, 8202, {0}, 0},{';', 0, 8203, {8782}, 1},{'E', 8207, 8204, {0}, 0}, + {'e', 8209, 8205, {0}, 0},{'\0', 0, 8206, {0}, 0},{';', 0, 8207, {10926}, 1}, + {'\0', 0, 8208, {0}, 0},{';', 0, 8209, {8783}, 1},{'q', 8212, 8210, {0}, 0}, + {'\0', 0, 8211, {0}, 0},{';', 0, 8212, {8783}, 1},{'\0', 0, 8213, {0}, 0}, + {'a', 8230, 8214, {0}, 0},{'c', 8295, 8215, {0}, 0},{'d', 8338, 8216, {0}, 0}, + {'e', 8344, 8217, {0}, 0},{'f', 8379, 8218, {0}, 0},{'h', 8383, 8219, {0}, 0}, + {'i', 8408, 8220, {0}, 0},{'l', 8520, 8221, {0}, 0},{'o', 8535, 8222, {0}, 0}, + {'r', 8626, 8223, {0}, 0},{'s', 8641, 8224, {0}, 0},{'t', 8661, 8225, {0}, 0}, + {'u', 8669, 8226, {0}, 0},{'w', 8860, 8227, {0}, 0},{'y', 8881, 8228, {0}, 0}, + {'\0', 0, 8229, {0}, 0},{'c', 8234, 8230, {0}, 0},{'p', 8242, 8231, {0}, 0}, + {'r', 8284, 8232, {0}, 0},{'\0', 0, 8233, {0}, 0},{'u', 8236, 8234, {0}, 0}, + {'\0', 0, 8235, {0}, 0},{'t', 8238, 8236, {0}, 0},{'\0', 0, 8237, {0}, 0}, + {'e', 8240, 8238, {0}, 0},{'\0', 0, 8239, {0}, 0},{';', 0, 8240, {263}, 1}, + {'\0', 0, 8241, {0}, 0},{';', 0, 8242, {8745}, 1},{'a', 8249, 8243, {0}, 0}, + {'b', 8255, 8244, {0}, 0},{'c', 8265, 8245, {0}, 0},{'d', 8276, 8246, {0}, 0}, + {'s', 8282, 8247, {0}, 0},{'\0', 0, 8248, {0}, 0},{'n', 8251, 8249, {0}, 0}, + {'\0', 0, 8250, {0}, 0},{'d', 8253, 8251, {0}, 0},{'\0', 0, 8252, {0}, 0}, + {';', 0, 8253, {10820}, 1},{'\0', 0, 8254, {0}, 0},{'r', 8257, 8255, {0}, 0}, + {'\0', 0, 8256, {0}, 0},{'c', 8259, 8257, {0}, 0},{'\0', 0, 8258, {0}, 0}, + {'u', 8261, 8259, {0}, 0},{'\0', 0, 8260, {0}, 0},{'p', 8263, 8261, {0}, 0}, + {'\0', 0, 8262, {0}, 0},{';', 0, 8263, {10825}, 1},{'\0', 0, 8264, {0}, 0}, + {'a', 8268, 8265, {0}, 0},{'u', 8272, 8266, {0}, 0},{'\0', 0, 8267, {0}, 0}, + {'p', 8270, 8268, {0}, 0},{'\0', 0, 8269, {0}, 0},{';', 0, 8270, {10827}, 1}, + {'\0', 0, 8271, {0}, 0},{'p', 8274, 8272, {0}, 0},{'\0', 0, 8273, {0}, 0}, + {';', 0, 8274, {10823}, 1},{'\0', 0, 8275, {0}, 0},{'o', 8278, 8276, {0}, 0}, + {'\0', 0, 8277, {0}, 0},{'t', 8280, 8278, {0}, 0},{'\0', 0, 8279, {0}, 0}, + {';', 0, 8280, {10816}, 1},{'\0', 0, 8281, {0}, 0},{';', 0, 8282, {8745,65024}, 2}, + {'\0', 0, 8283, {0}, 0},{'e', 8287, 8284, {0}, 0},{'o', 8291, 8285, {0}, 0}, + {'\0', 0, 8286, {0}, 0},{'t', 8289, 8287, {0}, 0},{'\0', 0, 8288, {0}, 0}, + {';', 0, 8289, {8257}, 1},{'\0', 0, 8290, {0}, 0},{'n', 8293, 8291, {0}, 0}, + {'\0', 0, 8292, {0}, 0},{';', 0, 8293, {711}, 1},{'\0', 0, 8294, {0}, 0}, + {'a', 8300, 8295, {0}, 0},{'e', 8313, 8296, {0}, 0},{'i', 8321, 8297, {0}, 0}, + {'u', 8327, 8298, {0}, 0},{'\0', 0, 8299, {0}, 0},{'p', 8303, 8300, {0}, 0}, + {'r', 8307, 8301, {0}, 0},{'\0', 0, 8302, {0}, 0},{'s', 8305, 8303, {0}, 0}, + {'\0', 0, 8304, {0}, 0},{';', 0, 8305, {10829}, 1},{'\0', 0, 8306, {0}, 0}, + {'o', 8309, 8307, {0}, 0},{'\0', 0, 8308, {0}, 0},{'n', 8311, 8309, {0}, 0}, + {'\0', 0, 8310, {0}, 0},{';', 0, 8311, {269}, 1},{'\0', 0, 8312, {0}, 0}, + {'d', 8315, 8313, {0}, 0},{'\0', 0, 8314, {0}, 0},{'i', 8317, 8315, {0}, 0}, + {'\0', 0, 8316, {0}, 0},{'l', 8319, 8317, {231}, 1},{'\0', 0, 8318, {0}, 0}, + {';', 0, 8319, {231}, 1},{'\0', 0, 8320, {0}, 0},{'r', 8323, 8321, {0}, 0}, + {'\0', 0, 8322, {0}, 0},{'c', 8325, 8323, {0}, 0},{'\0', 0, 8324, {0}, 0}, + {';', 0, 8325, {265}, 1},{'\0', 0, 8326, {0}, 0},{'p', 8329, 8327, {0}, 0}, + {'\0', 0, 8328, {0}, 0},{'s', 8331, 8329, {0}, 0},{'\0', 0, 8330, {0}, 0}, + {';', 0, 8331, {10828}, 1},{'s', 8334, 8332, {0}, 0},{'\0', 0, 8333, {0}, 0}, + {'m', 8336, 8334, {0}, 0},{'\0', 0, 8335, {0}, 0},{';', 0, 8336, {10832}, 1}, + {'\0', 0, 8337, {0}, 0},{'o', 8340, 8338, {0}, 0},{'\0', 0, 8339, {0}, 0}, + {'t', 8342, 8340, {0}, 0},{'\0', 0, 8341, {0}, 0},{';', 0, 8342, {267}, 1}, + {'\0', 0, 8343, {0}, 0},{'d', 8348, 8344, {0}, 0},{'m', 8354, 8345, {0}, 0}, + {'n', 8364, 8346, {0}, 0},{'\0', 0, 8347, {0}, 0},{'i', 8350, 8348, {0}, 0}, + {'\0', 0, 8349, {0}, 0},{'l', 8352, 8350, {184}, 1},{'\0', 0, 8351, {0}, 0}, + {';', 0, 8352, {184}, 1},{'\0', 0, 8353, {0}, 0},{'p', 8356, 8354, {0}, 0}, + {'\0', 0, 8355, {0}, 0},{'t', 8358, 8356, {0}, 0},{'\0', 0, 8357, {0}, 0}, + {'y', 8360, 8358, {0}, 0},{'\0', 0, 8359, {0}, 0},{'v', 8362, 8360, {0}, 0}, + {'\0', 0, 8361, {0}, 0},{';', 0, 8362, {10674}, 1},{'\0', 0, 8363, {0}, 0}, + {'t', 8366, 8364, {162}, 1},{'\0', 0, 8365, {0}, 0},{';', 0, 8366, {162}, 1}, + {'e', 8369, 8367, {0}, 0},{'\0', 0, 8368, {0}, 0},{'r', 8371, 8369, {0}, 0}, + {'\0', 0, 8370, {0}, 0},{'d', 8373, 8371, {0}, 0},{'\0', 0, 8372, {0}, 0}, + {'o', 8375, 8373, {0}, 0},{'\0', 0, 8374, {0}, 0},{'t', 8377, 8375, {0}, 0}, + {'\0', 0, 8376, {0}, 0},{';', 0, 8377, {183}, 1},{'\0', 0, 8378, {0}, 0}, + {'r', 8381, 8379, {0}, 0},{'\0', 0, 8380, {0}, 0},{';', 0, 8381, {120096}, 1}, + {'\0', 0, 8382, {0}, 0},{'c', 8387, 8383, {0}, 0},{'e', 8391, 8384, {0}, 0}, + {'i', 8406, 8385, {0}, 0},{'\0', 0, 8386, {0}, 0},{'y', 8389, 8387, {0}, 0}, + {'\0', 0, 8388, {0}, 0},{';', 0, 8389, {1095}, 1},{'\0', 0, 8390, {0}, 0}, + {'c', 8393, 8391, {0}, 0},{'\0', 0, 8392, {0}, 0},{'k', 8395, 8393, {0}, 0}, + {'\0', 0, 8394, {0}, 0},{';', 0, 8395, {10003}, 1},{'m', 8398, 8396, {0}, 0}, + {'\0', 0, 8397, {0}, 0},{'a', 8400, 8398, {0}, 0},{'\0', 0, 8399, {0}, 0}, + {'r', 8402, 8400, {0}, 0},{'\0', 0, 8401, {0}, 0},{'k', 8404, 8402, {0}, 0}, + {'\0', 0, 8403, {0}, 0},{';', 0, 8404, {10003}, 1},{'\0', 0, 8405, {0}, 0}, + {';', 0, 8406, {967}, 1},{'\0', 0, 8407, {0}, 0},{'r', 8410, 8408, {0}, 0}, + {'\0', 0, 8409, {0}, 0},{';', 0, 8410, {9675}, 1},{'E', 8418, 8411, {0}, 0}, + {'c', 8420, 8412, {0}, 0},{'e', 8494, 8413, {0}, 0},{'f', 8496, 8414, {0}, 0}, + {'m', 8506, 8415, {0}, 0},{'s', 8512, 8416, {0}, 0},{'\0', 0, 8417, {0}, 0}, + {';', 0, 8418, {10691}, 1},{'\0', 0, 8419, {0}, 0},{';', 0, 8420, {710}, 1}, + {'e', 8424, 8421, {0}, 0},{'l', 8428, 8422, {0}, 0},{'\0', 0, 8423, {0}, 0}, + {'q', 8426, 8424, {0}, 0},{'\0', 0, 8425, {0}, 0},{';', 0, 8426, {8791}, 1}, + {'\0', 0, 8427, {0}, 0},{'e', 8430, 8428, {0}, 0},{'\0', 0, 8429, {0}, 0}, + {'a', 8433, 8430, {0}, 0},{'d', 8462, 8431, {0}, 0},{'\0', 0, 8432, {0}, 0}, + {'r', 8435, 8433, {0}, 0},{'\0', 0, 8434, {0}, 0},{'r', 8437, 8435, {0}, 0}, + {'\0', 0, 8436, {0}, 0},{'o', 8439, 8437, {0}, 0},{'\0', 0, 8438, {0}, 0}, + {'w', 8441, 8439, {0}, 0},{'\0', 0, 8440, {0}, 0},{'l', 8444, 8441, {0}, 0}, + {'r', 8452, 8442, {0}, 0},{'\0', 0, 8443, {0}, 0},{'e', 8446, 8444, {0}, 0}, + {'\0', 0, 8445, {0}, 0},{'f', 8448, 8446, {0}, 0},{'\0', 0, 8447, {0}, 0}, + {'t', 8450, 8448, {0}, 0},{'\0', 0, 8449, {0}, 0},{';', 0, 8450, {8634}, 1}, + {'\0', 0, 8451, {0}, 0},{'i', 8454, 8452, {0}, 0},{'\0', 0, 8453, {0}, 0}, + {'g', 8456, 8454, {0}, 0},{'\0', 0, 8455, {0}, 0},{'h', 8458, 8456, {0}, 0}, + {'\0', 0, 8457, {0}, 0},{'t', 8460, 8458, {0}, 0},{'\0', 0, 8459, {0}, 0}, + {';', 0, 8460, {8635}, 1},{'\0', 0, 8461, {0}, 0},{'R', 8468, 8462, {0}, 0}, + {'S', 8470, 8463, {0}, 0},{'a', 8472, 8464, {0}, 0},{'c', 8478, 8465, {0}, 0}, + {'d', 8486, 8466, {0}, 0},{'\0', 0, 8467, {0}, 0},{';', 0, 8468, {174}, 1}, + {'\0', 0, 8469, {0}, 0},{';', 0, 8470, {9416}, 1},{'\0', 0, 8471, {0}, 0}, + {'s', 8474, 8472, {0}, 0},{'\0', 0, 8473, {0}, 0},{'t', 8476, 8474, {0}, 0}, + {'\0', 0, 8475, {0}, 0},{';', 0, 8476, {8859}, 1},{'\0', 0, 8477, {0}, 0}, + {'i', 8480, 8478, {0}, 0},{'\0', 0, 8479, {0}, 0},{'r', 8482, 8480, {0}, 0}, + {'\0', 0, 8481, {0}, 0},{'c', 8484, 8482, {0}, 0},{'\0', 0, 8483, {0}, 0}, + {';', 0, 8484, {8858}, 1},{'\0', 0, 8485, {0}, 0},{'a', 8488, 8486, {0}, 0}, + {'\0', 0, 8487, {0}, 0},{'s', 8490, 8488, {0}, 0},{'\0', 0, 8489, {0}, 0}, + {'h', 8492, 8490, {0}, 0},{'\0', 0, 8491, {0}, 0},{';', 0, 8492, {8861}, 1}, + {'\0', 0, 8493, {0}, 0},{';', 0, 8494, {8791}, 1},{'\0', 0, 8495, {0}, 0}, + {'n', 8498, 8496, {0}, 0},{'\0', 0, 8497, {0}, 0},{'i', 8500, 8498, {0}, 0}, + {'\0', 0, 8499, {0}, 0},{'n', 8502, 8500, {0}, 0},{'\0', 0, 8501, {0}, 0}, + {'t', 8504, 8502, {0}, 0},{'\0', 0, 8503, {0}, 0},{';', 0, 8504, {10768}, 1}, + {'\0', 0, 8505, {0}, 0},{'i', 8508, 8506, {0}, 0},{'\0', 0, 8507, {0}, 0}, + {'d', 8510, 8508, {0}, 0},{'\0', 0, 8509, {0}, 0},{';', 0, 8510, {10991}, 1}, + {'\0', 0, 8511, {0}, 0},{'c', 8514, 8512, {0}, 0},{'\0', 0, 8513, {0}, 0}, + {'i', 8516, 8514, {0}, 0},{'\0', 0, 8515, {0}, 0},{'r', 8518, 8516, {0}, 0}, + {'\0', 0, 8517, {0}, 0},{';', 0, 8518, {10690}, 1},{'\0', 0, 8519, {0}, 0}, + {'u', 8522, 8520, {0}, 0},{'\0', 0, 8521, {0}, 0},{'b', 8524, 8522, {0}, 0}, + {'\0', 0, 8523, {0}, 0},{'s', 8526, 8524, {0}, 0},{'\0', 0, 8525, {0}, 0}, + {';', 0, 8526, {9827}, 1},{'u', 8529, 8527, {0}, 0},{'\0', 0, 8528, {0}, 0}, + {'i', 8531, 8529, {0}, 0},{'\0', 0, 8530, {0}, 0},{'t', 8533, 8531, {0}, 0}, + {'\0', 0, 8532, {0}, 0},{';', 0, 8533, {9827}, 1},{'\0', 0, 8534, {0}, 0}, + {'l', 8540, 8535, {0}, 0},{'m', 8552, 8536, {0}, 0},{'n', 8589, 8537, {0}, 0}, + {'p', 8607, 8538, {0}, 0},{'\0', 0, 8539, {0}, 0},{'o', 8542, 8540, {0}, 0}, + {'\0', 0, 8541, {0}, 0},{'n', 8544, 8542, {0}, 0},{'\0', 0, 8543, {0}, 0}, + {';', 0, 8544, {58}, 1},{'e', 8547, 8545, {0}, 0},{'\0', 0, 8546, {0}, 0}, + {';', 0, 8547, {8788}, 1},{'q', 8550, 8548, {0}, 0},{'\0', 0, 8549, {0}, 0}, + {';', 0, 8550, {8788}, 1},{'\0', 0, 8551, {0}, 0},{'m', 8555, 8552, {0}, 0}, + {'p', 8562, 8553, {0}, 0},{'\0', 0, 8554, {0}, 0},{'a', 8557, 8555, {0}, 0}, + {'\0', 0, 8556, {0}, 0},{';', 0, 8557, {44}, 1},{'t', 8560, 8558, {0}, 0}, + {'\0', 0, 8559, {0}, 0},{';', 0, 8560, {64}, 1},{'\0', 0, 8561, {0}, 0}, + {';', 0, 8562, {8705}, 1},{'f', 8566, 8563, {0}, 0},{'l', 8570, 8564, {0}, 0}, + {'\0', 0, 8565, {0}, 0},{'n', 8568, 8566, {0}, 0},{'\0', 0, 8567, {0}, 0}, + {';', 0, 8568, {8728}, 1},{'\0', 0, 8569, {0}, 0},{'e', 8572, 8570, {0}, 0}, + {'\0', 0, 8571, {0}, 0},{'m', 8575, 8572, {0}, 0},{'x', 8583, 8573, {0}, 0}, + {'\0', 0, 8574, {0}, 0},{'e', 8577, 8575, {0}, 0},{'\0', 0, 8576, {0}, 0}, + {'n', 8579, 8577, {0}, 0},{'\0', 0, 8578, {0}, 0},{'t', 8581, 8579, {0}, 0}, + {'\0', 0, 8580, {0}, 0},{';', 0, 8581, {8705}, 1},{'\0', 0, 8582, {0}, 0}, + {'e', 8585, 8583, {0}, 0},{'\0', 0, 8584, {0}, 0},{'s', 8587, 8585, {0}, 0}, + {'\0', 0, 8586, {0}, 0},{';', 0, 8587, {8450}, 1},{'\0', 0, 8588, {0}, 0}, + {'g', 8592, 8589, {0}, 0},{'i', 8601, 8590, {0}, 0},{'\0', 0, 8591, {0}, 0}, + {';', 0, 8592, {8773}, 1},{'d', 8595, 8593, {0}, 0},{'\0', 0, 8594, {0}, 0}, + {'o', 8597, 8595, {0}, 0},{'\0', 0, 8596, {0}, 0},{'t', 8599, 8597, {0}, 0}, + {'\0', 0, 8598, {0}, 0},{';', 0, 8599, {10861}, 1},{'\0', 0, 8600, {0}, 0}, + {'n', 8603, 8601, {0}, 0},{'\0', 0, 8602, {0}, 0},{'t', 8605, 8603, {0}, 0}, + {'\0', 0, 8604, {0}, 0},{';', 0, 8605, {8750}, 1},{'\0', 0, 8606, {0}, 0}, + {'f', 8611, 8607, {0}, 0},{'r', 8613, 8608, {0}, 0},{'y', 8619, 8609, {169}, 1}, + {'\0', 0, 8610, {0}, 0},{';', 0, 8611, {120148}, 1},{'\0', 0, 8612, {0}, 0}, + {'o', 8615, 8613, {0}, 0},{'\0', 0, 8614, {0}, 0},{'d', 8617, 8615, {0}, 0}, + {'\0', 0, 8616, {0}, 0},{';', 0, 8617, {8720}, 1},{'\0', 0, 8618, {0}, 0}, + {';', 0, 8619, {169}, 1},{'s', 8622, 8620, {0}, 0},{'\0', 0, 8621, {0}, 0}, + {'r', 8624, 8622, {0}, 0},{'\0', 0, 8623, {0}, 0},{';', 0, 8624, {8471}, 1}, + {'\0', 0, 8625, {0}, 0},{'a', 8629, 8626, {0}, 0},{'o', 8635, 8627, {0}, 0}, + {'\0', 0, 8628, {0}, 0},{'r', 8631, 8629, {0}, 0},{'\0', 0, 8630, {0}, 0}, + {'r', 8633, 8631, {0}, 0},{'\0', 0, 8632, {0}, 0},{';', 0, 8633, {8629}, 1}, + {'\0', 0, 8634, {0}, 0},{'s', 8637, 8635, {0}, 0},{'\0', 0, 8636, {0}, 0}, + {'s', 8639, 8637, {0}, 0},{'\0', 0, 8638, {0}, 0},{';', 0, 8639, {10007}, 1}, + {'\0', 0, 8640, {0}, 0},{'c', 8644, 8641, {0}, 0},{'u', 8648, 8642, {0}, 0}, + {'\0', 0, 8643, {0}, 0},{'r', 8646, 8644, {0}, 0},{'\0', 0, 8645, {0}, 0}, + {';', 0, 8646, {119992}, 1},{'\0', 0, 8647, {0}, 0},{'b', 8651, 8648, {0}, 0}, + {'p', 8656, 8649, {0}, 0},{'\0', 0, 8650, {0}, 0},{';', 0, 8651, {10959}, 1}, + {'e', 8654, 8652, {0}, 0},{'\0', 0, 8653, {0}, 0},{';', 0, 8654, {10961}, 1}, + {'\0', 0, 8655, {0}, 0},{';', 0, 8656, {10960}, 1},{'e', 8659, 8657, {0}, 0}, + {'\0', 0, 8658, {0}, 0},{';', 0, 8659, {10962}, 1},{'\0', 0, 8660, {0}, 0}, + {'d', 8663, 8661, {0}, 0},{'\0', 0, 8662, {0}, 0},{'o', 8665, 8663, {0}, 0}, + {'\0', 0, 8664, {0}, 0},{'t', 8667, 8665, {0}, 0},{'\0', 0, 8666, {0}, 0}, + {';', 0, 8667, {8943}, 1},{'\0', 0, 8668, {0}, 0},{'d', 8677, 8669, {0}, 0}, + {'e', 8690, 8670, {0}, 0},{'l', 8701, 8671, {0}, 0},{'p', 8712, 8672, {0}, 0}, + {'r', 8752, 8673, {0}, 0},{'v', 8848, 8674, {0}, 0},{'w', 8854, 8675, {0}, 0}, + {'\0', 0, 8676, {0}, 0},{'a', 8679, 8677, {0}, 0},{'\0', 0, 8678, {0}, 0}, + {'r', 8681, 8679, {0}, 0},{'\0', 0, 8680, {0}, 0},{'r', 8683, 8681, {0}, 0}, + {'\0', 0, 8682, {0}, 0},{'l', 8686, 8683, {0}, 0},{'r', 8688, 8684, {0}, 0}, + {'\0', 0, 8685, {0}, 0},{';', 0, 8686, {10552}, 1},{'\0', 0, 8687, {0}, 0}, + {';', 0, 8688, {10549}, 1},{'\0', 0, 8689, {0}, 0},{'p', 8693, 8690, {0}, 0}, + {'s', 8697, 8691, {0}, 0},{'\0', 0, 8692, {0}, 0},{'r', 8695, 8693, {0}, 0}, + {'\0', 0, 8694, {0}, 0},{';', 0, 8695, {8926}, 1},{'\0', 0, 8696, {0}, 0}, + {'c', 8699, 8697, {0}, 0},{'\0', 0, 8698, {0}, 0},{';', 0, 8699, {8927}, 1}, + {'\0', 0, 8700, {0}, 0},{'a', 8703, 8701, {0}, 0},{'\0', 0, 8702, {0}, 0}, + {'r', 8705, 8703, {0}, 0},{'\0', 0, 8704, {0}, 0},{'r', 8707, 8705, {0}, 0}, + {'\0', 0, 8706, {0}, 0},{';', 0, 8707, {8630}, 1},{'p', 8710, 8708, {0}, 0}, + {'\0', 0, 8709, {0}, 0},{';', 0, 8710, {10557}, 1},{'\0', 0, 8711, {0}, 0}, + {';', 0, 8712, {8746}, 1},{'b', 8719, 8713, {0}, 0},{'c', 8729, 8714, {0}, 0}, + {'d', 8740, 8715, {0}, 0},{'o', 8746, 8716, {0}, 0},{'s', 8750, 8717, {0}, 0}, + {'\0', 0, 8718, {0}, 0},{'r', 8721, 8719, {0}, 0},{'\0', 0, 8720, {0}, 0}, + {'c', 8723, 8721, {0}, 0},{'\0', 0, 8722, {0}, 0},{'a', 8725, 8723, {0}, 0}, + {'\0', 0, 8724, {0}, 0},{'p', 8727, 8725, {0}, 0},{'\0', 0, 8726, {0}, 0}, + {';', 0, 8727, {10824}, 1},{'\0', 0, 8728, {0}, 0},{'a', 8732, 8729, {0}, 0}, + {'u', 8736, 8730, {0}, 0},{'\0', 0, 8731, {0}, 0},{'p', 8734, 8732, {0}, 0}, + {'\0', 0, 8733, {0}, 0},{';', 0, 8734, {10822}, 1},{'\0', 0, 8735, {0}, 0}, + {'p', 8738, 8736, {0}, 0},{'\0', 0, 8737, {0}, 0},{';', 0, 8738, {10826}, 1}, + {'\0', 0, 8739, {0}, 0},{'o', 8742, 8740, {0}, 0},{'\0', 0, 8741, {0}, 0}, + {'t', 8744, 8742, {0}, 0},{'\0', 0, 8743, {0}, 0},{';', 0, 8744, {8845}, 1}, + {'\0', 0, 8745, {0}, 0},{'r', 8748, 8746, {0}, 0},{'\0', 0, 8747, {0}, 0}, + {';', 0, 8748, {10821}, 1},{'\0', 0, 8749, {0}, 0},{';', 0, 8750, {8746,65024}, 2}, + {'\0', 0, 8751, {0}, 0},{'a', 8757, 8752, {0}, 0},{'l', 8766, 8753, {0}, 0}, + {'r', 8809, 8754, {0}, 0},{'v', 8815, 8755, {0}, 0},{'\0', 0, 8756, {0}, 0}, + {'r', 8759, 8757, {0}, 0},{'\0', 0, 8758, {0}, 0},{'r', 8761, 8759, {0}, 0}, + {'\0', 0, 8760, {0}, 0},{';', 0, 8761, {8631}, 1},{'m', 8764, 8762, {0}, 0}, + {'\0', 0, 8763, {0}, 0},{';', 0, 8764, {10556}, 1},{'\0', 0, 8765, {0}, 0}, + {'y', 8768, 8766, {0}, 0},{'\0', 0, 8767, {0}, 0},{'e', 8772, 8768, {0}, 0}, + {'v', 8793, 8769, {0}, 0},{'w', 8799, 8770, {0}, 0},{'\0', 0, 8771, {0}, 0}, + {'q', 8774, 8772, {0}, 0},{'\0', 0, 8773, {0}, 0},{'p', 8777, 8774, {0}, 0}, + {'s', 8785, 8775, {0}, 0},{'\0', 0, 8776, {0}, 0},{'r', 8779, 8777, {0}, 0}, + {'\0', 0, 8778, {0}, 0},{'e', 8781, 8779, {0}, 0},{'\0', 0, 8780, {0}, 0}, + {'c', 8783, 8781, {0}, 0},{'\0', 0, 8782, {0}, 0},{';', 0, 8783, {8926}, 1}, + {'\0', 0, 8784, {0}, 0},{'u', 8787, 8785, {0}, 0},{'\0', 0, 8786, {0}, 0}, + {'c', 8789, 8787, {0}, 0},{'\0', 0, 8788, {0}, 0},{'c', 8791, 8789, {0}, 0}, + {'\0', 0, 8790, {0}, 0},{';', 0, 8791, {8927}, 1},{'\0', 0, 8792, {0}, 0}, + {'e', 8795, 8793, {0}, 0},{'\0', 0, 8794, {0}, 0},{'e', 8797, 8795, {0}, 0}, + {'\0', 0, 8796, {0}, 0},{';', 0, 8797, {8910}, 1},{'\0', 0, 8798, {0}, 0}, + {'e', 8801, 8799, {0}, 0},{'\0', 0, 8800, {0}, 0},{'d', 8803, 8801, {0}, 0}, + {'\0', 0, 8802, {0}, 0},{'g', 8805, 8803, {0}, 0},{'\0', 0, 8804, {0}, 0}, + {'e', 8807, 8805, {0}, 0},{'\0', 0, 8806, {0}, 0},{';', 0, 8807, {8911}, 1}, + {'\0', 0, 8808, {0}, 0},{'e', 8811, 8809, {0}, 0},{'\0', 0, 8810, {0}, 0}, + {'n', 8813, 8811, {164}, 1},{'\0', 0, 8812, {0}, 0},{';', 0, 8813, {164}, 1}, + {'\0', 0, 8814, {0}, 0},{'e', 8817, 8815, {0}, 0},{'\0', 0, 8816, {0}, 0}, + {'a', 8819, 8817, {0}, 0},{'\0', 0, 8818, {0}, 0},{'r', 8821, 8819, {0}, 0}, + {'\0', 0, 8820, {0}, 0},{'r', 8823, 8821, {0}, 0},{'\0', 0, 8822, {0}, 0}, + {'o', 8825, 8823, {0}, 0},{'\0', 0, 8824, {0}, 0},{'w', 8827, 8825, {0}, 0}, + {'\0', 0, 8826, {0}, 0},{'l', 8830, 8827, {0}, 0},{'r', 8838, 8828, {0}, 0}, + {'\0', 0, 8829, {0}, 0},{'e', 8832, 8830, {0}, 0},{'\0', 0, 8831, {0}, 0}, + {'f', 8834, 8832, {0}, 0},{'\0', 0, 8833, {0}, 0},{'t', 8836, 8834, {0}, 0}, + {'\0', 0, 8835, {0}, 0},{';', 0, 8836, {8630}, 1},{'\0', 0, 8837, {0}, 0}, + {'i', 8840, 8838, {0}, 0},{'\0', 0, 8839, {0}, 0},{'g', 8842, 8840, {0}, 0}, + {'\0', 0, 8841, {0}, 0},{'h', 8844, 8842, {0}, 0},{'\0', 0, 8843, {0}, 0}, + {'t', 8846, 8844, {0}, 0},{'\0', 0, 8845, {0}, 0},{';', 0, 8846, {8631}, 1}, + {'\0', 0, 8847, {0}, 0},{'e', 8850, 8848, {0}, 0},{'\0', 0, 8849, {0}, 0}, + {'e', 8852, 8850, {0}, 0},{'\0', 0, 8851, {0}, 0},{';', 0, 8852, {8910}, 1}, + {'\0', 0, 8853, {0}, 0},{'e', 8856, 8854, {0}, 0},{'\0', 0, 8855, {0}, 0}, + {'d', 8858, 8856, {0}, 0},{'\0', 0, 8857, {0}, 0},{';', 0, 8858, {8911}, 1}, + {'\0', 0, 8859, {0}, 0},{'c', 8863, 8860, {0}, 0},{'i', 8875, 8861, {0}, 0}, + {'\0', 0, 8862, {0}, 0},{'o', 8865, 8863, {0}, 0},{'\0', 0, 8864, {0}, 0}, + {'n', 8867, 8865, {0}, 0},{'\0', 0, 8866, {0}, 0},{'i', 8869, 8867, {0}, 0}, + {'\0', 0, 8868, {0}, 0},{'n', 8871, 8869, {0}, 0},{'\0', 0, 8870, {0}, 0}, + {'t', 8873, 8871, {0}, 0},{'\0', 0, 8872, {0}, 0},{';', 0, 8873, {8754}, 1}, + {'\0', 0, 8874, {0}, 0},{'n', 8877, 8875, {0}, 0},{'\0', 0, 8876, {0}, 0}, + {'t', 8879, 8877, {0}, 0},{'\0', 0, 8878, {0}, 0},{';', 0, 8879, {8753}, 1}, + {'\0', 0, 8880, {0}, 0},{'l', 8883, 8881, {0}, 0},{'\0', 0, 8882, {0}, 0}, + {'c', 8885, 8883, {0}, 0},{'\0', 0, 8884, {0}, 0},{'t', 8887, 8885, {0}, 0}, + {'\0', 0, 8886, {0}, 0},{'y', 8889, 8887, {0}, 0},{'\0', 0, 8888, {0}, 0}, + {';', 0, 8889, {9005}, 1},{'\0', 0, 8890, {0}, 0},{'A', 8911, 8891, {0}, 0}, + {'H', 8917, 8892, {0}, 0},{'a', 8923, 8893, {0}, 0},{'b', 8955, 8894, {0}, 0}, + {'c', 8974, 8895, {0}, 0},{'d', 8987, 8896, {0}, 0},{'e', 9016, 8897, {0}, 0}, + {'f', 9038, 8898, {0}, 0},{'h', 9051, 8899, {0}, 0},{'i', 9062, 8900, {0}, 0}, + {'j', 9140, 8901, {0}, 0},{'l', 9146, 8902, {0}, 0},{'o', 9163, 8903, {0}, 0}, + {'r', 9321, 8904, {0}, 0},{'s', 9351, 8905, {0}, 0},{'t', 9374, 8906, {0}, 0}, + {'u', 9390, 8907, {0}, 0},{'w', 9405, 8908, {0}, 0},{'z', 9417, 8909, {0}, 0}, + {'\0', 0, 8910, {0}, 0},{'r', 8913, 8911, {0}, 0},{'\0', 0, 8912, {0}, 0}, + {'r', 8915, 8913, {0}, 0},{'\0', 0, 8914, {0}, 0},{';', 0, 8915, {8659}, 1}, + {'\0', 0, 8916, {0}, 0},{'a', 8919, 8917, {0}, 0},{'\0', 0, 8918, {0}, 0}, + {'r', 8921, 8919, {0}, 0},{'\0', 0, 8920, {0}, 0},{';', 0, 8921, {10597}, 1}, + {'\0', 0, 8922, {0}, 0},{'g', 8928, 8923, {0}, 0},{'l', 8936, 8924, {0}, 0}, + {'r', 8944, 8925, {0}, 0},{'s', 8948, 8926, {0}, 0},{'\0', 0, 8927, {0}, 0}, + {'g', 8930, 8928, {0}, 0},{'\0', 0, 8929, {0}, 0},{'e', 8932, 8930, {0}, 0}, + {'\0', 0, 8931, {0}, 0},{'r', 8934, 8932, {0}, 0},{'\0', 0, 8933, {0}, 0}, + {';', 0, 8934, {8224}, 1},{'\0', 0, 8935, {0}, 0},{'e', 8938, 8936, {0}, 0}, + {'\0', 0, 8937, {0}, 0},{'t', 8940, 8938, {0}, 0},{'\0', 0, 8939, {0}, 0}, + {'h', 8942, 8940, {0}, 0},{'\0', 0, 8941, {0}, 0},{';', 0, 8942, {8504}, 1}, + {'\0', 0, 8943, {0}, 0},{'r', 8946, 8944, {0}, 0},{'\0', 0, 8945, {0}, 0}, + {';', 0, 8946, {8595}, 1},{'\0', 0, 8947, {0}, 0},{'h', 8950, 8948, {0}, 0}, + {'\0', 0, 8949, {0}, 0},{';', 0, 8950, {8208}, 1},{'v', 8953, 8951, {0}, 0}, + {'\0', 0, 8952, {0}, 0},{';', 0, 8953, {8867}, 1},{'\0', 0, 8954, {0}, 0}, + {'k', 8958, 8955, {0}, 0},{'l', 8968, 8956, {0}, 0},{'\0', 0, 8957, {0}, 0}, + {'a', 8960, 8958, {0}, 0},{'\0', 0, 8959, {0}, 0},{'r', 8962, 8960, {0}, 0}, + {'\0', 0, 8961, {0}, 0},{'o', 8964, 8962, {0}, 0},{'\0', 0, 8963, {0}, 0}, + {'w', 8966, 8964, {0}, 0},{'\0', 0, 8965, {0}, 0},{';', 0, 8966, {10511}, 1}, + {'\0', 0, 8967, {0}, 0},{'a', 8970, 8968, {0}, 0},{'\0', 0, 8969, {0}, 0}, + {'c', 8972, 8970, {0}, 0},{'\0', 0, 8971, {0}, 0},{';', 0, 8972, {733}, 1}, + {'\0', 0, 8973, {0}, 0},{'a', 8977, 8974, {0}, 0},{'y', 8985, 8975, {0}, 0}, + {'\0', 0, 8976, {0}, 0},{'r', 8979, 8977, {0}, 0},{'\0', 0, 8978, {0}, 0}, + {'o', 8981, 8979, {0}, 0},{'\0', 0, 8980, {0}, 0},{'n', 8983, 8981, {0}, 0}, + {'\0', 0, 8982, {0}, 0},{';', 0, 8983, {271}, 1},{'\0', 0, 8984, {0}, 0}, + {';', 0, 8985, {1076}, 1},{'\0', 0, 8986, {0}, 0},{';', 0, 8987, {8518}, 1}, + {'a', 8991, 8988, {0}, 0},{'o', 9006, 8989, {0}, 0},{'\0', 0, 8990, {0}, 0}, + {'g', 8994, 8991, {0}, 0},{'r', 9002, 8992, {0}, 0},{'\0', 0, 8993, {0}, 0}, + {'g', 8996, 8994, {0}, 0},{'\0', 0, 8995, {0}, 0},{'e', 8998, 8996, {0}, 0}, + {'\0', 0, 8997, {0}, 0},{'r', 9000, 8998, {0}, 0},{'\0', 0, 8999, {0}, 0}, + {';', 0, 9000, {8225}, 1},{'\0', 0, 9001, {0}, 0},{'r', 9004, 9002, {0}, 0}, + {'\0', 0, 9003, {0}, 0},{';', 0, 9004, {8650}, 1},{'\0', 0, 9005, {0}, 0}, + {'t', 9008, 9006, {0}, 0},{'\0', 0, 9007, {0}, 0},{'s', 9010, 9008, {0}, 0}, + {'\0', 0, 9009, {0}, 0},{'e', 9012, 9010, {0}, 0},{'\0', 0, 9011, {0}, 0}, + {'q', 9014, 9012, {0}, 0},{'\0', 0, 9013, {0}, 0},{';', 0, 9014, {10871}, 1}, + {'\0', 0, 9015, {0}, 0},{'g', 9020, 9016, {176}, 1},{'l', 9022, 9017, {0}, 0}, + {'m', 9028, 9018, {0}, 0},{'\0', 0, 9019, {0}, 0},{';', 0, 9020, {176}, 1}, + {'\0', 0, 9021, {0}, 0},{'t', 9024, 9022, {0}, 0},{'\0', 0, 9023, {0}, 0}, + {'a', 9026, 9024, {0}, 0},{'\0', 0, 9025, {0}, 0},{';', 0, 9026, {948}, 1}, + {'\0', 0, 9027, {0}, 0},{'p', 9030, 9028, {0}, 0},{'\0', 0, 9029, {0}, 0}, + {'t', 9032, 9030, {0}, 0},{'\0', 0, 9031, {0}, 0},{'y', 9034, 9032, {0}, 0}, + {'\0', 0, 9033, {0}, 0},{'v', 9036, 9034, {0}, 0},{'\0', 0, 9035, {0}, 0}, + {';', 0, 9036, {10673}, 1},{'\0', 0, 9037, {0}, 0},{'i', 9041, 9038, {0}, 0}, + {'r', 9049, 9039, {0}, 0},{'\0', 0, 9040, {0}, 0},{'s', 9043, 9041, {0}, 0}, + {'\0', 0, 9042, {0}, 0},{'h', 9045, 9043, {0}, 0},{'\0', 0, 9044, {0}, 0}, + {'t', 9047, 9045, {0}, 0},{'\0', 0, 9046, {0}, 0},{';', 0, 9047, {10623}, 1}, + {'\0', 0, 9048, {0}, 0},{';', 0, 9049, {120097}, 1},{'\0', 0, 9050, {0}, 0}, + {'a', 9053, 9051, {0}, 0},{'\0', 0, 9052, {0}, 0},{'r', 9055, 9053, {0}, 0}, + {'\0', 0, 9054, {0}, 0},{'l', 9058, 9055, {0}, 0},{'r', 9060, 9056, {0}, 0}, + {'\0', 0, 9057, {0}, 0},{';', 0, 9058, {8643}, 1},{'\0', 0, 9059, {0}, 0}, + {';', 0, 9060, {8642}, 1},{'\0', 0, 9061, {0}, 0},{'a', 9068, 9062, {0}, 0}, + {'e', 9091, 9063, {0}, 0},{'g', 9093, 9064, {0}, 0},{'s', 9103, 9065, {0}, 0}, + {'v', 9109, 9066, {0}, 0},{'\0', 0, 9067, {0}, 0},{'m', 9070, 9068, {0}, 0}, + {'\0', 0, 9069, {0}, 0},{';', 0, 9070, {8900}, 1},{'o', 9074, 9071, {0}, 0}, + {'s', 9089, 9072, {0}, 0},{'\0', 0, 9073, {0}, 0},{'n', 9076, 9074, {0}, 0}, + {'\0', 0, 9075, {0}, 0},{'d', 9078, 9076, {0}, 0},{'\0', 0, 9077, {0}, 0}, + {';', 0, 9078, {8900}, 1},{'s', 9081, 9079, {0}, 0},{'\0', 0, 9080, {0}, 0}, + {'u', 9083, 9081, {0}, 0},{'\0', 0, 9082, {0}, 0},{'i', 9085, 9083, {0}, 0}, + {'\0', 0, 9084, {0}, 0},{'t', 9087, 9085, {0}, 0},{'\0', 0, 9086, {0}, 0}, + {';', 0, 9087, {9830}, 1},{'\0', 0, 9088, {0}, 0},{';', 0, 9089, {9830}, 1}, + {'\0', 0, 9090, {0}, 0},{';', 0, 9091, {168}, 1},{'\0', 0, 9092, {0}, 0}, + {'a', 9095, 9093, {0}, 0},{'\0', 0, 9094, {0}, 0},{'m', 9097, 9095, {0}, 0}, + {'\0', 0, 9096, {0}, 0},{'m', 9099, 9097, {0}, 0},{'\0', 0, 9098, {0}, 0}, + {'a', 9101, 9099, {0}, 0},{'\0', 0, 9100, {0}, 0},{';', 0, 9101, {989}, 1}, + {'\0', 0, 9102, {0}, 0},{'i', 9105, 9103, {0}, 0},{'\0', 0, 9104, {0}, 0}, + {'n', 9107, 9105, {0}, 0},{'\0', 0, 9106, {0}, 0},{';', 0, 9107, {8946}, 1}, + {'\0', 0, 9108, {0}, 0},{';', 0, 9109, {247}, 1},{'i', 9113, 9110, {0}, 0}, + {'o', 9134, 9111, {0}, 0},{'\0', 0, 9112, {0}, 0},{'d', 9115, 9113, {0}, 0}, + {'\0', 0, 9114, {0}, 0},{'e', 9117, 9115, {247}, 1},{'\0', 0, 9116, {0}, 0}, + {';', 0, 9117, {247}, 1},{'o', 9120, 9118, {0}, 0},{'\0', 0, 9119, {0}, 0}, + {'n', 9122, 9120, {0}, 0},{'\0', 0, 9121, {0}, 0},{'t', 9124, 9122, {0}, 0}, + {'\0', 0, 9123, {0}, 0},{'i', 9126, 9124, {0}, 0},{'\0', 0, 9125, {0}, 0}, + {'m', 9128, 9126, {0}, 0},{'\0', 0, 9127, {0}, 0},{'e', 9130, 9128, {0}, 0}, + {'\0', 0, 9129, {0}, 0},{'s', 9132, 9130, {0}, 0},{'\0', 0, 9131, {0}, 0}, + {';', 0, 9132, {8903}, 1},{'\0', 0, 9133, {0}, 0},{'n', 9136, 9134, {0}, 0}, + {'\0', 0, 9135, {0}, 0},{'x', 9138, 9136, {0}, 0},{'\0', 0, 9137, {0}, 0}, + {';', 0, 9138, {8903}, 1},{'\0', 0, 9139, {0}, 0},{'c', 9142, 9140, {0}, 0}, + {'\0', 0, 9141, {0}, 0},{'y', 9144, 9142, {0}, 0},{'\0', 0, 9143, {0}, 0}, + {';', 0, 9144, {1106}, 1},{'\0', 0, 9145, {0}, 0},{'c', 9148, 9146, {0}, 0}, + {'\0', 0, 9147, {0}, 0},{'o', 9151, 9148, {0}, 0},{'r', 9157, 9149, {0}, 0}, + {'\0', 0, 9150, {0}, 0},{'r', 9153, 9151, {0}, 0},{'\0', 0, 9152, {0}, 0}, + {'n', 9155, 9153, {0}, 0},{'\0', 0, 9154, {0}, 0},{';', 0, 9155, {8990}, 1}, + {'\0', 0, 9156, {0}, 0},{'o', 9159, 9157, {0}, 0},{'\0', 0, 9158, {0}, 0}, + {'p', 9161, 9159, {0}, 0},{'\0', 0, 9160, {0}, 0},{';', 0, 9161, {8973}, 1}, + {'\0', 0, 9162, {0}, 0},{'l', 9169, 9163, {0}, 0},{'p', 9177, 9164, {0}, 0}, + {'t', 9181, 9165, {0}, 0},{'u', 9228, 9166, {0}, 0},{'w', 9252, 9167, {0}, 0}, + {'\0', 0, 9168, {0}, 0},{'l', 9171, 9169, {0}, 0},{'\0', 0, 9170, {0}, 0}, + {'a', 9173, 9171, {0}, 0},{'\0', 0, 9172, {0}, 0},{'r', 9175, 9173, {0}, 0}, + {'\0', 0, 9174, {0}, 0},{';', 0, 9175, {36}, 1},{'\0', 0, 9176, {0}, 0}, + {'f', 9179, 9177, {0}, 0},{'\0', 0, 9178, {0}, 0},{';', 0, 9179, {120149}, 1}, + {'\0', 0, 9180, {0}, 0},{';', 0, 9181, {729}, 1},{'e', 9187, 9182, {0}, 0}, + {'m', 9198, 9183, {0}, 0},{'p', 9208, 9184, {0}, 0},{'s', 9216, 9185, {0}, 0}, + {'\0', 0, 9186, {0}, 0},{'q', 9189, 9187, {0}, 0},{'\0', 0, 9188, {0}, 0}, + {';', 0, 9189, {8784}, 1},{'d', 9192, 9190, {0}, 0},{'\0', 0, 9191, {0}, 0}, + {'o', 9194, 9192, {0}, 0},{'\0', 0, 9193, {0}, 0},{'t', 9196, 9194, {0}, 0}, + {'\0', 0, 9195, {0}, 0},{';', 0, 9196, {8785}, 1},{'\0', 0, 9197, {0}, 0}, + {'i', 9200, 9198, {0}, 0},{'\0', 0, 9199, {0}, 0},{'n', 9202, 9200, {0}, 0}, + {'\0', 0, 9201, {0}, 0},{'u', 9204, 9202, {0}, 0},{'\0', 0, 9203, {0}, 0}, + {'s', 9206, 9204, {0}, 0},{'\0', 0, 9205, {0}, 0},{';', 0, 9206, {8760}, 1}, + {'\0', 0, 9207, {0}, 0},{'l', 9210, 9208, {0}, 0},{'\0', 0, 9209, {0}, 0}, + {'u', 9212, 9210, {0}, 0},{'\0', 0, 9211, {0}, 0},{'s', 9214, 9212, {0}, 0}, + {'\0', 0, 9213, {0}, 0},{';', 0, 9214, {8724}, 1},{'\0', 0, 9215, {0}, 0}, + {'q', 9218, 9216, {0}, 0},{'\0', 0, 9217, {0}, 0},{'u', 9220, 9218, {0}, 0}, + {'\0', 0, 9219, {0}, 0},{'a', 9222, 9220, {0}, 0},{'\0', 0, 9221, {0}, 0}, + {'r', 9224, 9222, {0}, 0},{'\0', 0, 9223, {0}, 0},{'e', 9226, 9224, {0}, 0}, + {'\0', 0, 9225, {0}, 0},{';', 0, 9226, {8865}, 1},{'\0', 0, 9227, {0}, 0}, + {'b', 9230, 9228, {0}, 0},{'\0', 0, 9229, {0}, 0},{'l', 9232, 9230, {0}, 0}, + {'\0', 0, 9231, {0}, 0},{'e', 9234, 9232, {0}, 0},{'\0', 0, 9233, {0}, 0}, + {'b', 9236, 9234, {0}, 0},{'\0', 0, 9235, {0}, 0},{'a', 9238, 9236, {0}, 0}, + {'\0', 0, 9237, {0}, 0},{'r', 9240, 9238, {0}, 0},{'\0', 0, 9239, {0}, 0}, + {'w', 9242, 9240, {0}, 0},{'\0', 0, 9241, {0}, 0},{'e', 9244, 9242, {0}, 0}, + {'\0', 0, 9243, {0}, 0},{'d', 9246, 9244, {0}, 0},{'\0', 0, 9245, {0}, 0}, + {'g', 9248, 9246, {0}, 0},{'\0', 0, 9247, {0}, 0},{'e', 9250, 9248, {0}, 0}, + {'\0', 0, 9249, {0}, 0},{';', 0, 9250, {8966}, 1},{'\0', 0, 9251, {0}, 0}, + {'n', 9254, 9252, {0}, 0},{'\0', 0, 9253, {0}, 0},{'a', 9258, 9254, {0}, 0}, + {'d', 9268, 9255, {0}, 0},{'h', 9288, 9256, {0}, 0},{'\0', 0, 9257, {0}, 0}, + {'r', 9260, 9258, {0}, 0},{'\0', 0, 9259, {0}, 0},{'r', 9262, 9260, {0}, 0}, + {'\0', 0, 9261, {0}, 0},{'o', 9264, 9262, {0}, 0},{'\0', 0, 9263, {0}, 0}, + {'w', 9266, 9264, {0}, 0},{'\0', 0, 9265, {0}, 0},{';', 0, 9266, {8595}, 1}, + {'\0', 0, 9267, {0}, 0},{'o', 9270, 9268, {0}, 0},{'\0', 0, 9269, {0}, 0}, + {'w', 9272, 9270, {0}, 0},{'\0', 0, 9271, {0}, 0},{'n', 9274, 9272, {0}, 0}, + {'\0', 0, 9273, {0}, 0},{'a', 9276, 9274, {0}, 0},{'\0', 0, 9275, {0}, 0}, + {'r', 9278, 9276, {0}, 0},{'\0', 0, 9277, {0}, 0},{'r', 9280, 9278, {0}, 0}, + {'\0', 0, 9279, {0}, 0},{'o', 9282, 9280, {0}, 0},{'\0', 0, 9281, {0}, 0}, + {'w', 9284, 9282, {0}, 0},{'\0', 0, 9283, {0}, 0},{'s', 9286, 9284, {0}, 0}, + {'\0', 0, 9285, {0}, 0},{';', 0, 9286, {8650}, 1},{'\0', 0, 9287, {0}, 0}, + {'a', 9290, 9288, {0}, 0},{'\0', 0, 9289, {0}, 0},{'r', 9292, 9290, {0}, 0}, + {'\0', 0, 9291, {0}, 0},{'p', 9294, 9292, {0}, 0},{'\0', 0, 9293, {0}, 0}, + {'o', 9296, 9294, {0}, 0},{'\0', 0, 9295, {0}, 0},{'o', 9298, 9296, {0}, 0}, + {'\0', 0, 9297, {0}, 0},{'n', 9300, 9298, {0}, 0},{'\0', 0, 9299, {0}, 0}, + {'l', 9303, 9300, {0}, 0},{'r', 9311, 9301, {0}, 0},{'\0', 0, 9302, {0}, 0}, + {'e', 9305, 9303, {0}, 0},{'\0', 0, 9304, {0}, 0},{'f', 9307, 9305, {0}, 0}, + {'\0', 0, 9306, {0}, 0},{'t', 9309, 9307, {0}, 0},{'\0', 0, 9308, {0}, 0}, + {';', 0, 9309, {8643}, 1},{'\0', 0, 9310, {0}, 0},{'i', 9313, 9311, {0}, 0}, + {'\0', 0, 9312, {0}, 0},{'g', 9315, 9313, {0}, 0},{'\0', 0, 9314, {0}, 0}, + {'h', 9317, 9315, {0}, 0},{'\0', 0, 9316, {0}, 0},{'t', 9319, 9317, {0}, 0}, + {'\0', 0, 9318, {0}, 0},{';', 0, 9319, {8642}, 1},{'\0', 0, 9320, {0}, 0}, + {'b', 9324, 9321, {0}, 0},{'c', 9336, 9322, {0}, 0},{'\0', 0, 9323, {0}, 0}, + {'k', 9326, 9324, {0}, 0},{'\0', 0, 9325, {0}, 0},{'a', 9328, 9326, {0}, 0}, + {'\0', 0, 9327, {0}, 0},{'r', 9330, 9328, {0}, 0},{'\0', 0, 9329, {0}, 0}, + {'o', 9332, 9330, {0}, 0},{'\0', 0, 9331, {0}, 0},{'w', 9334, 9332, {0}, 0}, + {'\0', 0, 9333, {0}, 0},{';', 0, 9334, {10512}, 1},{'\0', 0, 9335, {0}, 0}, + {'o', 9339, 9336, {0}, 0},{'r', 9345, 9337, {0}, 0},{'\0', 0, 9338, {0}, 0}, + {'r', 9341, 9339, {0}, 0},{'\0', 0, 9340, {0}, 0},{'n', 9343, 9341, {0}, 0}, + {'\0', 0, 9342, {0}, 0},{';', 0, 9343, {8991}, 1},{'\0', 0, 9344, {0}, 0}, + {'o', 9347, 9345, {0}, 0},{'\0', 0, 9346, {0}, 0},{'p', 9349, 9347, {0}, 0}, + {'\0', 0, 9348, {0}, 0},{';', 0, 9349, {8972}, 1},{'\0', 0, 9350, {0}, 0}, + {'c', 9355, 9351, {0}, 0},{'o', 9362, 9352, {0}, 0},{'t', 9366, 9353, {0}, 0}, + {'\0', 0, 9354, {0}, 0},{'r', 9358, 9355, {0}, 0},{'y', 9360, 9356, {0}, 0}, + {'\0', 0, 9357, {0}, 0},{';', 0, 9358, {119993}, 1},{'\0', 0, 9359, {0}, 0}, + {';', 0, 9360, {1109}, 1},{'\0', 0, 9361, {0}, 0},{'l', 9364, 9362, {0}, 0}, + {'\0', 0, 9363, {0}, 0},{';', 0, 9364, {10742}, 1},{'\0', 0, 9365, {0}, 0}, + {'r', 9368, 9366, {0}, 0},{'\0', 0, 9367, {0}, 0},{'o', 9370, 9368, {0}, 0}, + {'\0', 0, 9369, {0}, 0},{'k', 9372, 9370, {0}, 0},{'\0', 0, 9371, {0}, 0}, + {';', 0, 9372, {273}, 1},{'\0', 0, 9373, {0}, 0},{'d', 9377, 9374, {0}, 0}, + {'r', 9383, 9375, {0}, 0},{'\0', 0, 9376, {0}, 0},{'o', 9379, 9377, {0}, 0}, + {'\0', 0, 9378, {0}, 0},{'t', 9381, 9379, {0}, 0},{'\0', 0, 9380, {0}, 0}, + {';', 0, 9381, {8945}, 1},{'\0', 0, 9382, {0}, 0},{'i', 9385, 9383, {0}, 0}, + {'\0', 0, 9384, {0}, 0},{';', 0, 9385, {9663}, 1},{'f', 9388, 9386, {0}, 0}, + {'\0', 0, 9387, {0}, 0},{';', 0, 9388, {9662}, 1},{'\0', 0, 9389, {0}, 0}, + {'a', 9393, 9390, {0}, 0},{'h', 9399, 9391, {0}, 0},{'\0', 0, 9392, {0}, 0}, + {'r', 9395, 9393, {0}, 0},{'\0', 0, 9394, {0}, 0},{'r', 9397, 9395, {0}, 0}, + {'\0', 0, 9396, {0}, 0},{';', 0, 9397, {8693}, 1},{'\0', 0, 9398, {0}, 0}, + {'a', 9401, 9399, {0}, 0},{'\0', 0, 9400, {0}, 0},{'r', 9403, 9401, {0}, 0}, + {'\0', 0, 9402, {0}, 0},{';', 0, 9403, {10607}, 1},{'\0', 0, 9404, {0}, 0}, + {'a', 9407, 9405, {0}, 0},{'\0', 0, 9406, {0}, 0},{'n', 9409, 9407, {0}, 0}, + {'\0', 0, 9408, {0}, 0},{'g', 9411, 9409, {0}, 0},{'\0', 0, 9410, {0}, 0}, + {'l', 9413, 9411, {0}, 0},{'\0', 0, 9412, {0}, 0},{'e', 9415, 9413, {0}, 0}, + {'\0', 0, 9414, {0}, 0},{';', 0, 9415, {10662}, 1},{'\0', 0, 9416, {0}, 0}, + {'c', 9420, 9417, {0}, 0},{'i', 9424, 9418, {0}, 0},{'\0', 0, 9419, {0}, 0}, + {'y', 9422, 9420, {0}, 0},{'\0', 0, 9421, {0}, 0},{';', 0, 9422, {1119}, 1}, + {'\0', 0, 9423, {0}, 0},{'g', 9426, 9424, {0}, 0},{'\0', 0, 9425, {0}, 0}, + {'r', 9428, 9426, {0}, 0},{'\0', 0, 9427, {0}, 0},{'a', 9430, 9428, {0}, 0}, + {'\0', 0, 9429, {0}, 0},{'r', 9432, 9430, {0}, 0},{'\0', 0, 9431, {0}, 0}, + {'r', 9434, 9432, {0}, 0},{'\0', 0, 9433, {0}, 0},{';', 0, 9434, {10239}, 1}, + {'\0', 0, 9435, {0}, 0},{'D', 9455, 9436, {0}, 0},{'a', 9468, 9437, {0}, 0}, + {'c', 9487, 9438, {0}, 0},{'d', 9517, 9439, {0}, 0},{'e', 9523, 9440, {0}, 0}, + {'f', 9525, 9441, {0}, 0},{'g', 9536, 9442, {0}, 0},{'l', 9557, 9443, {0}, 0}, + {'m', 9585, 9444, {0}, 0},{'n', 9623, 9445, {0}, 0},{'o', 9632, 9446, {0}, 0}, + {'p', 9645, 9447, {0}, 0},{'q', 9678, 9448, {0}, 0},{'r', 9767, 9449, {0}, 0}, + {'s', 9782, 9450, {0}, 0},{'t', 9800, 9451, {0}, 0},{'u', 9807, 9452, {0}, 0}, + {'x', 9818, 9453, {0}, 0},{'\0', 0, 9454, {0}, 0},{'D', 9458, 9455, {0}, 0}, + {'o', 9464, 9456, {0}, 0},{'\0', 0, 9457, {0}, 0},{'o', 9460, 9458, {0}, 0}, + {'\0', 0, 9459, {0}, 0},{'t', 9462, 9460, {0}, 0},{'\0', 0, 9461, {0}, 0}, + {';', 0, 9462, {10871}, 1},{'\0', 0, 9463, {0}, 0},{'t', 9466, 9464, {0}, 0}, + {'\0', 0, 9465, {0}, 0},{';', 0, 9466, {8785}, 1},{'\0', 0, 9467, {0}, 0}, + {'c', 9471, 9468, {0}, 0},{'s', 9479, 9469, {0}, 0},{'\0', 0, 9470, {0}, 0}, + {'u', 9473, 9471, {0}, 0},{'\0', 0, 9472, {0}, 0},{'t', 9475, 9473, {0}, 0}, + {'\0', 0, 9474, {0}, 0},{'e', 9477, 9475, {233}, 1},{'\0', 0, 9476, {0}, 0}, + {';', 0, 9477, {233}, 1},{'\0', 0, 9478, {0}, 0},{'t', 9481, 9479, {0}, 0}, + {'\0', 0, 9480, {0}, 0},{'e', 9483, 9481, {0}, 0},{'\0', 0, 9482, {0}, 0}, + {'r', 9485, 9483, {0}, 0},{'\0', 0, 9484, {0}, 0},{';', 0, 9485, {10862}, 1}, + {'\0', 0, 9486, {0}, 0},{'a', 9492, 9487, {0}, 0},{'i', 9500, 9488, {0}, 0}, + {'o', 9507, 9489, {0}, 0},{'y', 9515, 9490, {0}, 0},{'\0', 0, 9491, {0}, 0}, + {'r', 9494, 9492, {0}, 0},{'\0', 0, 9493, {0}, 0},{'o', 9496, 9494, {0}, 0}, + {'\0', 0, 9495, {0}, 0},{'n', 9498, 9496, {0}, 0},{'\0', 0, 9497, {0}, 0}, + {';', 0, 9498, {283}, 1},{'\0', 0, 9499, {0}, 0},{'r', 9502, 9500, {0}, 0}, + {'\0', 0, 9501, {0}, 0},{';', 0, 9502, {8790}, 1},{'c', 9505, 9503, {234}, 1}, + {'\0', 0, 9504, {0}, 0},{';', 0, 9505, {234}, 1},{'\0', 0, 9506, {0}, 0}, + {'l', 9509, 9507, {0}, 0},{'\0', 0, 9508, {0}, 0},{'o', 9511, 9509, {0}, 0}, + {'\0', 0, 9510, {0}, 0},{'n', 9513, 9511, {0}, 0},{'\0', 0, 9512, {0}, 0}, + {';', 0, 9513, {8789}, 1},{'\0', 0, 9514, {0}, 0},{';', 0, 9515, {1101}, 1}, + {'\0', 0, 9516, {0}, 0},{'o', 9519, 9517, {0}, 0},{'\0', 0, 9518, {0}, 0}, + {'t', 9521, 9519, {0}, 0},{'\0', 0, 9520, {0}, 0},{';', 0, 9521, {279}, 1}, + {'\0', 0, 9522, {0}, 0},{';', 0, 9523, {8519}, 1},{'\0', 0, 9524, {0}, 0}, + {'D', 9528, 9525, {0}, 0},{'r', 9534, 9526, {0}, 0},{'\0', 0, 9527, {0}, 0}, + {'o', 9530, 9528, {0}, 0},{'\0', 0, 9529, {0}, 0},{'t', 9532, 9530, {0}, 0}, + {'\0', 0, 9531, {0}, 0},{';', 0, 9532, {8786}, 1},{'\0', 0, 9533, {0}, 0}, + {';', 0, 9534, {120098}, 1},{'\0', 0, 9535, {0}, 0},{';', 0, 9536, {10906}, 1}, + {'r', 9540, 9537, {0}, 0},{'s', 9548, 9538, {0}, 0},{'\0', 0, 9539, {0}, 0}, + {'a', 9542, 9540, {0}, 0},{'\0', 0, 9541, {0}, 0},{'v', 9544, 9542, {0}, 0}, + {'\0', 0, 9543, {0}, 0},{'e', 9546, 9544, {232}, 1},{'\0', 0, 9545, {0}, 0}, + {';', 0, 9546, {232}, 1},{'\0', 0, 9547, {0}, 0},{';', 0, 9548, {10902}, 1}, + {'d', 9551, 9549, {0}, 0},{'\0', 0, 9550, {0}, 0},{'o', 9553, 9551, {0}, 0}, + {'\0', 0, 9552, {0}, 0},{'t', 9555, 9553, {0}, 0},{'\0', 0, 9554, {0}, 0}, + {';', 0, 9555, {10904}, 1},{'\0', 0, 9556, {0}, 0},{';', 0, 9557, {10905}, 1}, + {'i', 9562, 9558, {0}, 0},{'l', 9574, 9559, {0}, 0},{'s', 9576, 9560, {0}, 0}, + {'\0', 0, 9561, {0}, 0},{'n', 9564, 9562, {0}, 0},{'\0', 0, 9563, {0}, 0}, + {'t', 9566, 9564, {0}, 0},{'\0', 0, 9565, {0}, 0},{'e', 9568, 9566, {0}, 0}, + {'\0', 0, 9567, {0}, 0},{'r', 9570, 9568, {0}, 0},{'\0', 0, 9569, {0}, 0}, + {'s', 9572, 9570, {0}, 0},{'\0', 0, 9571, {0}, 0},{';', 0, 9572, {9191}, 1}, + {'\0', 0, 9573, {0}, 0},{';', 0, 9574, {8467}, 1},{'\0', 0, 9575, {0}, 0}, + {';', 0, 9576, {10901}, 1},{'d', 9579, 9577, {0}, 0},{'\0', 0, 9578, {0}, 0}, + {'o', 9581, 9579, {0}, 0},{'\0', 0, 9580, {0}, 0},{'t', 9583, 9581, {0}, 0}, + {'\0', 0, 9582, {0}, 0},{';', 0, 9583, {10903}, 1},{'\0', 0, 9584, {0}, 0}, + {'a', 9589, 9585, {0}, 0},{'p', 9595, 9586, {0}, 0},{'s', 9611, 9587, {0}, 0}, + {'\0', 0, 9588, {0}, 0},{'c', 9591, 9589, {0}, 0},{'\0', 0, 9590, {0}, 0}, + {'r', 9593, 9591, {0}, 0},{'\0', 0, 9592, {0}, 0},{';', 0, 9593, {275}, 1}, + {'\0', 0, 9594, {0}, 0},{'t', 9597, 9595, {0}, 0},{'\0', 0, 9596, {0}, 0}, + {'y', 9599, 9597, {0}, 0},{'\0', 0, 9598, {0}, 0},{';', 0, 9599, {8709}, 1}, + {'s', 9603, 9600, {0}, 0},{'v', 9609, 9601, {0}, 0},{'\0', 0, 9602, {0}, 0}, + {'e', 9605, 9603, {0}, 0},{'\0', 0, 9604, {0}, 0},{'t', 9607, 9605, {0}, 0}, + {'\0', 0, 9606, {0}, 0},{';', 0, 9607, {8709}, 1},{'\0', 0, 9608, {0}, 0}, + {';', 0, 9609, {8709}, 1},{'\0', 0, 9610, {0}, 0},{'p', 9613, 9611, {0}, 0}, + {'\0', 0, 9612, {0}, 0},{'1', 9616, 9613, {0}, 0},{';', 0, 9614, {8195}, 1}, + {'\0', 0, 9615, {0}, 0},{'3', 9619, 9616, {0}, 0},{'4', 9621, 9617, {0}, 0}, + {'\0', 0, 9618, {0}, 0},{';', 0, 9619, {8196}, 1},{'\0', 0, 9620, {0}, 0}, + {';', 0, 9621, {8197}, 1},{'\0', 0, 9622, {0}, 0},{'g', 9626, 9623, {0}, 0}, + {'s', 9628, 9624, {0}, 0},{'\0', 0, 9625, {0}, 0},{';', 0, 9626, {331}, 1}, + {'\0', 0, 9627, {0}, 0},{'p', 9630, 9628, {0}, 0},{'\0', 0, 9629, {0}, 0}, + {';', 0, 9630, {8194}, 1},{'\0', 0, 9631, {0}, 0},{'g', 9635, 9632, {0}, 0}, + {'p', 9641, 9633, {0}, 0},{'\0', 0, 9634, {0}, 0},{'o', 9637, 9635, {0}, 0}, + {'\0', 0, 9636, {0}, 0},{'n', 9639, 9637, {0}, 0},{'\0', 0, 9638, {0}, 0}, + {';', 0, 9639, {281}, 1},{'\0', 0, 9640, {0}, 0},{'f', 9643, 9641, {0}, 0}, + {'\0', 0, 9642, {0}, 0},{';', 0, 9643, {120150}, 1},{'\0', 0, 9644, {0}, 0}, + {'a', 9649, 9645, {0}, 0},{'l', 9658, 9646, {0}, 0},{'s', 9664, 9647, {0}, 0}, + {'\0', 0, 9648, {0}, 0},{'r', 9651, 9649, {0}, 0},{'\0', 0, 9650, {0}, 0}, + {';', 0, 9651, {8917}, 1},{'s', 9654, 9652, {0}, 0},{'\0', 0, 9653, {0}, 0}, + {'l', 9656, 9654, {0}, 0},{'\0', 0, 9655, {0}, 0},{';', 0, 9656, {10723}, 1}, + {'\0', 0, 9657, {0}, 0},{'u', 9660, 9658, {0}, 0},{'\0', 0, 9659, {0}, 0}, + {'s', 9662, 9660, {0}, 0},{'\0', 0, 9661, {0}, 0},{';', 0, 9662, {10865}, 1}, + {'\0', 0, 9663, {0}, 0},{'i', 9666, 9664, {0}, 0},{'\0', 0, 9665, {0}, 0}, + {';', 0, 9666, {949}, 1},{'l', 9670, 9667, {0}, 0},{'v', 9676, 9668, {0}, 0}, + {'\0', 0, 9669, {0}, 0},{'o', 9672, 9670, {0}, 0},{'\0', 0, 9671, {0}, 0}, + {'n', 9674, 9672, {0}, 0},{'\0', 0, 9673, {0}, 0},{';', 0, 9674, {949}, 1}, + {'\0', 0, 9675, {0}, 0},{';', 0, 9676, {1013}, 1},{'\0', 0, 9677, {0}, 0}, + {'c', 9683, 9678, {0}, 0},{'s', 9700, 9679, {0}, 0},{'u', 9730, 9680, {0}, 0}, + {'v', 9755, 9681, {0}, 0},{'\0', 0, 9682, {0}, 0},{'i', 9686, 9683, {0}, 0}, + {'o', 9692, 9684, {0}, 0},{'\0', 0, 9685, {0}, 0},{'r', 9688, 9686, {0}, 0}, + {'\0', 0, 9687, {0}, 0},{'c', 9690, 9688, {0}, 0},{'\0', 0, 9689, {0}, 0}, + {';', 0, 9690, {8790}, 1},{'\0', 0, 9691, {0}, 0},{'l', 9694, 9692, {0}, 0}, + {'\0', 0, 9693, {0}, 0},{'o', 9696, 9694, {0}, 0},{'\0', 0, 9695, {0}, 0}, + {'n', 9698, 9696, {0}, 0},{'\0', 0, 9697, {0}, 0},{';', 0, 9698, {8789}, 1}, + {'\0', 0, 9699, {0}, 0},{'i', 9703, 9700, {0}, 0},{'l', 9707, 9701, {0}, 0}, + {'\0', 0, 9702, {0}, 0},{'m', 9705, 9703, {0}, 0},{'\0', 0, 9704, {0}, 0}, + {';', 0, 9705, {8770}, 1},{'\0', 0, 9706, {0}, 0},{'a', 9709, 9707, {0}, 0}, + {'\0', 0, 9708, {0}, 0},{'n', 9711, 9709, {0}, 0},{'\0', 0, 9710, {0}, 0}, + {'t', 9713, 9711, {0}, 0},{'\0', 0, 9712, {0}, 0},{'g', 9716, 9713, {0}, 0}, + {'l', 9722, 9714, {0}, 0},{'\0', 0, 9715, {0}, 0},{'t', 9718, 9716, {0}, 0}, + {'\0', 0, 9717, {0}, 0},{'r', 9720, 9718, {0}, 0},{'\0', 0, 9719, {0}, 0}, + {';', 0, 9720, {10902}, 1},{'\0', 0, 9721, {0}, 0},{'e', 9724, 9722, {0}, 0}, + {'\0', 0, 9723, {0}, 0},{'s', 9726, 9724, {0}, 0},{'\0', 0, 9725, {0}, 0}, + {'s', 9728, 9726, {0}, 0},{'\0', 0, 9727, {0}, 0},{';', 0, 9728, {10901}, 1}, + {'\0', 0, 9729, {0}, 0},{'a', 9734, 9730, {0}, 0},{'e', 9740, 9731, {0}, 0}, + {'i', 9746, 9732, {0}, 0},{'\0', 0, 9733, {0}, 0},{'l', 9736, 9734, {0}, 0}, + {'\0', 0, 9735, {0}, 0},{'s', 9738, 9736, {0}, 0},{'\0', 0, 9737, {0}, 0}, + {';', 0, 9738, {61}, 1},{'\0', 0, 9739, {0}, 0},{'s', 9742, 9740, {0}, 0}, + {'\0', 0, 9741, {0}, 0},{'t', 9744, 9742, {0}, 0},{'\0', 0, 9743, {0}, 0}, + {';', 0, 9744, {8799}, 1},{'\0', 0, 9745, {0}, 0},{'v', 9748, 9746, {0}, 0}, + {'\0', 0, 9747, {0}, 0},{';', 0, 9748, {8801}, 1},{'D', 9751, 9749, {0}, 0}, + {'\0', 0, 9750, {0}, 0},{'D', 9753, 9751, {0}, 0},{'\0', 0, 9752, {0}, 0}, + {';', 0, 9753, {10872}, 1},{'\0', 0, 9754, {0}, 0},{'p', 9757, 9755, {0}, 0}, + {'\0', 0, 9756, {0}, 0},{'a', 9759, 9757, {0}, 0},{'\0', 0, 9758, {0}, 0}, + {'r', 9761, 9759, {0}, 0},{'\0', 0, 9760, {0}, 0},{'s', 9763, 9761, {0}, 0}, + {'\0', 0, 9762, {0}, 0},{'l', 9765, 9763, {0}, 0},{'\0', 0, 9764, {0}, 0}, + {';', 0, 9765, {10725}, 1},{'\0', 0, 9766, {0}, 0},{'D', 9770, 9767, {0}, 0}, + {'a', 9776, 9768, {0}, 0},{'\0', 0, 9769, {0}, 0},{'o', 9772, 9770, {0}, 0}, + {'\0', 0, 9771, {0}, 0},{'t', 9774, 9772, {0}, 0},{'\0', 0, 9773, {0}, 0}, + {';', 0, 9774, {8787}, 1},{'\0', 0, 9775, {0}, 0},{'r', 9778, 9776, {0}, 0}, + {'\0', 0, 9777, {0}, 0},{'r', 9780, 9778, {0}, 0},{'\0', 0, 9779, {0}, 0}, + {';', 0, 9780, {10609}, 1},{'\0', 0, 9781, {0}, 0},{'c', 9786, 9782, {0}, 0}, + {'d', 9790, 9783, {0}, 0},{'i', 9796, 9784, {0}, 0},{'\0', 0, 9785, {0}, 0}, + {'r', 9788, 9786, {0}, 0},{'\0', 0, 9787, {0}, 0},{';', 0, 9788, {8495}, 1}, + {'\0', 0, 9789, {0}, 0},{'o', 9792, 9790, {0}, 0},{'\0', 0, 9791, {0}, 0}, + {'t', 9794, 9792, {0}, 0},{'\0', 0, 9793, {0}, 0},{';', 0, 9794, {8784}, 1}, + {'\0', 0, 9795, {0}, 0},{'m', 9798, 9796, {0}, 0},{'\0', 0, 9797, {0}, 0}, + {';', 0, 9798, {8770}, 1},{'\0', 0, 9799, {0}, 0},{'a', 9803, 9800, {0}, 0}, + {'h', 9805, 9801, {240}, 1},{'\0', 0, 9802, {0}, 0},{';', 0, 9803, {951}, 1}, + {'\0', 0, 9804, {0}, 0},{';', 0, 9805, {240}, 1},{'\0', 0, 9806, {0}, 0}, + {'m', 9810, 9807, {0}, 0},{'r', 9814, 9808, {0}, 0},{'\0', 0, 9809, {0}, 0}, + {'l', 9812, 9810, {235}, 1},{'\0', 0, 9811, {0}, 0},{';', 0, 9812, {235}, 1}, + {'\0', 0, 9813, {0}, 0},{'o', 9816, 9814, {0}, 0},{'\0', 0, 9815, {0}, 0}, + {';', 0, 9816, {8364}, 1},{'\0', 0, 9817, {0}, 0},{'c', 9822, 9818, {0}, 0}, + {'i', 9826, 9819, {0}, 0},{'p', 9832, 9820, {0}, 0},{'\0', 0, 9821, {0}, 0}, + {'l', 9824, 9822, {0}, 0},{'\0', 0, 9823, {0}, 0},{';', 0, 9824, {33}, 1}, + {'\0', 0, 9825, {0}, 0},{'s', 9828, 9826, {0}, 0},{'\0', 0, 9827, {0}, 0}, + {'t', 9830, 9828, {0}, 0},{'\0', 0, 9829, {0}, 0},{';', 0, 9830, {8707}, 1}, + {'\0', 0, 9831, {0}, 0},{'e', 9835, 9832, {0}, 0},{'o', 9851, 9833, {0}, 0}, + {'\0', 0, 9834, {0}, 0},{'c', 9837, 9835, {0}, 0},{'\0', 0, 9836, {0}, 0}, + {'t', 9839, 9837, {0}, 0},{'\0', 0, 9838, {0}, 0},{'a', 9841, 9839, {0}, 0}, + {'\0', 0, 9840, {0}, 0},{'t', 9843, 9841, {0}, 0},{'\0', 0, 9842, {0}, 0}, + {'i', 9845, 9843, {0}, 0},{'\0', 0, 9844, {0}, 0},{'o', 9847, 9845, {0}, 0}, + {'\0', 0, 9846, {0}, 0},{'n', 9849, 9847, {0}, 0},{'\0', 0, 9848, {0}, 0}, + {';', 0, 9849, {8496}, 1},{'\0', 0, 9850, {0}, 0},{'n', 9853, 9851, {0}, 0}, + {'\0', 0, 9852, {0}, 0},{'e', 9855, 9853, {0}, 0},{'\0', 0, 9854, {0}, 0}, + {'n', 9857, 9855, {0}, 0},{'\0', 0, 9856, {0}, 0},{'t', 9859, 9857, {0}, 0}, + {'\0', 0, 9858, {0}, 0},{'i', 9861, 9859, {0}, 0},{'\0', 0, 9860, {0}, 0}, + {'a', 9863, 9861, {0}, 0},{'\0', 0, 9862, {0}, 0},{'l', 9865, 9863, {0}, 0}, + {'\0', 0, 9864, {0}, 0},{'e', 9867, 9865, {0}, 0},{'\0', 0, 9866, {0}, 0}, + {';', 0, 9867, {8519}, 1},{'\0', 0, 9868, {0}, 0},{'a', 9882, 9869, {0}, 0}, + {'c', 9906, 9870, {0}, 0},{'e', 9910, 9871, {0}, 0},{'f', 9920, 9872, {0}, 0}, + {'i', 9947, 9873, {0}, 0},{'j', 9955, 9874, {0}, 0},{'l', 9963, 9875, {0}, 0}, + {'n', 9983, 9876, {0}, 0},{'o', 9989, 9877, {0}, 0},{'p', 10010, 9878, {0}, 0}, + {'r', 10024, 9879, {0}, 0},{'s', 10098, 9880, {0}, 0},{'\0', 0, 9881, {0}, 0}, + {'l', 9884, 9882, {0}, 0},{'\0', 0, 9883, {0}, 0},{'l', 9886, 9884, {0}, 0}, + {'\0', 0, 9885, {0}, 0},{'i', 9888, 9886, {0}, 0},{'\0', 0, 9887, {0}, 0}, + {'n', 9890, 9888, {0}, 0},{'\0', 0, 9889, {0}, 0},{'g', 9892, 9890, {0}, 0}, + {'\0', 0, 9891, {0}, 0},{'d', 9894, 9892, {0}, 0},{'\0', 0, 9893, {0}, 0}, + {'o', 9896, 9894, {0}, 0},{'\0', 0, 9895, {0}, 0},{'t', 9898, 9896, {0}, 0}, + {'\0', 0, 9897, {0}, 0},{'s', 9900, 9898, {0}, 0},{'\0', 0, 9899, {0}, 0}, + {'e', 9902, 9900, {0}, 0},{'\0', 0, 9901, {0}, 0},{'q', 9904, 9902, {0}, 0}, + {'\0', 0, 9903, {0}, 0},{';', 0, 9904, {8786}, 1},{'\0', 0, 9905, {0}, 0}, + {'y', 9908, 9906, {0}, 0},{'\0', 0, 9907, {0}, 0},{';', 0, 9908, {1092}, 1}, + {'\0', 0, 9909, {0}, 0},{'m', 9912, 9910, {0}, 0},{'\0', 0, 9911, {0}, 0}, + {'a', 9914, 9912, {0}, 0},{'\0', 0, 9913, {0}, 0},{'l', 9916, 9914, {0}, 0}, + {'\0', 0, 9915, {0}, 0},{'e', 9918, 9916, {0}, 0},{'\0', 0, 9917, {0}, 0}, + {';', 0, 9918, {9792}, 1},{'\0', 0, 9919, {0}, 0},{'i', 9924, 9920, {0}, 0}, + {'l', 9932, 9921, {0}, 0},{'r', 9945, 9922, {0}, 0},{'\0', 0, 9923, {0}, 0}, + {'l', 9926, 9924, {0}, 0},{'\0', 0, 9925, {0}, 0},{'i', 9928, 9926, {0}, 0}, + {'\0', 0, 9927, {0}, 0},{'g', 9930, 9928, {0}, 0},{'\0', 0, 9929, {0}, 0}, + {';', 0, 9930, {64259}, 1},{'\0', 0, 9931, {0}, 0},{'i', 9935, 9932, {0}, 0}, + {'l', 9939, 9933, {0}, 0},{'\0', 0, 9934, {0}, 0},{'g', 9937, 9935, {0}, 0}, + {'\0', 0, 9936, {0}, 0},{';', 0, 9937, {64256}, 1},{'\0', 0, 9938, {0}, 0}, + {'i', 9941, 9939, {0}, 0},{'\0', 0, 9940, {0}, 0},{'g', 9943, 9941, {0}, 0}, + {'\0', 0, 9942, {0}, 0},{';', 0, 9943, {64260}, 1},{'\0', 0, 9944, {0}, 0}, + {';', 0, 9945, {120099}, 1},{'\0', 0, 9946, {0}, 0},{'l', 9949, 9947, {0}, 0}, + {'\0', 0, 9948, {0}, 0},{'i', 9951, 9949, {0}, 0},{'\0', 0, 9950, {0}, 0}, + {'g', 9953, 9951, {0}, 0},{'\0', 0, 9952, {0}, 0},{';', 0, 9953, {64257}, 1}, + {'\0', 0, 9954, {0}, 0},{'l', 9957, 9955, {0}, 0},{'\0', 0, 9956, {0}, 0}, + {'i', 9959, 9957, {0}, 0},{'\0', 0, 9958, {0}, 0},{'g', 9961, 9959, {0}, 0}, + {'\0', 0, 9960, {0}, 0},{';', 0, 9961, {102,106}, 2},{'\0', 0, 9962, {0}, 0}, + {'a', 9967, 9963, {0}, 0},{'l', 9971, 9964, {0}, 0},{'t', 9977, 9965, {0}, 0}, + {'\0', 0, 9966, {0}, 0},{'t', 9969, 9967, {0}, 0},{'\0', 0, 9968, {0}, 0}, + {';', 0, 9969, {9837}, 1},{'\0', 0, 9970, {0}, 0},{'i', 9973, 9971, {0}, 0}, + {'\0', 0, 9972, {0}, 0},{'g', 9975, 9973, {0}, 0},{'\0', 0, 9974, {0}, 0}, + {';', 0, 9975, {64258}, 1},{'\0', 0, 9976, {0}, 0},{'n', 9979, 9977, {0}, 0}, + {'\0', 0, 9978, {0}, 0},{'s', 9981, 9979, {0}, 0},{'\0', 0, 9980, {0}, 0}, + {';', 0, 9981, {9649}, 1},{'\0', 0, 9982, {0}, 0},{'o', 9985, 9983, {0}, 0}, + {'\0', 0, 9984, {0}, 0},{'f', 9987, 9985, {0}, 0},{'\0', 0, 9986, {0}, 0}, + {';', 0, 9987, {402}, 1},{'\0', 0, 9988, {0}, 0},{'p', 9992, 9989, {0}, 0}, + {'r', 9996, 9990, {0}, 0},{'\0', 0, 9991, {0}, 0},{'f', 9994, 9992, {0}, 0}, + {'\0', 0, 9993, {0}, 0},{';', 0, 9994, {120151}, 1},{'\0', 0, 9995, {0}, 0}, + {'a', 9999, 9996, {0}, 0},{'k', 10005, 9997, {0}, 0},{'\0', 0, 9998, {0}, 0}, + {'l', 10001, 9999, {0}, 0},{'\0', 0, 10000, {0}, 0},{'l', 10003, 10001, {0}, 0}, + {'\0', 0, 10002, {0}, 0},{';', 0, 10003, {8704}, 1},{'\0', 0, 10004, {0}, 0}, + {';', 0, 10005, {8916}, 1},{'v', 10008, 10006, {0}, 0},{'\0', 0, 10007, {0}, 0}, + {';', 0, 10008, {10969}, 1},{'\0', 0, 10009, {0}, 0},{'a', 10012, 10010, {0}, 0}, + {'\0', 0, 10011, {0}, 0},{'r', 10014, 10012, {0}, 0},{'\0', 0, 10013, {0}, 0}, + {'t', 10016, 10014, {0}, 0},{'\0', 0, 10015, {0}, 0},{'i', 10018, 10016, {0}, 0}, + {'\0', 0, 10017, {0}, 0},{'n', 10020, 10018, {0}, 0},{'\0', 0, 10019, {0}, 0}, + {'t', 10022, 10020, {0}, 0},{'\0', 0, 10021, {0}, 0},{';', 0, 10022, {10765}, 1}, + {'\0', 0, 10023, {0}, 0},{'a', 10027, 10024, {0}, 0},{'o', 10092, 10025, {0}, 0}, + {'\0', 0, 10026, {0}, 0},{'c', 10030, 10027, {0}, 0},{'s', 10088, 10028, {0}, 0}, + {'\0', 0, 10029, {0}, 0},{'1', 10037, 10030, {0}, 0},{'2', 10056, 10031, {0}, 0}, + {'3', 10063, 10032, {0}, 0},{'4', 10073, 10033, {0}, 0},{'5', 10077, 10034, {0}, 0}, + {'7', 10084, 10035, {0}, 0},{'\0', 0, 10036, {0}, 0},{'2', 10044, 10037, {189}, 1}, + {'3', 10046, 10038, {0}, 0},{'4', 10048, 10039, {188}, 1},{'5', 10050, 10040, {0}, 0}, + {'6', 10052, 10041, {0}, 0},{'8', 10054, 10042, {0}, 0},{'\0', 0, 10043, {0}, 0}, + {';', 0, 10044, {189}, 1},{'\0', 0, 10045, {0}, 0},{';', 0, 10046, {8531}, 1}, + {'\0', 0, 10047, {0}, 0},{';', 0, 10048, {188}, 1},{'\0', 0, 10049, {0}, 0}, + {';', 0, 10050, {8533}, 1},{'\0', 0, 10051, {0}, 0},{';', 0, 10052, {8537}, 1}, + {'\0', 0, 10053, {0}, 0},{';', 0, 10054, {8539}, 1},{'\0', 0, 10055, {0}, 0}, + {'3', 10059, 10056, {0}, 0},{'5', 10061, 10057, {0}, 0},{'\0', 0, 10058, {0}, 0}, + {';', 0, 10059, {8532}, 1},{'\0', 0, 10060, {0}, 0},{';', 0, 10061, {8534}, 1}, + {'\0', 0, 10062, {0}, 0},{'4', 10067, 10063, {190}, 1},{'5', 10069, 10064, {0}, 0}, + {'8', 10071, 10065, {0}, 0},{'\0', 0, 10066, {0}, 0},{';', 0, 10067, {190}, 1}, + {'\0', 0, 10068, {0}, 0},{';', 0, 10069, {8535}, 1},{'\0', 0, 10070, {0}, 0}, + {';', 0, 10071, {8540}, 1},{'\0', 0, 10072, {0}, 0},{'5', 10075, 10073, {0}, 0}, + {'\0', 0, 10074, {0}, 0},{';', 0, 10075, {8536}, 1},{'\0', 0, 10076, {0}, 0}, + {'6', 10080, 10077, {0}, 0},{'8', 10082, 10078, {0}, 0},{'\0', 0, 10079, {0}, 0}, + {';', 0, 10080, {8538}, 1},{'\0', 0, 10081, {0}, 0},{';', 0, 10082, {8541}, 1}, + {'\0', 0, 10083, {0}, 0},{'8', 10086, 10084, {0}, 0},{'\0', 0, 10085, {0}, 0}, + {';', 0, 10086, {8542}, 1},{'\0', 0, 10087, {0}, 0},{'l', 10090, 10088, {0}, 0}, + {'\0', 0, 10089, {0}, 0},{';', 0, 10090, {8260}, 1},{'\0', 0, 10091, {0}, 0}, + {'w', 10094, 10092, {0}, 0},{'\0', 0, 10093, {0}, 0},{'n', 10096, 10094, {0}, 0}, + {'\0', 0, 10095, {0}, 0},{';', 0, 10096, {8994}, 1},{'\0', 0, 10097, {0}, 0}, + {'c', 10100, 10098, {0}, 0},{'\0', 0, 10099, {0}, 0},{'r', 10102, 10100, {0}, 0}, + {'\0', 0, 10101, {0}, 0},{';', 0, 10102, {119995}, 1},{'\0', 0, 10103, {0}, 0}, + {'E', 10122, 10104, {0}, 0},{'a', 10127, 10105, {0}, 0},{'b', 10150, 10106, {0}, 0}, + {'c', 10160, 10107, {0}, 0},{'d', 10171, 10108, {0}, 0},{'e', 10177, 10109, {0}, 0}, + {'f', 10228, 10110, {0}, 0},{'g', 10232, 10111, {0}, 0},{'i', 10237, 10112, {0}, 0}, + {'j', 10245, 10113, {0}, 0},{'l', 10251, 10114, {0}, 0},{'n', 10262, 10115, {0}, 0}, + {'o', 10296, 10116, {0}, 0},{'r', 10302, 10117, {0}, 0},{'s', 10310, 10118, {0}, 0}, + {'t', 10327, 10119, {62}, 1},{'v', 10433, 10120, {0}, 0},{'\0', 0, 10121, {0}, 0}, + {';', 0, 10122, {8807}, 1},{'l', 10125, 10123, {0}, 0},{'\0', 0, 10124, {0}, 0}, + {';', 0, 10125, {10892}, 1},{'\0', 0, 10126, {0}, 0},{'c', 10131, 10127, {0}, 0}, + {'m', 10139, 10128, {0}, 0},{'p', 10148, 10129, {0}, 0},{'\0', 0, 10130, {0}, 0}, + {'u', 10133, 10131, {0}, 0},{'\0', 0, 10132, {0}, 0},{'t', 10135, 10133, {0}, 0}, + {'\0', 0, 10134, {0}, 0},{'e', 10137, 10135, {0}, 0},{'\0', 0, 10136, {0}, 0}, + {';', 0, 10137, {501}, 1},{'\0', 0, 10138, {0}, 0},{'m', 10141, 10139, {0}, 0}, + {'\0', 0, 10140, {0}, 0},{'a', 10143, 10141, {0}, 0},{'\0', 0, 10142, {0}, 0}, + {';', 0, 10143, {947}, 1},{'d', 10146, 10144, {0}, 0},{'\0', 0, 10145, {0}, 0}, + {';', 0, 10146, {989}, 1},{'\0', 0, 10147, {0}, 0},{';', 0, 10148, {10886}, 1}, + {'\0', 0, 10149, {0}, 0},{'r', 10152, 10150, {0}, 0},{'\0', 0, 10151, {0}, 0}, + {'e', 10154, 10152, {0}, 0},{'\0', 0, 10153, {0}, 0},{'v', 10156, 10154, {0}, 0}, + {'\0', 0, 10155, {0}, 0},{'e', 10158, 10156, {0}, 0},{'\0', 0, 10157, {0}, 0}, + {';', 0, 10158, {287}, 1},{'\0', 0, 10159, {0}, 0},{'i', 10163, 10160, {0}, 0}, + {'y', 10169, 10161, {0}, 0},{'\0', 0, 10162, {0}, 0},{'r', 10165, 10163, {0}, 0}, + {'\0', 0, 10164, {0}, 0},{'c', 10167, 10165, {0}, 0},{'\0', 0, 10166, {0}, 0}, + {';', 0, 10167, {285}, 1},{'\0', 0, 10168, {0}, 0},{';', 0, 10169, {1075}, 1}, + {'\0', 0, 10170, {0}, 0},{'o', 10173, 10171, {0}, 0},{'\0', 0, 10172, {0}, 0}, + {'t', 10175, 10173, {0}, 0},{'\0', 0, 10174, {0}, 0},{';', 0, 10175, {289}, 1}, + {'\0', 0, 10176, {0}, 0},{';', 0, 10177, {8805}, 1},{'l', 10182, 10178, {0}, 0}, + {'q', 10184, 10179, {0}, 0},{'s', 10200, 10180, {0}, 0},{'\0', 0, 10181, {0}, 0}, + {';', 0, 10182, {8923}, 1},{'\0', 0, 10183, {0}, 0},{';', 0, 10184, {8805}, 1}, + {'q', 10188, 10185, {0}, 0},{'s', 10190, 10186, {0}, 0},{'\0', 0, 10187, {0}, 0}, + {';', 0, 10188, {8807}, 1},{'\0', 0, 10189, {0}, 0},{'l', 10192, 10190, {0}, 0}, + {'\0', 0, 10191, {0}, 0},{'a', 10194, 10192, {0}, 0},{'\0', 0, 10193, {0}, 0}, + {'n', 10196, 10194, {0}, 0},{'\0', 0, 10195, {0}, 0},{'t', 10198, 10196, {0}, 0}, + {'\0', 0, 10197, {0}, 0},{';', 0, 10198, {10878}, 1},{'\0', 0, 10199, {0}, 0}, + {';', 0, 10200, {10878}, 1},{'c', 10205, 10201, {0}, 0},{'d', 10209, 10202, {0}, 0}, + {'l', 10221, 10203, {0}, 0},{'\0', 0, 10204, {0}, 0},{'c', 10207, 10205, {0}, 0}, + {'\0', 0, 10206, {0}, 0},{';', 0, 10207, {10921}, 1},{'\0', 0, 10208, {0}, 0}, + {'o', 10211, 10209, {0}, 0},{'\0', 0, 10210, {0}, 0},{'t', 10213, 10211, {0}, 0}, + {'\0', 0, 10212, {0}, 0},{';', 0, 10213, {10880}, 1},{'o', 10216, 10214, {0}, 0}, + {'\0', 0, 10215, {0}, 0},{';', 0, 10216, {10882}, 1},{'l', 10219, 10217, {0}, 0}, + {'\0', 0, 10218, {0}, 0},{';', 0, 10219, {10884}, 1},{'\0', 0, 10220, {0}, 0}, + {';', 0, 10221, {8923,65024}, 2},{'e', 10224, 10222, {0}, 0},{'\0', 0, 10223, {0}, 0}, + {'s', 10226, 10224, {0}, 0},{'\0', 0, 10225, {0}, 0},{';', 0, 10226, {10900}, 1}, + {'\0', 0, 10227, {0}, 0},{'r', 10230, 10228, {0}, 0},{'\0', 0, 10229, {0}, 0}, + {';', 0, 10230, {120100}, 1},{'\0', 0, 10231, {0}, 0},{';', 0, 10232, {8811}, 1}, + {'g', 10235, 10233, {0}, 0},{'\0', 0, 10234, {0}, 0},{';', 0, 10235, {8921}, 1}, + {'\0', 0, 10236, {0}, 0},{'m', 10239, 10237, {0}, 0},{'\0', 0, 10238, {0}, 0}, + {'e', 10241, 10239, {0}, 0},{'\0', 0, 10240, {0}, 0},{'l', 10243, 10241, {0}, 0}, + {'\0', 0, 10242, {0}, 0},{';', 0, 10243, {8503}, 1},{'\0', 0, 10244, {0}, 0}, + {'c', 10247, 10245, {0}, 0},{'\0', 0, 10246, {0}, 0},{'y', 10249, 10247, {0}, 0}, + {'\0', 0, 10248, {0}, 0},{';', 0, 10249, {1107}, 1},{'\0', 0, 10250, {0}, 0}, + {';', 0, 10251, {8823}, 1},{'E', 10256, 10252, {0}, 0},{'a', 10258, 10253, {0}, 0}, + {'j', 10260, 10254, {0}, 0},{'\0', 0, 10255, {0}, 0},{';', 0, 10256, {10898}, 1}, + {'\0', 0, 10257, {0}, 0},{';', 0, 10258, {10917}, 1},{'\0', 0, 10259, {0}, 0}, + {';', 0, 10260, {10916}, 1},{'\0', 0, 10261, {0}, 0},{'E', 10267, 10262, {0}, 0}, + {'a', 10269, 10263, {0}, 0},{'e', 10282, 10264, {0}, 0},{'s', 10290, 10265, {0}, 0}, + {'\0', 0, 10266, {0}, 0},{';', 0, 10267, {8809}, 1},{'\0', 0, 10268, {0}, 0}, + {'p', 10271, 10269, {0}, 0},{'\0', 0, 10270, {0}, 0},{';', 0, 10271, {10890}, 1}, + {'p', 10274, 10272, {0}, 0},{'\0', 0, 10273, {0}, 0},{'r', 10276, 10274, {0}, 0}, + {'\0', 0, 10275, {0}, 0},{'o', 10278, 10276, {0}, 0},{'\0', 0, 10277, {0}, 0}, + {'x', 10280, 10278, {0}, 0},{'\0', 0, 10279, {0}, 0},{';', 0, 10280, {10890}, 1}, + {'\0', 0, 10281, {0}, 0},{';', 0, 10282, {10888}, 1},{'q', 10285, 10283, {0}, 0}, + {'\0', 0, 10284, {0}, 0},{';', 0, 10285, {10888}, 1},{'q', 10288, 10286, {0}, 0}, + {'\0', 0, 10287, {0}, 0},{';', 0, 10288, {8809}, 1},{'\0', 0, 10289, {0}, 0}, + {'i', 10292, 10290, {0}, 0},{'\0', 0, 10291, {0}, 0},{'m', 10294, 10292, {0}, 0}, + {'\0', 0, 10293, {0}, 0},{';', 0, 10294, {8935}, 1},{'\0', 0, 10295, {0}, 0}, + {'p', 10298, 10296, {0}, 0},{'\0', 0, 10297, {0}, 0},{'f', 10300, 10298, {0}, 0}, + {'\0', 0, 10299, {0}, 0},{';', 0, 10300, {120152}, 1},{'\0', 0, 10301, {0}, 0}, + {'a', 10304, 10302, {0}, 0},{'\0', 0, 10303, {0}, 0},{'v', 10306, 10304, {0}, 0}, + {'\0', 0, 10305, {0}, 0},{'e', 10308, 10306, {0}, 0},{'\0', 0, 10307, {0}, 0}, + {';', 0, 10308, {96}, 1},{'\0', 0, 10309, {0}, 0},{'c', 10313, 10310, {0}, 0}, + {'i', 10317, 10311, {0}, 0},{'\0', 0, 10312, {0}, 0},{'r', 10315, 10313, {0}, 0}, + {'\0', 0, 10314, {0}, 0},{';', 0, 10315, {8458}, 1},{'\0', 0, 10316, {0}, 0}, + {'m', 10319, 10317, {0}, 0},{'\0', 0, 10318, {0}, 0},{';', 0, 10319, {8819}, 1}, + {'e', 10323, 10320, {0}, 0},{'l', 10325, 10321, {0}, 0},{'\0', 0, 10322, {0}, 0}, + {';', 0, 10323, {10894}, 1},{'\0', 0, 10324, {0}, 0},{';', 0, 10325, {10896}, 1}, + {'\0', 0, 10326, {0}, 0},{';', 0, 10327, {62}, 1},{'c', 10334, 10328, {0}, 0}, + {'d', 10343, 10329, {0}, 0},{'l', 10349, 10330, {0}, 0},{'q', 10357, 10331, {0}, 0}, + {'r', 10367, 10332, {0}, 0},{'\0', 0, 10333, {0}, 0},{'c', 10337, 10334, {0}, 0}, + {'i', 10339, 10335, {0}, 0},{'\0', 0, 10336, {0}, 0},{';', 0, 10337, {10919}, 1}, + {'\0', 0, 10338, {0}, 0},{'r', 10341, 10339, {0}, 0},{'\0', 0, 10340, {0}, 0}, + {';', 0, 10341, {10874}, 1},{'\0', 0, 10342, {0}, 0},{'o', 10345, 10343, {0}, 0}, + {'\0', 0, 10344, {0}, 0},{'t', 10347, 10345, {0}, 0},{'\0', 0, 10346, {0}, 0}, + {';', 0, 10347, {8919}, 1},{'\0', 0, 10348, {0}, 0},{'P', 10351, 10349, {0}, 0}, + {'\0', 0, 10350, {0}, 0},{'a', 10353, 10351, {0}, 0},{'\0', 0, 10352, {0}, 0}, + {'r', 10355, 10353, {0}, 0},{'\0', 0, 10354, {0}, 0},{';', 0, 10355, {10645}, 1}, + {'\0', 0, 10356, {0}, 0},{'u', 10359, 10357, {0}, 0},{'\0', 0, 10358, {0}, 0}, + {'e', 10361, 10359, {0}, 0},{'\0', 0, 10360, {0}, 0},{'s', 10363, 10361, {0}, 0}, + {'\0', 0, 10362, {0}, 0},{'t', 10365, 10363, {0}, 0},{'\0', 0, 10364, {0}, 0}, + {';', 0, 10365, {10876}, 1},{'\0', 0, 10366, {0}, 0},{'a', 10373, 10367, {0}, 0}, + {'d', 10390, 10368, {0}, 0},{'e', 10396, 10369, {0}, 0},{'l', 10419, 10370, {0}, 0}, + {'s', 10427, 10371, {0}, 0},{'\0', 0, 10372, {0}, 0},{'p', 10376, 10373, {0}, 0}, + {'r', 10386, 10374, {0}, 0},{'\0', 0, 10375, {0}, 0},{'p', 10378, 10376, {0}, 0}, + {'\0', 0, 10377, {0}, 0},{'r', 10380, 10378, {0}, 0},{'\0', 0, 10379, {0}, 0}, + {'o', 10382, 10380, {0}, 0},{'\0', 0, 10381, {0}, 0},{'x', 10384, 10382, {0}, 0}, + {'\0', 0, 10383, {0}, 0},{';', 0, 10384, {10886}, 1},{'\0', 0, 10385, {0}, 0}, + {'r', 10388, 10386, {0}, 0},{'\0', 0, 10387, {0}, 0},{';', 0, 10388, {10616}, 1}, + {'\0', 0, 10389, {0}, 0},{'o', 10392, 10390, {0}, 0},{'\0', 0, 10391, {0}, 0}, + {'t', 10394, 10392, {0}, 0},{'\0', 0, 10393, {0}, 0},{';', 0, 10394, {8919}, 1}, + {'\0', 0, 10395, {0}, 0},{'q', 10398, 10396, {0}, 0},{'\0', 0, 10397, {0}, 0}, + {'l', 10401, 10398, {0}, 0},{'q', 10409, 10399, {0}, 0},{'\0', 0, 10400, {0}, 0}, + {'e', 10403, 10401, {0}, 0},{'\0', 0, 10402, {0}, 0},{'s', 10405, 10403, {0}, 0}, + {'\0', 0, 10404, {0}, 0},{'s', 10407, 10405, {0}, 0},{'\0', 0, 10406, {0}, 0}, + {';', 0, 10407, {8923}, 1},{'\0', 0, 10408, {0}, 0},{'l', 10411, 10409, {0}, 0}, + {'\0', 0, 10410, {0}, 0},{'e', 10413, 10411, {0}, 0},{'\0', 0, 10412, {0}, 0}, + {'s', 10415, 10413, {0}, 0},{'\0', 0, 10414, {0}, 0},{'s', 10417, 10415, {0}, 0}, + {'\0', 0, 10416, {0}, 0},{';', 0, 10417, {10892}, 1},{'\0', 0, 10418, {0}, 0}, + {'e', 10421, 10419, {0}, 0},{'\0', 0, 10420, {0}, 0},{'s', 10423, 10421, {0}, 0}, + {'\0', 0, 10422, {0}, 0},{'s', 10425, 10423, {0}, 0},{'\0', 0, 10424, {0}, 0}, + {';', 0, 10425, {8823}, 1},{'\0', 0, 10426, {0}, 0},{'i', 10429, 10427, {0}, 0}, + {'\0', 0, 10428, {0}, 0},{'m', 10431, 10429, {0}, 0},{'\0', 0, 10430, {0}, 0}, + {';', 0, 10431, {8819}, 1},{'\0', 0, 10432, {0}, 0},{'e', 10436, 10433, {0}, 0}, + {'n', 10450, 10434, {0}, 0},{'\0', 0, 10435, {0}, 0},{'r', 10438, 10436, {0}, 0}, + {'\0', 0, 10437, {0}, 0},{'t', 10440, 10438, {0}, 0},{'\0', 0, 10439, {0}, 0}, + {'n', 10442, 10440, {0}, 0},{'\0', 0, 10441, {0}, 0},{'e', 10444, 10442, {0}, 0}, + {'\0', 0, 10443, {0}, 0},{'q', 10446, 10444, {0}, 0},{'\0', 0, 10445, {0}, 0}, + {'q', 10448, 10446, {0}, 0},{'\0', 0, 10447, {0}, 0},{';', 0, 10448, {8809,65024}, 2}, + {'\0', 0, 10449, {0}, 0},{'E', 10452, 10450, {0}, 0},{'\0', 0, 10451, {0}, 0}, + {';', 0, 10452, {8809,65024}, 2},{'\0', 0, 10453, {0}, 0},{'A', 10465, 10454, {0}, 0}, + {'a', 10471, 10455, {0}, 0},{'b', 10517, 10456, {0}, 0},{'c', 10523, 10457, {0}, 0}, + {'e', 10531, 10458, {0}, 0},{'f', 10566, 10459, {0}, 0},{'k', 10570, 10460, {0}, 0}, + {'o', 10595, 10461, {0}, 0},{'s', 10670, 10462, {0}, 0},{'y', 10694, 10463, {0}, 0}, + {'\0', 0, 10464, {0}, 0},{'r', 10467, 10465, {0}, 0},{'\0', 0, 10466, {0}, 0}, + {'r', 10469, 10467, {0}, 0},{'\0', 0, 10468, {0}, 0},{';', 0, 10469, {8660}, 1}, + {'\0', 0, 10470, {0}, 0},{'i', 10476, 10471, {0}, 0},{'l', 10484, 10472, {0}, 0}, + {'m', 10488, 10473, {0}, 0},{'r', 10496, 10474, {0}, 0},{'\0', 0, 10475, {0}, 0}, + {'r', 10478, 10476, {0}, 0},{'\0', 0, 10477, {0}, 0},{'s', 10480, 10478, {0}, 0}, + {'\0', 0, 10479, {0}, 0},{'p', 10482, 10480, {0}, 0},{'\0', 0, 10481, {0}, 0}, + {';', 0, 10482, {8202}, 1},{'\0', 0, 10483, {0}, 0},{'f', 10486, 10484, {0}, 0}, + {'\0', 0, 10485, {0}, 0},{';', 0, 10486, {189}, 1},{'\0', 0, 10487, {0}, 0}, + {'i', 10490, 10488, {0}, 0},{'\0', 0, 10489, {0}, 0},{'l', 10492, 10490, {0}, 0}, + {'\0', 0, 10491, {0}, 0},{'t', 10494, 10492, {0}, 0},{'\0', 0, 10493, {0}, 0}, + {';', 0, 10494, {8459}, 1},{'\0', 0, 10495, {0}, 0},{'d', 10499, 10496, {0}, 0}, + {'r', 10505, 10497, {0}, 0},{'\0', 0, 10498, {0}, 0},{'c', 10501, 10499, {0}, 0}, + {'\0', 0, 10500, {0}, 0},{'y', 10503, 10501, {0}, 0},{'\0', 0, 10502, {0}, 0}, + {';', 0, 10503, {1098}, 1},{'\0', 0, 10504, {0}, 0},{';', 0, 10505, {8596}, 1}, + {'c', 10509, 10506, {0}, 0},{'w', 10515, 10507, {0}, 0},{'\0', 0, 10508, {0}, 0}, + {'i', 10511, 10509, {0}, 0},{'\0', 0, 10510, {0}, 0},{'r', 10513, 10511, {0}, 0}, + {'\0', 0, 10512, {0}, 0},{';', 0, 10513, {10568}, 1},{'\0', 0, 10514, {0}, 0}, + {';', 0, 10515, {8621}, 1},{'\0', 0, 10516, {0}, 0},{'a', 10519, 10517, {0}, 0}, + {'\0', 0, 10518, {0}, 0},{'r', 10521, 10519, {0}, 0},{'\0', 0, 10520, {0}, 0}, + {';', 0, 10521, {8463}, 1},{'\0', 0, 10522, {0}, 0},{'i', 10525, 10523, {0}, 0}, + {'\0', 0, 10524, {0}, 0},{'r', 10527, 10525, {0}, 0},{'\0', 0, 10526, {0}, 0}, + {'c', 10529, 10527, {0}, 0},{'\0', 0, 10528, {0}, 0},{';', 0, 10529, {293}, 1}, + {'\0', 0, 10530, {0}, 0},{'a', 10535, 10531, {0}, 0},{'l', 10550, 10532, {0}, 0}, + {'r', 10558, 10533, {0}, 0},{'\0', 0, 10534, {0}, 0},{'r', 10537, 10535, {0}, 0}, + {'\0', 0, 10536, {0}, 0},{'t', 10539, 10537, {0}, 0},{'\0', 0, 10538, {0}, 0}, + {'s', 10541, 10539, {0}, 0},{'\0', 0, 10540, {0}, 0},{';', 0, 10541, {9829}, 1}, + {'u', 10544, 10542, {0}, 0},{'\0', 0, 10543, {0}, 0},{'i', 10546, 10544, {0}, 0}, + {'\0', 0, 10545, {0}, 0},{'t', 10548, 10546, {0}, 0},{'\0', 0, 10547, {0}, 0}, + {';', 0, 10548, {9829}, 1},{'\0', 0, 10549, {0}, 0},{'l', 10552, 10550, {0}, 0}, + {'\0', 0, 10551, {0}, 0},{'i', 10554, 10552, {0}, 0},{'\0', 0, 10553, {0}, 0}, + {'p', 10556, 10554, {0}, 0},{'\0', 0, 10555, {0}, 0},{';', 0, 10556, {8230}, 1}, + {'\0', 0, 10557, {0}, 0},{'c', 10560, 10558, {0}, 0},{'\0', 0, 10559, {0}, 0}, + {'o', 10562, 10560, {0}, 0},{'\0', 0, 10561, {0}, 0},{'n', 10564, 10562, {0}, 0}, + {'\0', 0, 10563, {0}, 0},{';', 0, 10564, {8889}, 1},{'\0', 0, 10565, {0}, 0}, + {'r', 10568, 10566, {0}, 0},{'\0', 0, 10567, {0}, 0},{';', 0, 10568, {120101}, 1}, + {'\0', 0, 10569, {0}, 0},{'s', 10572, 10570, {0}, 0},{'\0', 0, 10571, {0}, 0}, + {'e', 10575, 10572, {0}, 0},{'w', 10585, 10573, {0}, 0},{'\0', 0, 10574, {0}, 0}, + {'a', 10577, 10575, {0}, 0},{'\0', 0, 10576, {0}, 0},{'r', 10579, 10577, {0}, 0}, + {'\0', 0, 10578, {0}, 0},{'o', 10581, 10579, {0}, 0},{'\0', 0, 10580, {0}, 0}, + {'w', 10583, 10581, {0}, 0},{'\0', 0, 10582, {0}, 0},{';', 0, 10583, {10533}, 1}, + {'\0', 0, 10584, {0}, 0},{'a', 10587, 10585, {0}, 0},{'\0', 0, 10586, {0}, 0}, + {'r', 10589, 10587, {0}, 0},{'\0', 0, 10588, {0}, 0},{'o', 10591, 10589, {0}, 0}, + {'\0', 0, 10590, {0}, 0},{'w', 10593, 10591, {0}, 0},{'\0', 0, 10592, {0}, 0}, + {';', 0, 10593, {10534}, 1},{'\0', 0, 10594, {0}, 0},{'a', 10601, 10595, {0}, 0}, + {'m', 10607, 10596, {0}, 0},{'o', 10615, 10597, {0}, 0},{'p', 10658, 10598, {0}, 0}, + {'r', 10662, 10599, {0}, 0},{'\0', 0, 10600, {0}, 0},{'r', 10603, 10601, {0}, 0}, + {'\0', 0, 10602, {0}, 0},{'r', 10605, 10603, {0}, 0},{'\0', 0, 10604, {0}, 0}, + {';', 0, 10605, {8703}, 1},{'\0', 0, 10606, {0}, 0},{'t', 10609, 10607, {0}, 0}, + {'\0', 0, 10608, {0}, 0},{'h', 10611, 10609, {0}, 0},{'\0', 0, 10610, {0}, 0}, + {'t', 10613, 10611, {0}, 0},{'\0', 0, 10612, {0}, 0},{';', 0, 10613, {8763}, 1}, + {'\0', 0, 10614, {0}, 0},{'k', 10617, 10615, {0}, 0},{'\0', 0, 10616, {0}, 0}, + {'l', 10620, 10617, {0}, 0},{'r', 10638, 10618, {0}, 0},{'\0', 0, 10619, {0}, 0}, + {'e', 10622, 10620, {0}, 0},{'\0', 0, 10621, {0}, 0},{'f', 10624, 10622, {0}, 0}, + {'\0', 0, 10623, {0}, 0},{'t', 10626, 10624, {0}, 0},{'\0', 0, 10625, {0}, 0}, + {'a', 10628, 10626, {0}, 0},{'\0', 0, 10627, {0}, 0},{'r', 10630, 10628, {0}, 0}, + {'\0', 0, 10629, {0}, 0},{'r', 10632, 10630, {0}, 0},{'\0', 0, 10631, {0}, 0}, + {'o', 10634, 10632, {0}, 0},{'\0', 0, 10633, {0}, 0},{'w', 10636, 10634, {0}, 0}, + {'\0', 0, 10635, {0}, 0},{';', 0, 10636, {8617}, 1},{'\0', 0, 10637, {0}, 0}, + {'i', 10640, 10638, {0}, 0},{'\0', 0, 10639, {0}, 0},{'g', 10642, 10640, {0}, 0}, + {'\0', 0, 10641, {0}, 0},{'h', 10644, 10642, {0}, 0},{'\0', 0, 10643, {0}, 0}, + {'t', 10646, 10644, {0}, 0},{'\0', 0, 10645, {0}, 0},{'a', 10648, 10646, {0}, 0}, + {'\0', 0, 10647, {0}, 0},{'r', 10650, 10648, {0}, 0},{'\0', 0, 10649, {0}, 0}, + {'r', 10652, 10650, {0}, 0},{'\0', 0, 10651, {0}, 0},{'o', 10654, 10652, {0}, 0}, + {'\0', 0, 10653, {0}, 0},{'w', 10656, 10654, {0}, 0},{'\0', 0, 10655, {0}, 0}, + {';', 0, 10656, {8618}, 1},{'\0', 0, 10657, {0}, 0},{'f', 10660, 10658, {0}, 0}, + {'\0', 0, 10659, {0}, 0},{';', 0, 10660, {120153}, 1},{'\0', 0, 10661, {0}, 0}, + {'b', 10664, 10662, {0}, 0},{'\0', 0, 10663, {0}, 0},{'a', 10666, 10664, {0}, 0}, + {'\0', 0, 10665, {0}, 0},{'r', 10668, 10666, {0}, 0},{'\0', 0, 10667, {0}, 0}, + {';', 0, 10668, {8213}, 1},{'\0', 0, 10669, {0}, 0},{'c', 10674, 10670, {0}, 0}, + {'l', 10678, 10671, {0}, 0},{'t', 10686, 10672, {0}, 0},{'\0', 0, 10673, {0}, 0}, + {'r', 10676, 10674, {0}, 0},{'\0', 0, 10675, {0}, 0},{';', 0, 10676, {119997}, 1}, + {'\0', 0, 10677, {0}, 0},{'a', 10680, 10678, {0}, 0},{'\0', 0, 10679, {0}, 0}, + {'s', 10682, 10680, {0}, 0},{'\0', 0, 10681, {0}, 0},{'h', 10684, 10682, {0}, 0}, + {'\0', 0, 10683, {0}, 0},{';', 0, 10684, {8463}, 1},{'\0', 0, 10685, {0}, 0}, + {'r', 10688, 10686, {0}, 0},{'\0', 0, 10687, {0}, 0},{'o', 10690, 10688, {0}, 0}, + {'\0', 0, 10689, {0}, 0},{'k', 10692, 10690, {0}, 0},{'\0', 0, 10691, {0}, 0}, + {';', 0, 10692, {295}, 1},{'\0', 0, 10693, {0}, 0},{'b', 10697, 10694, {0}, 0}, + {'p', 10705, 10695, {0}, 0},{'\0', 0, 10696, {0}, 0},{'u', 10699, 10697, {0}, 0}, + {'\0', 0, 10698, {0}, 0},{'l', 10701, 10699, {0}, 0},{'\0', 0, 10700, {0}, 0}, + {'l', 10703, 10701, {0}, 0},{'\0', 0, 10702, {0}, 0},{';', 0, 10703, {8259}, 1}, + {'\0', 0, 10704, {0}, 0},{'h', 10707, 10705, {0}, 0},{'\0', 0, 10706, {0}, 0}, + {'e', 10709, 10707, {0}, 0},{'\0', 0, 10708, {0}, 0},{'n', 10711, 10709, {0}, 0}, + {'\0', 0, 10710, {0}, 0},{';', 0, 10711, {8208}, 1},{'\0', 0, 10712, {0}, 0}, + {'a', 10729, 10713, {0}, 0},{'c', 10739, 10714, {0}, 0},{'e', 10751, 10715, {0}, 0}, + {'f', 10764, 10716, {0}, 0},{'g', 10771, 10717, {0}, 0},{'i', 10781, 10718, {0}, 0}, + {'j', 10813, 10719, {0}, 0},{'m', 10821, 10720, {0}, 0},{'n', 10869, 10721, {0}, 0}, + {'o', 10953, 10722, {0}, 0},{'p', 10976, 10723, {0}, 0},{'q', 10984, 10724, {0}, 0}, + {'s', 10994, 10725, {0}, 0},{'t', 11024, 10726, {0}, 0},{'u', 11035, 10727, {0}, 0}, + {'\0', 0, 10728, {0}, 0},{'c', 10731, 10729, {0}, 0},{'\0', 0, 10730, {0}, 0}, + {'u', 10733, 10731, {0}, 0},{'\0', 0, 10732, {0}, 0},{'t', 10735, 10733, {0}, 0}, + {'\0', 0, 10734, {0}, 0},{'e', 10737, 10735, {237}, 1},{'\0', 0, 10736, {0}, 0}, + {';', 0, 10737, {237}, 1},{'\0', 0, 10738, {0}, 0},{';', 0, 10739, {8291}, 1}, + {'i', 10743, 10740, {0}, 0},{'y', 10749, 10741, {0}, 0},{'\0', 0, 10742, {0}, 0}, + {'r', 10745, 10743, {0}, 0},{'\0', 0, 10744, {0}, 0},{'c', 10747, 10745, {238}, 1}, + {'\0', 0, 10746, {0}, 0},{';', 0, 10747, {238}, 1},{'\0', 0, 10748, {0}, 0}, + {';', 0, 10749, {1080}, 1},{'\0', 0, 10750, {0}, 0},{'c', 10754, 10751, {0}, 0}, + {'x', 10758, 10752, {0}, 0},{'\0', 0, 10753, {0}, 0},{'y', 10756, 10754, {0}, 0}, + {'\0', 0, 10755, {0}, 0},{';', 0, 10756, {1077}, 1},{'\0', 0, 10757, {0}, 0}, + {'c', 10760, 10758, {0}, 0},{'\0', 0, 10759, {0}, 0},{'l', 10762, 10760, {161}, 1}, + {'\0', 0, 10761, {0}, 0},{';', 0, 10762, {161}, 1},{'\0', 0, 10763, {0}, 0}, + {'f', 10767, 10764, {0}, 0},{'r', 10769, 10765, {0}, 0},{'\0', 0, 10766, {0}, 0}, + {';', 0, 10767, {8660}, 1},{'\0', 0, 10768, {0}, 0},{';', 0, 10769, {120102}, 1}, + {'\0', 0, 10770, {0}, 0},{'r', 10773, 10771, {0}, 0},{'\0', 0, 10772, {0}, 0}, + {'a', 10775, 10773, {0}, 0},{'\0', 0, 10774, {0}, 0},{'v', 10777, 10775, {0}, 0}, + {'\0', 0, 10776, {0}, 0},{'e', 10779, 10777, {236}, 1},{'\0', 0, 10778, {0}, 0}, + {';', 0, 10779, {236}, 1},{'\0', 0, 10780, {0}, 0},{';', 0, 10781, {8520}, 1}, + {'i', 10786, 10782, {0}, 0},{'n', 10799, 10783, {0}, 0},{'o', 10807, 10784, {0}, 0}, + {'\0', 0, 10785, {0}, 0},{'i', 10789, 10786, {0}, 0},{'n', 10795, 10787, {0}, 0}, + {'\0', 0, 10788, {0}, 0},{'n', 10791, 10789, {0}, 0},{'\0', 0, 10790, {0}, 0}, + {'t', 10793, 10791, {0}, 0},{'\0', 0, 10792, {0}, 0},{';', 0, 10793, {10764}, 1}, + {'\0', 0, 10794, {0}, 0},{'t', 10797, 10795, {0}, 0},{'\0', 0, 10796, {0}, 0}, + {';', 0, 10797, {8749}, 1},{'\0', 0, 10798, {0}, 0},{'f', 10801, 10799, {0}, 0}, + {'\0', 0, 10800, {0}, 0},{'i', 10803, 10801, {0}, 0},{'\0', 0, 10802, {0}, 0}, + {'n', 10805, 10803, {0}, 0},{'\0', 0, 10804, {0}, 0},{';', 0, 10805, {10716}, 1}, + {'\0', 0, 10806, {0}, 0},{'t', 10809, 10807, {0}, 0},{'\0', 0, 10808, {0}, 0}, + {'a', 10811, 10809, {0}, 0},{'\0', 0, 10810, {0}, 0},{';', 0, 10811, {8489}, 1}, + {'\0', 0, 10812, {0}, 0},{'l', 10815, 10813, {0}, 0},{'\0', 0, 10814, {0}, 0}, + {'i', 10817, 10815, {0}, 0},{'\0', 0, 10816, {0}, 0},{'g', 10819, 10817, {0}, 0}, + {'\0', 0, 10818, {0}, 0},{';', 0, 10819, {307}, 1},{'\0', 0, 10820, {0}, 0}, + {'a', 10825, 10821, {0}, 0},{'o', 10859, 10822, {0}, 0},{'p', 10863, 10823, {0}, 0}, + {'\0', 0, 10824, {0}, 0},{'c', 10829, 10825, {0}, 0},{'g', 10833, 10826, {0}, 0}, + {'t', 10855, 10827, {0}, 0},{'\0', 0, 10828, {0}, 0},{'r', 10831, 10829, {0}, 0}, + {'\0', 0, 10830, {0}, 0},{';', 0, 10831, {299}, 1},{'\0', 0, 10832, {0}, 0}, + {'e', 10837, 10833, {0}, 0},{'l', 10839, 10834, {0}, 0},{'p', 10847, 10835, {0}, 0}, + {'\0', 0, 10836, {0}, 0},{';', 0, 10837, {8465}, 1},{'\0', 0, 10838, {0}, 0}, + {'i', 10841, 10839, {0}, 0},{'\0', 0, 10840, {0}, 0},{'n', 10843, 10841, {0}, 0}, + {'\0', 0, 10842, {0}, 0},{'e', 10845, 10843, {0}, 0},{'\0', 0, 10844, {0}, 0}, + {';', 0, 10845, {8464}, 1},{'\0', 0, 10846, {0}, 0},{'a', 10849, 10847, {0}, 0}, + {'\0', 0, 10848, {0}, 0},{'r', 10851, 10849, {0}, 0},{'\0', 0, 10850, {0}, 0}, + {'t', 10853, 10851, {0}, 0},{'\0', 0, 10852, {0}, 0},{';', 0, 10853, {8465}, 1}, + {'\0', 0, 10854, {0}, 0},{'h', 10857, 10855, {0}, 0},{'\0', 0, 10856, {0}, 0}, + {';', 0, 10857, {305}, 1},{'\0', 0, 10858, {0}, 0},{'f', 10861, 10859, {0}, 0}, + {'\0', 0, 10860, {0}, 0},{';', 0, 10861, {8887}, 1},{'\0', 0, 10862, {0}, 0}, + {'e', 10865, 10863, {0}, 0},{'\0', 0, 10864, {0}, 0},{'d', 10867, 10865, {0}, 0}, + {'\0', 0, 10866, {0}, 0},{';', 0, 10867, {437}, 1},{'\0', 0, 10868, {0}, 0}, + {';', 0, 10869, {8712}, 1},{'c', 10875, 10870, {0}, 0},{'f', 10883, 10871, {0}, 0}, + {'o', 10896, 10872, {0}, 0},{'t', 10904, 10873, {0}, 0},{'\0', 0, 10874, {0}, 0}, + {'a', 10877, 10875, {0}, 0},{'\0', 0, 10876, {0}, 0},{'r', 10879, 10877, {0}, 0}, + {'\0', 0, 10878, {0}, 0},{'e', 10881, 10879, {0}, 0},{'\0', 0, 10880, {0}, 0}, + {';', 0, 10881, {8453}, 1},{'\0', 0, 10882, {0}, 0},{'i', 10885, 10883, {0}, 0}, + {'\0', 0, 10884, {0}, 0},{'n', 10887, 10885, {0}, 0},{'\0', 0, 10886, {0}, 0}, + {';', 0, 10887, {8734}, 1},{'t', 10890, 10888, {0}, 0},{'\0', 0, 10889, {0}, 0}, + {'i', 10892, 10890, {0}, 0},{'\0', 0, 10891, {0}, 0},{'e', 10894, 10892, {0}, 0}, + {'\0', 0, 10893, {0}, 0},{';', 0, 10894, {10717}, 1},{'\0', 0, 10895, {0}, 0}, + {'d', 10898, 10896, {0}, 0},{'\0', 0, 10897, {0}, 0},{'o', 10900, 10898, {0}, 0}, + {'\0', 0, 10899, {0}, 0},{'t', 10902, 10900, {0}, 0},{'\0', 0, 10901, {0}, 0}, + {';', 0, 10902, {305}, 1},{'\0', 0, 10903, {0}, 0},{';', 0, 10904, {8747}, 1}, + {'c', 10910, 10905, {0}, 0},{'e', 10916, 10906, {0}, 0},{'l', 10935, 10907, {0}, 0}, + {'p', 10945, 10908, {0}, 0},{'\0', 0, 10909, {0}, 0},{'a', 10912, 10910, {0}, 0}, + {'\0', 0, 10911, {0}, 0},{'l', 10914, 10912, {0}, 0},{'\0', 0, 10913, {0}, 0}, + {';', 0, 10914, {8890}, 1},{'\0', 0, 10915, {0}, 0},{'g', 10919, 10916, {0}, 0}, + {'r', 10927, 10917, {0}, 0},{'\0', 0, 10918, {0}, 0},{'e', 10921, 10919, {0}, 0}, + {'\0', 0, 10920, {0}, 0},{'r', 10923, 10921, {0}, 0},{'\0', 0, 10922, {0}, 0}, + {'s', 10925, 10923, {0}, 0},{'\0', 0, 10924, {0}, 0},{';', 0, 10925, {8484}, 1}, + {'\0', 0, 10926, {0}, 0},{'c', 10929, 10927, {0}, 0},{'\0', 0, 10928, {0}, 0}, + {'a', 10931, 10929, {0}, 0},{'\0', 0, 10930, {0}, 0},{'l', 10933, 10931, {0}, 0}, + {'\0', 0, 10932, {0}, 0},{';', 0, 10933, {8890}, 1},{'\0', 0, 10934, {0}, 0}, + {'a', 10937, 10935, {0}, 0},{'\0', 0, 10936, {0}, 0},{'r', 10939, 10937, {0}, 0}, + {'\0', 0, 10938, {0}, 0},{'h', 10941, 10939, {0}, 0},{'\0', 0, 10940, {0}, 0}, + {'k', 10943, 10941, {0}, 0},{'\0', 0, 10942, {0}, 0},{';', 0, 10943, {10775}, 1}, + {'\0', 0, 10944, {0}, 0},{'r', 10947, 10945, {0}, 0},{'\0', 0, 10946, {0}, 0}, + {'o', 10949, 10947, {0}, 0},{'\0', 0, 10948, {0}, 0},{'d', 10951, 10949, {0}, 0}, + {'\0', 0, 10950, {0}, 0},{';', 0, 10951, {10812}, 1},{'\0', 0, 10952, {0}, 0}, + {'c', 10958, 10953, {0}, 0},{'g', 10962, 10954, {0}, 0},{'p', 10968, 10955, {0}, 0}, + {'t', 10972, 10956, {0}, 0},{'\0', 0, 10957, {0}, 0},{'y', 10960, 10958, {0}, 0}, + {'\0', 0, 10959, {0}, 0},{';', 0, 10960, {1105}, 1},{'\0', 0, 10961, {0}, 0}, + {'o', 10964, 10962, {0}, 0},{'\0', 0, 10963, {0}, 0},{'n', 10966, 10964, {0}, 0}, + {'\0', 0, 10965, {0}, 0},{';', 0, 10966, {303}, 1},{'\0', 0, 10967, {0}, 0}, + {'f', 10970, 10968, {0}, 0},{'\0', 0, 10969, {0}, 0},{';', 0, 10970, {120154}, 1}, + {'\0', 0, 10971, {0}, 0},{'a', 10974, 10972, {0}, 0},{'\0', 0, 10973, {0}, 0}, + {';', 0, 10974, {953}, 1},{'\0', 0, 10975, {0}, 0},{'r', 10978, 10976, {0}, 0}, + {'\0', 0, 10977, {0}, 0},{'o', 10980, 10978, {0}, 0},{'\0', 0, 10979, {0}, 0}, + {'d', 10982, 10980, {0}, 0},{'\0', 0, 10981, {0}, 0},{';', 0, 10982, {10812}, 1}, + {'\0', 0, 10983, {0}, 0},{'u', 10986, 10984, {0}, 0},{'\0', 0, 10985, {0}, 0}, + {'e', 10988, 10986, {0}, 0},{'\0', 0, 10987, {0}, 0},{'s', 10990, 10988, {0}, 0}, + {'\0', 0, 10989, {0}, 0},{'t', 10992, 10990, {191}, 1},{'\0', 0, 10991, {0}, 0}, + {';', 0, 10992, {191}, 1},{'\0', 0, 10993, {0}, 0},{'c', 10997, 10994, {0}, 0}, + {'i', 11001, 10995, {0}, 0},{'\0', 0, 10996, {0}, 0},{'r', 10999, 10997, {0}, 0}, + {'\0', 0, 10998, {0}, 0},{';', 0, 10999, {119998}, 1},{'\0', 0, 11000, {0}, 0}, + {'n', 11003, 11001, {0}, 0},{'\0', 0, 11002, {0}, 0},{';', 0, 11003, {8712}, 1}, + {'E', 11009, 11004, {0}, 0},{'d', 11011, 11005, {0}, 0},{'s', 11017, 11006, {0}, 0}, + {'v', 11022, 11007, {0}, 0},{'\0', 0, 11008, {0}, 0},{';', 0, 11009, {8953}, 1}, + {'\0', 0, 11010, {0}, 0},{'o', 11013, 11011, {0}, 0},{'\0', 0, 11012, {0}, 0}, + {'t', 11015, 11013, {0}, 0},{'\0', 0, 11014, {0}, 0},{';', 0, 11015, {8949}, 1}, + {'\0', 0, 11016, {0}, 0},{';', 0, 11017, {8948}, 1},{'v', 11020, 11018, {0}, 0}, + {'\0', 0, 11019, {0}, 0},{';', 0, 11020, {8947}, 1},{'\0', 0, 11021, {0}, 0}, + {';', 0, 11022, {8712}, 1},{'\0', 0, 11023, {0}, 0},{';', 0, 11024, {8290}, 1}, + {'i', 11027, 11025, {0}, 0},{'\0', 0, 11026, {0}, 0},{'l', 11029, 11027, {0}, 0}, + {'\0', 0, 11028, {0}, 0},{'d', 11031, 11029, {0}, 0},{'\0', 0, 11030, {0}, 0}, + {'e', 11033, 11031, {0}, 0},{'\0', 0, 11032, {0}, 0},{';', 0, 11033, {297}, 1}, + {'\0', 0, 11034, {0}, 0},{'k', 11038, 11035, {0}, 0},{'m', 11044, 11036, {0}, 0}, + {'\0', 0, 11037, {0}, 0},{'c', 11040, 11038, {0}, 0},{'\0', 0, 11039, {0}, 0}, + {'y', 11042, 11040, {0}, 0},{'\0', 0, 11041, {0}, 0},{';', 0, 11042, {1110}, 1}, + {'\0', 0, 11043, {0}, 0},{'l', 11046, 11044, {239}, 1},{'\0', 0, 11045, {0}, 0}, + {';', 0, 11046, {239}, 1},{'\0', 0, 11047, {0}, 0},{'c', 11055, 11048, {0}, 0}, + {'f', 11066, 11049, {0}, 0},{'m', 11070, 11050, {0}, 0},{'o', 11078, 11051, {0}, 0}, + {'s', 11084, 11052, {0}, 0},{'u', 11099, 11053, {0}, 0},{'\0', 0, 11054, {0}, 0}, + {'i', 11058, 11055, {0}, 0},{'y', 11064, 11056, {0}, 0},{'\0', 0, 11057, {0}, 0}, + {'r', 11060, 11058, {0}, 0},{'\0', 0, 11059, {0}, 0},{'c', 11062, 11060, {0}, 0}, + {'\0', 0, 11061, {0}, 0},{';', 0, 11062, {309}, 1},{'\0', 0, 11063, {0}, 0}, + {';', 0, 11064, {1081}, 1},{'\0', 0, 11065, {0}, 0},{'r', 11068, 11066, {0}, 0}, + {'\0', 0, 11067, {0}, 0},{';', 0, 11068, {120103}, 1},{'\0', 0, 11069, {0}, 0}, + {'a', 11072, 11070, {0}, 0},{'\0', 0, 11071, {0}, 0},{'t', 11074, 11072, {0}, 0}, + {'\0', 0, 11073, {0}, 0},{'h', 11076, 11074, {0}, 0},{'\0', 0, 11075, {0}, 0}, + {';', 0, 11076, {567}, 1},{'\0', 0, 11077, {0}, 0},{'p', 11080, 11078, {0}, 0}, + {'\0', 0, 11079, {0}, 0},{'f', 11082, 11080, {0}, 0},{'\0', 0, 11081, {0}, 0}, + {';', 0, 11082, {120155}, 1},{'\0', 0, 11083, {0}, 0},{'c', 11087, 11084, {0}, 0}, + {'e', 11091, 11085, {0}, 0},{'\0', 0, 11086, {0}, 0},{'r', 11089, 11087, {0}, 0}, + {'\0', 0, 11088, {0}, 0},{';', 0, 11089, {119999}, 1},{'\0', 0, 11090, {0}, 0}, + {'r', 11093, 11091, {0}, 0},{'\0', 0, 11092, {0}, 0},{'c', 11095, 11093, {0}, 0}, + {'\0', 0, 11094, {0}, 0},{'y', 11097, 11095, {0}, 0},{'\0', 0, 11096, {0}, 0}, + {';', 0, 11097, {1112}, 1},{'\0', 0, 11098, {0}, 0},{'k', 11101, 11099, {0}, 0}, + {'\0', 0, 11100, {0}, 0},{'c', 11103, 11101, {0}, 0},{'\0', 0, 11102, {0}, 0}, + {'y', 11105, 11103, {0}, 0},{'\0', 0, 11104, {0}, 0},{';', 0, 11105, {1108}, 1}, + {'\0', 0, 11106, {0}, 0},{'a', 11116, 11107, {0}, 0},{'c', 11127, 11108, {0}, 0}, + {'f', 11140, 11109, {0}, 0},{'g', 11144, 11110, {0}, 0},{'h', 11154, 11111, {0}, 0}, + {'j', 11160, 11112, {0}, 0},{'o', 11166, 11113, {0}, 0},{'s', 11172, 11114, {0}, 0}, + {'\0', 0, 11115, {0}, 0},{'p', 11118, 11116, {0}, 0},{'\0', 0, 11117, {0}, 0}, + {'p', 11120, 11118, {0}, 0},{'\0', 0, 11119, {0}, 0},{'a', 11122, 11120, {0}, 0}, + {'\0', 0, 11121, {0}, 0},{';', 0, 11122, {954}, 1},{'v', 11125, 11123, {0}, 0}, + {'\0', 0, 11124, {0}, 0},{';', 0, 11125, {1008}, 1},{'\0', 0, 11126, {0}, 0}, + {'e', 11130, 11127, {0}, 0},{'y', 11138, 11128, {0}, 0},{'\0', 0, 11129, {0}, 0}, + {'d', 11132, 11130, {0}, 0},{'\0', 0, 11131, {0}, 0},{'i', 11134, 11132, {0}, 0}, + {'\0', 0, 11133, {0}, 0},{'l', 11136, 11134, {0}, 0},{'\0', 0, 11135, {0}, 0}, + {';', 0, 11136, {311}, 1},{'\0', 0, 11137, {0}, 0},{';', 0, 11138, {1082}, 1}, + {'\0', 0, 11139, {0}, 0},{'r', 11142, 11140, {0}, 0},{'\0', 0, 11141, {0}, 0}, + {';', 0, 11142, {120104}, 1},{'\0', 0, 11143, {0}, 0},{'r', 11146, 11144, {0}, 0}, + {'\0', 0, 11145, {0}, 0},{'e', 11148, 11146, {0}, 0},{'\0', 0, 11147, {0}, 0}, + {'e', 11150, 11148, {0}, 0},{'\0', 0, 11149, {0}, 0},{'n', 11152, 11150, {0}, 0}, + {'\0', 0, 11151, {0}, 0},{';', 0, 11152, {312}, 1},{'\0', 0, 11153, {0}, 0}, + {'c', 11156, 11154, {0}, 0},{'\0', 0, 11155, {0}, 0},{'y', 11158, 11156, {0}, 0}, + {'\0', 0, 11157, {0}, 0},{';', 0, 11158, {1093}, 1},{'\0', 0, 11159, {0}, 0}, + {'c', 11162, 11160, {0}, 0},{'\0', 0, 11161, {0}, 0},{'y', 11164, 11162, {0}, 0}, + {'\0', 0, 11163, {0}, 0},{';', 0, 11164, {1116}, 1},{'\0', 0, 11165, {0}, 0}, + {'p', 11168, 11166, {0}, 0},{'\0', 0, 11167, {0}, 0},{'f', 11170, 11168, {0}, 0}, + {'\0', 0, 11169, {0}, 0},{';', 0, 11170, {120156}, 1},{'\0', 0, 11171, {0}, 0}, + {'c', 11174, 11172, {0}, 0},{'\0', 0, 11173, {0}, 0},{'r', 11176, 11174, {0}, 0}, + {'\0', 0, 11175, {0}, 0},{';', 0, 11176, {120000}, 1},{'\0', 0, 11177, {0}, 0}, + {'A', 11202, 11178, {0}, 0},{'B', 11224, 11179, {0}, 0},{'E', 11232, 11180, {0}, 0}, + {'H', 11237, 11181, {0}, 0},{'a', 11243, 11182, {0}, 0},{'b', 11368, 11183, {0}, 0}, + {'c', 11410, 11184, {0}, 0},{'d', 11442, 11185, {0}, 0},{'e', 11485, 11186, {0}, 0}, + {'f', 11748, 11187, {0}, 0},{'g', 11770, 11188, {0}, 0},{'h', 11775, 11189, {0}, 0}, + {'j', 11796, 11190, {0}, 0},{'l', 11802, 11191, {0}, 0},{'m', 11840, 11192, {0}, 0}, + {'n', 11868, 11193, {0}, 0},{'o', 11902, 11194, {0}, 0},{'p', 12093, 11195, {0}, 0}, + {'r', 12104, 11196, {0}, 0},{'s', 12145, 11197, {0}, 0},{'t', 12196, 11198, {60}, 1}, + {'u', 12271, 11199, {0}, 0},{'v', 12294, 11200, {0}, 0},{'\0', 0, 11201, {0}, 0}, + {'a', 11206, 11202, {0}, 0},{'r', 11212, 11203, {0}, 0},{'t', 11216, 11204, {0}, 0}, + {'\0', 0, 11205, {0}, 0},{'r', 11208, 11206, {0}, 0},{'\0', 0, 11207, {0}, 0}, + {'r', 11210, 11208, {0}, 0},{'\0', 0, 11209, {0}, 0},{';', 0, 11210, {8666}, 1}, + {'\0', 0, 11211, {0}, 0},{'r', 11214, 11212, {0}, 0},{'\0', 0, 11213, {0}, 0}, + {';', 0, 11214, {8656}, 1},{'\0', 0, 11215, {0}, 0},{'a', 11218, 11216, {0}, 0}, + {'\0', 0, 11217, {0}, 0},{'i', 11220, 11218, {0}, 0},{'\0', 0, 11219, {0}, 0}, + {'l', 11222, 11220, {0}, 0},{'\0', 0, 11221, {0}, 0},{';', 0, 11222, {10523}, 1}, + {'\0', 0, 11223, {0}, 0},{'a', 11226, 11224, {0}, 0},{'\0', 0, 11225, {0}, 0}, + {'r', 11228, 11226, {0}, 0},{'\0', 0, 11227, {0}, 0},{'r', 11230, 11228, {0}, 0}, + {'\0', 0, 11229, {0}, 0},{';', 0, 11230, {10510}, 1},{'\0', 0, 11231, {0}, 0}, + {';', 0, 11232, {8806}, 1},{'g', 11235, 11233, {0}, 0},{'\0', 0, 11234, {0}, 0}, + {';', 0, 11235, {10891}, 1},{'\0', 0, 11236, {0}, 0},{'a', 11239, 11237, {0}, 0}, + {'\0', 0, 11238, {0}, 0},{'r', 11241, 11239, {0}, 0},{'\0', 0, 11240, {0}, 0}, + {';', 0, 11241, {10594}, 1},{'\0', 0, 11242, {0}, 0},{'c', 11253, 11243, {0}, 0}, + {'e', 11261, 11244, {0}, 0},{'g', 11273, 11245, {0}, 0},{'m', 11281, 11246, {0}, 0}, + {'n', 11289, 11247, {0}, 0},{'p', 11301, 11248, {0}, 0},{'q', 11303, 11249, {0}, 0}, + {'r', 11309, 11250, {0}, 0},{'t', 11353, 11251, {0}, 0},{'\0', 0, 11252, {0}, 0}, + {'u', 11255, 11253, {0}, 0},{'\0', 0, 11254, {0}, 0},{'t', 11257, 11255, {0}, 0}, + {'\0', 0, 11256, {0}, 0},{'e', 11259, 11257, {0}, 0},{'\0', 0, 11258, {0}, 0}, + {';', 0, 11259, {314}, 1},{'\0', 0, 11260, {0}, 0},{'m', 11263, 11261, {0}, 0}, + {'\0', 0, 11262, {0}, 0},{'p', 11265, 11263, {0}, 0},{'\0', 0, 11264, {0}, 0}, + {'t', 11267, 11265, {0}, 0},{'\0', 0, 11266, {0}, 0},{'y', 11269, 11267, {0}, 0}, + {'\0', 0, 11268, {0}, 0},{'v', 11271, 11269, {0}, 0},{'\0', 0, 11270, {0}, 0}, + {';', 0, 11271, {10676}, 1},{'\0', 0, 11272, {0}, 0},{'r', 11275, 11273, {0}, 0}, + {'\0', 0, 11274, {0}, 0},{'a', 11277, 11275, {0}, 0},{'\0', 0, 11276, {0}, 0}, + {'n', 11279, 11277, {0}, 0},{'\0', 0, 11278, {0}, 0},{';', 0, 11279, {8466}, 1}, + {'\0', 0, 11280, {0}, 0},{'b', 11283, 11281, {0}, 0},{'\0', 0, 11282, {0}, 0}, + {'d', 11285, 11283, {0}, 0},{'\0', 0, 11284, {0}, 0},{'a', 11287, 11285, {0}, 0}, + {'\0', 0, 11286, {0}, 0},{';', 0, 11287, {955}, 1},{'\0', 0, 11288, {0}, 0}, + {'g', 11291, 11289, {0}, 0},{'\0', 0, 11290, {0}, 0},{';', 0, 11291, {10216}, 1}, + {'d', 11295, 11292, {0}, 0},{'l', 11297, 11293, {0}, 0},{'\0', 0, 11294, {0}, 0}, + {';', 0, 11295, {10641}, 1},{'\0', 0, 11296, {0}, 0},{'e', 11299, 11297, {0}, 0}, + {'\0', 0, 11298, {0}, 0},{';', 0, 11299, {10216}, 1},{'\0', 0, 11300, {0}, 0}, + {';', 0, 11301, {10885}, 1},{'\0', 0, 11302, {0}, 0},{'u', 11305, 11303, {0}, 0}, + {'\0', 0, 11304, {0}, 0},{'o', 11307, 11305, {171}, 1},{'\0', 0, 11306, {0}, 0}, + {';', 0, 11307, {171}, 1},{'\0', 0, 11308, {0}, 0},{'r', 11311, 11309, {0}, 0}, + {'\0', 0, 11310, {0}, 0},{';', 0, 11311, {8592}, 1},{'b', 11320, 11312, {0}, 0}, + {'f', 11327, 11313, {0}, 0},{'h', 11331, 11314, {0}, 0},{'l', 11335, 11315, {0}, 0}, + {'p', 11339, 11316, {0}, 0},{'s', 11343, 11317, {0}, 0},{'t', 11349, 11318, {0}, 0}, + {'\0', 0, 11319, {0}, 0},{';', 0, 11320, {8676}, 1},{'f', 11323, 11321, {0}, 0}, + {'\0', 0, 11322, {0}, 0},{'s', 11325, 11323, {0}, 0},{'\0', 0, 11324, {0}, 0}, + {';', 0, 11325, {10527}, 1},{'\0', 0, 11326, {0}, 0},{'s', 11329, 11327, {0}, 0}, + {'\0', 0, 11328, {0}, 0},{';', 0, 11329, {10525}, 1},{'\0', 0, 11330, {0}, 0}, + {'k', 11333, 11331, {0}, 0},{'\0', 0, 11332, {0}, 0},{';', 0, 11333, {8617}, 1}, + {'\0', 0, 11334, {0}, 0},{'p', 11337, 11335, {0}, 0},{'\0', 0, 11336, {0}, 0}, + {';', 0, 11337, {8619}, 1},{'\0', 0, 11338, {0}, 0},{'l', 11341, 11339, {0}, 0}, + {'\0', 0, 11340, {0}, 0},{';', 0, 11341, {10553}, 1},{'\0', 0, 11342, {0}, 0}, + {'i', 11345, 11343, {0}, 0},{'\0', 0, 11344, {0}, 0},{'m', 11347, 11345, {0}, 0}, + {'\0', 0, 11346, {0}, 0},{';', 0, 11347, {10611}, 1},{'\0', 0, 11348, {0}, 0}, + {'l', 11351, 11349, {0}, 0},{'\0', 0, 11350, {0}, 0},{';', 0, 11351, {8610}, 1}, + {'\0', 0, 11352, {0}, 0},{';', 0, 11353, {10923}, 1},{'a', 11357, 11354, {0}, 0}, + {'e', 11363, 11355, {0}, 0},{'\0', 0, 11356, {0}, 0},{'i', 11359, 11357, {0}, 0}, + {'\0', 0, 11358, {0}, 0},{'l', 11361, 11359, {0}, 0},{'\0', 0, 11360, {0}, 0}, + {';', 0, 11361, {10521}, 1},{'\0', 0, 11362, {0}, 0},{';', 0, 11363, {10925}, 1}, + {'s', 11366, 11364, {0}, 0},{'\0', 0, 11365, {0}, 0},{';', 0, 11366, {10925,65024}, 2}, + {'\0', 0, 11367, {0}, 0},{'a', 11372, 11368, {0}, 0},{'b', 11378, 11369, {0}, 0}, + {'r', 11384, 11370, {0}, 0},{'\0', 0, 11371, {0}, 0},{'r', 11374, 11372, {0}, 0}, + {'\0', 0, 11373, {0}, 0},{'r', 11376, 11374, {0}, 0},{'\0', 0, 11375, {0}, 0}, + {';', 0, 11376, {10508}, 1},{'\0', 0, 11377, {0}, 0},{'r', 11380, 11378, {0}, 0}, + {'\0', 0, 11379, {0}, 0},{'k', 11382, 11380, {0}, 0},{'\0', 0, 11381, {0}, 0}, + {';', 0, 11382, {10098}, 1},{'\0', 0, 11383, {0}, 0},{'a', 11387, 11384, {0}, 0}, + {'k', 11396, 11385, {0}, 0},{'\0', 0, 11386, {0}, 0},{'c', 11389, 11387, {0}, 0}, + {'\0', 0, 11388, {0}, 0},{'e', 11392, 11389, {0}, 0},{'k', 11394, 11390, {0}, 0}, + {'\0', 0, 11391, {0}, 0},{';', 0, 11392, {123}, 1},{'\0', 0, 11393, {0}, 0}, + {';', 0, 11394, {91}, 1},{'\0', 0, 11395, {0}, 0},{'e', 11399, 11396, {0}, 0}, + {'s', 11401, 11397, {0}, 0},{'\0', 0, 11398, {0}, 0},{';', 0, 11399, {10635}, 1}, + {'\0', 0, 11400, {0}, 0},{'l', 11403, 11401, {0}, 0},{'\0', 0, 11402, {0}, 0}, + {'d', 11406, 11403, {0}, 0},{'u', 11408, 11404, {0}, 0},{'\0', 0, 11405, {0}, 0}, + {';', 0, 11406, {10639}, 1},{'\0', 0, 11407, {0}, 0},{';', 0, 11408, {10637}, 1}, + {'\0', 0, 11409, {0}, 0},{'a', 11415, 11410, {0}, 0},{'e', 11423, 11411, {0}, 0}, + {'u', 11436, 11412, {0}, 0},{'y', 11440, 11413, {0}, 0},{'\0', 0, 11414, {0}, 0}, + {'r', 11417, 11415, {0}, 0},{'\0', 0, 11416, {0}, 0},{'o', 11419, 11417, {0}, 0}, + {'\0', 0, 11418, {0}, 0},{'n', 11421, 11419, {0}, 0},{'\0', 0, 11420, {0}, 0}, + {';', 0, 11421, {318}, 1},{'\0', 0, 11422, {0}, 0},{'d', 11426, 11423, {0}, 0}, + {'i', 11432, 11424, {0}, 0},{'\0', 0, 11425, {0}, 0},{'i', 11428, 11426, {0}, 0}, + {'\0', 0, 11427, {0}, 0},{'l', 11430, 11428, {0}, 0},{'\0', 0, 11429, {0}, 0}, + {';', 0, 11430, {316}, 1},{'\0', 0, 11431, {0}, 0},{'l', 11434, 11432, {0}, 0}, + {'\0', 0, 11433, {0}, 0},{';', 0, 11434, {8968}, 1},{'\0', 0, 11435, {0}, 0}, + {'b', 11438, 11436, {0}, 0},{'\0', 0, 11437, {0}, 0},{';', 0, 11438, {123}, 1}, + {'\0', 0, 11439, {0}, 0},{';', 0, 11440, {1083}, 1},{'\0', 0, 11441, {0}, 0}, + {'c', 11447, 11442, {0}, 0},{'q', 11451, 11443, {0}, 0},{'r', 11460, 11444, {0}, 0}, + {'s', 11481, 11445, {0}, 0},{'\0', 0, 11446, {0}, 0},{'a', 11449, 11447, {0}, 0}, + {'\0', 0, 11448, {0}, 0},{';', 0, 11449, {10550}, 1},{'\0', 0, 11450, {0}, 0}, + {'u', 11453, 11451, {0}, 0},{'\0', 0, 11452, {0}, 0},{'o', 11455, 11453, {0}, 0}, + {'\0', 0, 11454, {0}, 0},{';', 0, 11455, {8220}, 1},{'r', 11458, 11456, {0}, 0}, + {'\0', 0, 11457, {0}, 0},{';', 0, 11458, {8222}, 1},{'\0', 0, 11459, {0}, 0}, + {'d', 11463, 11460, {0}, 0},{'u', 11471, 11461, {0}, 0},{'\0', 0, 11462, {0}, 0}, + {'h', 11465, 11463, {0}, 0},{'\0', 0, 11464, {0}, 0},{'a', 11467, 11465, {0}, 0}, + {'\0', 0, 11466, {0}, 0},{'r', 11469, 11467, {0}, 0},{'\0', 0, 11468, {0}, 0}, + {';', 0, 11469, {10599}, 1},{'\0', 0, 11470, {0}, 0},{'s', 11473, 11471, {0}, 0}, + {'\0', 0, 11472, {0}, 0},{'h', 11475, 11473, {0}, 0},{'\0', 0, 11474, {0}, 0}, + {'a', 11477, 11475, {0}, 0},{'\0', 0, 11476, {0}, 0},{'r', 11479, 11477, {0}, 0}, + {'\0', 0, 11478, {0}, 0},{';', 0, 11479, {10571}, 1},{'\0', 0, 11480, {0}, 0}, + {'h', 11483, 11481, {0}, 0},{'\0', 0, 11482, {0}, 0},{';', 0, 11483, {8626}, 1}, + {'\0', 0, 11484, {0}, 0},{';', 0, 11485, {8804}, 1},{'f', 11491, 11486, {0}, 0}, + {'g', 11646, 11487, {0}, 0},{'q', 11648, 11488, {0}, 0},{'s', 11664, 11489, {0}, 0}, + {'\0', 0, 11490, {0}, 0},{'t', 11493, 11491, {0}, 0},{'\0', 0, 11492, {0}, 0}, + {'a', 11499, 11493, {0}, 0},{'h', 11518, 11494, {0}, 0},{'l', 11545, 11495, {0}, 0}, + {'r', 11565, 11496, {0}, 0},{'t', 11626, 11497, {0}, 0},{'\0', 0, 11498, {0}, 0}, + {'r', 11501, 11499, {0}, 0},{'\0', 0, 11500, {0}, 0},{'r', 11503, 11501, {0}, 0}, + {'\0', 0, 11502, {0}, 0},{'o', 11505, 11503, {0}, 0},{'\0', 0, 11504, {0}, 0}, + {'w', 11507, 11505, {0}, 0},{'\0', 0, 11506, {0}, 0},{';', 0, 11507, {8592}, 1}, + {'t', 11510, 11508, {0}, 0},{'\0', 0, 11509, {0}, 0},{'a', 11512, 11510, {0}, 0}, + {'\0', 0, 11511, {0}, 0},{'i', 11514, 11512, {0}, 0},{'\0', 0, 11513, {0}, 0}, + {'l', 11516, 11514, {0}, 0},{'\0', 0, 11515, {0}, 0},{';', 0, 11516, {8610}, 1}, + {'\0', 0, 11517, {0}, 0},{'a', 11520, 11518, {0}, 0},{'\0', 0, 11519, {0}, 0}, + {'r', 11522, 11520, {0}, 0},{'\0', 0, 11521, {0}, 0},{'p', 11524, 11522, {0}, 0}, + {'\0', 0, 11523, {0}, 0},{'o', 11526, 11524, {0}, 0},{'\0', 0, 11525, {0}, 0}, + {'o', 11528, 11526, {0}, 0},{'\0', 0, 11527, {0}, 0},{'n', 11530, 11528, {0}, 0}, + {'\0', 0, 11529, {0}, 0},{'d', 11533, 11530, {0}, 0},{'u', 11541, 11531, {0}, 0}, + {'\0', 0, 11532, {0}, 0},{'o', 11535, 11533, {0}, 0},{'\0', 0, 11534, {0}, 0}, + {'w', 11537, 11535, {0}, 0},{'\0', 0, 11536, {0}, 0},{'n', 11539, 11537, {0}, 0}, + {'\0', 0, 11538, {0}, 0},{';', 0, 11539, {8637}, 1},{'\0', 0, 11540, {0}, 0}, + {'p', 11543, 11541, {0}, 0},{'\0', 0, 11542, {0}, 0},{';', 0, 11543, {8636}, 1}, + {'\0', 0, 11544, {0}, 0},{'e', 11547, 11545, {0}, 0},{'\0', 0, 11546, {0}, 0}, + {'f', 11549, 11547, {0}, 0},{'\0', 0, 11548, {0}, 0},{'t', 11551, 11549, {0}, 0}, + {'\0', 0, 11550, {0}, 0},{'a', 11553, 11551, {0}, 0},{'\0', 0, 11552, {0}, 0}, + {'r', 11555, 11553, {0}, 0},{'\0', 0, 11554, {0}, 0},{'r', 11557, 11555, {0}, 0}, + {'\0', 0, 11556, {0}, 0},{'o', 11559, 11557, {0}, 0},{'\0', 0, 11558, {0}, 0}, + {'w', 11561, 11559, {0}, 0},{'\0', 0, 11560, {0}, 0},{'s', 11563, 11561, {0}, 0}, + {'\0', 0, 11562, {0}, 0},{';', 0, 11563, {8647}, 1},{'\0', 0, 11564, {0}, 0}, + {'i', 11567, 11565, {0}, 0},{'\0', 0, 11566, {0}, 0},{'g', 11569, 11567, {0}, 0}, + {'\0', 0, 11568, {0}, 0},{'h', 11571, 11569, {0}, 0},{'\0', 0, 11570, {0}, 0}, + {'t', 11573, 11571, {0}, 0},{'\0', 0, 11572, {0}, 0},{'a', 11577, 11573, {0}, 0}, + {'h', 11590, 11574, {0}, 0},{'s', 11606, 11575, {0}, 0},{'\0', 0, 11576, {0}, 0}, + {'r', 11579, 11577, {0}, 0},{'\0', 0, 11578, {0}, 0},{'r', 11581, 11579, {0}, 0}, + {'\0', 0, 11580, {0}, 0},{'o', 11583, 11581, {0}, 0},{'\0', 0, 11582, {0}, 0}, + {'w', 11585, 11583, {0}, 0},{'\0', 0, 11584, {0}, 0},{';', 0, 11585, {8596}, 1}, + {'s', 11588, 11586, {0}, 0},{'\0', 0, 11587, {0}, 0},{';', 0, 11588, {8646}, 1}, + {'\0', 0, 11589, {0}, 0},{'a', 11592, 11590, {0}, 0},{'\0', 0, 11591, {0}, 0}, + {'r', 11594, 11592, {0}, 0},{'\0', 0, 11593, {0}, 0},{'p', 11596, 11594, {0}, 0}, + {'\0', 0, 11595, {0}, 0},{'o', 11598, 11596, {0}, 0},{'\0', 0, 11597, {0}, 0}, + {'o', 11600, 11598, {0}, 0},{'\0', 0, 11599, {0}, 0},{'n', 11602, 11600, {0}, 0}, + {'\0', 0, 11601, {0}, 0},{'s', 11604, 11602, {0}, 0},{'\0', 0, 11603, {0}, 0}, + {';', 0, 11604, {8651}, 1},{'\0', 0, 11605, {0}, 0},{'q', 11608, 11606, {0}, 0}, + {'\0', 0, 11607, {0}, 0},{'u', 11610, 11608, {0}, 0},{'\0', 0, 11609, {0}, 0}, + {'i', 11612, 11610, {0}, 0},{'\0', 0, 11611, {0}, 0},{'g', 11614, 11612, {0}, 0}, + {'\0', 0, 11613, {0}, 0},{'a', 11616, 11614, {0}, 0},{'\0', 0, 11615, {0}, 0}, + {'r', 11618, 11616, {0}, 0},{'\0', 0, 11617, {0}, 0},{'r', 11620, 11618, {0}, 0}, + {'\0', 0, 11619, {0}, 0},{'o', 11622, 11620, {0}, 0},{'\0', 0, 11621, {0}, 0}, + {'w', 11624, 11622, {0}, 0},{'\0', 0, 11623, {0}, 0},{';', 0, 11624, {8621}, 1}, + {'\0', 0, 11625, {0}, 0},{'h', 11628, 11626, {0}, 0},{'\0', 0, 11627, {0}, 0}, + {'r', 11630, 11628, {0}, 0},{'\0', 0, 11629, {0}, 0},{'e', 11632, 11630, {0}, 0}, + {'\0', 0, 11631, {0}, 0},{'e', 11634, 11632, {0}, 0},{'\0', 0, 11633, {0}, 0}, + {'t', 11636, 11634, {0}, 0},{'\0', 0, 11635, {0}, 0},{'i', 11638, 11636, {0}, 0}, + {'\0', 0, 11637, {0}, 0},{'m', 11640, 11638, {0}, 0},{'\0', 0, 11639, {0}, 0}, + {'e', 11642, 11640, {0}, 0},{'\0', 0, 11641, {0}, 0},{'s', 11644, 11642, {0}, 0}, + {'\0', 0, 11643, {0}, 0},{';', 0, 11644, {8907}, 1},{'\0', 0, 11645, {0}, 0}, + {';', 0, 11646, {8922}, 1},{'\0', 0, 11647, {0}, 0},{';', 0, 11648, {8804}, 1}, + {'q', 11652, 11649, {0}, 0},{'s', 11654, 11650, {0}, 0},{'\0', 0, 11651, {0}, 0}, + {';', 0, 11652, {8806}, 1},{'\0', 0, 11653, {0}, 0},{'l', 11656, 11654, {0}, 0}, + {'\0', 0, 11655, {0}, 0},{'a', 11658, 11656, {0}, 0},{'\0', 0, 11657, {0}, 0}, + {'n', 11660, 11658, {0}, 0},{'\0', 0, 11659, {0}, 0},{'t', 11662, 11660, {0}, 0}, + {'\0', 0, 11661, {0}, 0},{';', 0, 11662, {10877}, 1},{'\0', 0, 11663, {0}, 0}, + {';', 0, 11664, {10877}, 1},{'c', 11670, 11665, {0}, 0},{'d', 11674, 11666, {0}, 0}, + {'g', 11686, 11667, {0}, 0},{'s', 11693, 11668, {0}, 0},{'\0', 0, 11669, {0}, 0}, + {'c', 11672, 11670, {0}, 0},{'\0', 0, 11671, {0}, 0},{';', 0, 11672, {10920}, 1}, + {'\0', 0, 11673, {0}, 0},{'o', 11676, 11674, {0}, 0},{'\0', 0, 11675, {0}, 0}, + {'t', 11678, 11676, {0}, 0},{'\0', 0, 11677, {0}, 0},{';', 0, 11678, {10879}, 1}, + {'o', 11681, 11679, {0}, 0},{'\0', 0, 11680, {0}, 0},{';', 0, 11681, {10881}, 1}, + {'r', 11684, 11682, {0}, 0},{'\0', 0, 11683, {0}, 0},{';', 0, 11684, {10883}, 1}, + {'\0', 0, 11685, {0}, 0},{';', 0, 11686, {8922,65024}, 2},{'e', 11689, 11687, {0}, 0}, + {'\0', 0, 11688, {0}, 0},{'s', 11691, 11689, {0}, 0},{'\0', 0, 11690, {0}, 0}, + {';', 0, 11691, {10899}, 1},{'\0', 0, 11692, {0}, 0},{'a', 11699, 11693, {0}, 0}, + {'d', 11711, 11694, {0}, 0},{'e', 11717, 11695, {0}, 0},{'g', 11736, 11696, {0}, 0}, + {'s', 11742, 11697, {0}, 0},{'\0', 0, 11698, {0}, 0},{'p', 11701, 11699, {0}, 0}, + {'\0', 0, 11700, {0}, 0},{'p', 11703, 11701, {0}, 0},{'\0', 0, 11702, {0}, 0}, + {'r', 11705, 11703, {0}, 0},{'\0', 0, 11704, {0}, 0},{'o', 11707, 11705, {0}, 0}, + {'\0', 0, 11706, {0}, 0},{'x', 11709, 11707, {0}, 0},{'\0', 0, 11708, {0}, 0}, + {';', 0, 11709, {10885}, 1},{'\0', 0, 11710, {0}, 0},{'o', 11713, 11711, {0}, 0}, + {'\0', 0, 11712, {0}, 0},{'t', 11715, 11713, {0}, 0},{'\0', 0, 11714, {0}, 0}, + {';', 0, 11715, {8918}, 1},{'\0', 0, 11716, {0}, 0},{'q', 11719, 11717, {0}, 0}, + {'\0', 0, 11718, {0}, 0},{'g', 11722, 11719, {0}, 0},{'q', 11728, 11720, {0}, 0}, + {'\0', 0, 11721, {0}, 0},{'t', 11724, 11722, {0}, 0},{'\0', 0, 11723, {0}, 0}, + {'r', 11726, 11724, {0}, 0},{'\0', 0, 11725, {0}, 0},{';', 0, 11726, {8922}, 1}, + {'\0', 0, 11727, {0}, 0},{'g', 11730, 11728, {0}, 0},{'\0', 0, 11729, {0}, 0}, + {'t', 11732, 11730, {0}, 0},{'\0', 0, 11731, {0}, 0},{'r', 11734, 11732, {0}, 0}, + {'\0', 0, 11733, {0}, 0},{';', 0, 11734, {10891}, 1},{'\0', 0, 11735, {0}, 0}, + {'t', 11738, 11736, {0}, 0},{'\0', 0, 11737, {0}, 0},{'r', 11740, 11738, {0}, 0}, + {'\0', 0, 11739, {0}, 0},{';', 0, 11740, {8822}, 1},{'\0', 0, 11741, {0}, 0}, + {'i', 11744, 11742, {0}, 0},{'\0', 0, 11743, {0}, 0},{'m', 11746, 11744, {0}, 0}, + {'\0', 0, 11745, {0}, 0},{';', 0, 11746, {8818}, 1},{'\0', 0, 11747, {0}, 0}, + {'i', 11752, 11748, {0}, 0},{'l', 11760, 11749, {0}, 0},{'r', 11768, 11750, {0}, 0}, + {'\0', 0, 11751, {0}, 0},{'s', 11754, 11752, {0}, 0},{'\0', 0, 11753, {0}, 0}, + {'h', 11756, 11754, {0}, 0},{'\0', 0, 11755, {0}, 0},{'t', 11758, 11756, {0}, 0}, + {'\0', 0, 11757, {0}, 0},{';', 0, 11758, {10620}, 1},{'\0', 0, 11759, {0}, 0}, + {'o', 11762, 11760, {0}, 0},{'\0', 0, 11761, {0}, 0},{'o', 11764, 11762, {0}, 0}, + {'\0', 0, 11763, {0}, 0},{'r', 11766, 11764, {0}, 0},{'\0', 0, 11765, {0}, 0}, + {';', 0, 11766, {8970}, 1},{'\0', 0, 11767, {0}, 0},{';', 0, 11768, {120105}, 1}, + {'\0', 0, 11769, {0}, 0},{';', 0, 11770, {8822}, 1},{'E', 11773, 11771, {0}, 0}, + {'\0', 0, 11772, {0}, 0},{';', 0, 11773, {10897}, 1},{'\0', 0, 11774, {0}, 0}, + {'a', 11778, 11775, {0}, 0},{'b', 11790, 11776, {0}, 0},{'\0', 0, 11777, {0}, 0}, + {'r', 11780, 11778, {0}, 0},{'\0', 0, 11779, {0}, 0},{'d', 11783, 11780, {0}, 0}, + {'u', 11785, 11781, {0}, 0},{'\0', 0, 11782, {0}, 0},{';', 0, 11783, {8637}, 1}, + {'\0', 0, 11784, {0}, 0},{';', 0, 11785, {8636}, 1},{'l', 11788, 11786, {0}, 0}, + {'\0', 0, 11787, {0}, 0},{';', 0, 11788, {10602}, 1},{'\0', 0, 11789, {0}, 0}, + {'l', 11792, 11790, {0}, 0},{'\0', 0, 11791, {0}, 0},{'k', 11794, 11792, {0}, 0}, + {'\0', 0, 11793, {0}, 0},{';', 0, 11794, {9604}, 1},{'\0', 0, 11795, {0}, 0}, + {'c', 11798, 11796, {0}, 0},{'\0', 0, 11797, {0}, 0},{'y', 11800, 11798, {0}, 0}, + {'\0', 0, 11799, {0}, 0},{';', 0, 11800, {1113}, 1},{'\0', 0, 11801, {0}, 0}, + {';', 0, 11802, {8810}, 1},{'a', 11808, 11803, {0}, 0},{'c', 11814, 11804, {0}, 0}, + {'h', 11826, 11805, {0}, 0},{'t', 11834, 11806, {0}, 0},{'\0', 0, 11807, {0}, 0}, + {'r', 11810, 11808, {0}, 0},{'\0', 0, 11809, {0}, 0},{'r', 11812, 11810, {0}, 0}, + {'\0', 0, 11811, {0}, 0},{';', 0, 11812, {8647}, 1},{'\0', 0, 11813, {0}, 0}, + {'o', 11816, 11814, {0}, 0},{'\0', 0, 11815, {0}, 0},{'r', 11818, 11816, {0}, 0}, + {'\0', 0, 11817, {0}, 0},{'n', 11820, 11818, {0}, 0},{'\0', 0, 11819, {0}, 0}, + {'e', 11822, 11820, {0}, 0},{'\0', 0, 11821, {0}, 0},{'r', 11824, 11822, {0}, 0}, + {'\0', 0, 11823, {0}, 0},{';', 0, 11824, {8990}, 1},{'\0', 0, 11825, {0}, 0}, + {'a', 11828, 11826, {0}, 0},{'\0', 0, 11827, {0}, 0},{'r', 11830, 11828, {0}, 0}, + {'\0', 0, 11829, {0}, 0},{'d', 11832, 11830, {0}, 0},{'\0', 0, 11831, {0}, 0}, + {';', 0, 11832, {10603}, 1},{'\0', 0, 11833, {0}, 0},{'r', 11836, 11834, {0}, 0}, + {'\0', 0, 11835, {0}, 0},{'i', 11838, 11836, {0}, 0},{'\0', 0, 11837, {0}, 0}, + {';', 0, 11838, {9722}, 1},{'\0', 0, 11839, {0}, 0},{'i', 11843, 11840, {0}, 0}, + {'o', 11851, 11841, {0}, 0},{'\0', 0, 11842, {0}, 0},{'d', 11845, 11843, {0}, 0}, + {'\0', 0, 11844, {0}, 0},{'o', 11847, 11845, {0}, 0},{'\0', 0, 11846, {0}, 0}, + {'t', 11849, 11847, {0}, 0},{'\0', 0, 11848, {0}, 0},{';', 0, 11849, {320}, 1}, + {'\0', 0, 11850, {0}, 0},{'u', 11853, 11851, {0}, 0},{'\0', 0, 11852, {0}, 0}, + {'s', 11855, 11853, {0}, 0},{'\0', 0, 11854, {0}, 0},{'t', 11857, 11855, {0}, 0}, + {'\0', 0, 11856, {0}, 0},{';', 0, 11857, {9136}, 1},{'a', 11860, 11858, {0}, 0}, + {'\0', 0, 11859, {0}, 0},{'c', 11862, 11860, {0}, 0},{'\0', 0, 11861, {0}, 0}, + {'h', 11864, 11862, {0}, 0},{'\0', 0, 11863, {0}, 0},{'e', 11866, 11864, {0}, 0}, + {'\0', 0, 11865, {0}, 0},{';', 0, 11866, {9136}, 1},{'\0', 0, 11867, {0}, 0}, + {'E', 11873, 11868, {0}, 0},{'a', 11875, 11869, {0}, 0},{'e', 11888, 11870, {0}, 0}, + {'s', 11896, 11871, {0}, 0},{'\0', 0, 11872, {0}, 0},{';', 0, 11873, {8808}, 1}, + {'\0', 0, 11874, {0}, 0},{'p', 11877, 11875, {0}, 0},{'\0', 0, 11876, {0}, 0}, + {';', 0, 11877, {10889}, 1},{'p', 11880, 11878, {0}, 0},{'\0', 0, 11879, {0}, 0}, + {'r', 11882, 11880, {0}, 0},{'\0', 0, 11881, {0}, 0},{'o', 11884, 11882, {0}, 0}, + {'\0', 0, 11883, {0}, 0},{'x', 11886, 11884, {0}, 0},{'\0', 0, 11885, {0}, 0}, + {';', 0, 11886, {10889}, 1},{'\0', 0, 11887, {0}, 0},{';', 0, 11888, {10887}, 1}, + {'q', 11891, 11889, {0}, 0},{'\0', 0, 11890, {0}, 0},{';', 0, 11891, {10887}, 1}, + {'q', 11894, 11892, {0}, 0},{'\0', 0, 11893, {0}, 0},{';', 0, 11894, {8808}, 1}, + {'\0', 0, 11895, {0}, 0},{'i', 11898, 11896, {0}, 0},{'\0', 0, 11897, {0}, 0}, + {'m', 11900, 11898, {0}, 0},{'\0', 0, 11899, {0}, 0},{';', 0, 11900, {8934}, 1}, + {'\0', 0, 11901, {0}, 0},{'a', 11911, 11902, {0}, 0},{'b', 11922, 11903, {0}, 0}, + {'n', 11928, 11904, {0}, 0},{'o', 12005, 11905, {0}, 0},{'p', 12038, 11906, {0}, 0}, + {'t', 12054, 11907, {0}, 0},{'w', 12064, 11908, {0}, 0},{'z', 12079, 11909, {0}, 0}, + {'\0', 0, 11910, {0}, 0},{'n', 11914, 11911, {0}, 0},{'r', 11918, 11912, {0}, 0}, + {'\0', 0, 11913, {0}, 0},{'g', 11916, 11914, {0}, 0},{'\0', 0, 11915, {0}, 0}, + {';', 0, 11916, {10220}, 1},{'\0', 0, 11917, {0}, 0},{'r', 11920, 11918, {0}, 0}, + {'\0', 0, 11919, {0}, 0},{';', 0, 11920, {8701}, 1},{'\0', 0, 11921, {0}, 0}, + {'r', 11924, 11922, {0}, 0},{'\0', 0, 11923, {0}, 0},{'k', 11926, 11924, {0}, 0}, + {'\0', 0, 11925, {0}, 0},{';', 0, 11926, {10214}, 1},{'\0', 0, 11927, {0}, 0}, + {'g', 11930, 11928, {0}, 0},{'\0', 0, 11929, {0}, 0},{'l', 11934, 11930, {0}, 0}, + {'m', 11973, 11931, {0}, 0},{'r', 11985, 11932, {0}, 0},{'\0', 0, 11933, {0}, 0}, + {'e', 11936, 11934, {0}, 0},{'\0', 0, 11935, {0}, 0},{'f', 11938, 11936, {0}, 0}, + {'\0', 0, 11937, {0}, 0},{'t', 11940, 11938, {0}, 0},{'\0', 0, 11939, {0}, 0}, + {'a', 11943, 11940, {0}, 0},{'r', 11953, 11941, {0}, 0},{'\0', 0, 11942, {0}, 0}, + {'r', 11945, 11943, {0}, 0},{'\0', 0, 11944, {0}, 0},{'r', 11947, 11945, {0}, 0}, + {'\0', 0, 11946, {0}, 0},{'o', 11949, 11947, {0}, 0},{'\0', 0, 11948, {0}, 0}, + {'w', 11951, 11949, {0}, 0},{'\0', 0, 11950, {0}, 0},{';', 0, 11951, {10229}, 1}, + {'\0', 0, 11952, {0}, 0},{'i', 11955, 11953, {0}, 0},{'\0', 0, 11954, {0}, 0}, + {'g', 11957, 11955, {0}, 0},{'\0', 0, 11956, {0}, 0},{'h', 11959, 11957, {0}, 0}, + {'\0', 0, 11958, {0}, 0},{'t', 11961, 11959, {0}, 0},{'\0', 0, 11960, {0}, 0}, + {'a', 11963, 11961, {0}, 0},{'\0', 0, 11962, {0}, 0},{'r', 11965, 11963, {0}, 0}, + {'\0', 0, 11964, {0}, 0},{'r', 11967, 11965, {0}, 0},{'\0', 0, 11966, {0}, 0}, + {'o', 11969, 11967, {0}, 0},{'\0', 0, 11968, {0}, 0},{'w', 11971, 11969, {0}, 0}, + {'\0', 0, 11970, {0}, 0},{';', 0, 11971, {10231}, 1},{'\0', 0, 11972, {0}, 0}, + {'a', 11975, 11973, {0}, 0},{'\0', 0, 11974, {0}, 0},{'p', 11977, 11975, {0}, 0}, + {'\0', 0, 11976, {0}, 0},{'s', 11979, 11977, {0}, 0},{'\0', 0, 11978, {0}, 0}, + {'t', 11981, 11979, {0}, 0},{'\0', 0, 11980, {0}, 0},{'o', 11983, 11981, {0}, 0}, + {'\0', 0, 11982, {0}, 0},{';', 0, 11983, {10236}, 1},{'\0', 0, 11984, {0}, 0}, + {'i', 11987, 11985, {0}, 0},{'\0', 0, 11986, {0}, 0},{'g', 11989, 11987, {0}, 0}, + {'\0', 0, 11988, {0}, 0},{'h', 11991, 11989, {0}, 0},{'\0', 0, 11990, {0}, 0}, + {'t', 11993, 11991, {0}, 0},{'\0', 0, 11992, {0}, 0},{'a', 11995, 11993, {0}, 0}, + {'\0', 0, 11994, {0}, 0},{'r', 11997, 11995, {0}, 0},{'\0', 0, 11996, {0}, 0}, + {'r', 11999, 11997, {0}, 0},{'\0', 0, 11998, {0}, 0},{'o', 12001, 11999, {0}, 0}, + {'\0', 0, 12000, {0}, 0},{'w', 12003, 12001, {0}, 0},{'\0', 0, 12002, {0}, 0}, + {';', 0, 12003, {10230}, 1},{'\0', 0, 12004, {0}, 0},{'p', 12007, 12005, {0}, 0}, + {'\0', 0, 12006, {0}, 0},{'a', 12009, 12007, {0}, 0},{'\0', 0, 12008, {0}, 0}, + {'r', 12011, 12009, {0}, 0},{'\0', 0, 12010, {0}, 0},{'r', 12013, 12011, {0}, 0}, + {'\0', 0, 12012, {0}, 0},{'o', 12015, 12013, {0}, 0},{'\0', 0, 12014, {0}, 0}, + {'w', 12017, 12015, {0}, 0},{'\0', 0, 12016, {0}, 0},{'l', 12020, 12017, {0}, 0}, + {'r', 12028, 12018, {0}, 0},{'\0', 0, 12019, {0}, 0},{'e', 12022, 12020, {0}, 0}, + {'\0', 0, 12021, {0}, 0},{'f', 12024, 12022, {0}, 0},{'\0', 0, 12023, {0}, 0}, + {'t', 12026, 12024, {0}, 0},{'\0', 0, 12025, {0}, 0},{';', 0, 12026, {8619}, 1}, + {'\0', 0, 12027, {0}, 0},{'i', 12030, 12028, {0}, 0},{'\0', 0, 12029, {0}, 0}, + {'g', 12032, 12030, {0}, 0},{'\0', 0, 12031, {0}, 0},{'h', 12034, 12032, {0}, 0}, + {'\0', 0, 12033, {0}, 0},{'t', 12036, 12034, {0}, 0},{'\0', 0, 12035, {0}, 0}, + {';', 0, 12036, {8620}, 1},{'\0', 0, 12037, {0}, 0},{'a', 12042, 12038, {0}, 0}, + {'f', 12046, 12039, {0}, 0},{'l', 12048, 12040, {0}, 0},{'\0', 0, 12041, {0}, 0}, + {'r', 12044, 12042, {0}, 0},{'\0', 0, 12043, {0}, 0},{';', 0, 12044, {10629}, 1}, + {'\0', 0, 12045, {0}, 0},{';', 0, 12046, {120157}, 1},{'\0', 0, 12047, {0}, 0}, + {'u', 12050, 12048, {0}, 0},{'\0', 0, 12049, {0}, 0},{'s', 12052, 12050, {0}, 0}, + {'\0', 0, 12051, {0}, 0},{';', 0, 12052, {10797}, 1},{'\0', 0, 12053, {0}, 0}, + {'i', 12056, 12054, {0}, 0},{'\0', 0, 12055, {0}, 0},{'m', 12058, 12056, {0}, 0}, + {'\0', 0, 12057, {0}, 0},{'e', 12060, 12058, {0}, 0},{'\0', 0, 12059, {0}, 0}, + {'s', 12062, 12060, {0}, 0},{'\0', 0, 12061, {0}, 0},{';', 0, 12062, {10804}, 1}, + {'\0', 0, 12063, {0}, 0},{'a', 12067, 12064, {0}, 0},{'b', 12073, 12065, {0}, 0}, + {'\0', 0, 12066, {0}, 0},{'s', 12069, 12067, {0}, 0},{'\0', 0, 12068, {0}, 0}, + {'t', 12071, 12069, {0}, 0},{'\0', 0, 12070, {0}, 0},{';', 0, 12071, {8727}, 1}, + {'\0', 0, 12072, {0}, 0},{'a', 12075, 12073, {0}, 0},{'\0', 0, 12074, {0}, 0}, + {'r', 12077, 12075, {0}, 0},{'\0', 0, 12076, {0}, 0},{';', 0, 12077, {95}, 1}, + {'\0', 0, 12078, {0}, 0},{';', 0, 12079, {9674}, 1},{'e', 12083, 12080, {0}, 0}, + {'f', 12091, 12081, {0}, 0},{'\0', 0, 12082, {0}, 0},{'n', 12085, 12083, {0}, 0}, + {'\0', 0, 12084, {0}, 0},{'g', 12087, 12085, {0}, 0},{'\0', 0, 12086, {0}, 0}, + {'e', 12089, 12087, {0}, 0},{'\0', 0, 12088, {0}, 0},{';', 0, 12089, {9674}, 1}, + {'\0', 0, 12090, {0}, 0},{';', 0, 12091, {10731}, 1},{'\0', 0, 12092, {0}, 0}, + {'a', 12095, 12093, {0}, 0},{'\0', 0, 12094, {0}, 0},{'r', 12097, 12095, {0}, 0}, + {'\0', 0, 12096, {0}, 0},{';', 0, 12097, {40}, 1},{'l', 12100, 12098, {0}, 0}, + {'\0', 0, 12099, {0}, 0},{'t', 12102, 12100, {0}, 0},{'\0', 0, 12101, {0}, 0}, + {';', 0, 12102, {10643}, 1},{'\0', 0, 12103, {0}, 0},{'a', 12110, 12104, {0}, 0}, + {'c', 12116, 12105, {0}, 0},{'h', 12128, 12106, {0}, 0},{'m', 12137, 12107, {0}, 0}, + {'t', 12139, 12108, {0}, 0},{'\0', 0, 12109, {0}, 0},{'r', 12112, 12110, {0}, 0}, + {'\0', 0, 12111, {0}, 0},{'r', 12114, 12112, {0}, 0},{'\0', 0, 12113, {0}, 0}, + {';', 0, 12114, {8646}, 1},{'\0', 0, 12115, {0}, 0},{'o', 12118, 12116, {0}, 0}, + {'\0', 0, 12117, {0}, 0},{'r', 12120, 12118, {0}, 0},{'\0', 0, 12119, {0}, 0}, + {'n', 12122, 12120, {0}, 0},{'\0', 0, 12121, {0}, 0},{'e', 12124, 12122, {0}, 0}, + {'\0', 0, 12123, {0}, 0},{'r', 12126, 12124, {0}, 0},{'\0', 0, 12125, {0}, 0}, + {';', 0, 12126, {8991}, 1},{'\0', 0, 12127, {0}, 0},{'a', 12130, 12128, {0}, 0}, + {'\0', 0, 12129, {0}, 0},{'r', 12132, 12130, {0}, 0},{'\0', 0, 12131, {0}, 0}, + {';', 0, 12132, {8651}, 1},{'d', 12135, 12133, {0}, 0},{'\0', 0, 12134, {0}, 0}, + {';', 0, 12135, {10605}, 1},{'\0', 0, 12136, {0}, 0},{';', 0, 12137, {8206}, 1}, + {'\0', 0, 12138, {0}, 0},{'r', 12141, 12139, {0}, 0},{'\0', 0, 12140, {0}, 0}, + {'i', 12143, 12141, {0}, 0},{'\0', 0, 12142, {0}, 0},{';', 0, 12143, {8895}, 1}, + {'\0', 0, 12144, {0}, 0},{'a', 12152, 12145, {0}, 0},{'c', 12160, 12146, {0}, 0}, + {'h', 12164, 12147, {0}, 0},{'i', 12166, 12148, {0}, 0},{'q', 12176, 12149, {0}, 0}, + {'t', 12188, 12150, {0}, 0},{'\0', 0, 12151, {0}, 0},{'q', 12154, 12152, {0}, 0}, + {'\0', 0, 12153, {0}, 0},{'u', 12156, 12154, {0}, 0},{'\0', 0, 12155, {0}, 0}, + {'o', 12158, 12156, {0}, 0},{'\0', 0, 12157, {0}, 0},{';', 0, 12158, {8249}, 1}, + {'\0', 0, 12159, {0}, 0},{'r', 12162, 12160, {0}, 0},{'\0', 0, 12161, {0}, 0}, + {';', 0, 12162, {120001}, 1},{'\0', 0, 12163, {0}, 0},{';', 0, 12164, {8624}, 1}, + {'\0', 0, 12165, {0}, 0},{'m', 12168, 12166, {0}, 0},{'\0', 0, 12167, {0}, 0}, + {';', 0, 12168, {8818}, 1},{'e', 12172, 12169, {0}, 0},{'g', 12174, 12170, {0}, 0}, + {'\0', 0, 12171, {0}, 0},{';', 0, 12172, {10893}, 1},{'\0', 0, 12173, {0}, 0}, + {';', 0, 12174, {10895}, 1},{'\0', 0, 12175, {0}, 0},{'b', 12179, 12176, {0}, 0}, + {'u', 12181, 12177, {0}, 0},{'\0', 0, 12178, {0}, 0},{';', 0, 12179, {91}, 1}, + {'\0', 0, 12180, {0}, 0},{'o', 12183, 12181, {0}, 0},{'\0', 0, 12182, {0}, 0}, + {';', 0, 12183, {8216}, 1},{'r', 12186, 12184, {0}, 0},{'\0', 0, 12185, {0}, 0}, + {';', 0, 12186, {8218}, 1},{'\0', 0, 12187, {0}, 0},{'r', 12190, 12188, {0}, 0}, + {'\0', 0, 12189, {0}, 0},{'o', 12192, 12190, {0}, 0},{'\0', 0, 12191, {0}, 0}, + {'k', 12194, 12192, {0}, 0},{'\0', 0, 12193, {0}, 0},{';', 0, 12194, {322}, 1}, + {'\0', 0, 12195, {0}, 0},{';', 0, 12196, {60}, 1},{'c', 12205, 12197, {0}, 0}, + {'d', 12214, 12198, {0}, 0},{'h', 12220, 12199, {0}, 0},{'i', 12228, 12200, {0}, 0}, + {'l', 12236, 12201, {0}, 0},{'q', 12244, 12202, {0}, 0},{'r', 12254, 12203, {0}, 0}, + {'\0', 0, 12204, {0}, 0},{'c', 12208, 12205, {0}, 0},{'i', 12210, 12206, {0}, 0}, + {'\0', 0, 12207, {0}, 0},{';', 0, 12208, {10918}, 1},{'\0', 0, 12209, {0}, 0}, + {'r', 12212, 12210, {0}, 0},{'\0', 0, 12211, {0}, 0},{';', 0, 12212, {10873}, 1}, + {'\0', 0, 12213, {0}, 0},{'o', 12216, 12214, {0}, 0},{'\0', 0, 12215, {0}, 0}, + {'t', 12218, 12216, {0}, 0},{'\0', 0, 12217, {0}, 0},{';', 0, 12218, {8918}, 1}, + {'\0', 0, 12219, {0}, 0},{'r', 12222, 12220, {0}, 0},{'\0', 0, 12221, {0}, 0}, + {'e', 12224, 12222, {0}, 0},{'\0', 0, 12223, {0}, 0},{'e', 12226, 12224, {0}, 0}, + {'\0', 0, 12225, {0}, 0},{';', 0, 12226, {8907}, 1},{'\0', 0, 12227, {0}, 0}, + {'m', 12230, 12228, {0}, 0},{'\0', 0, 12229, {0}, 0},{'e', 12232, 12230, {0}, 0}, + {'\0', 0, 12231, {0}, 0},{'s', 12234, 12232, {0}, 0},{'\0', 0, 12233, {0}, 0}, + {';', 0, 12234, {8905}, 1},{'\0', 0, 12235, {0}, 0},{'a', 12238, 12236, {0}, 0}, + {'\0', 0, 12237, {0}, 0},{'r', 12240, 12238, {0}, 0},{'\0', 0, 12239, {0}, 0}, + {'r', 12242, 12240, {0}, 0},{'\0', 0, 12241, {0}, 0},{';', 0, 12242, {10614}, 1}, + {'\0', 0, 12243, {0}, 0},{'u', 12246, 12244, {0}, 0},{'\0', 0, 12245, {0}, 0}, + {'e', 12248, 12246, {0}, 0},{'\0', 0, 12247, {0}, 0},{'s', 12250, 12248, {0}, 0}, + {'\0', 0, 12249, {0}, 0},{'t', 12252, 12250, {0}, 0},{'\0', 0, 12251, {0}, 0}, + {';', 0, 12252, {10875}, 1},{'\0', 0, 12253, {0}, 0},{'P', 12257, 12254, {0}, 0}, + {'i', 12263, 12255, {0}, 0},{'\0', 0, 12256, {0}, 0},{'a', 12259, 12257, {0}, 0}, + {'\0', 0, 12258, {0}, 0},{'r', 12261, 12259, {0}, 0},{'\0', 0, 12260, {0}, 0}, + {';', 0, 12261, {10646}, 1},{'\0', 0, 12262, {0}, 0},{';', 0, 12263, {9667}, 1}, + {'e', 12267, 12264, {0}, 0},{'f', 12269, 12265, {0}, 0},{'\0', 0, 12266, {0}, 0}, + {';', 0, 12267, {8884}, 1},{'\0', 0, 12268, {0}, 0},{';', 0, 12269, {9666}, 1}, + {'\0', 0, 12270, {0}, 0},{'r', 12273, 12271, {0}, 0},{'\0', 0, 12272, {0}, 0}, + {'d', 12276, 12273, {0}, 0},{'u', 12286, 12274, {0}, 0},{'\0', 0, 12275, {0}, 0}, + {'s', 12278, 12276, {0}, 0},{'\0', 0, 12277, {0}, 0},{'h', 12280, 12278, {0}, 0}, + {'\0', 0, 12279, {0}, 0},{'a', 12282, 12280, {0}, 0},{'\0', 0, 12281, {0}, 0}, + {'r', 12284, 12282, {0}, 0},{'\0', 0, 12283, {0}, 0},{';', 0, 12284, {10570}, 1}, + {'\0', 0, 12285, {0}, 0},{'h', 12288, 12286, {0}, 0},{'\0', 0, 12287, {0}, 0}, + {'a', 12290, 12288, {0}, 0},{'\0', 0, 12289, {0}, 0},{'r', 12292, 12290, {0}, 0}, + {'\0', 0, 12291, {0}, 0},{';', 0, 12292, {10598}, 1},{'\0', 0, 12293, {0}, 0}, + {'e', 12297, 12294, {0}, 0},{'n', 12311, 12295, {0}, 0},{'\0', 0, 12296, {0}, 0}, + {'r', 12299, 12297, {0}, 0},{'\0', 0, 12298, {0}, 0},{'t', 12301, 12299, {0}, 0}, + {'\0', 0, 12300, {0}, 0},{'n', 12303, 12301, {0}, 0},{'\0', 0, 12302, {0}, 0}, + {'e', 12305, 12303, {0}, 0},{'\0', 0, 12304, {0}, 0},{'q', 12307, 12305, {0}, 0}, + {'\0', 0, 12306, {0}, 0},{'q', 12309, 12307, {0}, 0},{'\0', 0, 12308, {0}, 0}, + {';', 0, 12309, {8808,65024}, 2},{'\0', 0, 12310, {0}, 0},{'E', 12313, 12311, {0}, 0}, + {'\0', 0, 12312, {0}, 0},{';', 0, 12313, {8808,65024}, 2},{'\0', 0, 12314, {0}, 0}, + {'D', 12330, 12315, {0}, 0},{'a', 12338, 12316, {0}, 0},{'c', 12401, 12317, {0}, 0}, + {'d', 12414, 12318, {0}, 0},{'e', 12422, 12319, {0}, 0},{'f', 12446, 12320, {0}, 0}, + {'h', 12450, 12321, {0}, 0},{'i', 12454, 12322, {0}, 0},{'l', 12502, 12323, {0}, 0}, + {'n', 12513, 12324, {0}, 0},{'o', 12523, 12325, {0}, 0},{'p', 12538, 12326, {0}, 0}, + {'s', 12540, 12327, {0}, 0},{'u', 12555, 12328, {0}, 0},{'\0', 0, 12329, {0}, 0}, + {'D', 12332, 12330, {0}, 0},{'\0', 0, 12331, {0}, 0},{'o', 12334, 12332, {0}, 0}, + {'\0', 0, 12333, {0}, 0},{'t', 12336, 12334, {0}, 0},{'\0', 0, 12335, {0}, 0}, + {';', 0, 12336, {8762}, 1},{'\0', 0, 12337, {0}, 0},{'c', 12343, 12338, {0}, 0}, + {'l', 12347, 12339, {0}, 0},{'p', 12361, 12340, {0}, 0},{'r', 12393, 12341, {0}, 0}, + {'\0', 0, 12342, {0}, 0},{'r', 12345, 12343, {175}, 1},{'\0', 0, 12344, {0}, 0}, + {';', 0, 12345, {175}, 1},{'\0', 0, 12346, {0}, 0},{'e', 12350, 12347, {0}, 0}, + {'t', 12352, 12348, {0}, 0},{'\0', 0, 12349, {0}, 0},{';', 0, 12350, {9794}, 1}, + {'\0', 0, 12351, {0}, 0},{';', 0, 12352, {10016}, 1},{'e', 12355, 12353, {0}, 0}, + {'\0', 0, 12354, {0}, 0},{'s', 12357, 12355, {0}, 0},{'\0', 0, 12356, {0}, 0}, + {'e', 12359, 12357, {0}, 0},{'\0', 0, 12358, {0}, 0},{';', 0, 12359, {10016}, 1}, + {'\0', 0, 12360, {0}, 0},{';', 0, 12361, {8614}, 1},{'s', 12364, 12362, {0}, 0}, + {'\0', 0, 12363, {0}, 0},{'t', 12366, 12364, {0}, 0},{'\0', 0, 12365, {0}, 0}, + {'o', 12368, 12366, {0}, 0},{'\0', 0, 12367, {0}, 0},{';', 0, 12368, {8614}, 1}, + {'d', 12373, 12369, {0}, 0},{'l', 12381, 12370, {0}, 0},{'u', 12389, 12371, {0}, 0}, + {'\0', 0, 12372, {0}, 0},{'o', 12375, 12373, {0}, 0},{'\0', 0, 12374, {0}, 0}, + {'w', 12377, 12375, {0}, 0},{'\0', 0, 12376, {0}, 0},{'n', 12379, 12377, {0}, 0}, + {'\0', 0, 12378, {0}, 0},{';', 0, 12379, {8615}, 1},{'\0', 0, 12380, {0}, 0}, + {'e', 12383, 12381, {0}, 0},{'\0', 0, 12382, {0}, 0},{'f', 12385, 12383, {0}, 0}, + {'\0', 0, 12384, {0}, 0},{'t', 12387, 12385, {0}, 0},{'\0', 0, 12386, {0}, 0}, + {';', 0, 12387, {8612}, 1},{'\0', 0, 12388, {0}, 0},{'p', 12391, 12389, {0}, 0}, + {'\0', 0, 12390, {0}, 0},{';', 0, 12391, {8613}, 1},{'\0', 0, 12392, {0}, 0}, + {'k', 12395, 12393, {0}, 0},{'\0', 0, 12394, {0}, 0},{'e', 12397, 12395, {0}, 0}, + {'\0', 0, 12396, {0}, 0},{'r', 12399, 12397, {0}, 0},{'\0', 0, 12398, {0}, 0}, + {';', 0, 12399, {9646}, 1},{'\0', 0, 12400, {0}, 0},{'o', 12404, 12401, {0}, 0}, + {'y', 12412, 12402, {0}, 0},{'\0', 0, 12403, {0}, 0},{'m', 12406, 12404, {0}, 0}, + {'\0', 0, 12405, {0}, 0},{'m', 12408, 12406, {0}, 0},{'\0', 0, 12407, {0}, 0}, + {'a', 12410, 12408, {0}, 0},{'\0', 0, 12409, {0}, 0},{';', 0, 12410, {10793}, 1}, + {'\0', 0, 12411, {0}, 0},{';', 0, 12412, {1084}, 1},{'\0', 0, 12413, {0}, 0}, + {'a', 12416, 12414, {0}, 0},{'\0', 0, 12415, {0}, 0},{'s', 12418, 12416, {0}, 0}, + {'\0', 0, 12417, {0}, 0},{'h', 12420, 12418, {0}, 0},{'\0', 0, 12419, {0}, 0}, + {';', 0, 12420, {8212}, 1},{'\0', 0, 12421, {0}, 0},{'a', 12424, 12422, {0}, 0}, + {'\0', 0, 12423, {0}, 0},{'s', 12426, 12424, {0}, 0},{'\0', 0, 12425, {0}, 0}, + {'u', 12428, 12426, {0}, 0},{'\0', 0, 12427, {0}, 0},{'r', 12430, 12428, {0}, 0}, + {'\0', 0, 12429, {0}, 0},{'e', 12432, 12430, {0}, 0},{'\0', 0, 12431, {0}, 0}, + {'d', 12434, 12432, {0}, 0},{'\0', 0, 12433, {0}, 0},{'a', 12436, 12434, {0}, 0}, + {'\0', 0, 12435, {0}, 0},{'n', 12438, 12436, {0}, 0},{'\0', 0, 12437, {0}, 0}, + {'g', 12440, 12438, {0}, 0},{'\0', 0, 12439, {0}, 0},{'l', 12442, 12440, {0}, 0}, + {'\0', 0, 12441, {0}, 0},{'e', 12444, 12442, {0}, 0},{'\0', 0, 12443, {0}, 0}, + {';', 0, 12444, {8737}, 1},{'\0', 0, 12445, {0}, 0},{'r', 12448, 12446, {0}, 0}, + {'\0', 0, 12447, {0}, 0},{';', 0, 12448, {120106}, 1},{'\0', 0, 12449, {0}, 0}, + {'o', 12452, 12450, {0}, 0},{'\0', 0, 12451, {0}, 0},{';', 0, 12452, {8487}, 1}, + {'\0', 0, 12453, {0}, 0},{'c', 12458, 12454, {0}, 0},{'d', 12464, 12455, {0}, 0}, + {'n', 12487, 12456, {0}, 0},{'\0', 0, 12457, {0}, 0},{'r', 12460, 12458, {0}, 0}, + {'\0', 0, 12459, {0}, 0},{'o', 12462, 12460, {181}, 1},{'\0', 0, 12461, {0}, 0}, + {';', 0, 12462, {181}, 1},{'\0', 0, 12463, {0}, 0},{';', 0, 12464, {8739}, 1}, + {'a', 12469, 12465, {0}, 0},{'c', 12475, 12466, {0}, 0},{'d', 12481, 12467, {0}, 0}, + {'\0', 0, 12468, {0}, 0},{'s', 12471, 12469, {0}, 0},{'\0', 0, 12470, {0}, 0}, + {'t', 12473, 12471, {0}, 0},{'\0', 0, 12472, {0}, 0},{';', 0, 12473, {42}, 1}, + {'\0', 0, 12474, {0}, 0},{'i', 12477, 12475, {0}, 0},{'\0', 0, 12476, {0}, 0}, + {'r', 12479, 12477, {0}, 0},{'\0', 0, 12478, {0}, 0},{';', 0, 12479, {10992}, 1}, + {'\0', 0, 12480, {0}, 0},{'o', 12483, 12481, {0}, 0},{'\0', 0, 12482, {0}, 0}, + {'t', 12485, 12483, {183}, 1},{'\0', 0, 12484, {0}, 0},{';', 0, 12485, {183}, 1}, + {'\0', 0, 12486, {0}, 0},{'u', 12489, 12487, {0}, 0},{'\0', 0, 12488, {0}, 0}, + {'s', 12491, 12489, {0}, 0},{'\0', 0, 12490, {0}, 0},{';', 0, 12491, {8722}, 1}, + {'b', 12495, 12492, {0}, 0},{'d', 12497, 12493, {0}, 0},{'\0', 0, 12494, {0}, 0}, + {';', 0, 12495, {8863}, 1},{'\0', 0, 12496, {0}, 0},{';', 0, 12497, {8760}, 1}, + {'u', 12500, 12498, {0}, 0},{'\0', 0, 12499, {0}, 0},{';', 0, 12500, {10794}, 1}, + {'\0', 0, 12501, {0}, 0},{'c', 12505, 12502, {0}, 0},{'d', 12509, 12503, {0}, 0}, + {'\0', 0, 12504, {0}, 0},{'p', 12507, 12505, {0}, 0},{'\0', 0, 12506, {0}, 0}, + {';', 0, 12507, {10971}, 1},{'\0', 0, 12508, {0}, 0},{'r', 12511, 12509, {0}, 0}, + {'\0', 0, 12510, {0}, 0},{';', 0, 12511, {8230}, 1},{'\0', 0, 12512, {0}, 0}, + {'p', 12515, 12513, {0}, 0},{'\0', 0, 12514, {0}, 0},{'l', 12517, 12515, {0}, 0}, + {'\0', 0, 12516, {0}, 0},{'u', 12519, 12517, {0}, 0},{'\0', 0, 12518, {0}, 0}, + {'s', 12521, 12519, {0}, 0},{'\0', 0, 12520, {0}, 0},{';', 0, 12521, {8723}, 1}, + {'\0', 0, 12522, {0}, 0},{'d', 12526, 12523, {0}, 0},{'p', 12534, 12524, {0}, 0}, + {'\0', 0, 12525, {0}, 0},{'e', 12528, 12526, {0}, 0},{'\0', 0, 12527, {0}, 0}, + {'l', 12530, 12528, {0}, 0},{'\0', 0, 12529, {0}, 0},{'s', 12532, 12530, {0}, 0}, + {'\0', 0, 12531, {0}, 0},{';', 0, 12532, {8871}, 1},{'\0', 0, 12533, {0}, 0}, + {'f', 12536, 12534, {0}, 0},{'\0', 0, 12535, {0}, 0},{';', 0, 12536, {120158}, 1}, + {'\0', 0, 12537, {0}, 0},{';', 0, 12538, {8723}, 1},{'\0', 0, 12539, {0}, 0}, + {'c', 12543, 12540, {0}, 0},{'t', 12547, 12541, {0}, 0},{'\0', 0, 12542, {0}, 0}, + {'r', 12545, 12543, {0}, 0},{'\0', 0, 12544, {0}, 0},{';', 0, 12545, {120002}, 1}, + {'\0', 0, 12546, {0}, 0},{'p', 12549, 12547, {0}, 0},{'\0', 0, 12548, {0}, 0}, + {'o', 12551, 12549, {0}, 0},{'\0', 0, 12550, {0}, 0},{'s', 12553, 12551, {0}, 0}, + {'\0', 0, 12552, {0}, 0},{';', 0, 12553, {8766}, 1},{'\0', 0, 12554, {0}, 0}, + {';', 0, 12555, {956}, 1},{'l', 12559, 12556, {0}, 0},{'m', 12571, 12557, {0}, 0}, + {'\0', 0, 12558, {0}, 0},{'t', 12561, 12559, {0}, 0},{'\0', 0, 12560, {0}, 0}, + {'i', 12563, 12561, {0}, 0},{'\0', 0, 12562, {0}, 0},{'m', 12565, 12563, {0}, 0}, + {'\0', 0, 12564, {0}, 0},{'a', 12567, 12565, {0}, 0},{'\0', 0, 12566, {0}, 0}, + {'p', 12569, 12567, {0}, 0},{'\0', 0, 12568, {0}, 0},{';', 0, 12569, {8888}, 1}, + {'\0', 0, 12570, {0}, 0},{'a', 12573, 12571, {0}, 0},{'\0', 0, 12572, {0}, 0}, + {'p', 12575, 12573, {0}, 0},{'\0', 0, 12574, {0}, 0},{';', 0, 12575, {8888}, 1}, + {'\0', 0, 12576, {0}, 0},{'G', 12602, 12577, {0}, 0},{'L', 12612, 12578, {0}, 0}, + {'R', 12660, 12579, {0}, 0},{'V', 12680, 12580, {0}, 0},{'a', 12699, 12581, {0}, 0}, + {'b', 12761, 12582, {0}, 0},{'c', 12777, 12583, {0}, 0},{'d', 12821, 12584, {0}, 0}, + {'e', 12829, 12585, {0}, 0},{'f', 12897, 12586, {0}, 0},{'g', 12901, 12587, {0}, 0}, + {'h', 12941, 12588, {0}, 0},{'i', 12963, 12589, {0}, 0},{'j', 12974, 12590, {0}, 0}, + {'l', 12980, 12591, {0}, 0},{'m', 13083, 12592, {0}, 0},{'o', 13089, 12593, {0}, 0}, + {'p', 13140, 12594, {0}, 0},{'r', 13197, 12595, {0}, 0},{'s', 13247, 12596, {0}, 0}, + {'t', 13397, 12597, {0}, 0},{'u', 13461, 12598, {0}, 0},{'v', 13478, 12599, {0}, 0}, + {'w', 13577, 12600, {0}, 0},{'\0', 0, 12601, {0}, 0},{'g', 12605, 12602, {0}, 0}, + {'t', 12607, 12603, {0}, 0},{'\0', 0, 12604, {0}, 0},{';', 0, 12605, {8921,824}, 2}, + {'\0', 0, 12606, {0}, 0},{';', 0, 12607, {8811,8402}, 2},{'v', 12610, 12608, {0}, 0}, + {'\0', 0, 12609, {0}, 0},{';', 0, 12610, {8811,824}, 2},{'\0', 0, 12611, {0}, 0}, + {'e', 12616, 12612, {0}, 0},{'l', 12653, 12613, {0}, 0},{'t', 12655, 12614, {0}, 0}, + {'\0', 0, 12615, {0}, 0},{'f', 12618, 12616, {0}, 0},{'\0', 0, 12617, {0}, 0}, + {'t', 12620, 12618, {0}, 0},{'\0', 0, 12619, {0}, 0},{'a', 12623, 12620, {0}, 0}, + {'r', 12633, 12621, {0}, 0},{'\0', 0, 12622, {0}, 0},{'r', 12625, 12623, {0}, 0}, + {'\0', 0, 12624, {0}, 0},{'r', 12627, 12625, {0}, 0},{'\0', 0, 12626, {0}, 0}, + {'o', 12629, 12627, {0}, 0},{'\0', 0, 12628, {0}, 0},{'w', 12631, 12629, {0}, 0}, + {'\0', 0, 12630, {0}, 0},{';', 0, 12631, {8653}, 1},{'\0', 0, 12632, {0}, 0}, + {'i', 12635, 12633, {0}, 0},{'\0', 0, 12634, {0}, 0},{'g', 12637, 12635, {0}, 0}, + {'\0', 0, 12636, {0}, 0},{'h', 12639, 12637, {0}, 0},{'\0', 0, 12638, {0}, 0}, + {'t', 12641, 12639, {0}, 0},{'\0', 0, 12640, {0}, 0},{'a', 12643, 12641, {0}, 0}, + {'\0', 0, 12642, {0}, 0},{'r', 12645, 12643, {0}, 0},{'\0', 0, 12644, {0}, 0}, + {'r', 12647, 12645, {0}, 0},{'\0', 0, 12646, {0}, 0},{'o', 12649, 12647, {0}, 0}, + {'\0', 0, 12648, {0}, 0},{'w', 12651, 12649, {0}, 0},{'\0', 0, 12650, {0}, 0}, + {';', 0, 12651, {8654}, 1},{'\0', 0, 12652, {0}, 0},{';', 0, 12653, {8920,824}, 2}, + {'\0', 0, 12654, {0}, 0},{';', 0, 12655, {8810,8402}, 2},{'v', 12658, 12656, {0}, 0}, + {'\0', 0, 12657, {0}, 0},{';', 0, 12658, {8810,824}, 2},{'\0', 0, 12659, {0}, 0}, + {'i', 12662, 12660, {0}, 0},{'\0', 0, 12661, {0}, 0},{'g', 12664, 12662, {0}, 0}, + {'\0', 0, 12663, {0}, 0},{'h', 12666, 12664, {0}, 0},{'\0', 0, 12665, {0}, 0}, + {'t', 12668, 12666, {0}, 0},{'\0', 0, 12667, {0}, 0},{'a', 12670, 12668, {0}, 0}, + {'\0', 0, 12669, {0}, 0},{'r', 12672, 12670, {0}, 0},{'\0', 0, 12671, {0}, 0}, + {'r', 12674, 12672, {0}, 0},{'\0', 0, 12673, {0}, 0},{'o', 12676, 12674, {0}, 0}, + {'\0', 0, 12675, {0}, 0},{'w', 12678, 12676, {0}, 0},{'\0', 0, 12677, {0}, 0}, + {';', 0, 12678, {8655}, 1},{'\0', 0, 12679, {0}, 0},{'D', 12683, 12680, {0}, 0}, + {'d', 12691, 12681, {0}, 0},{'\0', 0, 12682, {0}, 0},{'a', 12685, 12683, {0}, 0}, + {'\0', 0, 12684, {0}, 0},{'s', 12687, 12685, {0}, 0},{'\0', 0, 12686, {0}, 0}, + {'h', 12689, 12687, {0}, 0},{'\0', 0, 12688, {0}, 0},{';', 0, 12689, {8879}, 1}, + {'\0', 0, 12690, {0}, 0},{'a', 12693, 12691, {0}, 0},{'\0', 0, 12692, {0}, 0}, + {'s', 12695, 12693, {0}, 0},{'\0', 0, 12694, {0}, 0},{'h', 12697, 12695, {0}, 0}, + {'\0', 0, 12696, {0}, 0},{';', 0, 12697, {8878}, 1},{'\0', 0, 12698, {0}, 0}, + {'b', 12705, 12699, {0}, 0},{'c', 12711, 12700, {0}, 0},{'n', 12719, 12701, {0}, 0}, + {'p', 12723, 12702, {0}, 0},{'t', 12747, 12703, {0}, 0},{'\0', 0, 12704, {0}, 0}, + {'l', 12707, 12705, {0}, 0},{'\0', 0, 12706, {0}, 0},{'a', 12709, 12707, {0}, 0}, + {'\0', 0, 12708, {0}, 0},{';', 0, 12709, {8711}, 1},{'\0', 0, 12710, {0}, 0}, + {'u', 12713, 12711, {0}, 0},{'\0', 0, 12712, {0}, 0},{'t', 12715, 12713, {0}, 0}, + {'\0', 0, 12714, {0}, 0},{'e', 12717, 12715, {0}, 0},{'\0', 0, 12716, {0}, 0}, + {';', 0, 12717, {324}, 1},{'\0', 0, 12718, {0}, 0},{'g', 12721, 12719, {0}, 0}, + {'\0', 0, 12720, {0}, 0},{';', 0, 12721, {8736,8402}, 2},{'\0', 0, 12722, {0}, 0}, + {';', 0, 12723, {8777}, 1},{'E', 12729, 12724, {0}, 0},{'i', 12731, 12725, {0}, 0}, + {'o', 12735, 12726, {0}, 0},{'p', 12739, 12727, {0}, 0},{'\0', 0, 12728, {0}, 0}, + {';', 0, 12729, {10864,824}, 2},{'\0', 0, 12730, {0}, 0},{'d', 12733, 12731, {0}, 0}, + {'\0', 0, 12732, {0}, 0},{';', 0, 12733, {8779,824}, 2},{'\0', 0, 12734, {0}, 0}, + {'s', 12737, 12735, {0}, 0},{'\0', 0, 12736, {0}, 0},{';', 0, 12737, {329}, 1}, + {'\0', 0, 12738, {0}, 0},{'r', 12741, 12739, {0}, 0},{'\0', 0, 12740, {0}, 0}, + {'o', 12743, 12741, {0}, 0},{'\0', 0, 12742, {0}, 0},{'x', 12745, 12743, {0}, 0}, + {'\0', 0, 12744, {0}, 0},{';', 0, 12745, {8777}, 1},{'\0', 0, 12746, {0}, 0}, + {'u', 12749, 12747, {0}, 0},{'\0', 0, 12748, {0}, 0},{'r', 12751, 12749, {0}, 0}, + {'\0', 0, 12750, {0}, 0},{';', 0, 12751, {9838}, 1},{'a', 12754, 12752, {0}, 0}, + {'\0', 0, 12753, {0}, 0},{'l', 12756, 12754, {0}, 0},{'\0', 0, 12755, {0}, 0}, + {';', 0, 12756, {9838}, 1},{'s', 12759, 12757, {0}, 0},{'\0', 0, 12758, {0}, 0}, + {';', 0, 12759, {8469}, 1},{'\0', 0, 12760, {0}, 0},{'s', 12764, 12761, {0}, 0}, + {'u', 12768, 12762, {0}, 0},{'\0', 0, 12763, {0}, 0},{'p', 12766, 12764, {160}, 1}, + {'\0', 0, 12765, {0}, 0},{';', 0, 12766, {160}, 1},{'\0', 0, 12767, {0}, 0}, + {'m', 12770, 12768, {0}, 0},{'\0', 0, 12769, {0}, 0},{'p', 12772, 12770, {0}, 0}, + {'\0', 0, 12771, {0}, 0},{';', 0, 12772, {8782,824}, 2},{'e', 12775, 12773, {0}, 0}, + {'\0', 0, 12774, {0}, 0},{';', 0, 12775, {8783,824}, 2},{'\0', 0, 12776, {0}, 0}, + {'a', 12783, 12777, {0}, 0},{'e', 12794, 12778, {0}, 0},{'o', 12802, 12779, {0}, 0}, + {'u', 12815, 12780, {0}, 0},{'y', 12819, 12781, {0}, 0},{'\0', 0, 12782, {0}, 0}, + {'p', 12786, 12783, {0}, 0},{'r', 12788, 12784, {0}, 0},{'\0', 0, 12785, {0}, 0}, + {';', 0, 12786, {10819}, 1},{'\0', 0, 12787, {0}, 0},{'o', 12790, 12788, {0}, 0}, + {'\0', 0, 12789, {0}, 0},{'n', 12792, 12790, {0}, 0},{'\0', 0, 12791, {0}, 0}, + {';', 0, 12792, {328}, 1},{'\0', 0, 12793, {0}, 0},{'d', 12796, 12794, {0}, 0}, + {'\0', 0, 12795, {0}, 0},{'i', 12798, 12796, {0}, 0},{'\0', 0, 12797, {0}, 0}, + {'l', 12800, 12798, {0}, 0},{'\0', 0, 12799, {0}, 0},{';', 0, 12800, {326}, 1}, + {'\0', 0, 12801, {0}, 0},{'n', 12804, 12802, {0}, 0},{'\0', 0, 12803, {0}, 0}, + {'g', 12806, 12804, {0}, 0},{'\0', 0, 12805, {0}, 0},{';', 0, 12806, {8775}, 1}, + {'d', 12809, 12807, {0}, 0},{'\0', 0, 12808, {0}, 0},{'o', 12811, 12809, {0}, 0}, + {'\0', 0, 12810, {0}, 0},{'t', 12813, 12811, {0}, 0},{'\0', 0, 12812, {0}, 0}, + {';', 0, 12813, {10861,824}, 2},{'\0', 0, 12814, {0}, 0},{'p', 12817, 12815, {0}, 0}, + {'\0', 0, 12816, {0}, 0},{';', 0, 12817, {10818}, 1},{'\0', 0, 12818, {0}, 0}, + {';', 0, 12819, {1085}, 1},{'\0', 0, 12820, {0}, 0},{'a', 12823, 12821, {0}, 0}, + {'\0', 0, 12822, {0}, 0},{'s', 12825, 12823, {0}, 0},{'\0', 0, 12824, {0}, 0}, + {'h', 12827, 12825, {0}, 0},{'\0', 0, 12826, {0}, 0},{';', 0, 12827, {8211}, 1}, + {'\0', 0, 12828, {0}, 0},{';', 0, 12829, {8800}, 1},{'A', 12837, 12830, {0}, 0}, + {'a', 12843, 12831, {0}, 0},{'d', 12859, 12832, {0}, 0},{'q', 12865, 12833, {0}, 0}, + {'s', 12873, 12834, {0}, 0},{'x', 12886, 12835, {0}, 0},{'\0', 0, 12836, {0}, 0}, + {'r', 12839, 12837, {0}, 0},{'\0', 0, 12838, {0}, 0},{'r', 12841, 12839, {0}, 0}, + {'\0', 0, 12840, {0}, 0},{';', 0, 12841, {8663}, 1},{'\0', 0, 12842, {0}, 0}, + {'r', 12845, 12843, {0}, 0},{'\0', 0, 12844, {0}, 0},{'h', 12848, 12845, {0}, 0}, + {'r', 12852, 12846, {0}, 0},{'\0', 0, 12847, {0}, 0},{'k', 12850, 12848, {0}, 0}, + {'\0', 0, 12849, {0}, 0},{';', 0, 12850, {10532}, 1},{'\0', 0, 12851, {0}, 0}, + {';', 0, 12852, {8599}, 1},{'o', 12855, 12853, {0}, 0},{'\0', 0, 12854, {0}, 0}, + {'w', 12857, 12855, {0}, 0},{'\0', 0, 12856, {0}, 0},{';', 0, 12857, {8599}, 1}, + {'\0', 0, 12858, {0}, 0},{'o', 12861, 12859, {0}, 0},{'\0', 0, 12860, {0}, 0}, + {'t', 12863, 12861, {0}, 0},{'\0', 0, 12862, {0}, 0},{';', 0, 12863, {8784,824}, 2}, + {'\0', 0, 12864, {0}, 0},{'u', 12867, 12865, {0}, 0},{'\0', 0, 12866, {0}, 0}, + {'i', 12869, 12867, {0}, 0},{'\0', 0, 12868, {0}, 0},{'v', 12871, 12869, {0}, 0}, + {'\0', 0, 12870, {0}, 0},{';', 0, 12871, {8802}, 1},{'\0', 0, 12872, {0}, 0}, + {'e', 12876, 12873, {0}, 0},{'i', 12882, 12874, {0}, 0},{'\0', 0, 12875, {0}, 0}, + {'a', 12878, 12876, {0}, 0},{'\0', 0, 12877, {0}, 0},{'r', 12880, 12878, {0}, 0}, + {'\0', 0, 12879, {0}, 0},{';', 0, 12880, {10536}, 1},{'\0', 0, 12881, {0}, 0}, + {'m', 12884, 12882, {0}, 0},{'\0', 0, 12883, {0}, 0},{';', 0, 12884, {8770,824}, 2}, + {'\0', 0, 12885, {0}, 0},{'i', 12888, 12886, {0}, 0},{'\0', 0, 12887, {0}, 0}, + {'s', 12890, 12888, {0}, 0},{'\0', 0, 12889, {0}, 0},{'t', 12892, 12890, {0}, 0}, + {'\0', 0, 12891, {0}, 0},{';', 0, 12892, {8708}, 1},{'s', 12895, 12893, {0}, 0}, + {'\0', 0, 12894, {0}, 0},{';', 0, 12895, {8708}, 1},{'\0', 0, 12896, {0}, 0}, + {'r', 12899, 12897, {0}, 0},{'\0', 0, 12898, {0}, 0},{';', 0, 12899, {120107}, 1}, + {'\0', 0, 12900, {0}, 0},{'E', 12906, 12901, {0}, 0},{'e', 12908, 12902, {0}, 0}, + {'s', 12930, 12903, {0}, 0},{'t', 12936, 12904, {0}, 0},{'\0', 0, 12905, {0}, 0}, + {';', 0, 12906, {8807,824}, 2},{'\0', 0, 12907, {0}, 0},{';', 0, 12908, {8817}, 1}, + {'q', 12912, 12909, {0}, 0},{'s', 12928, 12910, {0}, 0},{'\0', 0, 12911, {0}, 0}, + {';', 0, 12912, {8817}, 1},{'q', 12916, 12913, {0}, 0},{'s', 12918, 12914, {0}, 0}, + {'\0', 0, 12915, {0}, 0},{';', 0, 12916, {8807,824}, 2},{'\0', 0, 12917, {0}, 0}, + {'l', 12920, 12918, {0}, 0},{'\0', 0, 12919, {0}, 0},{'a', 12922, 12920, {0}, 0}, + {'\0', 0, 12921, {0}, 0},{'n', 12924, 12922, {0}, 0},{'\0', 0, 12923, {0}, 0}, + {'t', 12926, 12924, {0}, 0},{'\0', 0, 12925, {0}, 0},{';', 0, 12926, {10878,824}, 2}, + {'\0', 0, 12927, {0}, 0},{';', 0, 12928, {10878,824}, 2},{'\0', 0, 12929, {0}, 0}, + {'i', 12932, 12930, {0}, 0},{'\0', 0, 12931, {0}, 0},{'m', 12934, 12932, {0}, 0}, + {'\0', 0, 12933, {0}, 0},{';', 0, 12934, {8821}, 1},{'\0', 0, 12935, {0}, 0}, + {';', 0, 12936, {8815}, 1},{'r', 12939, 12937, {0}, 0},{'\0', 0, 12938, {0}, 0}, + {';', 0, 12939, {8815}, 1},{'\0', 0, 12940, {0}, 0},{'A', 12945, 12941, {0}, 0}, + {'a', 12951, 12942, {0}, 0},{'p', 12957, 12943, {0}, 0},{'\0', 0, 12944, {0}, 0}, + {'r', 12947, 12945, {0}, 0},{'\0', 0, 12946, {0}, 0},{'r', 12949, 12947, {0}, 0}, + {'\0', 0, 12948, {0}, 0},{';', 0, 12949, {8654}, 1},{'\0', 0, 12950, {0}, 0}, + {'r', 12953, 12951, {0}, 0},{'\0', 0, 12952, {0}, 0},{'r', 12955, 12953, {0}, 0}, + {'\0', 0, 12954, {0}, 0},{';', 0, 12955, {8622}, 1},{'\0', 0, 12956, {0}, 0}, + {'a', 12959, 12957, {0}, 0},{'\0', 0, 12958, {0}, 0},{'r', 12961, 12959, {0}, 0}, + {'\0', 0, 12960, {0}, 0},{';', 0, 12961, {10994}, 1},{'\0', 0, 12962, {0}, 0}, + {';', 0, 12963, {8715}, 1},{'s', 12967, 12964, {0}, 0},{'v', 12972, 12965, {0}, 0}, + {'\0', 0, 12966, {0}, 0},{';', 0, 12967, {8956}, 1},{'d', 12970, 12968, {0}, 0}, + {'\0', 0, 12969, {0}, 0},{';', 0, 12970, {8954}, 1},{'\0', 0, 12971, {0}, 0}, + {';', 0, 12972, {8715}, 1},{'\0', 0, 12973, {0}, 0},{'c', 12976, 12974, {0}, 0}, + {'\0', 0, 12975, {0}, 0},{'y', 12978, 12976, {0}, 0},{'\0', 0, 12977, {0}, 0}, + {';', 0, 12978, {1114}, 1},{'\0', 0, 12979, {0}, 0},{'A', 12988, 12980, {0}, 0}, + {'E', 12994, 12981, {0}, 0},{'a', 12996, 12982, {0}, 0},{'d', 13002, 12983, {0}, 0}, + {'e', 13006, 12984, {0}, 0},{'s', 13067, 12985, {0}, 0},{'t', 13073, 12986, {0}, 0}, + {'\0', 0, 12987, {0}, 0},{'r', 12990, 12988, {0}, 0},{'\0', 0, 12989, {0}, 0}, + {'r', 12992, 12990, {0}, 0},{'\0', 0, 12991, {0}, 0},{';', 0, 12992, {8653}, 1}, + {'\0', 0, 12993, {0}, 0},{';', 0, 12994, {8806,824}, 2},{'\0', 0, 12995, {0}, 0}, + {'r', 12998, 12996, {0}, 0},{'\0', 0, 12997, {0}, 0},{'r', 13000, 12998, {0}, 0}, + {'\0', 0, 12999, {0}, 0},{';', 0, 13000, {8602}, 1},{'\0', 0, 13001, {0}, 0}, + {'r', 13004, 13002, {0}, 0},{'\0', 0, 13003, {0}, 0},{';', 0, 13004, {8229}, 1}, + {'\0', 0, 13005, {0}, 0},{';', 0, 13006, {8816}, 1},{'f', 13011, 13007, {0}, 0}, + {'q', 13046, 13008, {0}, 0},{'s', 13062, 13009, {0}, 0},{'\0', 0, 13010, {0}, 0}, + {'t', 13013, 13011, {0}, 0},{'\0', 0, 13012, {0}, 0},{'a', 13016, 13013, {0}, 0}, + {'r', 13026, 13014, {0}, 0},{'\0', 0, 13015, {0}, 0},{'r', 13018, 13016, {0}, 0}, + {'\0', 0, 13017, {0}, 0},{'r', 13020, 13018, {0}, 0},{'\0', 0, 13019, {0}, 0}, + {'o', 13022, 13020, {0}, 0},{'\0', 0, 13021, {0}, 0},{'w', 13024, 13022, {0}, 0}, + {'\0', 0, 13023, {0}, 0},{';', 0, 13024, {8602}, 1},{'\0', 0, 13025, {0}, 0}, + {'i', 13028, 13026, {0}, 0},{'\0', 0, 13027, {0}, 0},{'g', 13030, 13028, {0}, 0}, + {'\0', 0, 13029, {0}, 0},{'h', 13032, 13030, {0}, 0},{'\0', 0, 13031, {0}, 0}, + {'t', 13034, 13032, {0}, 0},{'\0', 0, 13033, {0}, 0},{'a', 13036, 13034, {0}, 0}, + {'\0', 0, 13035, {0}, 0},{'r', 13038, 13036, {0}, 0},{'\0', 0, 13037, {0}, 0}, + {'r', 13040, 13038, {0}, 0},{'\0', 0, 13039, {0}, 0},{'o', 13042, 13040, {0}, 0}, + {'\0', 0, 13041, {0}, 0},{'w', 13044, 13042, {0}, 0},{'\0', 0, 13043, {0}, 0}, + {';', 0, 13044, {8622}, 1},{'\0', 0, 13045, {0}, 0},{';', 0, 13046, {8816}, 1}, + {'q', 13050, 13047, {0}, 0},{'s', 13052, 13048, {0}, 0},{'\0', 0, 13049, {0}, 0}, + {';', 0, 13050, {8806,824}, 2},{'\0', 0, 13051, {0}, 0},{'l', 13054, 13052, {0}, 0}, + {'\0', 0, 13053, {0}, 0},{'a', 13056, 13054, {0}, 0},{'\0', 0, 13055, {0}, 0}, + {'n', 13058, 13056, {0}, 0},{'\0', 0, 13057, {0}, 0},{'t', 13060, 13058, {0}, 0}, + {'\0', 0, 13059, {0}, 0},{';', 0, 13060, {10877,824}, 2},{'\0', 0, 13061, {0}, 0}, + {';', 0, 13062, {10877,824}, 2},{'s', 13065, 13063, {0}, 0},{'\0', 0, 13064, {0}, 0}, + {';', 0, 13065, {8814}, 1},{'\0', 0, 13066, {0}, 0},{'i', 13069, 13067, {0}, 0}, + {'\0', 0, 13068, {0}, 0},{'m', 13071, 13069, {0}, 0},{'\0', 0, 13070, {0}, 0}, + {';', 0, 13071, {8820}, 1},{'\0', 0, 13072, {0}, 0},{';', 0, 13073, {8814}, 1}, + {'r', 13076, 13074, {0}, 0},{'\0', 0, 13075, {0}, 0},{'i', 13078, 13076, {0}, 0}, + {'\0', 0, 13077, {0}, 0},{';', 0, 13078, {8938}, 1},{'e', 13081, 13079, {0}, 0}, + {'\0', 0, 13080, {0}, 0},{';', 0, 13081, {8940}, 1},{'\0', 0, 13082, {0}, 0}, + {'i', 13085, 13083, {0}, 0},{'\0', 0, 13084, {0}, 0},{'d', 13087, 13085, {0}, 0}, + {'\0', 0, 13086, {0}, 0},{';', 0, 13087, {8740}, 1},{'\0', 0, 13088, {0}, 0}, + {'p', 13092, 13089, {0}, 0},{'t', 13096, 13090, {172}, 1},{'\0', 0, 13091, {0}, 0}, + {'f', 13094, 13092, {0}, 0},{'\0', 0, 13093, {0}, 0},{';', 0, 13094, {120159}, 1}, + {'\0', 0, 13095, {0}, 0},{';', 0, 13096, {172}, 1},{'i', 13100, 13097, {0}, 0}, + {'n', 13125, 13098, {0}, 0},{'\0', 0, 13099, {0}, 0},{'n', 13102, 13100, {0}, 0}, + {'\0', 0, 13101, {0}, 0},{';', 0, 13102, {8713}, 1},{'E', 13107, 13103, {0}, 0}, + {'d', 13109, 13104, {0}, 0},{'v', 13115, 13105, {0}, 0},{'\0', 0, 13106, {0}, 0}, + {';', 0, 13107, {8953,824}, 2},{'\0', 0, 13108, {0}, 0},{'o', 13111, 13109, {0}, 0}, + {'\0', 0, 13110, {0}, 0},{'t', 13113, 13111, {0}, 0},{'\0', 0, 13112, {0}, 0}, + {';', 0, 13113, {8949,824}, 2},{'\0', 0, 13114, {0}, 0},{'a', 13119, 13115, {0}, 0}, + {'b', 13121, 13116, {0}, 0},{'c', 13123, 13117, {0}, 0},{'\0', 0, 13118, {0}, 0}, + {';', 0, 13119, {8713}, 1},{'\0', 0, 13120, {0}, 0},{';', 0, 13121, {8951}, 1}, + {'\0', 0, 13122, {0}, 0},{';', 0, 13123, {8950}, 1},{'\0', 0, 13124, {0}, 0}, + {'i', 13127, 13125, {0}, 0},{'\0', 0, 13126, {0}, 0},{';', 0, 13127, {8716}, 1}, + {'v', 13130, 13128, {0}, 0},{'\0', 0, 13129, {0}, 0},{'a', 13134, 13130, {0}, 0}, + {'b', 13136, 13131, {0}, 0},{'c', 13138, 13132, {0}, 0},{'\0', 0, 13133, {0}, 0}, + {';', 0, 13134, {8716}, 1},{'\0', 0, 13135, {0}, 0},{';', 0, 13136, {8958}, 1}, + {'\0', 0, 13137, {0}, 0},{';', 0, 13138, {8957}, 1},{'\0', 0, 13139, {0}, 0}, + {'a', 13144, 13140, {0}, 0},{'o', 13167, 13141, {0}, 0},{'r', 13177, 13142, {0}, 0}, + {'\0', 0, 13143, {0}, 0},{'r', 13146, 13144, {0}, 0},{'\0', 0, 13145, {0}, 0}, + {';', 0, 13146, {8742}, 1},{'a', 13151, 13147, {0}, 0},{'s', 13161, 13148, {0}, 0}, + {'t', 13165, 13149, {0}, 0},{'\0', 0, 13150, {0}, 0},{'l', 13153, 13151, {0}, 0}, + {'\0', 0, 13152, {0}, 0},{'l', 13155, 13153, {0}, 0},{'\0', 0, 13154, {0}, 0}, + {'e', 13157, 13155, {0}, 0},{'\0', 0, 13156, {0}, 0},{'l', 13159, 13157, {0}, 0}, + {'\0', 0, 13158, {0}, 0},{';', 0, 13159, {8742}, 1},{'\0', 0, 13160, {0}, 0}, + {'l', 13163, 13161, {0}, 0},{'\0', 0, 13162, {0}, 0},{';', 0, 13163, {11005,8421}, 2}, + {'\0', 0, 13164, {0}, 0},{';', 0, 13165, {8706,824}, 2},{'\0', 0, 13166, {0}, 0}, + {'l', 13169, 13167, {0}, 0},{'\0', 0, 13168, {0}, 0},{'i', 13171, 13169, {0}, 0}, + {'\0', 0, 13170, {0}, 0},{'n', 13173, 13171, {0}, 0},{'\0', 0, 13172, {0}, 0}, + {'t', 13175, 13173, {0}, 0},{'\0', 0, 13174, {0}, 0},{';', 0, 13175, {10772}, 1}, + {'\0', 0, 13176, {0}, 0},{';', 0, 13177, {8832}, 1},{'c', 13181, 13178, {0}, 0}, + {'e', 13187, 13179, {0}, 0},{'\0', 0, 13180, {0}, 0},{'u', 13183, 13181, {0}, 0}, + {'\0', 0, 13182, {0}, 0},{'e', 13185, 13183, {0}, 0},{'\0', 0, 13184, {0}, 0}, + {';', 0, 13185, {8928}, 1},{'\0', 0, 13186, {0}, 0},{';', 0, 13187, {10927,824}, 2}, + {'c', 13190, 13188, {0}, 0},{'\0', 0, 13189, {0}, 0},{';', 0, 13190, {8832}, 1}, + {'e', 13193, 13191, {0}, 0},{'\0', 0, 13192, {0}, 0},{'q', 13195, 13193, {0}, 0}, + {'\0', 0, 13194, {0}, 0},{';', 0, 13195, {10927,824}, 2},{'\0', 0, 13196, {0}, 0}, + {'A', 13202, 13197, {0}, 0},{'a', 13208, 13198, {0}, 0},{'i', 13220, 13199, {0}, 0}, + {'t', 13238, 13200, {0}, 0},{'\0', 0, 13201, {0}, 0},{'r', 13204, 13202, {0}, 0}, + {'\0', 0, 13203, {0}, 0},{'r', 13206, 13204, {0}, 0},{'\0', 0, 13205, {0}, 0}, + {';', 0, 13206, {8655}, 1},{'\0', 0, 13207, {0}, 0},{'r', 13210, 13208, {0}, 0}, + {'\0', 0, 13209, {0}, 0},{'r', 13212, 13210, {0}, 0},{'\0', 0, 13211, {0}, 0}, + {';', 0, 13212, {8603}, 1},{'c', 13216, 13213, {0}, 0},{'w', 13218, 13214, {0}, 0}, + {'\0', 0, 13215, {0}, 0},{';', 0, 13216, {10547,824}, 2},{'\0', 0, 13217, {0}, 0}, + {';', 0, 13218, {8605,824}, 2},{'\0', 0, 13219, {0}, 0},{'g', 13222, 13220, {0}, 0}, + {'\0', 0, 13221, {0}, 0},{'h', 13224, 13222, {0}, 0},{'\0', 0, 13223, {0}, 0}, + {'t', 13226, 13224, {0}, 0},{'\0', 0, 13225, {0}, 0},{'a', 13228, 13226, {0}, 0}, + {'\0', 0, 13227, {0}, 0},{'r', 13230, 13228, {0}, 0},{'\0', 0, 13229, {0}, 0}, + {'r', 13232, 13230, {0}, 0},{'\0', 0, 13231, {0}, 0},{'o', 13234, 13232, {0}, 0}, + {'\0', 0, 13233, {0}, 0},{'w', 13236, 13234, {0}, 0},{'\0', 0, 13235, {0}, 0}, + {';', 0, 13236, {8603}, 1},{'\0', 0, 13237, {0}, 0},{'r', 13240, 13238, {0}, 0}, + {'\0', 0, 13239, {0}, 0},{'i', 13242, 13240, {0}, 0},{'\0', 0, 13241, {0}, 0}, + {';', 0, 13242, {8939}, 1},{'e', 13245, 13243, {0}, 0},{'\0', 0, 13244, {0}, 0}, + {';', 0, 13245, {8941}, 1},{'\0', 0, 13246, {0}, 0},{'c', 13255, 13247, {0}, 0}, + {'h', 13270, 13248, {0}, 0},{'i', 13301, 13249, {0}, 0},{'m', 13311, 13250, {0}, 0}, + {'p', 13317, 13251, {0}, 0},{'q', 13323, 13252, {0}, 0},{'u', 13338, 13253, {0}, 0}, + {'\0', 0, 13254, {0}, 0},{';', 0, 13255, {8833}, 1},{'c', 13260, 13256, {0}, 0}, + {'e', 13266, 13257, {0}, 0},{'r', 13268, 13258, {0}, 0},{'\0', 0, 13259, {0}, 0}, + {'u', 13262, 13260, {0}, 0},{'\0', 0, 13261, {0}, 0},{'e', 13264, 13262, {0}, 0}, + {'\0', 0, 13263, {0}, 0},{';', 0, 13264, {8929}, 1},{'\0', 0, 13265, {0}, 0}, + {';', 0, 13266, {10928,824}, 2},{'\0', 0, 13267, {0}, 0},{';', 0, 13268, {120003}, 1}, + {'\0', 0, 13269, {0}, 0},{'o', 13272, 13270, {0}, 0},{'\0', 0, 13271, {0}, 0}, + {'r', 13274, 13272, {0}, 0},{'\0', 0, 13273, {0}, 0},{'t', 13276, 13274, {0}, 0}, + {'\0', 0, 13275, {0}, 0},{'m', 13279, 13276, {0}, 0},{'p', 13285, 13277, {0}, 0}, + {'\0', 0, 13278, {0}, 0},{'i', 13281, 13279, {0}, 0},{'\0', 0, 13280, {0}, 0}, + {'d', 13283, 13281, {0}, 0},{'\0', 0, 13282, {0}, 0},{';', 0, 13283, {8740}, 1}, + {'\0', 0, 13284, {0}, 0},{'a', 13287, 13285, {0}, 0},{'\0', 0, 13286, {0}, 0}, + {'r', 13289, 13287, {0}, 0},{'\0', 0, 13288, {0}, 0},{'a', 13291, 13289, {0}, 0}, + {'\0', 0, 13290, {0}, 0},{'l', 13293, 13291, {0}, 0},{'\0', 0, 13292, {0}, 0}, + {'l', 13295, 13293, {0}, 0},{'\0', 0, 13294, {0}, 0},{'e', 13297, 13295, {0}, 0}, + {'\0', 0, 13296, {0}, 0},{'l', 13299, 13297, {0}, 0},{'\0', 0, 13298, {0}, 0}, + {';', 0, 13299, {8742}, 1},{'\0', 0, 13300, {0}, 0},{'m', 13303, 13301, {0}, 0}, + {'\0', 0, 13302, {0}, 0},{';', 0, 13303, {8769}, 1},{'e', 13306, 13304, {0}, 0}, + {'\0', 0, 13305, {0}, 0},{';', 0, 13306, {8772}, 1},{'q', 13309, 13307, {0}, 0}, + {'\0', 0, 13308, {0}, 0},{';', 0, 13309, {8772}, 1},{'\0', 0, 13310, {0}, 0}, + {'i', 13313, 13311, {0}, 0},{'\0', 0, 13312, {0}, 0},{'d', 13315, 13313, {0}, 0}, + {'\0', 0, 13314, {0}, 0},{';', 0, 13315, {8740}, 1},{'\0', 0, 13316, {0}, 0}, + {'a', 13319, 13317, {0}, 0},{'\0', 0, 13318, {0}, 0},{'r', 13321, 13319, {0}, 0}, + {'\0', 0, 13320, {0}, 0},{';', 0, 13321, {8742}, 1},{'\0', 0, 13322, {0}, 0}, + {'s', 13325, 13323, {0}, 0},{'\0', 0, 13324, {0}, 0},{'u', 13327, 13325, {0}, 0}, + {'\0', 0, 13326, {0}, 0},{'b', 13330, 13327, {0}, 0},{'p', 13334, 13328, {0}, 0}, + {'\0', 0, 13329, {0}, 0},{'e', 13332, 13330, {0}, 0},{'\0', 0, 13331, {0}, 0}, + {';', 0, 13332, {8930}, 1},{'\0', 0, 13333, {0}, 0},{'e', 13336, 13334, {0}, 0}, + {'\0', 0, 13335, {0}, 0},{';', 0, 13336, {8931}, 1},{'\0', 0, 13337, {0}, 0}, + {'b', 13342, 13338, {0}, 0},{'c', 13365, 13339, {0}, 0},{'p', 13374, 13340, {0}, 0}, + {'\0', 0, 13341, {0}, 0},{';', 0, 13342, {8836}, 1},{'E', 13347, 13343, {0}, 0}, + {'e', 13349, 13344, {0}, 0},{'s', 13351, 13345, {0}, 0},{'\0', 0, 13346, {0}, 0}, + {';', 0, 13347, {10949,824}, 2},{'\0', 0, 13348, {0}, 0},{';', 0, 13349, {8840}, 1}, + {'\0', 0, 13350, {0}, 0},{'e', 13353, 13351, {0}, 0},{'\0', 0, 13352, {0}, 0}, + {'t', 13355, 13353, {0}, 0},{'\0', 0, 13354, {0}, 0},{';', 0, 13355, {8834,8402}, 2}, + {'e', 13358, 13356, {0}, 0},{'\0', 0, 13357, {0}, 0},{'q', 13360, 13358, {0}, 0}, + {'\0', 0, 13359, {0}, 0},{';', 0, 13360, {8840}, 1},{'q', 13363, 13361, {0}, 0}, + {'\0', 0, 13362, {0}, 0},{';', 0, 13363, {10949,824}, 2},{'\0', 0, 13364, {0}, 0}, + {'c', 13367, 13365, {0}, 0},{'\0', 0, 13366, {0}, 0},{';', 0, 13367, {8833}, 1}, + {'e', 13370, 13368, {0}, 0},{'\0', 0, 13369, {0}, 0},{'q', 13372, 13370, {0}, 0}, + {'\0', 0, 13371, {0}, 0},{';', 0, 13372, {10928,824}, 2},{'\0', 0, 13373, {0}, 0}, + {';', 0, 13374, {8837}, 1},{'E', 13379, 13375, {0}, 0},{'e', 13381, 13376, {0}, 0}, + {'s', 13383, 13377, {0}, 0},{'\0', 0, 13378, {0}, 0},{';', 0, 13379, {10950,824}, 2}, + {'\0', 0, 13380, {0}, 0},{';', 0, 13381, {8841}, 1},{'\0', 0, 13382, {0}, 0}, + {'e', 13385, 13383, {0}, 0},{'\0', 0, 13384, {0}, 0},{'t', 13387, 13385, {0}, 0}, + {'\0', 0, 13386, {0}, 0},{';', 0, 13387, {8835,8402}, 2},{'e', 13390, 13388, {0}, 0}, + {'\0', 0, 13389, {0}, 0},{'q', 13392, 13390, {0}, 0},{'\0', 0, 13391, {0}, 0}, + {';', 0, 13392, {8841}, 1},{'q', 13395, 13393, {0}, 0},{'\0', 0, 13394, {0}, 0}, + {';', 0, 13395, {10950,824}, 2},{'\0', 0, 13396, {0}, 0},{'g', 13402, 13397, {0}, 0}, + {'i', 13406, 13398, {0}, 0},{'l', 13414, 13399, {0}, 0},{'r', 13418, 13400, {0}, 0}, + {'\0', 0, 13401, {0}, 0},{'l', 13404, 13402, {0}, 0},{'\0', 0, 13403, {0}, 0}, + {';', 0, 13404, {8825}, 1},{'\0', 0, 13405, {0}, 0},{'l', 13408, 13406, {0}, 0}, + {'\0', 0, 13407, {0}, 0},{'d', 13410, 13408, {0}, 0},{'\0', 0, 13409, {0}, 0}, + {'e', 13412, 13410, {241}, 1},{'\0', 0, 13411, {0}, 0},{';', 0, 13412, {241}, 1}, + {'\0', 0, 13413, {0}, 0},{'g', 13416, 13414, {0}, 0},{'\0', 0, 13415, {0}, 0}, + {';', 0, 13416, {8824}, 1},{'\0', 0, 13417, {0}, 0},{'i', 13420, 13418, {0}, 0}, + {'\0', 0, 13419, {0}, 0},{'a', 13422, 13420, {0}, 0},{'\0', 0, 13421, {0}, 0}, + {'n', 13424, 13422, {0}, 0},{'\0', 0, 13423, {0}, 0},{'g', 13426, 13424, {0}, 0}, + {'\0', 0, 13425, {0}, 0},{'l', 13428, 13426, {0}, 0},{'\0', 0, 13427, {0}, 0}, + {'e', 13430, 13428, {0}, 0},{'\0', 0, 13429, {0}, 0},{'l', 13433, 13430, {0}, 0}, + {'r', 13446, 13431, {0}, 0},{'\0', 0, 13432, {0}, 0},{'e', 13435, 13433, {0}, 0}, + {'\0', 0, 13434, {0}, 0},{'f', 13437, 13435, {0}, 0},{'\0', 0, 13436, {0}, 0}, + {'t', 13439, 13437, {0}, 0},{'\0', 0, 13438, {0}, 0},{';', 0, 13439, {8938}, 1}, + {'e', 13442, 13440, {0}, 0},{'\0', 0, 13441, {0}, 0},{'q', 13444, 13442, {0}, 0}, + {'\0', 0, 13443, {0}, 0},{';', 0, 13444, {8940}, 1},{'\0', 0, 13445, {0}, 0}, + {'i', 13448, 13446, {0}, 0},{'\0', 0, 13447, {0}, 0},{'g', 13450, 13448, {0}, 0}, + {'\0', 0, 13449, {0}, 0},{'h', 13452, 13450, {0}, 0},{'\0', 0, 13451, {0}, 0}, + {'t', 13454, 13452, {0}, 0},{'\0', 0, 13453, {0}, 0},{';', 0, 13454, {8939}, 1}, + {'e', 13457, 13455, {0}, 0},{'\0', 0, 13456, {0}, 0},{'q', 13459, 13457, {0}, 0}, + {'\0', 0, 13458, {0}, 0},{';', 0, 13459, {8941}, 1},{'\0', 0, 13460, {0}, 0}, + {';', 0, 13461, {957}, 1},{'m', 13464, 13462, {0}, 0},{'\0', 0, 13463, {0}, 0}, + {';', 0, 13464, {35}, 1},{'e', 13468, 13465, {0}, 0},{'s', 13474, 13466, {0}, 0}, + {'\0', 0, 13467, {0}, 0},{'r', 13470, 13468, {0}, 0},{'\0', 0, 13469, {0}, 0}, + {'o', 13472, 13470, {0}, 0},{'\0', 0, 13471, {0}, 0},{';', 0, 13472, {8470}, 1}, + {'\0', 0, 13473, {0}, 0},{'p', 13476, 13474, {0}, 0},{'\0', 0, 13475, {0}, 0}, + {';', 0, 13476, {8199}, 1},{'\0', 0, 13477, {0}, 0},{'D', 13488, 13478, {0}, 0}, + {'H', 13496, 13479, {0}, 0},{'a', 13504, 13480, {0}, 0},{'d', 13508, 13481, {0}, 0}, + {'g', 13516, 13482, {0}, 0},{'i', 13523, 13483, {0}, 0},{'l', 13533, 13484, {0}, 0}, + {'r', 13554, 13485, {0}, 0},{'s', 13571, 13486, {0}, 0},{'\0', 0, 13487, {0}, 0}, + {'a', 13490, 13488, {0}, 0},{'\0', 0, 13489, {0}, 0},{'s', 13492, 13490, {0}, 0}, + {'\0', 0, 13491, {0}, 0},{'h', 13494, 13492, {0}, 0},{'\0', 0, 13493, {0}, 0}, + {';', 0, 13494, {8877}, 1},{'\0', 0, 13495, {0}, 0},{'a', 13498, 13496, {0}, 0}, + {'\0', 0, 13497, {0}, 0},{'r', 13500, 13498, {0}, 0},{'\0', 0, 13499, {0}, 0}, + {'r', 13502, 13500, {0}, 0},{'\0', 0, 13501, {0}, 0},{';', 0, 13502, {10500}, 1}, + {'\0', 0, 13503, {0}, 0},{'p', 13506, 13504, {0}, 0},{'\0', 0, 13505, {0}, 0}, + {';', 0, 13506, {8781,8402}, 2},{'\0', 0, 13507, {0}, 0},{'a', 13510, 13508, {0}, 0}, + {'\0', 0, 13509, {0}, 0},{'s', 13512, 13510, {0}, 0},{'\0', 0, 13511, {0}, 0}, + {'h', 13514, 13512, {0}, 0},{'\0', 0, 13513, {0}, 0},{';', 0, 13514, {8876}, 1}, + {'\0', 0, 13515, {0}, 0},{'e', 13519, 13516, {0}, 0},{'t', 13521, 13517, {0}, 0}, + {'\0', 0, 13518, {0}, 0},{';', 0, 13519, {8805,8402}, 2},{'\0', 0, 13520, {0}, 0}, + {';', 0, 13521, {62,8402}, 2},{'\0', 0, 13522, {0}, 0},{'n', 13525, 13523, {0}, 0}, + {'\0', 0, 13524, {0}, 0},{'f', 13527, 13525, {0}, 0},{'\0', 0, 13526, {0}, 0}, + {'i', 13529, 13527, {0}, 0},{'\0', 0, 13528, {0}, 0},{'n', 13531, 13529, {0}, 0}, + {'\0', 0, 13530, {0}, 0},{';', 0, 13531, {10718}, 1},{'\0', 0, 13532, {0}, 0}, + {'A', 13537, 13533, {0}, 0},{'e', 13543, 13534, {0}, 0},{'t', 13545, 13535, {0}, 0}, + {'\0', 0, 13536, {0}, 0},{'r', 13539, 13537, {0}, 0},{'\0', 0, 13538, {0}, 0}, + {'r', 13541, 13539, {0}, 0},{'\0', 0, 13540, {0}, 0},{';', 0, 13541, {10498}, 1}, + {'\0', 0, 13542, {0}, 0},{';', 0, 13543, {8804,8402}, 2},{'\0', 0, 13544, {0}, 0}, + {';', 0, 13545, {60,8402}, 2},{'r', 13548, 13546, {0}, 0},{'\0', 0, 13547, {0}, 0}, + {'i', 13550, 13548, {0}, 0},{'\0', 0, 13549, {0}, 0},{'e', 13552, 13550, {0}, 0}, + {'\0', 0, 13551, {0}, 0},{';', 0, 13552, {8884,8402}, 2},{'\0', 0, 13553, {0}, 0}, + {'A', 13557, 13554, {0}, 0},{'t', 13563, 13555, {0}, 0},{'\0', 0, 13556, {0}, 0}, + {'r', 13559, 13557, {0}, 0},{'\0', 0, 13558, {0}, 0},{'r', 13561, 13559, {0}, 0}, + {'\0', 0, 13560, {0}, 0},{';', 0, 13561, {10499}, 1},{'\0', 0, 13562, {0}, 0}, + {'r', 13565, 13563, {0}, 0},{'\0', 0, 13564, {0}, 0},{'i', 13567, 13565, {0}, 0}, + {'\0', 0, 13566, {0}, 0},{'e', 13569, 13567, {0}, 0},{'\0', 0, 13568, {0}, 0}, + {';', 0, 13569, {8885,8402}, 2},{'\0', 0, 13570, {0}, 0},{'i', 13573, 13571, {0}, 0}, + {'\0', 0, 13572, {0}, 0},{'m', 13575, 13573, {0}, 0},{'\0', 0, 13574, {0}, 0}, + {';', 0, 13575, {8764,8402}, 2},{'\0', 0, 13576, {0}, 0},{'A', 13581, 13577, {0}, 0}, + {'a', 13587, 13578, {0}, 0},{'n', 13603, 13579, {0}, 0},{'\0', 0, 13580, {0}, 0}, + {'r', 13583, 13581, {0}, 0},{'\0', 0, 13582, {0}, 0},{'r', 13585, 13583, {0}, 0}, + {'\0', 0, 13584, {0}, 0},{';', 0, 13585, {8662}, 1},{'\0', 0, 13586, {0}, 0}, + {'r', 13589, 13587, {0}, 0},{'\0', 0, 13588, {0}, 0},{'h', 13592, 13589, {0}, 0}, + {'r', 13596, 13590, {0}, 0},{'\0', 0, 13591, {0}, 0},{'k', 13594, 13592, {0}, 0}, + {'\0', 0, 13593, {0}, 0},{';', 0, 13594, {10531}, 1},{'\0', 0, 13595, {0}, 0}, + {';', 0, 13596, {8598}, 1},{'o', 13599, 13597, {0}, 0},{'\0', 0, 13598, {0}, 0}, + {'w', 13601, 13599, {0}, 0},{'\0', 0, 13600, {0}, 0},{';', 0, 13601, {8598}, 1}, + {'\0', 0, 13602, {0}, 0},{'e', 13605, 13603, {0}, 0},{'\0', 0, 13604, {0}, 0}, + {'a', 13607, 13605, {0}, 0},{'\0', 0, 13606, {0}, 0},{'r', 13609, 13607, {0}, 0}, + {'\0', 0, 13608, {0}, 0},{';', 0, 13609, {10535}, 1},{'\0', 0, 13610, {0}, 0}, + {'S', 13630, 13611, {0}, 0},{'a', 13632, 13612, {0}, 0},{'c', 13647, 13613, {0}, 0}, + {'d', 13659, 13614, {0}, 0},{'e', 13695, 13615, {0}, 0},{'f', 13703, 13616, {0}, 0}, + {'g', 13714, 13617, {0}, 0},{'h', 13732, 13618, {0}, 0},{'i', 13743, 13619, {0}, 0}, + {'l', 13749, 13620, {0}, 0},{'m', 13783, 13621, {0}, 0},{'o', 13819, 13622, {0}, 0}, + {'p', 13825, 13623, {0}, 0},{'r', 13845, 13624, {0}, 0},{'s', 13901, 13625, {0}, 0}, + {'t', 13921, 13626, {0}, 0},{'u', 13943, 13627, {0}, 0},{'v', 13949, 13628, {0}, 0}, + {'\0', 0, 13629, {0}, 0},{';', 0, 13630, {9416}, 1},{'\0', 0, 13631, {0}, 0}, + {'c', 13635, 13632, {0}, 0},{'s', 13643, 13633, {0}, 0},{'\0', 0, 13634, {0}, 0}, + {'u', 13637, 13635, {0}, 0},{'\0', 0, 13636, {0}, 0},{'t', 13639, 13637, {0}, 0}, + {'\0', 0, 13638, {0}, 0},{'e', 13641, 13639, {243}, 1},{'\0', 0, 13640, {0}, 0}, + {';', 0, 13641, {243}, 1},{'\0', 0, 13642, {0}, 0},{'t', 13645, 13643, {0}, 0}, + {'\0', 0, 13644, {0}, 0},{';', 0, 13645, {8859}, 1},{'\0', 0, 13646, {0}, 0}, + {'i', 13650, 13647, {0}, 0},{'y', 13657, 13648, {0}, 0},{'\0', 0, 13649, {0}, 0}, + {'r', 13652, 13650, {0}, 0},{'\0', 0, 13651, {0}, 0},{';', 0, 13652, {8858}, 1}, + {'c', 13655, 13653, {244}, 1},{'\0', 0, 13654, {0}, 0},{';', 0, 13655, {244}, 1}, + {'\0', 0, 13656, {0}, 0},{';', 0, 13657, {1086}, 1},{'\0', 0, 13658, {0}, 0}, + {'a', 13665, 13659, {0}, 0},{'b', 13671, 13660, {0}, 0},{'i', 13679, 13661, {0}, 0}, + {'o', 13683, 13662, {0}, 0},{'s', 13687, 13663, {0}, 0},{'\0', 0, 13664, {0}, 0}, + {'s', 13667, 13665, {0}, 0},{'\0', 0, 13666, {0}, 0},{'h', 13669, 13667, {0}, 0}, + {'\0', 0, 13668, {0}, 0},{';', 0, 13669, {8861}, 1},{'\0', 0, 13670, {0}, 0}, + {'l', 13673, 13671, {0}, 0},{'\0', 0, 13672, {0}, 0},{'a', 13675, 13673, {0}, 0}, + {'\0', 0, 13674, {0}, 0},{'c', 13677, 13675, {0}, 0},{'\0', 0, 13676, {0}, 0}, + {';', 0, 13677, {337}, 1},{'\0', 0, 13678, {0}, 0},{'v', 13681, 13679, {0}, 0}, + {'\0', 0, 13680, {0}, 0},{';', 0, 13681, {10808}, 1},{'\0', 0, 13682, {0}, 0}, + {'t', 13685, 13683, {0}, 0},{'\0', 0, 13684, {0}, 0},{';', 0, 13685, {8857}, 1}, + {'\0', 0, 13686, {0}, 0},{'o', 13689, 13687, {0}, 0},{'\0', 0, 13688, {0}, 0}, + {'l', 13691, 13689, {0}, 0},{'\0', 0, 13690, {0}, 0},{'d', 13693, 13691, {0}, 0}, + {'\0', 0, 13692, {0}, 0},{';', 0, 13693, {10684}, 1},{'\0', 0, 13694, {0}, 0}, + {'l', 13697, 13695, {0}, 0},{'\0', 0, 13696, {0}, 0},{'i', 13699, 13697, {0}, 0}, + {'\0', 0, 13698, {0}, 0},{'g', 13701, 13699, {0}, 0},{'\0', 0, 13700, {0}, 0}, + {';', 0, 13701, {339}, 1},{'\0', 0, 13702, {0}, 0},{'c', 13706, 13703, {0}, 0}, + {'r', 13712, 13704, {0}, 0},{'\0', 0, 13705, {0}, 0},{'i', 13708, 13706, {0}, 0}, + {'\0', 0, 13707, {0}, 0},{'r', 13710, 13708, {0}, 0},{'\0', 0, 13709, {0}, 0}, + {';', 0, 13710, {10687}, 1},{'\0', 0, 13711, {0}, 0},{';', 0, 13712, {120108}, 1}, + {'\0', 0, 13713, {0}, 0},{'o', 13718, 13714, {0}, 0},{'r', 13722, 13715, {0}, 0}, + {'t', 13730, 13716, {0}, 0},{'\0', 0, 13717, {0}, 0},{'n', 13720, 13718, {0}, 0}, + {'\0', 0, 13719, {0}, 0},{';', 0, 13720, {731}, 1},{'\0', 0, 13721, {0}, 0}, + {'a', 13724, 13722, {0}, 0},{'\0', 0, 13723, {0}, 0},{'v', 13726, 13724, {0}, 0}, + {'\0', 0, 13725, {0}, 0},{'e', 13728, 13726, {242}, 1},{'\0', 0, 13727, {0}, 0}, + {';', 0, 13728, {242}, 1},{'\0', 0, 13729, {0}, 0},{';', 0, 13730, {10689}, 1}, + {'\0', 0, 13731, {0}, 0},{'b', 13735, 13732, {0}, 0},{'m', 13741, 13733, {0}, 0}, + {'\0', 0, 13734, {0}, 0},{'a', 13737, 13735, {0}, 0},{'\0', 0, 13736, {0}, 0}, + {'r', 13739, 13737, {0}, 0},{'\0', 0, 13738, {0}, 0},{';', 0, 13739, {10677}, 1}, + {'\0', 0, 13740, {0}, 0},{';', 0, 13741, {937}, 1},{'\0', 0, 13742, {0}, 0}, + {'n', 13745, 13743, {0}, 0},{'\0', 0, 13744, {0}, 0},{'t', 13747, 13745, {0}, 0}, + {'\0', 0, 13746, {0}, 0},{';', 0, 13747, {8750}, 1},{'\0', 0, 13748, {0}, 0}, + {'a', 13754, 13749, {0}, 0},{'c', 13760, 13750, {0}, 0},{'i', 13775, 13751, {0}, 0}, + {'t', 13781, 13752, {0}, 0},{'\0', 0, 13753, {0}, 0},{'r', 13756, 13754, {0}, 0}, + {'\0', 0, 13755, {0}, 0},{'r', 13758, 13756, {0}, 0},{'\0', 0, 13757, {0}, 0}, + {';', 0, 13758, {8634}, 1},{'\0', 0, 13759, {0}, 0},{'i', 13763, 13760, {0}, 0}, + {'r', 13767, 13761, {0}, 0},{'\0', 0, 13762, {0}, 0},{'r', 13765, 13763, {0}, 0}, + {'\0', 0, 13764, {0}, 0},{';', 0, 13765, {10686}, 1},{'\0', 0, 13766, {0}, 0}, + {'o', 13769, 13767, {0}, 0},{'\0', 0, 13768, {0}, 0},{'s', 13771, 13769, {0}, 0}, + {'\0', 0, 13770, {0}, 0},{'s', 13773, 13771, {0}, 0},{'\0', 0, 13772, {0}, 0}, + {';', 0, 13773, {10683}, 1},{'\0', 0, 13774, {0}, 0},{'n', 13777, 13775, {0}, 0}, + {'\0', 0, 13776, {0}, 0},{'e', 13779, 13777, {0}, 0},{'\0', 0, 13778, {0}, 0}, + {';', 0, 13779, {8254}, 1},{'\0', 0, 13780, {0}, 0},{';', 0, 13781, {10688}, 1}, + {'\0', 0, 13782, {0}, 0},{'a', 13787, 13783, {0}, 0},{'e', 13793, 13784, {0}, 0}, + {'i', 13799, 13785, {0}, 0},{'\0', 0, 13786, {0}, 0},{'c', 13789, 13787, {0}, 0}, + {'\0', 0, 13788, {0}, 0},{'r', 13791, 13789, {0}, 0},{'\0', 0, 13790, {0}, 0}, + {';', 0, 13791, {333}, 1},{'\0', 0, 13792, {0}, 0},{'g', 13795, 13793, {0}, 0}, + {'\0', 0, 13794, {0}, 0},{'a', 13797, 13795, {0}, 0},{'\0', 0, 13796, {0}, 0}, + {';', 0, 13797, {969}, 1},{'\0', 0, 13798, {0}, 0},{'c', 13803, 13799, {0}, 0}, + {'d', 13811, 13800, {0}, 0},{'n', 13813, 13801, {0}, 0},{'\0', 0, 13802, {0}, 0}, + {'r', 13805, 13803, {0}, 0},{'\0', 0, 13804, {0}, 0},{'o', 13807, 13805, {0}, 0}, + {'\0', 0, 13806, {0}, 0},{'n', 13809, 13807, {0}, 0},{'\0', 0, 13808, {0}, 0}, + {';', 0, 13809, {959}, 1},{'\0', 0, 13810, {0}, 0},{';', 0, 13811, {10678}, 1}, + {'\0', 0, 13812, {0}, 0},{'u', 13815, 13813, {0}, 0},{'\0', 0, 13814, {0}, 0}, + {'s', 13817, 13815, {0}, 0},{'\0', 0, 13816, {0}, 0},{';', 0, 13817, {8854}, 1}, + {'\0', 0, 13818, {0}, 0},{'p', 13821, 13819, {0}, 0},{'\0', 0, 13820, {0}, 0}, + {'f', 13823, 13821, {0}, 0},{'\0', 0, 13822, {0}, 0},{';', 0, 13823, {120160}, 1}, + {'\0', 0, 13824, {0}, 0},{'a', 13829, 13825, {0}, 0},{'e', 13833, 13826, {0}, 0}, + {'l', 13839, 13827, {0}, 0},{'\0', 0, 13828, {0}, 0},{'r', 13831, 13829, {0}, 0}, + {'\0', 0, 13830, {0}, 0},{';', 0, 13831, {10679}, 1},{'\0', 0, 13832, {0}, 0}, + {'r', 13835, 13833, {0}, 0},{'\0', 0, 13834, {0}, 0},{'p', 13837, 13835, {0}, 0}, + {'\0', 0, 13836, {0}, 0},{';', 0, 13837, {10681}, 1},{'\0', 0, 13838, {0}, 0}, + {'u', 13841, 13839, {0}, 0},{'\0', 0, 13840, {0}, 0},{'s', 13843, 13841, {0}, 0}, + {'\0', 0, 13842, {0}, 0},{';', 0, 13843, {8853}, 1},{'\0', 0, 13844, {0}, 0}, + {';', 0, 13845, {8744}, 1},{'a', 13853, 13846, {0}, 0},{'d', 13859, 13847, {0}, 0}, + {'i', 13877, 13848, {0}, 0},{'o', 13885, 13849, {0}, 0},{'s', 13889, 13850, {0}, 0}, + {'v', 13899, 13851, {0}, 0},{'\0', 0, 13852, {0}, 0},{'r', 13855, 13853, {0}, 0}, + {'\0', 0, 13854, {0}, 0},{'r', 13857, 13855, {0}, 0},{'\0', 0, 13856, {0}, 0}, + {';', 0, 13857, {8635}, 1},{'\0', 0, 13858, {0}, 0},{';', 0, 13859, {10845}, 1}, + {'e', 13864, 13860, {0}, 0},{'f', 13873, 13861, {170}, 1},{'m', 13875, 13862, {186}, 1}, + {'\0', 0, 13863, {0}, 0},{'r', 13866, 13864, {0}, 0},{'\0', 0, 13865, {0}, 0}, + {';', 0, 13866, {8500}, 1},{'o', 13869, 13867, {0}, 0},{'\0', 0, 13868, {0}, 0}, + {'f', 13871, 13869, {0}, 0},{'\0', 0, 13870, {0}, 0},{';', 0, 13871, {8500}, 1}, + {'\0', 0, 13872, {0}, 0},{';', 0, 13873, {170}, 1},{'\0', 0, 13874, {0}, 0}, + {';', 0, 13875, {186}, 1},{'\0', 0, 13876, {0}, 0},{'g', 13879, 13877, {0}, 0}, + {'\0', 0, 13878, {0}, 0},{'o', 13881, 13879, {0}, 0},{'\0', 0, 13880, {0}, 0}, + {'f', 13883, 13881, {0}, 0},{'\0', 0, 13882, {0}, 0},{';', 0, 13883, {8886}, 1}, + {'\0', 0, 13884, {0}, 0},{'r', 13887, 13885, {0}, 0},{'\0', 0, 13886, {0}, 0}, + {';', 0, 13887, {10838}, 1},{'\0', 0, 13888, {0}, 0},{'l', 13891, 13889, {0}, 0}, + {'\0', 0, 13890, {0}, 0},{'o', 13893, 13891, {0}, 0},{'\0', 0, 13892, {0}, 0}, + {'p', 13895, 13893, {0}, 0},{'\0', 0, 13894, {0}, 0},{'e', 13897, 13895, {0}, 0}, + {'\0', 0, 13896, {0}, 0},{';', 0, 13897, {10839}, 1},{'\0', 0, 13898, {0}, 0}, + {';', 0, 13899, {10843}, 1},{'\0', 0, 13900, {0}, 0},{'c', 13905, 13901, {0}, 0}, + {'l', 13909, 13902, {0}, 0},{'o', 13917, 13903, {0}, 0},{'\0', 0, 13904, {0}, 0}, + {'r', 13907, 13905, {0}, 0},{'\0', 0, 13906, {0}, 0},{';', 0, 13907, {8500}, 1}, + {'\0', 0, 13908, {0}, 0},{'a', 13911, 13909, {0}, 0},{'\0', 0, 13910, {0}, 0}, + {'s', 13913, 13911, {0}, 0},{'\0', 0, 13912, {0}, 0},{'h', 13915, 13913, {248}, 1}, + {'\0', 0, 13914, {0}, 0},{';', 0, 13915, {248}, 1},{'\0', 0, 13916, {0}, 0}, + {'l', 13919, 13917, {0}, 0},{'\0', 0, 13918, {0}, 0},{';', 0, 13919, {8856}, 1}, + {'\0', 0, 13920, {0}, 0},{'i', 13923, 13921, {0}, 0},{'\0', 0, 13922, {0}, 0}, + {'l', 13926, 13923, {0}, 0},{'m', 13932, 13924, {0}, 0},{'\0', 0, 13925, {0}, 0}, + {'d', 13928, 13926, {0}, 0},{'\0', 0, 13927, {0}, 0},{'e', 13930, 13928, {245}, 1}, + {'\0', 0, 13929, {0}, 0},{';', 0, 13930, {245}, 1},{'\0', 0, 13931, {0}, 0}, + {'e', 13934, 13932, {0}, 0},{'\0', 0, 13933, {0}, 0},{'s', 13936, 13934, {0}, 0}, + {'\0', 0, 13935, {0}, 0},{';', 0, 13936, {8855}, 1},{'a', 13939, 13937, {0}, 0}, + {'\0', 0, 13938, {0}, 0},{'s', 13941, 13939, {0}, 0},{'\0', 0, 13940, {0}, 0}, + {';', 0, 13941, {10806}, 1},{'\0', 0, 13942, {0}, 0},{'m', 13945, 13943, {0}, 0}, + {'\0', 0, 13944, {0}, 0},{'l', 13947, 13945, {246}, 1},{'\0', 0, 13946, {0}, 0}, + {';', 0, 13947, {246}, 1},{'\0', 0, 13948, {0}, 0},{'b', 13951, 13949, {0}, 0}, + {'\0', 0, 13950, {0}, 0},{'a', 13953, 13951, {0}, 0},{'\0', 0, 13952, {0}, 0}, + {'r', 13955, 13953, {0}, 0},{'\0', 0, 13954, {0}, 0},{';', 0, 13955, {9021}, 1}, + {'\0', 0, 13956, {0}, 0},{'a', 13970, 13957, {0}, 0},{'c', 13999, 13958, {0}, 0}, + {'e', 14003, 13959, {0}, 0},{'f', 14039, 13960, {0}, 0},{'h', 14043, 13961, {0}, 0}, + {'i', 14066, 13962, {0}, 0},{'l', 14086, 13963, {0}, 0},{'m', 14158, 13964, {0}, 0}, + {'o', 14160, 13965, {0}, 0},{'r', 14186, 13966, {0}, 0},{'s', 14363, 13967, {0}, 0}, + {'u', 14372, 13968, {0}, 0},{'\0', 0, 13969, {0}, 0},{'r', 13972, 13970, {0}, 0}, + {'\0', 0, 13971, {0}, 0},{';', 0, 13972, {8741}, 1},{'a', 13977, 13973, {182}, 1}, + {'s', 13988, 13974, {0}, 0},{'t', 13997, 13975, {0}, 0},{'\0', 0, 13976, {0}, 0}, + {';', 0, 13977, {182}, 1},{'l', 13980, 13978, {0}, 0},{'\0', 0, 13979, {0}, 0}, + {'l', 13982, 13980, {0}, 0},{'\0', 0, 13981, {0}, 0},{'e', 13984, 13982, {0}, 0}, + {'\0', 0, 13983, {0}, 0},{'l', 13986, 13984, {0}, 0},{'\0', 0, 13985, {0}, 0}, + {';', 0, 13986, {8741}, 1},{'\0', 0, 13987, {0}, 0},{'i', 13991, 13988, {0}, 0}, + {'l', 13995, 13989, {0}, 0},{'\0', 0, 13990, {0}, 0},{'m', 13993, 13991, {0}, 0}, + {'\0', 0, 13992, {0}, 0},{';', 0, 13993, {10995}, 1},{'\0', 0, 13994, {0}, 0}, + {';', 0, 13995, {11005}, 1},{'\0', 0, 13996, {0}, 0},{';', 0, 13997, {8706}, 1}, + {'\0', 0, 13998, {0}, 0},{'y', 14001, 13999, {0}, 0},{'\0', 0, 14000, {0}, 0}, + {';', 0, 14001, {1087}, 1},{'\0', 0, 14002, {0}, 0},{'r', 14005, 14003, {0}, 0}, + {'\0', 0, 14004, {0}, 0},{'c', 14011, 14005, {0}, 0},{'i', 14017, 14006, {0}, 0}, + {'m', 14023, 14007, {0}, 0},{'p', 14029, 14008, {0}, 0},{'t', 14031, 14009, {0}, 0}, + {'\0', 0, 14010, {0}, 0},{'n', 14013, 14011, {0}, 0},{'\0', 0, 14012, {0}, 0}, + {'t', 14015, 14013, {0}, 0},{'\0', 0, 14014, {0}, 0},{';', 0, 14015, {37}, 1}, + {'\0', 0, 14016, {0}, 0},{'o', 14019, 14017, {0}, 0},{'\0', 0, 14018, {0}, 0}, + {'d', 14021, 14019, {0}, 0},{'\0', 0, 14020, {0}, 0},{';', 0, 14021, {46}, 1}, + {'\0', 0, 14022, {0}, 0},{'i', 14025, 14023, {0}, 0},{'\0', 0, 14024, {0}, 0}, + {'l', 14027, 14025, {0}, 0},{'\0', 0, 14026, {0}, 0},{';', 0, 14027, {8240}, 1}, + {'\0', 0, 14028, {0}, 0},{';', 0, 14029, {8869}, 1},{'\0', 0, 14030, {0}, 0}, + {'e', 14033, 14031, {0}, 0},{'\0', 0, 14032, {0}, 0},{'n', 14035, 14033, {0}, 0}, + {'\0', 0, 14034, {0}, 0},{'k', 14037, 14035, {0}, 0},{'\0', 0, 14036, {0}, 0}, + {';', 0, 14037, {8241}, 1},{'\0', 0, 14038, {0}, 0},{'r', 14041, 14039, {0}, 0}, + {'\0', 0, 14040, {0}, 0},{';', 0, 14041, {120109}, 1},{'\0', 0, 14042, {0}, 0}, + {'i', 14047, 14043, {0}, 0},{'m', 14052, 14044, {0}, 0},{'o', 14060, 14045, {0}, 0}, + {'\0', 0, 14046, {0}, 0},{';', 0, 14047, {966}, 1},{'v', 14050, 14048, {0}, 0}, + {'\0', 0, 14049, {0}, 0},{';', 0, 14050, {981}, 1},{'\0', 0, 14051, {0}, 0}, + {'m', 14054, 14052, {0}, 0},{'\0', 0, 14053, {0}, 0},{'a', 14056, 14054, {0}, 0}, + {'\0', 0, 14055, {0}, 0},{'t', 14058, 14056, {0}, 0},{'\0', 0, 14057, {0}, 0}, + {';', 0, 14058, {8499}, 1},{'\0', 0, 14059, {0}, 0},{'n', 14062, 14060, {0}, 0}, + {'\0', 0, 14061, {0}, 0},{'e', 14064, 14062, {0}, 0},{'\0', 0, 14063, {0}, 0}, + {';', 0, 14064, {9742}, 1},{'\0', 0, 14065, {0}, 0},{';', 0, 14066, {960}, 1}, + {'t', 14070, 14067, {0}, 0},{'v', 14084, 14068, {0}, 0},{'\0', 0, 14069, {0}, 0}, + {'c', 14072, 14070, {0}, 0},{'\0', 0, 14071, {0}, 0},{'h', 14074, 14072, {0}, 0}, + {'\0', 0, 14073, {0}, 0},{'f', 14076, 14074, {0}, 0},{'\0', 0, 14075, {0}, 0}, + {'o', 14078, 14076, {0}, 0},{'\0', 0, 14077, {0}, 0},{'r', 14080, 14078, {0}, 0}, + {'\0', 0, 14079, {0}, 0},{'k', 14082, 14080, {0}, 0},{'\0', 0, 14081, {0}, 0}, + {';', 0, 14082, {8916}, 1},{'\0', 0, 14083, {0}, 0},{';', 0, 14084, {982}, 1}, + {'\0', 0, 14085, {0}, 0},{'a', 14089, 14086, {0}, 0},{'u', 14105, 14087, {0}, 0}, + {'\0', 0, 14088, {0}, 0},{'n', 14091, 14089, {0}, 0},{'\0', 0, 14090, {0}, 0}, + {'c', 14094, 14091, {0}, 0},{'k', 14101, 14092, {0}, 0},{'\0', 0, 14093, {0}, 0}, + {'k', 14096, 14094, {0}, 0},{'\0', 0, 14095, {0}, 0},{';', 0, 14096, {8463}, 1}, + {'h', 14099, 14097, {0}, 0},{'\0', 0, 14098, {0}, 0},{';', 0, 14099, {8462}, 1}, + {'\0', 0, 14100, {0}, 0},{'v', 14103, 14101, {0}, 0},{'\0', 0, 14102, {0}, 0}, + {';', 0, 14103, {8463}, 1},{'\0', 0, 14104, {0}, 0},{'s', 14107, 14105, {0}, 0}, + {'\0', 0, 14106, {0}, 0},{';', 0, 14107, {43}, 1},{'a', 14117, 14108, {0}, 0}, + {'b', 14125, 14109, {0}, 0},{'c', 14127, 14110, {0}, 0},{'d', 14133, 14111, {0}, 0}, + {'e', 14140, 14112, {0}, 0},{'m', 14142, 14113, {0}, 0},{'s', 14146, 14114, {0}, 0}, + {'t', 14152, 14115, {0}, 0},{'\0', 0, 14116, {0}, 0},{'c', 14119, 14117, {0}, 0}, + {'\0', 0, 14118, {0}, 0},{'i', 14121, 14119, {0}, 0},{'\0', 0, 14120, {0}, 0}, + {'r', 14123, 14121, {0}, 0},{'\0', 0, 14122, {0}, 0},{';', 0, 14123, {10787}, 1}, + {'\0', 0, 14124, {0}, 0},{';', 0, 14125, {8862}, 1},{'\0', 0, 14126, {0}, 0}, + {'i', 14129, 14127, {0}, 0},{'\0', 0, 14128, {0}, 0},{'r', 14131, 14129, {0}, 0}, + {'\0', 0, 14130, {0}, 0},{';', 0, 14131, {10786}, 1},{'\0', 0, 14132, {0}, 0}, + {'o', 14136, 14133, {0}, 0},{'u', 14138, 14134, {0}, 0},{'\0', 0, 14135, {0}, 0}, + {';', 0, 14136, {8724}, 1},{'\0', 0, 14137, {0}, 0},{';', 0, 14138, {10789}, 1}, + {'\0', 0, 14139, {0}, 0},{';', 0, 14140, {10866}, 1},{'\0', 0, 14141, {0}, 0}, + {'n', 14144, 14142, {177}, 1},{'\0', 0, 14143, {0}, 0},{';', 0, 14144, {177}, 1}, + {'\0', 0, 14145, {0}, 0},{'i', 14148, 14146, {0}, 0},{'\0', 0, 14147, {0}, 0}, + {'m', 14150, 14148, {0}, 0},{'\0', 0, 14149, {0}, 0},{';', 0, 14150, {10790}, 1}, + {'\0', 0, 14151, {0}, 0},{'w', 14154, 14152, {0}, 0},{'\0', 0, 14153, {0}, 0}, + {'o', 14156, 14154, {0}, 0},{'\0', 0, 14155, {0}, 0},{';', 0, 14156, {10791}, 1}, + {'\0', 0, 14157, {0}, 0},{';', 0, 14158, {177}, 1},{'\0', 0, 14159, {0}, 0}, + {'i', 14164, 14160, {0}, 0},{'p', 14176, 14161, {0}, 0},{'u', 14180, 14162, {0}, 0}, + {'\0', 0, 14163, {0}, 0},{'n', 14166, 14164, {0}, 0},{'\0', 0, 14165, {0}, 0}, + {'t', 14168, 14166, {0}, 0},{'\0', 0, 14167, {0}, 0},{'i', 14170, 14168, {0}, 0}, + {'\0', 0, 14169, {0}, 0},{'n', 14172, 14170, {0}, 0},{'\0', 0, 14171, {0}, 0}, + {'t', 14174, 14172, {0}, 0},{'\0', 0, 14173, {0}, 0},{';', 0, 14174, {10773}, 1}, + {'\0', 0, 14175, {0}, 0},{'f', 14178, 14176, {0}, 0},{'\0', 0, 14177, {0}, 0}, + {';', 0, 14178, {120161}, 1},{'\0', 0, 14179, {0}, 0},{'n', 14182, 14180, {0}, 0}, + {'\0', 0, 14181, {0}, 0},{'d', 14184, 14182, {163}, 1},{'\0', 0, 14183, {0}, 0}, + {';', 0, 14184, {163}, 1},{'\0', 0, 14185, {0}, 0},{';', 0, 14186, {8826}, 1}, + {'E', 14197, 14187, {0}, 0},{'a', 14199, 14188, {0}, 0},{'c', 14203, 14189, {0}, 0}, + {'e', 14209, 14190, {0}, 0},{'i', 14283, 14191, {0}, 0},{'n', 14292, 14192, {0}, 0}, + {'o', 14308, 14193, {0}, 0},{'s', 14349, 14194, {0}, 0},{'u', 14355, 14195, {0}, 0}, + {'\0', 0, 14196, {0}, 0},{';', 0, 14197, {10931}, 1},{'\0', 0, 14198, {0}, 0}, + {'p', 14201, 14199, {0}, 0},{'\0', 0, 14200, {0}, 0},{';', 0, 14201, {10935}, 1}, + {'\0', 0, 14202, {0}, 0},{'u', 14205, 14203, {0}, 0},{'\0', 0, 14204, {0}, 0}, + {'e', 14207, 14205, {0}, 0},{'\0', 0, 14206, {0}, 0},{';', 0, 14207, {8828}, 1}, + {'\0', 0, 14208, {0}, 0},{';', 0, 14209, {10927}, 1},{'c', 14212, 14210, {0}, 0}, + {'\0', 0, 14211, {0}, 0},{';', 0, 14212, {8826}, 1},{'a', 14219, 14213, {0}, 0}, + {'c', 14231, 14214, {0}, 0},{'e', 14245, 14215, {0}, 0},{'n', 14249, 14216, {0}, 0}, + {'s', 14277, 14217, {0}, 0},{'\0', 0, 14218, {0}, 0},{'p', 14221, 14219, {0}, 0}, + {'\0', 0, 14220, {0}, 0},{'p', 14223, 14221, {0}, 0},{'\0', 0, 14222, {0}, 0}, + {'r', 14225, 14223, {0}, 0},{'\0', 0, 14224, {0}, 0},{'o', 14227, 14225, {0}, 0}, + {'\0', 0, 14226, {0}, 0},{'x', 14229, 14227, {0}, 0},{'\0', 0, 14228, {0}, 0}, + {';', 0, 14229, {10935}, 1},{'\0', 0, 14230, {0}, 0},{'u', 14233, 14231, {0}, 0}, + {'\0', 0, 14232, {0}, 0},{'r', 14235, 14233, {0}, 0},{'\0', 0, 14234, {0}, 0}, + {'l', 14237, 14235, {0}, 0},{'\0', 0, 14236, {0}, 0},{'y', 14239, 14237, {0}, 0}, + {'\0', 0, 14238, {0}, 0},{'e', 14241, 14239, {0}, 0},{'\0', 0, 14240, {0}, 0}, + {'q', 14243, 14241, {0}, 0},{'\0', 0, 14242, {0}, 0},{';', 0, 14243, {8828}, 1}, + {'\0', 0, 14244, {0}, 0},{'q', 14247, 14245, {0}, 0},{'\0', 0, 14246, {0}, 0}, + {';', 0, 14247, {10927}, 1},{'\0', 0, 14248, {0}, 0},{'a', 14253, 14249, {0}, 0}, + {'e', 14265, 14250, {0}, 0},{'s', 14271, 14251, {0}, 0},{'\0', 0, 14252, {0}, 0}, + {'p', 14255, 14253, {0}, 0},{'\0', 0, 14254, {0}, 0},{'p', 14257, 14255, {0}, 0}, + {'\0', 0, 14256, {0}, 0},{'r', 14259, 14257, {0}, 0},{'\0', 0, 14258, {0}, 0}, + {'o', 14261, 14259, {0}, 0},{'\0', 0, 14260, {0}, 0},{'x', 14263, 14261, {0}, 0}, + {'\0', 0, 14262, {0}, 0},{';', 0, 14263, {10937}, 1},{'\0', 0, 14264, {0}, 0}, + {'q', 14267, 14265, {0}, 0},{'\0', 0, 14266, {0}, 0},{'q', 14269, 14267, {0}, 0}, + {'\0', 0, 14268, {0}, 0},{';', 0, 14269, {10933}, 1},{'\0', 0, 14270, {0}, 0}, + {'i', 14273, 14271, {0}, 0},{'\0', 0, 14272, {0}, 0},{'m', 14275, 14273, {0}, 0}, + {'\0', 0, 14274, {0}, 0},{';', 0, 14275, {8936}, 1},{'\0', 0, 14276, {0}, 0}, + {'i', 14279, 14277, {0}, 0},{'\0', 0, 14278, {0}, 0},{'m', 14281, 14279, {0}, 0}, + {'\0', 0, 14280, {0}, 0},{';', 0, 14281, {8830}, 1},{'\0', 0, 14282, {0}, 0}, + {'m', 14285, 14283, {0}, 0},{'\0', 0, 14284, {0}, 0},{'e', 14287, 14285, {0}, 0}, + {'\0', 0, 14286, {0}, 0},{';', 0, 14287, {8242}, 1},{'s', 14290, 14288, {0}, 0}, + {'\0', 0, 14289, {0}, 0},{';', 0, 14290, {8473}, 1},{'\0', 0, 14291, {0}, 0}, + {'E', 14296, 14292, {0}, 0},{'a', 14298, 14293, {0}, 0},{'s', 14302, 14294, {0}, 0}, + {'\0', 0, 14295, {0}, 0},{';', 0, 14296, {10933}, 1},{'\0', 0, 14297, {0}, 0}, + {'p', 14300, 14298, {0}, 0},{'\0', 0, 14299, {0}, 0},{';', 0, 14300, {10937}, 1}, + {'\0', 0, 14301, {0}, 0},{'i', 14304, 14302, {0}, 0},{'\0', 0, 14303, {0}, 0}, + {'m', 14306, 14304, {0}, 0},{'\0', 0, 14305, {0}, 0},{';', 0, 14306, {8936}, 1}, + {'\0', 0, 14307, {0}, 0},{'d', 14312, 14308, {0}, 0},{'f', 14314, 14309, {0}, 0}, + {'p', 14342, 14310, {0}, 0},{'\0', 0, 14311, {0}, 0},{';', 0, 14312, {8719}, 1}, + {'\0', 0, 14313, {0}, 0},{'a', 14318, 14314, {0}, 0},{'l', 14326, 14315, {0}, 0}, + {'s', 14334, 14316, {0}, 0},{'\0', 0, 14317, {0}, 0},{'l', 14320, 14318, {0}, 0}, + {'\0', 0, 14319, {0}, 0},{'a', 14322, 14320, {0}, 0},{'\0', 0, 14321, {0}, 0}, + {'r', 14324, 14322, {0}, 0},{'\0', 0, 14323, {0}, 0},{';', 0, 14324, {9006}, 1}, + {'\0', 0, 14325, {0}, 0},{'i', 14328, 14326, {0}, 0},{'\0', 0, 14327, {0}, 0}, + {'n', 14330, 14328, {0}, 0},{'\0', 0, 14329, {0}, 0},{'e', 14332, 14330, {0}, 0}, + {'\0', 0, 14331, {0}, 0},{';', 0, 14332, {8978}, 1},{'\0', 0, 14333, {0}, 0}, + {'u', 14336, 14334, {0}, 0},{'\0', 0, 14335, {0}, 0},{'r', 14338, 14336, {0}, 0}, + {'\0', 0, 14337, {0}, 0},{'f', 14340, 14338, {0}, 0},{'\0', 0, 14339, {0}, 0}, + {';', 0, 14340, {8979}, 1},{'\0', 0, 14341, {0}, 0},{';', 0, 14342, {8733}, 1}, + {'t', 14345, 14343, {0}, 0},{'\0', 0, 14344, {0}, 0},{'o', 14347, 14345, {0}, 0}, + {'\0', 0, 14346, {0}, 0},{';', 0, 14347, {8733}, 1},{'\0', 0, 14348, {0}, 0}, + {'i', 14351, 14349, {0}, 0},{'\0', 0, 14350, {0}, 0},{'m', 14353, 14351, {0}, 0}, + {'\0', 0, 14352, {0}, 0},{';', 0, 14353, {8830}, 1},{'\0', 0, 14354, {0}, 0}, + {'r', 14357, 14355, {0}, 0},{'\0', 0, 14356, {0}, 0},{'e', 14359, 14357, {0}, 0}, + {'\0', 0, 14358, {0}, 0},{'l', 14361, 14359, {0}, 0},{'\0', 0, 14360, {0}, 0}, + {';', 0, 14361, {8880}, 1},{'\0', 0, 14362, {0}, 0},{'c', 14366, 14363, {0}, 0}, + {'i', 14370, 14364, {0}, 0},{'\0', 0, 14365, {0}, 0},{'r', 14368, 14366, {0}, 0}, + {'\0', 0, 14367, {0}, 0},{';', 0, 14368, {120005}, 1},{'\0', 0, 14369, {0}, 0}, + {';', 0, 14370, {968}, 1},{'\0', 0, 14371, {0}, 0},{'n', 14374, 14372, {0}, 0}, + {'\0', 0, 14373, {0}, 0},{'c', 14376, 14374, {0}, 0},{'\0', 0, 14375, {0}, 0}, + {'s', 14378, 14376, {0}, 0},{'\0', 0, 14377, {0}, 0},{'p', 14380, 14378, {0}, 0}, + {'\0', 0, 14379, {0}, 0},{';', 0, 14380, {8200}, 1},{'\0', 0, 14381, {0}, 0}, + {'f', 14389, 14382, {0}, 0},{'i', 14393, 14383, {0}, 0},{'o', 14399, 14384, {0}, 0}, + {'p', 14405, 14385, {0}, 0},{'s', 14415, 14386, {0}, 0},{'u', 14421, 14387, {0}, 0}, + {'\0', 0, 14388, {0}, 0},{'r', 14391, 14389, {0}, 0},{'\0', 0, 14390, {0}, 0}, + {';', 0, 14391, {120110}, 1},{'\0', 0, 14392, {0}, 0},{'n', 14395, 14393, {0}, 0}, + {'\0', 0, 14394, {0}, 0},{'t', 14397, 14395, {0}, 0},{'\0', 0, 14396, {0}, 0}, + {';', 0, 14397, {10764}, 1},{'\0', 0, 14398, {0}, 0},{'p', 14401, 14399, {0}, 0}, + {'\0', 0, 14400, {0}, 0},{'f', 14403, 14401, {0}, 0},{'\0', 0, 14402, {0}, 0}, + {';', 0, 14403, {120162}, 1},{'\0', 0, 14404, {0}, 0},{'r', 14407, 14405, {0}, 0}, + {'\0', 0, 14406, {0}, 0},{'i', 14409, 14407, {0}, 0},{'\0', 0, 14408, {0}, 0}, + {'m', 14411, 14409, {0}, 0},{'\0', 0, 14410, {0}, 0},{'e', 14413, 14411, {0}, 0}, + {'\0', 0, 14412, {0}, 0},{';', 0, 14413, {8279}, 1},{'\0', 0, 14414, {0}, 0}, + {'c', 14417, 14415, {0}, 0},{'\0', 0, 14416, {0}, 0},{'r', 14419, 14417, {0}, 0}, + {'\0', 0, 14418, {0}, 0},{';', 0, 14419, {120006}, 1},{'\0', 0, 14420, {0}, 0}, + {'a', 14425, 14421, {0}, 0},{'e', 14450, 14422, {0}, 0},{'o', 14461, 14423, {0}, 0}, + {'\0', 0, 14424, {0}, 0},{'t', 14427, 14425, {0}, 0},{'\0', 0, 14426, {0}, 0}, + {'e', 14430, 14427, {0}, 0},{'i', 14444, 14428, {0}, 0},{'\0', 0, 14429, {0}, 0}, + {'r', 14432, 14430, {0}, 0},{'\0', 0, 14431, {0}, 0},{'n', 14434, 14432, {0}, 0}, + {'\0', 0, 14433, {0}, 0},{'i', 14436, 14434, {0}, 0},{'\0', 0, 14435, {0}, 0}, + {'o', 14438, 14436, {0}, 0},{'\0', 0, 14437, {0}, 0},{'n', 14440, 14438, {0}, 0}, + {'\0', 0, 14439, {0}, 0},{'s', 14442, 14440, {0}, 0},{'\0', 0, 14441, {0}, 0}, + {';', 0, 14442, {8461}, 1},{'\0', 0, 14443, {0}, 0},{'n', 14446, 14444, {0}, 0}, + {'\0', 0, 14445, {0}, 0},{'t', 14448, 14446, {0}, 0},{'\0', 0, 14447, {0}, 0}, + {';', 0, 14448, {10774}, 1},{'\0', 0, 14449, {0}, 0},{'s', 14452, 14450, {0}, 0}, + {'\0', 0, 14451, {0}, 0},{'t', 14454, 14452, {0}, 0},{'\0', 0, 14453, {0}, 0}, + {';', 0, 14454, {63}, 1},{'e', 14457, 14455, {0}, 0},{'\0', 0, 14456, {0}, 0}, + {'q', 14459, 14457, {0}, 0},{'\0', 0, 14458, {0}, 0},{';', 0, 14459, {8799}, 1}, + {'\0', 0, 14460, {0}, 0},{'t', 14463, 14461, {34}, 1},{'\0', 0, 14462, {0}, 0}, + {';', 0, 14463, {34}, 1},{'\0', 0, 14464, {0}, 0},{'A', 14487, 14465, {0}, 0}, + {'B', 14509, 14466, {0}, 0},{'H', 14517, 14467, {0}, 0},{'a', 14523, 14468, {0}, 0}, + {'b', 14658, 14469, {0}, 0},{'c', 14700, 14470, {0}, 0},{'d', 14732, 14471, {0}, 0}, + {'e', 14764, 14472, {0}, 0},{'f', 14797, 14473, {0}, 0},{'h', 14819, 14474, {0}, 0}, + {'i', 14839, 14475, {0}, 0},{'l', 15023, 14476, {0}, 0},{'m', 15041, 14477, {0}, 0}, + {'n', 15060, 14478, {0}, 0},{'o', 15068, 14479, {0}, 0},{'p', 15116, 14480, {0}, 0}, + {'r', 15140, 14481, {0}, 0},{'s', 15148, 14482, {0}, 0},{'t', 15179, 14483, {0}, 0}, + {'u', 15218, 14484, {0}, 0},{'x', 15230, 14485, {0}, 0},{'\0', 0, 14486, {0}, 0}, + {'a', 14491, 14487, {0}, 0},{'r', 14497, 14488, {0}, 0},{'t', 14501, 14489, {0}, 0}, + {'\0', 0, 14490, {0}, 0},{'r', 14493, 14491, {0}, 0},{'\0', 0, 14492, {0}, 0}, + {'r', 14495, 14493, {0}, 0},{'\0', 0, 14494, {0}, 0},{';', 0, 14495, {8667}, 1}, + {'\0', 0, 14496, {0}, 0},{'r', 14499, 14497, {0}, 0},{'\0', 0, 14498, {0}, 0}, + {';', 0, 14499, {8658}, 1},{'\0', 0, 14500, {0}, 0},{'a', 14503, 14501, {0}, 0}, + {'\0', 0, 14502, {0}, 0},{'i', 14505, 14503, {0}, 0},{'\0', 0, 14504, {0}, 0}, + {'l', 14507, 14505, {0}, 0},{'\0', 0, 14506, {0}, 0},{';', 0, 14507, {10524}, 1}, + {'\0', 0, 14508, {0}, 0},{'a', 14511, 14509, {0}, 0},{'\0', 0, 14510, {0}, 0}, + {'r', 14513, 14511, {0}, 0},{'\0', 0, 14512, {0}, 0},{'r', 14515, 14513, {0}, 0}, + {'\0', 0, 14514, {0}, 0},{';', 0, 14515, {10511}, 1},{'\0', 0, 14516, {0}, 0}, + {'a', 14519, 14517, {0}, 0},{'\0', 0, 14518, {0}, 0},{'r', 14521, 14519, {0}, 0}, + {'\0', 0, 14520, {0}, 0},{';', 0, 14521, {10596}, 1},{'\0', 0, 14522, {0}, 0}, + {'c', 14531, 14523, {0}, 0},{'d', 14542, 14524, {0}, 0},{'e', 14548, 14525, {0}, 0}, + {'n', 14560, 14526, {0}, 0},{'q', 14575, 14527, {0}, 0},{'r', 14581, 14528, {0}, 0}, + {'t', 14636, 14529, {0}, 0},{'\0', 0, 14530, {0}, 0},{'e', 14534, 14531, {0}, 0}, + {'u', 14536, 14532, {0}, 0},{'\0', 0, 14533, {0}, 0},{';', 0, 14534, {8765,817}, 2}, + {'\0', 0, 14535, {0}, 0},{'t', 14538, 14536, {0}, 0},{'\0', 0, 14537, {0}, 0}, + {'e', 14540, 14538, {0}, 0},{'\0', 0, 14539, {0}, 0},{';', 0, 14540, {341}, 1}, + {'\0', 0, 14541, {0}, 0},{'i', 14544, 14542, {0}, 0},{'\0', 0, 14543, {0}, 0}, + {'c', 14546, 14544, {0}, 0},{'\0', 0, 14545, {0}, 0},{';', 0, 14546, {8730}, 1}, + {'\0', 0, 14547, {0}, 0},{'m', 14550, 14548, {0}, 0},{'\0', 0, 14549, {0}, 0}, + {'p', 14552, 14550, {0}, 0},{'\0', 0, 14551, {0}, 0},{'t', 14554, 14552, {0}, 0}, + {'\0', 0, 14553, {0}, 0},{'y', 14556, 14554, {0}, 0},{'\0', 0, 14555, {0}, 0}, + {'v', 14558, 14556, {0}, 0},{'\0', 0, 14557, {0}, 0},{';', 0, 14558, {10675}, 1}, + {'\0', 0, 14559, {0}, 0},{'g', 14562, 14560, {0}, 0},{'\0', 0, 14561, {0}, 0}, + {';', 0, 14562, {10217}, 1},{'d', 14567, 14563, {0}, 0},{'e', 14569, 14564, {0}, 0}, + {'l', 14571, 14565, {0}, 0},{'\0', 0, 14566, {0}, 0},{';', 0, 14567, {10642}, 1}, + {'\0', 0, 14568, {0}, 0},{';', 0, 14569, {10661}, 1},{'\0', 0, 14570, {0}, 0}, + {'e', 14573, 14571, {0}, 0},{'\0', 0, 14572, {0}, 0},{';', 0, 14573, {10217}, 1}, + {'\0', 0, 14574, {0}, 0},{'u', 14577, 14575, {0}, 0},{'\0', 0, 14576, {0}, 0}, + {'o', 14579, 14577, {187}, 1},{'\0', 0, 14578, {0}, 0},{';', 0, 14579, {187}, 1}, + {'\0', 0, 14580, {0}, 0},{'r', 14583, 14581, {0}, 0},{'\0', 0, 14582, {0}, 0}, + {';', 0, 14583, {8594}, 1},{'a', 14595, 14584, {0}, 0},{'b', 14599, 14585, {0}, 0}, + {'c', 14606, 14586, {0}, 0},{'f', 14608, 14587, {0}, 0},{'h', 14612, 14588, {0}, 0}, + {'l', 14616, 14589, {0}, 0},{'p', 14620, 14590, {0}, 0},{'s', 14624, 14591, {0}, 0}, + {'t', 14630, 14592, {0}, 0},{'w', 14634, 14593, {0}, 0},{'\0', 0, 14594, {0}, 0}, + {'p', 14597, 14595, {0}, 0},{'\0', 0, 14596, {0}, 0},{';', 0, 14597, {10613}, 1}, + {'\0', 0, 14598, {0}, 0},{';', 0, 14599, {8677}, 1},{'f', 14602, 14600, {0}, 0}, + {'\0', 0, 14601, {0}, 0},{'s', 14604, 14602, {0}, 0},{'\0', 0, 14603, {0}, 0}, + {';', 0, 14604, {10528}, 1},{'\0', 0, 14605, {0}, 0},{';', 0, 14606, {10547}, 1}, + {'\0', 0, 14607, {0}, 0},{'s', 14610, 14608, {0}, 0},{'\0', 0, 14609, {0}, 0}, + {';', 0, 14610, {10526}, 1},{'\0', 0, 14611, {0}, 0},{'k', 14614, 14612, {0}, 0}, + {'\0', 0, 14613, {0}, 0},{';', 0, 14614, {8618}, 1},{'\0', 0, 14615, {0}, 0}, + {'p', 14618, 14616, {0}, 0},{'\0', 0, 14617, {0}, 0},{';', 0, 14618, {8620}, 1}, + {'\0', 0, 14619, {0}, 0},{'l', 14622, 14620, {0}, 0},{'\0', 0, 14621, {0}, 0}, + {';', 0, 14622, {10565}, 1},{'\0', 0, 14623, {0}, 0},{'i', 14626, 14624, {0}, 0}, + {'\0', 0, 14625, {0}, 0},{'m', 14628, 14626, {0}, 0},{'\0', 0, 14627, {0}, 0}, + {';', 0, 14628, {10612}, 1},{'\0', 0, 14629, {0}, 0},{'l', 14632, 14630, {0}, 0}, + {'\0', 0, 14631, {0}, 0},{';', 0, 14632, {8611}, 1},{'\0', 0, 14633, {0}, 0}, + {';', 0, 14634, {8605}, 1},{'\0', 0, 14635, {0}, 0},{'a', 14639, 14636, {0}, 0}, + {'i', 14645, 14637, {0}, 0},{'\0', 0, 14638, {0}, 0},{'i', 14641, 14639, {0}, 0}, + {'\0', 0, 14640, {0}, 0},{'l', 14643, 14641, {0}, 0},{'\0', 0, 14642, {0}, 0}, + {';', 0, 14643, {10522}, 1},{'\0', 0, 14644, {0}, 0},{'o', 14647, 14645, {0}, 0}, + {'\0', 0, 14646, {0}, 0},{';', 0, 14647, {8758}, 1},{'n', 14650, 14648, {0}, 0}, + {'\0', 0, 14649, {0}, 0},{'a', 14652, 14650, {0}, 0},{'\0', 0, 14651, {0}, 0}, + {'l', 14654, 14652, {0}, 0},{'\0', 0, 14653, {0}, 0},{'s', 14656, 14654, {0}, 0}, + {'\0', 0, 14655, {0}, 0},{';', 0, 14656, {8474}, 1},{'\0', 0, 14657, {0}, 0}, + {'a', 14662, 14658, {0}, 0},{'b', 14668, 14659, {0}, 0},{'r', 14674, 14660, {0}, 0}, + {'\0', 0, 14661, {0}, 0},{'r', 14664, 14662, {0}, 0},{'\0', 0, 14663, {0}, 0}, + {'r', 14666, 14664, {0}, 0},{'\0', 0, 14665, {0}, 0},{';', 0, 14666, {10509}, 1}, + {'\0', 0, 14667, {0}, 0},{'r', 14670, 14668, {0}, 0},{'\0', 0, 14669, {0}, 0}, + {'k', 14672, 14670, {0}, 0},{'\0', 0, 14671, {0}, 0},{';', 0, 14672, {10099}, 1}, + {'\0', 0, 14673, {0}, 0},{'a', 14677, 14674, {0}, 0},{'k', 14686, 14675, {0}, 0}, + {'\0', 0, 14676, {0}, 0},{'c', 14679, 14677, {0}, 0},{'\0', 0, 14678, {0}, 0}, + {'e', 14682, 14679, {0}, 0},{'k', 14684, 14680, {0}, 0},{'\0', 0, 14681, {0}, 0}, + {';', 0, 14682, {125}, 1},{'\0', 0, 14683, {0}, 0},{';', 0, 14684, {93}, 1}, + {'\0', 0, 14685, {0}, 0},{'e', 14689, 14686, {0}, 0},{'s', 14691, 14687, {0}, 0}, + {'\0', 0, 14688, {0}, 0},{';', 0, 14689, {10636}, 1},{'\0', 0, 14690, {0}, 0}, + {'l', 14693, 14691, {0}, 0},{'\0', 0, 14692, {0}, 0},{'d', 14696, 14693, {0}, 0}, + {'u', 14698, 14694, {0}, 0},{'\0', 0, 14695, {0}, 0},{';', 0, 14696, {10638}, 1}, + {'\0', 0, 14697, {0}, 0},{';', 0, 14698, {10640}, 1},{'\0', 0, 14699, {0}, 0}, + {'a', 14705, 14700, {0}, 0},{'e', 14713, 14701, {0}, 0},{'u', 14726, 14702, {0}, 0}, + {'y', 14730, 14703, {0}, 0},{'\0', 0, 14704, {0}, 0},{'r', 14707, 14705, {0}, 0}, + {'\0', 0, 14706, {0}, 0},{'o', 14709, 14707, {0}, 0},{'\0', 0, 14708, {0}, 0}, + {'n', 14711, 14709, {0}, 0},{'\0', 0, 14710, {0}, 0},{';', 0, 14711, {345}, 1}, + {'\0', 0, 14712, {0}, 0},{'d', 14716, 14713, {0}, 0},{'i', 14722, 14714, {0}, 0}, + {'\0', 0, 14715, {0}, 0},{'i', 14718, 14716, {0}, 0},{'\0', 0, 14717, {0}, 0}, + {'l', 14720, 14718, {0}, 0},{'\0', 0, 14719, {0}, 0},{';', 0, 14720, {343}, 1}, + {'\0', 0, 14721, {0}, 0},{'l', 14724, 14722, {0}, 0},{'\0', 0, 14723, {0}, 0}, + {';', 0, 14724, {8969}, 1},{'\0', 0, 14725, {0}, 0},{'b', 14728, 14726, {0}, 0}, + {'\0', 0, 14727, {0}, 0},{';', 0, 14728, {125}, 1},{'\0', 0, 14729, {0}, 0}, + {';', 0, 14730, {1088}, 1},{'\0', 0, 14731, {0}, 0},{'c', 14737, 14732, {0}, 0}, + {'l', 14741, 14733, {0}, 0},{'q', 14751, 14734, {0}, 0},{'s', 14760, 14735, {0}, 0}, + {'\0', 0, 14736, {0}, 0},{'a', 14739, 14737, {0}, 0},{'\0', 0, 14738, {0}, 0}, + {';', 0, 14739, {10551}, 1},{'\0', 0, 14740, {0}, 0},{'d', 14743, 14741, {0}, 0}, + {'\0', 0, 14742, {0}, 0},{'h', 14745, 14743, {0}, 0},{'\0', 0, 14744, {0}, 0}, + {'a', 14747, 14745, {0}, 0},{'\0', 0, 14746, {0}, 0},{'r', 14749, 14747, {0}, 0}, + {'\0', 0, 14748, {0}, 0},{';', 0, 14749, {10601}, 1},{'\0', 0, 14750, {0}, 0}, + {'u', 14753, 14751, {0}, 0},{'\0', 0, 14752, {0}, 0},{'o', 14755, 14753, {0}, 0}, + {'\0', 0, 14754, {0}, 0},{';', 0, 14755, {8221}, 1},{'r', 14758, 14756, {0}, 0}, + {'\0', 0, 14757, {0}, 0},{';', 0, 14758, {8221}, 1},{'\0', 0, 14759, {0}, 0}, + {'h', 14762, 14760, {0}, 0},{'\0', 0, 14761, {0}, 0},{';', 0, 14762, {8627}, 1}, + {'\0', 0, 14763, {0}, 0},{'a', 14768, 14764, {0}, 0},{'c', 14791, 14765, {0}, 0}, + {'g', 14795, 14766, {174}, 1},{'\0', 0, 14767, {0}, 0},{'l', 14770, 14768, {0}, 0}, + {'\0', 0, 14769, {0}, 0},{';', 0, 14770, {8476}, 1},{'i', 14775, 14771, {0}, 0}, + {'p', 14781, 14772, {0}, 0},{'s', 14789, 14773, {0}, 0},{'\0', 0, 14774, {0}, 0}, + {'n', 14777, 14775, {0}, 0},{'\0', 0, 14776, {0}, 0},{'e', 14779, 14777, {0}, 0}, + {'\0', 0, 14778, {0}, 0},{';', 0, 14779, {8475}, 1},{'\0', 0, 14780, {0}, 0}, + {'a', 14783, 14781, {0}, 0},{'\0', 0, 14782, {0}, 0},{'r', 14785, 14783, {0}, 0}, + {'\0', 0, 14784, {0}, 0},{'t', 14787, 14785, {0}, 0},{'\0', 0, 14786, {0}, 0}, + {';', 0, 14787, {8476}, 1},{'\0', 0, 14788, {0}, 0},{';', 0, 14789, {8477}, 1}, + {'\0', 0, 14790, {0}, 0},{'t', 14793, 14791, {0}, 0},{'\0', 0, 14792, {0}, 0}, + {';', 0, 14793, {9645}, 1},{'\0', 0, 14794, {0}, 0},{';', 0, 14795, {174}, 1}, + {'\0', 0, 14796, {0}, 0},{'i', 14801, 14797, {0}, 0},{'l', 14809, 14798, {0}, 0}, + {'r', 14817, 14799, {0}, 0},{'\0', 0, 14800, {0}, 0},{'s', 14803, 14801, {0}, 0}, + {'\0', 0, 14802, {0}, 0},{'h', 14805, 14803, {0}, 0},{'\0', 0, 14804, {0}, 0}, + {'t', 14807, 14805, {0}, 0},{'\0', 0, 14806, {0}, 0},{';', 0, 14807, {10621}, 1}, + {'\0', 0, 14808, {0}, 0},{'o', 14811, 14809, {0}, 0},{'\0', 0, 14810, {0}, 0}, + {'o', 14813, 14811, {0}, 0},{'\0', 0, 14812, {0}, 0},{'r', 14815, 14813, {0}, 0}, + {'\0', 0, 14814, {0}, 0},{';', 0, 14815, {8971}, 1},{'\0', 0, 14816, {0}, 0}, + {';', 0, 14817, {120111}, 1},{'\0', 0, 14818, {0}, 0},{'a', 14822, 14819, {0}, 0}, + {'o', 14834, 14820, {0}, 0},{'\0', 0, 14821, {0}, 0},{'r', 14824, 14822, {0}, 0}, + {'\0', 0, 14823, {0}, 0},{'d', 14827, 14824, {0}, 0},{'u', 14829, 14825, {0}, 0}, + {'\0', 0, 14826, {0}, 0},{';', 0, 14827, {8641}, 1},{'\0', 0, 14828, {0}, 0}, + {';', 0, 14829, {8640}, 1},{'l', 14832, 14830, {0}, 0},{'\0', 0, 14831, {0}, 0}, + {';', 0, 14832, {10604}, 1},{'\0', 0, 14833, {0}, 0},{';', 0, 14834, {961}, 1}, + {'v', 14837, 14835, {0}, 0},{'\0', 0, 14836, {0}, 0},{';', 0, 14837, {1009}, 1}, + {'\0', 0, 14838, {0}, 0},{'g', 14843, 14839, {0}, 0},{'n', 14999, 14840, {0}, 0}, + {'s', 15003, 14841, {0}, 0},{'\0', 0, 14842, {0}, 0},{'h', 14845, 14843, {0}, 0}, + {'\0', 0, 14844, {0}, 0},{'t', 14847, 14845, {0}, 0},{'\0', 0, 14846, {0}, 0}, + {'a', 14854, 14847, {0}, 0},{'h', 14873, 14848, {0}, 0},{'l', 14900, 14849, {0}, 0}, + {'r', 14937, 14850, {0}, 0},{'s', 14959, 14851, {0}, 0},{'t', 14979, 14852, {0}, 0}, + {'\0', 0, 14853, {0}, 0},{'r', 14856, 14854, {0}, 0},{'\0', 0, 14855, {0}, 0}, + {'r', 14858, 14856, {0}, 0},{'\0', 0, 14857, {0}, 0},{'o', 14860, 14858, {0}, 0}, + {'\0', 0, 14859, {0}, 0},{'w', 14862, 14860, {0}, 0},{'\0', 0, 14861, {0}, 0}, + {';', 0, 14862, {8594}, 1},{'t', 14865, 14863, {0}, 0},{'\0', 0, 14864, {0}, 0}, + {'a', 14867, 14865, {0}, 0},{'\0', 0, 14866, {0}, 0},{'i', 14869, 14867, {0}, 0}, + {'\0', 0, 14868, {0}, 0},{'l', 14871, 14869, {0}, 0},{'\0', 0, 14870, {0}, 0}, + {';', 0, 14871, {8611}, 1},{'\0', 0, 14872, {0}, 0},{'a', 14875, 14873, {0}, 0}, + {'\0', 0, 14874, {0}, 0},{'r', 14877, 14875, {0}, 0},{'\0', 0, 14876, {0}, 0}, + {'p', 14879, 14877, {0}, 0},{'\0', 0, 14878, {0}, 0},{'o', 14881, 14879, {0}, 0}, + {'\0', 0, 14880, {0}, 0},{'o', 14883, 14881, {0}, 0},{'\0', 0, 14882, {0}, 0}, + {'n', 14885, 14883, {0}, 0},{'\0', 0, 14884, {0}, 0},{'d', 14888, 14885, {0}, 0}, + {'u', 14896, 14886, {0}, 0},{'\0', 0, 14887, {0}, 0},{'o', 14890, 14888, {0}, 0}, + {'\0', 0, 14889, {0}, 0},{'w', 14892, 14890, {0}, 0},{'\0', 0, 14891, {0}, 0}, + {'n', 14894, 14892, {0}, 0},{'\0', 0, 14893, {0}, 0},{';', 0, 14894, {8641}, 1}, + {'\0', 0, 14895, {0}, 0},{'p', 14898, 14896, {0}, 0},{'\0', 0, 14897, {0}, 0}, + {';', 0, 14898, {8640}, 1},{'\0', 0, 14899, {0}, 0},{'e', 14902, 14900, {0}, 0}, + {'\0', 0, 14901, {0}, 0},{'f', 14904, 14902, {0}, 0},{'\0', 0, 14903, {0}, 0}, + {'t', 14906, 14904, {0}, 0},{'\0', 0, 14905, {0}, 0},{'a', 14909, 14906, {0}, 0}, + {'h', 14921, 14907, {0}, 0},{'\0', 0, 14908, {0}, 0},{'r', 14911, 14909, {0}, 0}, + {'\0', 0, 14910, {0}, 0},{'r', 14913, 14911, {0}, 0},{'\0', 0, 14912, {0}, 0}, + {'o', 14915, 14913, {0}, 0},{'\0', 0, 14914, {0}, 0},{'w', 14917, 14915, {0}, 0}, + {'\0', 0, 14916, {0}, 0},{'s', 14919, 14917, {0}, 0},{'\0', 0, 14918, {0}, 0}, + {';', 0, 14919, {8644}, 1},{'\0', 0, 14920, {0}, 0},{'a', 14923, 14921, {0}, 0}, + {'\0', 0, 14922, {0}, 0},{'r', 14925, 14923, {0}, 0},{'\0', 0, 14924, {0}, 0}, + {'p', 14927, 14925, {0}, 0},{'\0', 0, 14926, {0}, 0},{'o', 14929, 14927, {0}, 0}, + {'\0', 0, 14928, {0}, 0},{'o', 14931, 14929, {0}, 0},{'\0', 0, 14930, {0}, 0}, + {'n', 14933, 14931, {0}, 0},{'\0', 0, 14932, {0}, 0},{'s', 14935, 14933, {0}, 0}, + {'\0', 0, 14934, {0}, 0},{';', 0, 14935, {8652}, 1},{'\0', 0, 14936, {0}, 0}, + {'i', 14939, 14937, {0}, 0},{'\0', 0, 14938, {0}, 0},{'g', 14941, 14939, {0}, 0}, + {'\0', 0, 14940, {0}, 0},{'h', 14943, 14941, {0}, 0},{'\0', 0, 14942, {0}, 0}, + {'t', 14945, 14943, {0}, 0},{'\0', 0, 14944, {0}, 0},{'a', 14947, 14945, {0}, 0}, + {'\0', 0, 14946, {0}, 0},{'r', 14949, 14947, {0}, 0},{'\0', 0, 14948, {0}, 0}, + {'r', 14951, 14949, {0}, 0},{'\0', 0, 14950, {0}, 0},{'o', 14953, 14951, {0}, 0}, + {'\0', 0, 14952, {0}, 0},{'w', 14955, 14953, {0}, 0},{'\0', 0, 14954, {0}, 0}, + {'s', 14957, 14955, {0}, 0},{'\0', 0, 14956, {0}, 0},{';', 0, 14957, {8649}, 1}, + {'\0', 0, 14958, {0}, 0},{'q', 14961, 14959, {0}, 0},{'\0', 0, 14960, {0}, 0}, + {'u', 14963, 14961, {0}, 0},{'\0', 0, 14962, {0}, 0},{'i', 14965, 14963, {0}, 0}, + {'\0', 0, 14964, {0}, 0},{'g', 14967, 14965, {0}, 0},{'\0', 0, 14966, {0}, 0}, + {'a', 14969, 14967, {0}, 0},{'\0', 0, 14968, {0}, 0},{'r', 14971, 14969, {0}, 0}, + {'\0', 0, 14970, {0}, 0},{'r', 14973, 14971, {0}, 0},{'\0', 0, 14972, {0}, 0}, + {'o', 14975, 14973, {0}, 0},{'\0', 0, 14974, {0}, 0},{'w', 14977, 14975, {0}, 0}, + {'\0', 0, 14976, {0}, 0},{';', 0, 14977, {8605}, 1},{'\0', 0, 14978, {0}, 0}, + {'h', 14981, 14979, {0}, 0},{'\0', 0, 14980, {0}, 0},{'r', 14983, 14981, {0}, 0}, + {'\0', 0, 14982, {0}, 0},{'e', 14985, 14983, {0}, 0},{'\0', 0, 14984, {0}, 0}, + {'e', 14987, 14985, {0}, 0},{'\0', 0, 14986, {0}, 0},{'t', 14989, 14987, {0}, 0}, + {'\0', 0, 14988, {0}, 0},{'i', 14991, 14989, {0}, 0},{'\0', 0, 14990, {0}, 0}, + {'m', 14993, 14991, {0}, 0},{'\0', 0, 14992, {0}, 0},{'e', 14995, 14993, {0}, 0}, + {'\0', 0, 14994, {0}, 0},{'s', 14997, 14995, {0}, 0},{'\0', 0, 14996, {0}, 0}, + {';', 0, 14997, {8908}, 1},{'\0', 0, 14998, {0}, 0},{'g', 15001, 14999, {0}, 0}, + {'\0', 0, 15000, {0}, 0},{';', 0, 15001, {730}, 1},{'\0', 0, 15002, {0}, 0}, + {'i', 15005, 15003, {0}, 0},{'\0', 0, 15004, {0}, 0},{'n', 15007, 15005, {0}, 0}, + {'\0', 0, 15006, {0}, 0},{'g', 15009, 15007, {0}, 0},{'\0', 0, 15008, {0}, 0}, + {'d', 15011, 15009, {0}, 0},{'\0', 0, 15010, {0}, 0},{'o', 15013, 15011, {0}, 0}, + {'\0', 0, 15012, {0}, 0},{'t', 15015, 15013, {0}, 0},{'\0', 0, 15014, {0}, 0}, + {'s', 15017, 15015, {0}, 0},{'\0', 0, 15016, {0}, 0},{'e', 15019, 15017, {0}, 0}, + {'\0', 0, 15018, {0}, 0},{'q', 15021, 15019, {0}, 0},{'\0', 0, 15020, {0}, 0}, + {';', 0, 15021, {8787}, 1},{'\0', 0, 15022, {0}, 0},{'a', 15027, 15023, {0}, 0}, + {'h', 15033, 15024, {0}, 0},{'m', 15039, 15025, {0}, 0},{'\0', 0, 15026, {0}, 0}, + {'r', 15029, 15027, {0}, 0},{'\0', 0, 15028, {0}, 0},{'r', 15031, 15029, {0}, 0}, + {'\0', 0, 15030, {0}, 0},{';', 0, 15031, {8644}, 1},{'\0', 0, 15032, {0}, 0}, + {'a', 15035, 15033, {0}, 0},{'\0', 0, 15034, {0}, 0},{'r', 15037, 15035, {0}, 0}, + {'\0', 0, 15036, {0}, 0},{';', 0, 15037, {8652}, 1},{'\0', 0, 15038, {0}, 0}, + {';', 0, 15039, {8207}, 1},{'\0', 0, 15040, {0}, 0},{'o', 15043, 15041, {0}, 0}, + {'\0', 0, 15042, {0}, 0},{'u', 15045, 15043, {0}, 0},{'\0', 0, 15044, {0}, 0}, + {'s', 15047, 15045, {0}, 0},{'\0', 0, 15046, {0}, 0},{'t', 15049, 15047, {0}, 0}, + {'\0', 0, 15048, {0}, 0},{';', 0, 15049, {9137}, 1},{'a', 15052, 15050, {0}, 0}, + {'\0', 0, 15051, {0}, 0},{'c', 15054, 15052, {0}, 0},{'\0', 0, 15053, {0}, 0}, + {'h', 15056, 15054, {0}, 0},{'\0', 0, 15055, {0}, 0},{'e', 15058, 15056, {0}, 0}, + {'\0', 0, 15057, {0}, 0},{';', 0, 15058, {9137}, 1},{'\0', 0, 15059, {0}, 0}, + {'m', 15062, 15060, {0}, 0},{'\0', 0, 15061, {0}, 0},{'i', 15064, 15062, {0}, 0}, + {'\0', 0, 15063, {0}, 0},{'d', 15066, 15064, {0}, 0},{'\0', 0, 15065, {0}, 0}, + {';', 0, 15066, {10990}, 1},{'\0', 0, 15067, {0}, 0},{'a', 15073, 15068, {0}, 0}, + {'b', 15084, 15069, {0}, 0},{'p', 15090, 15070, {0}, 0},{'t', 15106, 15071, {0}, 0}, + {'\0', 0, 15072, {0}, 0},{'n', 15076, 15073, {0}, 0},{'r', 15080, 15074, {0}, 0}, + {'\0', 0, 15075, {0}, 0},{'g', 15078, 15076, {0}, 0},{'\0', 0, 15077, {0}, 0}, + {';', 0, 15078, {10221}, 1},{'\0', 0, 15079, {0}, 0},{'r', 15082, 15080, {0}, 0}, + {'\0', 0, 15081, {0}, 0},{';', 0, 15082, {8702}, 1},{'\0', 0, 15083, {0}, 0}, + {'r', 15086, 15084, {0}, 0},{'\0', 0, 15085, {0}, 0},{'k', 15088, 15086, {0}, 0}, + {'\0', 0, 15087, {0}, 0},{';', 0, 15088, {10215}, 1},{'\0', 0, 15089, {0}, 0}, + {'a', 15094, 15090, {0}, 0},{'f', 15098, 15091, {0}, 0},{'l', 15100, 15092, {0}, 0}, + {'\0', 0, 15093, {0}, 0},{'r', 15096, 15094, {0}, 0},{'\0', 0, 15095, {0}, 0}, + {';', 0, 15096, {10630}, 1},{'\0', 0, 15097, {0}, 0},{';', 0, 15098, {120163}, 1}, + {'\0', 0, 15099, {0}, 0},{'u', 15102, 15100, {0}, 0},{'\0', 0, 15101, {0}, 0}, + {'s', 15104, 15102, {0}, 0},{'\0', 0, 15103, {0}, 0},{';', 0, 15104, {10798}, 1}, + {'\0', 0, 15105, {0}, 0},{'i', 15108, 15106, {0}, 0},{'\0', 0, 15107, {0}, 0}, + {'m', 15110, 15108, {0}, 0},{'\0', 0, 15109, {0}, 0},{'e', 15112, 15110, {0}, 0}, + {'\0', 0, 15111, {0}, 0},{'s', 15114, 15112, {0}, 0},{'\0', 0, 15113, {0}, 0}, + {';', 0, 15114, {10805}, 1},{'\0', 0, 15115, {0}, 0},{'a', 15119, 15116, {0}, 0}, + {'p', 15128, 15117, {0}, 0},{'\0', 0, 15118, {0}, 0},{'r', 15121, 15119, {0}, 0}, + {'\0', 0, 15120, {0}, 0},{';', 0, 15121, {41}, 1},{'g', 15124, 15122, {0}, 0}, + {'\0', 0, 15123, {0}, 0},{'t', 15126, 15124, {0}, 0},{'\0', 0, 15125, {0}, 0}, + {';', 0, 15126, {10644}, 1},{'\0', 0, 15127, {0}, 0},{'o', 15130, 15128, {0}, 0}, + {'\0', 0, 15129, {0}, 0},{'l', 15132, 15130, {0}, 0},{'\0', 0, 15131, {0}, 0}, + {'i', 15134, 15132, {0}, 0},{'\0', 0, 15133, {0}, 0},{'n', 15136, 15134, {0}, 0}, + {'\0', 0, 15135, {0}, 0},{'t', 15138, 15136, {0}, 0},{'\0', 0, 15137, {0}, 0}, + {';', 0, 15138, {10770}, 1},{'\0', 0, 15139, {0}, 0},{'a', 15142, 15140, {0}, 0}, + {'\0', 0, 15141, {0}, 0},{'r', 15144, 15142, {0}, 0},{'\0', 0, 15143, {0}, 0}, + {'r', 15146, 15144, {0}, 0},{'\0', 0, 15145, {0}, 0},{';', 0, 15146, {8649}, 1}, + {'\0', 0, 15147, {0}, 0},{'a', 15153, 15148, {0}, 0},{'c', 15161, 15149, {0}, 0}, + {'h', 15165, 15150, {0}, 0},{'q', 15167, 15151, {0}, 0},{'\0', 0, 15152, {0}, 0}, + {'q', 15155, 15153, {0}, 0},{'\0', 0, 15154, {0}, 0},{'u', 15157, 15155, {0}, 0}, + {'\0', 0, 15156, {0}, 0},{'o', 15159, 15157, {0}, 0},{'\0', 0, 15158, {0}, 0}, + {';', 0, 15159, {8250}, 1},{'\0', 0, 15160, {0}, 0},{'r', 15163, 15161, {0}, 0}, + {'\0', 0, 15162, {0}, 0},{';', 0, 15163, {120007}, 1},{'\0', 0, 15164, {0}, 0}, + {';', 0, 15165, {8625}, 1},{'\0', 0, 15166, {0}, 0},{'b', 15170, 15167, {0}, 0}, + {'u', 15172, 15168, {0}, 0},{'\0', 0, 15169, {0}, 0},{';', 0, 15170, {93}, 1}, + {'\0', 0, 15171, {0}, 0},{'o', 15174, 15172, {0}, 0},{'\0', 0, 15173, {0}, 0}, + {';', 0, 15174, {8217}, 1},{'r', 15177, 15175, {0}, 0},{'\0', 0, 15176, {0}, 0}, + {';', 0, 15177, {8217}, 1},{'\0', 0, 15178, {0}, 0},{'h', 15183, 15179, {0}, 0}, + {'i', 15191, 15180, {0}, 0},{'r', 15199, 15181, {0}, 0},{'\0', 0, 15182, {0}, 0}, + {'r', 15185, 15183, {0}, 0},{'\0', 0, 15184, {0}, 0},{'e', 15187, 15185, {0}, 0}, + {'\0', 0, 15186, {0}, 0},{'e', 15189, 15187, {0}, 0},{'\0', 0, 15188, {0}, 0}, + {';', 0, 15189, {8908}, 1},{'\0', 0, 15190, {0}, 0},{'m', 15193, 15191, {0}, 0}, + {'\0', 0, 15192, {0}, 0},{'e', 15195, 15193, {0}, 0},{'\0', 0, 15194, {0}, 0}, + {'s', 15197, 15195, {0}, 0},{'\0', 0, 15196, {0}, 0},{';', 0, 15197, {8906}, 1}, + {'\0', 0, 15198, {0}, 0},{'i', 15201, 15199, {0}, 0},{'\0', 0, 15200, {0}, 0}, + {';', 0, 15201, {9657}, 1},{'e', 15206, 15202, {0}, 0},{'f', 15208, 15203, {0}, 0}, + {'l', 15210, 15204, {0}, 0},{'\0', 0, 15205, {0}, 0},{';', 0, 15206, {8885}, 1}, + {'\0', 0, 15207, {0}, 0},{';', 0, 15208, {9656}, 1},{'\0', 0, 15209, {0}, 0}, + {'t', 15212, 15210, {0}, 0},{'\0', 0, 15211, {0}, 0},{'r', 15214, 15212, {0}, 0}, + {'\0', 0, 15213, {0}, 0},{'i', 15216, 15214, {0}, 0},{'\0', 0, 15215, {0}, 0}, + {';', 0, 15216, {10702}, 1},{'\0', 0, 15217, {0}, 0},{'l', 15220, 15218, {0}, 0}, + {'\0', 0, 15219, {0}, 0},{'u', 15222, 15220, {0}, 0},{'\0', 0, 15221, {0}, 0}, + {'h', 15224, 15222, {0}, 0},{'\0', 0, 15223, {0}, 0},{'a', 15226, 15224, {0}, 0}, + {'\0', 0, 15225, {0}, 0},{'r', 15228, 15226, {0}, 0},{'\0', 0, 15227, {0}, 0}, + {';', 0, 15228, {10600}, 1},{'\0', 0, 15229, {0}, 0},{';', 0, 15230, {8478}, 1}, + {'\0', 0, 15231, {0}, 0},{'a', 15252, 15232, {0}, 0},{'b', 15262, 15233, {0}, 0}, + {'c', 15270, 15234, {0}, 0},{'d', 15351, 15235, {0}, 0},{'e', 15363, 15236, {0}, 0}, + {'f', 15428, 15237, {0}, 0},{'h', 15439, 15238, {0}, 0},{'i', 15492, 15239, {0}, 0}, + {'l', 15557, 15240, {0}, 0},{'m', 15565, 15241, {0}, 0},{'o', 15628, 15242, {0}, 0}, + {'p', 15654, 15243, {0}, 0},{'q', 15674, 15244, {0}, 0},{'r', 15749, 15245, {0}, 0}, + {'s', 15757, 15246, {0}, 0},{'t', 15790, 15247, {0}, 0},{'u', 15838, 15248, {0}, 0}, + {'w', 16143, 15249, {0}, 0},{'z', 16177, 15250, {0}, 0},{'\0', 0, 15251, {0}, 0}, + {'c', 15254, 15252, {0}, 0},{'\0', 0, 15253, {0}, 0},{'u', 15256, 15254, {0}, 0}, + {'\0', 0, 15255, {0}, 0},{'t', 15258, 15256, {0}, 0},{'\0', 0, 15257, {0}, 0}, + {'e', 15260, 15258, {0}, 0},{'\0', 0, 15259, {0}, 0},{';', 0, 15260, {347}, 1}, + {'\0', 0, 15261, {0}, 0},{'q', 15264, 15262, {0}, 0},{'\0', 0, 15263, {0}, 0}, + {'u', 15266, 15264, {0}, 0},{'\0', 0, 15265, {0}, 0},{'o', 15268, 15266, {0}, 0}, + {'\0', 0, 15267, {0}, 0},{';', 0, 15268, {8218}, 1},{'\0', 0, 15269, {0}, 0}, + {';', 0, 15270, {8827}, 1},{'E', 15281, 15271, {0}, 0},{'a', 15283, 15272, {0}, 0}, + {'c', 15294, 15273, {0}, 0},{'e', 15300, 15274, {0}, 0},{'i', 15309, 15275, {0}, 0}, + {'n', 15315, 15276, {0}, 0},{'p', 15331, 15277, {0}, 0},{'s', 15343, 15278, {0}, 0}, + {'y', 15349, 15279, {0}, 0},{'\0', 0, 15280, {0}, 0},{';', 0, 15281, {10932}, 1}, + {'\0', 0, 15282, {0}, 0},{'p', 15286, 15283, {0}, 0},{'r', 15288, 15284, {0}, 0}, + {'\0', 0, 15285, {0}, 0},{';', 0, 15286, {10936}, 1},{'\0', 0, 15287, {0}, 0}, + {'o', 15290, 15288, {0}, 0},{'\0', 0, 15289, {0}, 0},{'n', 15292, 15290, {0}, 0}, + {'\0', 0, 15291, {0}, 0},{';', 0, 15292, {353}, 1},{'\0', 0, 15293, {0}, 0}, + {'u', 15296, 15294, {0}, 0},{'\0', 0, 15295, {0}, 0},{'e', 15298, 15296, {0}, 0}, + {'\0', 0, 15297, {0}, 0},{';', 0, 15298, {8829}, 1},{'\0', 0, 15299, {0}, 0}, + {';', 0, 15300, {10928}, 1},{'d', 15303, 15301, {0}, 0},{'\0', 0, 15302, {0}, 0}, + {'i', 15305, 15303, {0}, 0},{'\0', 0, 15304, {0}, 0},{'l', 15307, 15305, {0}, 0}, + {'\0', 0, 15306, {0}, 0},{';', 0, 15307, {351}, 1},{'\0', 0, 15308, {0}, 0}, + {'r', 15311, 15309, {0}, 0},{'\0', 0, 15310, {0}, 0},{'c', 15313, 15311, {0}, 0}, + {'\0', 0, 15312, {0}, 0},{';', 0, 15313, {349}, 1},{'\0', 0, 15314, {0}, 0}, + {'E', 15319, 15315, {0}, 0},{'a', 15321, 15316, {0}, 0},{'s', 15325, 15317, {0}, 0}, + {'\0', 0, 15318, {0}, 0},{';', 0, 15319, {10934}, 1},{'\0', 0, 15320, {0}, 0}, + {'p', 15323, 15321, {0}, 0},{'\0', 0, 15322, {0}, 0},{';', 0, 15323, {10938}, 1}, + {'\0', 0, 15324, {0}, 0},{'i', 15327, 15325, {0}, 0},{'\0', 0, 15326, {0}, 0}, + {'m', 15329, 15327, {0}, 0},{'\0', 0, 15328, {0}, 0},{';', 0, 15329, {8937}, 1}, + {'\0', 0, 15330, {0}, 0},{'o', 15333, 15331, {0}, 0},{'\0', 0, 15332, {0}, 0}, + {'l', 15335, 15333, {0}, 0},{'\0', 0, 15334, {0}, 0},{'i', 15337, 15335, {0}, 0}, + {'\0', 0, 15336, {0}, 0},{'n', 15339, 15337, {0}, 0},{'\0', 0, 15338, {0}, 0}, + {'t', 15341, 15339, {0}, 0},{'\0', 0, 15340, {0}, 0},{';', 0, 15341, {10771}, 1}, + {'\0', 0, 15342, {0}, 0},{'i', 15345, 15343, {0}, 0},{'\0', 0, 15344, {0}, 0}, + {'m', 15347, 15345, {0}, 0},{'\0', 0, 15346, {0}, 0},{';', 0, 15347, {8831}, 1}, + {'\0', 0, 15348, {0}, 0},{';', 0, 15349, {1089}, 1},{'\0', 0, 15350, {0}, 0}, + {'o', 15353, 15351, {0}, 0},{'\0', 0, 15352, {0}, 0},{'t', 15355, 15353, {0}, 0}, + {'\0', 0, 15354, {0}, 0},{';', 0, 15355, {8901}, 1},{'b', 15359, 15356, {0}, 0}, + {'e', 15361, 15357, {0}, 0},{'\0', 0, 15358, {0}, 0},{';', 0, 15359, {8865}, 1}, + {'\0', 0, 15360, {0}, 0},{';', 0, 15361, {10854}, 1},{'\0', 0, 15362, {0}, 0}, + {'A', 15371, 15363, {0}, 0},{'a', 15377, 15364, {0}, 0},{'c', 15393, 15365, {0}, 0}, + {'m', 15397, 15366, {0}, 0},{'s', 15401, 15367, {0}, 0},{'t', 15409, 15368, {0}, 0}, + {'x', 15424, 15369, {0}, 0},{'\0', 0, 15370, {0}, 0},{'r', 15373, 15371, {0}, 0}, + {'\0', 0, 15372, {0}, 0},{'r', 15375, 15373, {0}, 0},{'\0', 0, 15374, {0}, 0}, + {';', 0, 15375, {8664}, 1},{'\0', 0, 15376, {0}, 0},{'r', 15379, 15377, {0}, 0}, + {'\0', 0, 15378, {0}, 0},{'h', 15382, 15379, {0}, 0},{'r', 15386, 15380, {0}, 0}, + {'\0', 0, 15381, {0}, 0},{'k', 15384, 15382, {0}, 0},{'\0', 0, 15383, {0}, 0}, + {';', 0, 15384, {10533}, 1},{'\0', 0, 15385, {0}, 0},{';', 0, 15386, {8600}, 1}, + {'o', 15389, 15387, {0}, 0},{'\0', 0, 15388, {0}, 0},{'w', 15391, 15389, {0}, 0}, + {'\0', 0, 15390, {0}, 0},{';', 0, 15391, {8600}, 1},{'\0', 0, 15392, {0}, 0}, + {'t', 15395, 15393, {167}, 1},{'\0', 0, 15394, {0}, 0},{';', 0, 15395, {167}, 1}, + {'\0', 0, 15396, {0}, 0},{'i', 15399, 15397, {0}, 0},{'\0', 0, 15398, {0}, 0}, + {';', 0, 15399, {59}, 1},{'\0', 0, 15400, {0}, 0},{'w', 15403, 15401, {0}, 0}, + {'\0', 0, 15402, {0}, 0},{'a', 15405, 15403, {0}, 0},{'\0', 0, 15404, {0}, 0}, + {'r', 15407, 15405, {0}, 0},{'\0', 0, 15406, {0}, 0},{';', 0, 15407, {10537}, 1}, + {'\0', 0, 15408, {0}, 0},{'m', 15411, 15409, {0}, 0},{'\0', 0, 15410, {0}, 0}, + {'i', 15414, 15411, {0}, 0},{'n', 15422, 15412, {0}, 0},{'\0', 0, 15413, {0}, 0}, + {'n', 15416, 15414, {0}, 0},{'\0', 0, 15415, {0}, 0},{'u', 15418, 15416, {0}, 0}, + {'\0', 0, 15417, {0}, 0},{'s', 15420, 15418, {0}, 0},{'\0', 0, 15419, {0}, 0}, + {';', 0, 15420, {8726}, 1},{'\0', 0, 15421, {0}, 0},{';', 0, 15422, {8726}, 1}, + {'\0', 0, 15423, {0}, 0},{'t', 15426, 15424, {0}, 0},{'\0', 0, 15425, {0}, 0}, + {';', 0, 15426, {10038}, 1},{'\0', 0, 15427, {0}, 0},{'r', 15430, 15428, {0}, 0}, + {'\0', 0, 15429, {0}, 0},{';', 0, 15430, {120112}, 1},{'o', 15433, 15431, {0}, 0}, + {'\0', 0, 15432, {0}, 0},{'w', 15435, 15433, {0}, 0},{'\0', 0, 15434, {0}, 0}, + {'n', 15437, 15435, {0}, 0},{'\0', 0, 15436, {0}, 0},{';', 0, 15437, {8994}, 1}, + {'\0', 0, 15438, {0}, 0},{'a', 15444, 15439, {0}, 0},{'c', 15450, 15440, {0}, 0}, + {'o', 15461, 15441, {0}, 0},{'y', 15490, 15442, {173}, 1},{'\0', 0, 15443, {0}, 0}, + {'r', 15446, 15444, {0}, 0},{'\0', 0, 15445, {0}, 0},{'p', 15448, 15446, {0}, 0}, + {'\0', 0, 15447, {0}, 0},{';', 0, 15448, {9839}, 1},{'\0', 0, 15449, {0}, 0}, + {'h', 15453, 15450, {0}, 0},{'y', 15459, 15451, {0}, 0},{'\0', 0, 15452, {0}, 0}, + {'c', 15455, 15453, {0}, 0},{'\0', 0, 15454, {0}, 0},{'y', 15457, 15455, {0}, 0}, + {'\0', 0, 15456, {0}, 0},{';', 0, 15457, {1097}, 1},{'\0', 0, 15458, {0}, 0}, + {';', 0, 15459, {1096}, 1},{'\0', 0, 15460, {0}, 0},{'r', 15463, 15461, {0}, 0}, + {'\0', 0, 15462, {0}, 0},{'t', 15465, 15463, {0}, 0},{'\0', 0, 15464, {0}, 0}, + {'m', 15468, 15465, {0}, 0},{'p', 15474, 15466, {0}, 0},{'\0', 0, 15467, {0}, 0}, + {'i', 15470, 15468, {0}, 0},{'\0', 0, 15469, {0}, 0},{'d', 15472, 15470, {0}, 0}, + {'\0', 0, 15471, {0}, 0},{';', 0, 15472, {8739}, 1},{'\0', 0, 15473, {0}, 0}, + {'a', 15476, 15474, {0}, 0},{'\0', 0, 15475, {0}, 0},{'r', 15478, 15476, {0}, 0}, + {'\0', 0, 15477, {0}, 0},{'a', 15480, 15478, {0}, 0},{'\0', 0, 15479, {0}, 0}, + {'l', 15482, 15480, {0}, 0},{'\0', 0, 15481, {0}, 0},{'l', 15484, 15482, {0}, 0}, + {'\0', 0, 15483, {0}, 0},{'e', 15486, 15484, {0}, 0},{'\0', 0, 15485, {0}, 0}, + {'l', 15488, 15486, {0}, 0},{'\0', 0, 15487, {0}, 0},{';', 0, 15488, {8741}, 1}, + {'\0', 0, 15489, {0}, 0},{';', 0, 15490, {173}, 1},{'\0', 0, 15491, {0}, 0}, + {'g', 15495, 15492, {0}, 0},{'m', 15507, 15493, {0}, 0},{'\0', 0, 15494, {0}, 0}, + {'m', 15497, 15495, {0}, 0},{'\0', 0, 15496, {0}, 0},{'a', 15499, 15497, {0}, 0}, + {'\0', 0, 15498, {0}, 0},{';', 0, 15499, {963}, 1},{'f', 15503, 15500, {0}, 0}, + {'v', 15505, 15501, {0}, 0},{'\0', 0, 15502, {0}, 0},{';', 0, 15503, {962}, 1}, + {'\0', 0, 15504, {0}, 0},{';', 0, 15505, {962}, 1},{'\0', 0, 15506, {0}, 0}, + {';', 0, 15507, {8764}, 1},{'d', 15516, 15508, {0}, 0},{'e', 15522, 15509, {0}, 0}, + {'g', 15527, 15510, {0}, 0},{'l', 15532, 15511, {0}, 0},{'n', 15537, 15512, {0}, 0}, + {'p', 15541, 15513, {0}, 0},{'r', 15549, 15514, {0}, 0},{'\0', 0, 15515, {0}, 0}, + {'o', 15518, 15516, {0}, 0},{'\0', 0, 15517, {0}, 0},{'t', 15520, 15518, {0}, 0}, + {'\0', 0, 15519, {0}, 0},{';', 0, 15520, {10858}, 1},{'\0', 0, 15521, {0}, 0}, + {';', 0, 15522, {8771}, 1},{'q', 15525, 15523, {0}, 0},{'\0', 0, 15524, {0}, 0}, + {';', 0, 15525, {8771}, 1},{'\0', 0, 15526, {0}, 0},{';', 0, 15527, {10910}, 1}, + {'E', 15530, 15528, {0}, 0},{'\0', 0, 15529, {0}, 0},{';', 0, 15530, {10912}, 1}, + {'\0', 0, 15531, {0}, 0},{';', 0, 15532, {10909}, 1},{'E', 15535, 15533, {0}, 0}, + {'\0', 0, 15534, {0}, 0},{';', 0, 15535, {10911}, 1},{'\0', 0, 15536, {0}, 0}, + {'e', 15539, 15537, {0}, 0},{'\0', 0, 15538, {0}, 0},{';', 0, 15539, {8774}, 1}, + {'\0', 0, 15540, {0}, 0},{'l', 15543, 15541, {0}, 0},{'\0', 0, 15542, {0}, 0}, + {'u', 15545, 15543, {0}, 0},{'\0', 0, 15544, {0}, 0},{'s', 15547, 15545, {0}, 0}, + {'\0', 0, 15546, {0}, 0},{';', 0, 15547, {10788}, 1},{'\0', 0, 15548, {0}, 0}, + {'a', 15551, 15549, {0}, 0},{'\0', 0, 15550, {0}, 0},{'r', 15553, 15551, {0}, 0}, + {'\0', 0, 15552, {0}, 0},{'r', 15555, 15553, {0}, 0},{'\0', 0, 15554, {0}, 0}, + {';', 0, 15555, {10610}, 1},{'\0', 0, 15556, {0}, 0},{'a', 15559, 15557, {0}, 0}, + {'\0', 0, 15558, {0}, 0},{'r', 15561, 15559, {0}, 0},{'\0', 0, 15560, {0}, 0}, + {'r', 15563, 15561, {0}, 0},{'\0', 0, 15562, {0}, 0},{';', 0, 15563, {8592}, 1}, + {'\0', 0, 15564, {0}, 0},{'a', 15570, 15565, {0}, 0},{'e', 15599, 15566, {0}, 0}, + {'i', 15611, 15567, {0}, 0},{'t', 15620, 15568, {0}, 0},{'\0', 0, 15569, {0}, 0}, + {'l', 15573, 15570, {0}, 0},{'s', 15593, 15571, {0}, 0},{'\0', 0, 15572, {0}, 0}, + {'l', 15575, 15573, {0}, 0},{'\0', 0, 15574, {0}, 0},{'s', 15577, 15575, {0}, 0}, + {'\0', 0, 15576, {0}, 0},{'e', 15579, 15577, {0}, 0},{'\0', 0, 15578, {0}, 0}, + {'t', 15581, 15579, {0}, 0},{'\0', 0, 15580, {0}, 0},{'m', 15583, 15581, {0}, 0}, + {'\0', 0, 15582, {0}, 0},{'i', 15585, 15583, {0}, 0},{'\0', 0, 15584, {0}, 0}, + {'n', 15587, 15585, {0}, 0},{'\0', 0, 15586, {0}, 0},{'u', 15589, 15587, {0}, 0}, + {'\0', 0, 15588, {0}, 0},{'s', 15591, 15589, {0}, 0},{'\0', 0, 15590, {0}, 0}, + {';', 0, 15591, {8726}, 1},{'\0', 0, 15592, {0}, 0},{'h', 15595, 15593, {0}, 0}, + {'\0', 0, 15594, {0}, 0},{'p', 15597, 15595, {0}, 0},{'\0', 0, 15596, {0}, 0}, + {';', 0, 15597, {10803}, 1},{'\0', 0, 15598, {0}, 0},{'p', 15601, 15599, {0}, 0}, + {'\0', 0, 15600, {0}, 0},{'a', 15603, 15601, {0}, 0},{'\0', 0, 15602, {0}, 0}, + {'r', 15605, 15603, {0}, 0},{'\0', 0, 15604, {0}, 0},{'s', 15607, 15605, {0}, 0}, + {'\0', 0, 15606, {0}, 0},{'l', 15609, 15607, {0}, 0},{'\0', 0, 15608, {0}, 0}, + {';', 0, 15609, {10724}, 1},{'\0', 0, 15610, {0}, 0},{'d', 15614, 15611, {0}, 0}, + {'l', 15616, 15612, {0}, 0},{'\0', 0, 15613, {0}, 0},{';', 0, 15614, {8739}, 1}, + {'\0', 0, 15615, {0}, 0},{'e', 15618, 15616, {0}, 0},{'\0', 0, 15617, {0}, 0}, + {';', 0, 15618, {8995}, 1},{'\0', 0, 15619, {0}, 0},{';', 0, 15620, {10922}, 1}, + {'e', 15623, 15621, {0}, 0},{'\0', 0, 15622, {0}, 0},{';', 0, 15623, {10924}, 1}, + {'s', 15626, 15624, {0}, 0},{'\0', 0, 15625, {0}, 0},{';', 0, 15626, {10924,65024}, 2}, + {'\0', 0, 15627, {0}, 0},{'f', 15632, 15628, {0}, 0},{'l', 15640, 15629, {0}, 0}, + {'p', 15650, 15630, {0}, 0},{'\0', 0, 15631, {0}, 0},{'t', 15634, 15632, {0}, 0}, + {'\0', 0, 15633, {0}, 0},{'c', 15636, 15634, {0}, 0},{'\0', 0, 15635, {0}, 0}, + {'y', 15638, 15636, {0}, 0},{'\0', 0, 15637, {0}, 0},{';', 0, 15638, {1100}, 1}, + {'\0', 0, 15639, {0}, 0},{';', 0, 15640, {47}, 1},{'b', 15643, 15641, {0}, 0}, + {'\0', 0, 15642, {0}, 0},{';', 0, 15643, {10692}, 1},{'a', 15646, 15644, {0}, 0}, + {'\0', 0, 15645, {0}, 0},{'r', 15648, 15646, {0}, 0},{'\0', 0, 15647, {0}, 0}, + {';', 0, 15648, {9023}, 1},{'\0', 0, 15649, {0}, 0},{'f', 15652, 15650, {0}, 0}, + {'\0', 0, 15651, {0}, 0},{';', 0, 15652, {120164}, 1},{'\0', 0, 15653, {0}, 0}, + {'a', 15656, 15654, {0}, 0},{'\0', 0, 15655, {0}, 0},{'d', 15659, 15656, {0}, 0}, + {'r', 15672, 15657, {0}, 0},{'\0', 0, 15658, {0}, 0},{'e', 15661, 15659, {0}, 0}, + {'\0', 0, 15660, {0}, 0},{'s', 15663, 15661, {0}, 0},{'\0', 0, 15662, {0}, 0}, + {';', 0, 15663, {9824}, 1},{'u', 15666, 15664, {0}, 0},{'\0', 0, 15665, {0}, 0}, + {'i', 15668, 15666, {0}, 0},{'\0', 0, 15667, {0}, 0},{'t', 15670, 15668, {0}, 0}, + {'\0', 0, 15669, {0}, 0},{';', 0, 15670, {9824}, 1},{'\0', 0, 15671, {0}, 0}, + {';', 0, 15672, {8741}, 1},{'\0', 0, 15673, {0}, 0},{'c', 15678, 15674, {0}, 0}, + {'s', 15695, 15675, {0}, 0},{'u', 15734, 15676, {0}, 0},{'\0', 0, 15677, {0}, 0}, + {'a', 15681, 15678, {0}, 0},{'u', 15688, 15679, {0}, 0},{'\0', 0, 15680, {0}, 0}, + {'p', 15683, 15681, {0}, 0},{'\0', 0, 15682, {0}, 0},{';', 0, 15683, {8851}, 1}, + {'s', 15686, 15684, {0}, 0},{'\0', 0, 15685, {0}, 0},{';', 0, 15686, {8851,65024}, 2}, + {'\0', 0, 15687, {0}, 0},{'p', 15690, 15688, {0}, 0},{'\0', 0, 15689, {0}, 0}, + {';', 0, 15690, {8852}, 1},{'s', 15693, 15691, {0}, 0},{'\0', 0, 15692, {0}, 0}, + {';', 0, 15693, {8852,65024}, 2},{'\0', 0, 15694, {0}, 0},{'u', 15697, 15695, {0}, 0}, + {'\0', 0, 15696, {0}, 0},{'b', 15700, 15697, {0}, 0},{'p', 15717, 15698, {0}, 0}, + {'\0', 0, 15699, {0}, 0},{';', 0, 15700, {8847}, 1},{'e', 15704, 15701, {0}, 0}, + {'s', 15706, 15702, {0}, 0},{'\0', 0, 15703, {0}, 0},{';', 0, 15704, {8849}, 1}, + {'\0', 0, 15705, {0}, 0},{'e', 15708, 15706, {0}, 0},{'\0', 0, 15707, {0}, 0}, + {'t', 15710, 15708, {0}, 0},{'\0', 0, 15709, {0}, 0},{';', 0, 15710, {8847}, 1}, + {'e', 15713, 15711, {0}, 0},{'\0', 0, 15712, {0}, 0},{'q', 15715, 15713, {0}, 0}, + {'\0', 0, 15714, {0}, 0},{';', 0, 15715, {8849}, 1},{'\0', 0, 15716, {0}, 0}, + {';', 0, 15717, {8848}, 1},{'e', 15721, 15718, {0}, 0},{'s', 15723, 15719, {0}, 0}, + {'\0', 0, 15720, {0}, 0},{';', 0, 15721, {8850}, 1},{'\0', 0, 15722, {0}, 0}, + {'e', 15725, 15723, {0}, 0},{'\0', 0, 15724, {0}, 0},{'t', 15727, 15725, {0}, 0}, + {'\0', 0, 15726, {0}, 0},{';', 0, 15727, {8848}, 1},{'e', 15730, 15728, {0}, 0}, + {'\0', 0, 15729, {0}, 0},{'q', 15732, 15730, {0}, 0},{'\0', 0, 15731, {0}, 0}, + {';', 0, 15732, {8850}, 1},{'\0', 0, 15733, {0}, 0},{';', 0, 15734, {9633}, 1}, + {'a', 15738, 15735, {0}, 0},{'f', 15747, 15736, {0}, 0},{'\0', 0, 15737, {0}, 0}, + {'r', 15740, 15738, {0}, 0},{'\0', 0, 15739, {0}, 0},{'e', 15743, 15740, {0}, 0}, + {'f', 15745, 15741, {0}, 0},{'\0', 0, 15742, {0}, 0},{';', 0, 15743, {9633}, 1}, + {'\0', 0, 15744, {0}, 0},{';', 0, 15745, {9642}, 1},{'\0', 0, 15746, {0}, 0}, + {';', 0, 15747, {9642}, 1},{'\0', 0, 15748, {0}, 0},{'a', 15751, 15749, {0}, 0}, + {'\0', 0, 15750, {0}, 0},{'r', 15753, 15751, {0}, 0},{'\0', 0, 15752, {0}, 0}, + {'r', 15755, 15753, {0}, 0},{'\0', 0, 15754, {0}, 0},{';', 0, 15755, {8594}, 1}, + {'\0', 0, 15756, {0}, 0},{'c', 15762, 15757, {0}, 0},{'e', 15766, 15758, {0}, 0}, + {'m', 15774, 15759, {0}, 0},{'t', 15782, 15760, {0}, 0},{'\0', 0, 15761, {0}, 0}, + {'r', 15764, 15762, {0}, 0},{'\0', 0, 15763, {0}, 0},{';', 0, 15764, {120008}, 1}, + {'\0', 0, 15765, {0}, 0},{'t', 15768, 15766, {0}, 0},{'\0', 0, 15767, {0}, 0}, + {'m', 15770, 15768, {0}, 0},{'\0', 0, 15769, {0}, 0},{'n', 15772, 15770, {0}, 0}, + {'\0', 0, 15771, {0}, 0},{';', 0, 15772, {8726}, 1},{'\0', 0, 15773, {0}, 0}, + {'i', 15776, 15774, {0}, 0},{'\0', 0, 15775, {0}, 0},{'l', 15778, 15776, {0}, 0}, + {'\0', 0, 15777, {0}, 0},{'e', 15780, 15778, {0}, 0},{'\0', 0, 15779, {0}, 0}, + {';', 0, 15780, {8995}, 1},{'\0', 0, 15781, {0}, 0},{'a', 15784, 15782, {0}, 0}, + {'\0', 0, 15783, {0}, 0},{'r', 15786, 15784, {0}, 0},{'\0', 0, 15785, {0}, 0}, + {'f', 15788, 15786, {0}, 0},{'\0', 0, 15787, {0}, 0},{';', 0, 15788, {8902}, 1}, + {'\0', 0, 15789, {0}, 0},{'a', 15793, 15790, {0}, 0},{'r', 15800, 15791, {0}, 0}, + {'\0', 0, 15792, {0}, 0},{'r', 15795, 15793, {0}, 0},{'\0', 0, 15794, {0}, 0}, + {';', 0, 15795, {9734}, 1},{'f', 15798, 15796, {0}, 0},{'\0', 0, 15797, {0}, 0}, + {';', 0, 15798, {9733}, 1},{'\0', 0, 15799, {0}, 0},{'a', 15803, 15800, {0}, 0}, + {'n', 15834, 15801, {0}, 0},{'\0', 0, 15802, {0}, 0},{'i', 15805, 15803, {0}, 0}, + {'\0', 0, 15804, {0}, 0},{'g', 15807, 15805, {0}, 0},{'\0', 0, 15806, {0}, 0}, + {'h', 15809, 15807, {0}, 0},{'\0', 0, 15808, {0}, 0},{'t', 15811, 15809, {0}, 0}, + {'\0', 0, 15810, {0}, 0},{'e', 15814, 15811, {0}, 0},{'p', 15828, 15812, {0}, 0}, + {'\0', 0, 15813, {0}, 0},{'p', 15816, 15814, {0}, 0},{'\0', 0, 15815, {0}, 0}, + {'s', 15818, 15816, {0}, 0},{'\0', 0, 15817, {0}, 0},{'i', 15820, 15818, {0}, 0}, + {'\0', 0, 15819, {0}, 0},{'l', 15822, 15820, {0}, 0},{'\0', 0, 15821, {0}, 0}, + {'o', 15824, 15822, {0}, 0},{'\0', 0, 15823, {0}, 0},{'n', 15826, 15824, {0}, 0}, + {'\0', 0, 15825, {0}, 0},{';', 0, 15826, {1013}, 1},{'\0', 0, 15827, {0}, 0}, + {'h', 15830, 15828, {0}, 0},{'\0', 0, 15829, {0}, 0},{'i', 15832, 15830, {0}, 0}, + {'\0', 0, 15831, {0}, 0},{';', 0, 15832, {981}, 1},{'\0', 0, 15833, {0}, 0}, + {'s', 15836, 15834, {0}, 0},{'\0', 0, 15835, {0}, 0},{';', 0, 15836, {175}, 1}, + {'\0', 0, 15837, {0}, 0},{'b', 15844, 15838, {0}, 0},{'c', 15939, 15839, {0}, 0}, + {'m', 16012, 15840, {0}, 0},{'n', 16014, 15841, {0}, 0},{'p', 16018, 15842, {0}, 0}, + {'\0', 0, 15843, {0}, 0},{';', 0, 15844, {8834}, 1},{'E', 15854, 15845, {0}, 0}, + {'d', 15856, 15846, {0}, 0},{'e', 15862, 15847, {0}, 0},{'m', 15871, 15848, {0}, 0}, + {'n', 15879, 15849, {0}, 0},{'p', 15886, 15850, {0}, 0},{'r', 15894, 15851, {0}, 0}, + {'s', 15902, 15852, {0}, 0},{'\0', 0, 15853, {0}, 0},{';', 0, 15854, {10949}, 1}, + {'\0', 0, 15855, {0}, 0},{'o', 15858, 15856, {0}, 0},{'\0', 0, 15857, {0}, 0}, + {'t', 15860, 15858, {0}, 0},{'\0', 0, 15859, {0}, 0},{';', 0, 15860, {10941}, 1}, + {'\0', 0, 15861, {0}, 0},{';', 0, 15862, {8838}, 1},{'d', 15865, 15863, {0}, 0}, + {'\0', 0, 15864, {0}, 0},{'o', 15867, 15865, {0}, 0},{'\0', 0, 15866, {0}, 0}, + {'t', 15869, 15867, {0}, 0},{'\0', 0, 15868, {0}, 0},{';', 0, 15869, {10947}, 1}, + {'\0', 0, 15870, {0}, 0},{'u', 15873, 15871, {0}, 0},{'\0', 0, 15872, {0}, 0}, + {'l', 15875, 15873, {0}, 0},{'\0', 0, 15874, {0}, 0},{'t', 15877, 15875, {0}, 0}, + {'\0', 0, 15876, {0}, 0},{';', 0, 15877, {10945}, 1},{'\0', 0, 15878, {0}, 0}, + {'E', 15882, 15879, {0}, 0},{'e', 15884, 15880, {0}, 0},{'\0', 0, 15881, {0}, 0}, + {';', 0, 15882, {10955}, 1},{'\0', 0, 15883, {0}, 0},{';', 0, 15884, {8842}, 1}, + {'\0', 0, 15885, {0}, 0},{'l', 15888, 15886, {0}, 0},{'\0', 0, 15887, {0}, 0}, + {'u', 15890, 15888, {0}, 0},{'\0', 0, 15889, {0}, 0},{'s', 15892, 15890, {0}, 0}, + {'\0', 0, 15891, {0}, 0},{';', 0, 15892, {10943}, 1},{'\0', 0, 15893, {0}, 0}, + {'a', 15896, 15894, {0}, 0},{'\0', 0, 15895, {0}, 0},{'r', 15898, 15896, {0}, 0}, + {'\0', 0, 15897, {0}, 0},{'r', 15900, 15898, {0}, 0},{'\0', 0, 15899, {0}, 0}, + {';', 0, 15900, {10617}, 1},{'\0', 0, 15901, {0}, 0},{'e', 15906, 15902, {0}, 0}, + {'i', 15928, 15903, {0}, 0},{'u', 15932, 15904, {0}, 0},{'\0', 0, 15905, {0}, 0}, + {'t', 15908, 15906, {0}, 0},{'\0', 0, 15907, {0}, 0},{';', 0, 15908, {8834}, 1}, + {'e', 15912, 15909, {0}, 0},{'n', 15919, 15910, {0}, 0},{'\0', 0, 15911, {0}, 0}, + {'q', 15914, 15912, {0}, 0},{'\0', 0, 15913, {0}, 0},{';', 0, 15914, {8838}, 1}, + {'q', 15917, 15915, {0}, 0},{'\0', 0, 15916, {0}, 0},{';', 0, 15917, {10949}, 1}, + {'\0', 0, 15918, {0}, 0},{'e', 15921, 15919, {0}, 0},{'\0', 0, 15920, {0}, 0}, + {'q', 15923, 15921, {0}, 0},{'\0', 0, 15922, {0}, 0},{';', 0, 15923, {8842}, 1}, + {'q', 15926, 15924, {0}, 0},{'\0', 0, 15925, {0}, 0},{';', 0, 15926, {10955}, 1}, + {'\0', 0, 15927, {0}, 0},{'m', 15930, 15928, {0}, 0},{'\0', 0, 15929, {0}, 0}, + {';', 0, 15930, {10951}, 1},{'\0', 0, 15931, {0}, 0},{'b', 15935, 15932, {0}, 0}, + {'p', 15937, 15933, {0}, 0},{'\0', 0, 15934, {0}, 0},{';', 0, 15935, {10965}, 1}, + {'\0', 0, 15936, {0}, 0},{';', 0, 15937, {10963}, 1},{'\0', 0, 15938, {0}, 0}, + {'c', 15941, 15939, {0}, 0},{'\0', 0, 15940, {0}, 0},{';', 0, 15941, {8827}, 1}, + {'a', 15948, 15942, {0}, 0},{'c', 15960, 15943, {0}, 0},{'e', 15974, 15944, {0}, 0}, + {'n', 15978, 15945, {0}, 0},{'s', 16006, 15946, {0}, 0},{'\0', 0, 15947, {0}, 0}, + {'p', 15950, 15948, {0}, 0},{'\0', 0, 15949, {0}, 0},{'p', 15952, 15950, {0}, 0}, + {'\0', 0, 15951, {0}, 0},{'r', 15954, 15952, {0}, 0},{'\0', 0, 15953, {0}, 0}, + {'o', 15956, 15954, {0}, 0},{'\0', 0, 15955, {0}, 0},{'x', 15958, 15956, {0}, 0}, + {'\0', 0, 15957, {0}, 0},{';', 0, 15958, {10936}, 1},{'\0', 0, 15959, {0}, 0}, + {'u', 15962, 15960, {0}, 0},{'\0', 0, 15961, {0}, 0},{'r', 15964, 15962, {0}, 0}, + {'\0', 0, 15963, {0}, 0},{'l', 15966, 15964, {0}, 0},{'\0', 0, 15965, {0}, 0}, + {'y', 15968, 15966, {0}, 0},{'\0', 0, 15967, {0}, 0},{'e', 15970, 15968, {0}, 0}, + {'\0', 0, 15969, {0}, 0},{'q', 15972, 15970, {0}, 0},{'\0', 0, 15971, {0}, 0}, + {';', 0, 15972, {8829}, 1},{'\0', 0, 15973, {0}, 0},{'q', 15976, 15974, {0}, 0}, + {'\0', 0, 15975, {0}, 0},{';', 0, 15976, {10928}, 1},{'\0', 0, 15977, {0}, 0}, + {'a', 15982, 15978, {0}, 0},{'e', 15994, 15979, {0}, 0},{'s', 16000, 15980, {0}, 0}, + {'\0', 0, 15981, {0}, 0},{'p', 15984, 15982, {0}, 0},{'\0', 0, 15983, {0}, 0}, + {'p', 15986, 15984, {0}, 0},{'\0', 0, 15985, {0}, 0},{'r', 15988, 15986, {0}, 0}, + {'\0', 0, 15987, {0}, 0},{'o', 15990, 15988, {0}, 0},{'\0', 0, 15989, {0}, 0}, + {'x', 15992, 15990, {0}, 0},{'\0', 0, 15991, {0}, 0},{';', 0, 15992, {10938}, 1}, + {'\0', 0, 15993, {0}, 0},{'q', 15996, 15994, {0}, 0},{'\0', 0, 15995, {0}, 0}, + {'q', 15998, 15996, {0}, 0},{'\0', 0, 15997, {0}, 0},{';', 0, 15998, {10934}, 1}, + {'\0', 0, 15999, {0}, 0},{'i', 16002, 16000, {0}, 0},{'\0', 0, 16001, {0}, 0}, + {'m', 16004, 16002, {0}, 0},{'\0', 0, 16003, {0}, 0},{';', 0, 16004, {8937}, 1}, + {'\0', 0, 16005, {0}, 0},{'i', 16008, 16006, {0}, 0},{'\0', 0, 16007, {0}, 0}, + {'m', 16010, 16008, {0}, 0},{'\0', 0, 16009, {0}, 0},{';', 0, 16010, {8831}, 1}, + {'\0', 0, 16011, {0}, 0},{';', 0, 16012, {8721}, 1},{'\0', 0, 16013, {0}, 0}, + {'g', 16016, 16014, {0}, 0},{'\0', 0, 16015, {0}, 0},{';', 0, 16016, {9834}, 1}, + {'\0', 0, 16017, {0}, 0},{'1', 16032, 16018, {185}, 1},{'2', 16034, 16019, {178}, 1}, + {'3', 16036, 16020, {179}, 1},{';', 0, 16021, {8835}, 1},{'E', 16038, 16022, {0}, 0}, + {'d', 16040, 16023, {0}, 0},{'e', 16053, 16024, {0}, 0},{'h', 16062, 16025, {0}, 0}, + {'l', 16075, 16026, {0}, 0},{'m', 16083, 16027, {0}, 0},{'n', 16091, 16028, {0}, 0}, + {'p', 16098, 16029, {0}, 0},{'s', 16106, 16030, {0}, 0},{'\0', 0, 16031, {0}, 0}, + {';', 0, 16032, {185}, 1},{'\0', 0, 16033, {0}, 0},{';', 0, 16034, {178}, 1}, + {'\0', 0, 16035, {0}, 0},{';', 0, 16036, {179}, 1},{'\0', 0, 16037, {0}, 0}, + {';', 0, 16038, {10950}, 1},{'\0', 0, 16039, {0}, 0},{'o', 16043, 16040, {0}, 0}, + {'s', 16047, 16041, {0}, 0},{'\0', 0, 16042, {0}, 0},{'t', 16045, 16043, {0}, 0}, + {'\0', 0, 16044, {0}, 0},{';', 0, 16045, {10942}, 1},{'\0', 0, 16046, {0}, 0}, + {'u', 16049, 16047, {0}, 0},{'\0', 0, 16048, {0}, 0},{'b', 16051, 16049, {0}, 0}, + {'\0', 0, 16050, {0}, 0},{';', 0, 16051, {10968}, 1},{'\0', 0, 16052, {0}, 0}, + {';', 0, 16053, {8839}, 1},{'d', 16056, 16054, {0}, 0},{'\0', 0, 16055, {0}, 0}, + {'o', 16058, 16056, {0}, 0},{'\0', 0, 16057, {0}, 0},{'t', 16060, 16058, {0}, 0}, + {'\0', 0, 16059, {0}, 0},{';', 0, 16060, {10948}, 1},{'\0', 0, 16061, {0}, 0}, + {'s', 16064, 16062, {0}, 0},{'\0', 0, 16063, {0}, 0},{'o', 16067, 16064, {0}, 0}, + {'u', 16071, 16065, {0}, 0},{'\0', 0, 16066, {0}, 0},{'l', 16069, 16067, {0}, 0}, + {'\0', 0, 16068, {0}, 0},{';', 0, 16069, {10185}, 1},{'\0', 0, 16070, {0}, 0}, + {'b', 16073, 16071, {0}, 0},{'\0', 0, 16072, {0}, 0},{';', 0, 16073, {10967}, 1}, + {'\0', 0, 16074, {0}, 0},{'a', 16077, 16075, {0}, 0},{'\0', 0, 16076, {0}, 0}, + {'r', 16079, 16077, {0}, 0},{'\0', 0, 16078, {0}, 0},{'r', 16081, 16079, {0}, 0}, + {'\0', 0, 16080, {0}, 0},{';', 0, 16081, {10619}, 1},{'\0', 0, 16082, {0}, 0}, + {'u', 16085, 16083, {0}, 0},{'\0', 0, 16084, {0}, 0},{'l', 16087, 16085, {0}, 0}, + {'\0', 0, 16086, {0}, 0},{'t', 16089, 16087, {0}, 0},{'\0', 0, 16088, {0}, 0}, + {';', 0, 16089, {10946}, 1},{'\0', 0, 16090, {0}, 0},{'E', 16094, 16091, {0}, 0}, + {'e', 16096, 16092, {0}, 0},{'\0', 0, 16093, {0}, 0},{';', 0, 16094, {10956}, 1}, + {'\0', 0, 16095, {0}, 0},{';', 0, 16096, {8843}, 1},{'\0', 0, 16097, {0}, 0}, + {'l', 16100, 16098, {0}, 0},{'\0', 0, 16099, {0}, 0},{'u', 16102, 16100, {0}, 0}, + {'\0', 0, 16101, {0}, 0},{'s', 16104, 16102, {0}, 0},{'\0', 0, 16103, {0}, 0}, + {';', 0, 16104, {10944}, 1},{'\0', 0, 16105, {0}, 0},{'e', 16110, 16106, {0}, 0}, + {'i', 16132, 16107, {0}, 0},{'u', 16136, 16108, {0}, 0},{'\0', 0, 16109, {0}, 0}, + {'t', 16112, 16110, {0}, 0},{'\0', 0, 16111, {0}, 0},{';', 0, 16112, {8835}, 1}, + {'e', 16116, 16113, {0}, 0},{'n', 16123, 16114, {0}, 0},{'\0', 0, 16115, {0}, 0}, + {'q', 16118, 16116, {0}, 0},{'\0', 0, 16117, {0}, 0},{';', 0, 16118, {8839}, 1}, + {'q', 16121, 16119, {0}, 0},{'\0', 0, 16120, {0}, 0},{';', 0, 16121, {10950}, 1}, + {'\0', 0, 16122, {0}, 0},{'e', 16125, 16123, {0}, 0},{'\0', 0, 16124, {0}, 0}, + {'q', 16127, 16125, {0}, 0},{'\0', 0, 16126, {0}, 0},{';', 0, 16127, {8843}, 1}, + {'q', 16130, 16128, {0}, 0},{'\0', 0, 16129, {0}, 0},{';', 0, 16130, {10956}, 1}, + {'\0', 0, 16131, {0}, 0},{'m', 16134, 16132, {0}, 0},{'\0', 0, 16133, {0}, 0}, + {';', 0, 16134, {10952}, 1},{'\0', 0, 16135, {0}, 0},{'b', 16139, 16136, {0}, 0}, + {'p', 16141, 16137, {0}, 0},{'\0', 0, 16138, {0}, 0},{';', 0, 16139, {10964}, 1}, + {'\0', 0, 16140, {0}, 0},{';', 0, 16141, {10966}, 1},{'\0', 0, 16142, {0}, 0}, + {'A', 16147, 16143, {0}, 0},{'a', 16153, 16144, {0}, 0},{'n', 16169, 16145, {0}, 0}, + {'\0', 0, 16146, {0}, 0},{'r', 16149, 16147, {0}, 0},{'\0', 0, 16148, {0}, 0}, + {'r', 16151, 16149, {0}, 0},{'\0', 0, 16150, {0}, 0},{';', 0, 16151, {8665}, 1}, + {'\0', 0, 16152, {0}, 0},{'r', 16155, 16153, {0}, 0},{'\0', 0, 16154, {0}, 0}, + {'h', 16158, 16155, {0}, 0},{'r', 16162, 16156, {0}, 0},{'\0', 0, 16157, {0}, 0}, + {'k', 16160, 16158, {0}, 0},{'\0', 0, 16159, {0}, 0},{';', 0, 16160, {10534}, 1}, + {'\0', 0, 16161, {0}, 0},{';', 0, 16162, {8601}, 1},{'o', 16165, 16163, {0}, 0}, + {'\0', 0, 16164, {0}, 0},{'w', 16167, 16165, {0}, 0},{'\0', 0, 16166, {0}, 0}, + {';', 0, 16167, {8601}, 1},{'\0', 0, 16168, {0}, 0},{'w', 16171, 16169, {0}, 0}, + {'\0', 0, 16170, {0}, 0},{'a', 16173, 16171, {0}, 0},{'\0', 0, 16172, {0}, 0}, + {'r', 16175, 16173, {0}, 0},{'\0', 0, 16174, {0}, 0},{';', 0, 16175, {10538}, 1}, + {'\0', 0, 16176, {0}, 0},{'l', 16179, 16177, {0}, 0},{'\0', 0, 16178, {0}, 0}, + {'i', 16181, 16179, {0}, 0},{'\0', 0, 16180, {0}, 0},{'g', 16183, 16181, {223}, 1}, + {'\0', 0, 16182, {0}, 0},{';', 0, 16183, {223}, 1},{'\0', 0, 16184, {0}, 0}, + {'a', 16199, 16185, {0}, 0},{'b', 16212, 16186, {0}, 0},{'c', 16218, 16187, {0}, 0}, + {'d', 16240, 16188, {0}, 0},{'e', 16246, 16189, {0}, 0},{'f', 16256, 16190, {0}, 0}, + {'h', 16260, 16191, {0}, 0},{'i', 16348, 16192, {0}, 0},{'o', 16379, 16193, {0}, 0}, + {'p', 16417, 16194, {0}, 0},{'r', 16427, 16195, {0}, 0},{'s', 16547, 16196, {0}, 0}, + {'w', 16572, 16197, {0}, 0},{'\0', 0, 16198, {0}, 0},{'r', 16202, 16199, {0}, 0}, + {'u', 16210, 16200, {0}, 0},{'\0', 0, 16201, {0}, 0},{'g', 16204, 16202, {0}, 0}, + {'\0', 0, 16203, {0}, 0},{'e', 16206, 16204, {0}, 0},{'\0', 0, 16205, {0}, 0}, + {'t', 16208, 16206, {0}, 0},{'\0', 0, 16207, {0}, 0},{';', 0, 16208, {8982}, 1}, + {'\0', 0, 16209, {0}, 0},{';', 0, 16210, {964}, 1},{'\0', 0, 16211, {0}, 0}, + {'r', 16214, 16212, {0}, 0},{'\0', 0, 16213, {0}, 0},{'k', 16216, 16214, {0}, 0}, + {'\0', 0, 16215, {0}, 0},{';', 0, 16216, {9140}, 1},{'\0', 0, 16217, {0}, 0}, + {'a', 16222, 16218, {0}, 0},{'e', 16230, 16219, {0}, 0},{'y', 16238, 16220, {0}, 0}, + {'\0', 0, 16221, {0}, 0},{'r', 16224, 16222, {0}, 0},{'\0', 0, 16223, {0}, 0}, + {'o', 16226, 16224, {0}, 0},{'\0', 0, 16225, {0}, 0},{'n', 16228, 16226, {0}, 0}, + {'\0', 0, 16227, {0}, 0},{';', 0, 16228, {357}, 1},{'\0', 0, 16229, {0}, 0}, + {'d', 16232, 16230, {0}, 0},{'\0', 0, 16231, {0}, 0},{'i', 16234, 16232, {0}, 0}, + {'\0', 0, 16233, {0}, 0},{'l', 16236, 16234, {0}, 0},{'\0', 0, 16235, {0}, 0}, + {';', 0, 16236, {355}, 1},{'\0', 0, 16237, {0}, 0},{';', 0, 16238, {1090}, 1}, + {'\0', 0, 16239, {0}, 0},{'o', 16242, 16240, {0}, 0},{'\0', 0, 16241, {0}, 0}, + {'t', 16244, 16242, {0}, 0},{'\0', 0, 16243, {0}, 0},{';', 0, 16244, {8411}, 1}, + {'\0', 0, 16245, {0}, 0},{'l', 16248, 16246, {0}, 0},{'\0', 0, 16247, {0}, 0}, + {'r', 16250, 16248, {0}, 0},{'\0', 0, 16249, {0}, 0},{'e', 16252, 16250, {0}, 0}, + {'\0', 0, 16251, {0}, 0},{'c', 16254, 16252, {0}, 0},{'\0', 0, 16253, {0}, 0}, + {';', 0, 16254, {8981}, 1},{'\0', 0, 16255, {0}, 0},{'r', 16258, 16256, {0}, 0}, + {'\0', 0, 16257, {0}, 0},{';', 0, 16258, {120113}, 1},{'\0', 0, 16259, {0}, 0}, + {'e', 16265, 16260, {0}, 0},{'i', 16297, 16261, {0}, 0},{'k', 16329, 16262, {0}, 0}, + {'o', 16342, 16263, {0}, 0},{'\0', 0, 16264, {0}, 0},{'r', 16268, 16265, {0}, 0}, + {'t', 16283, 16266, {0}, 0},{'\0', 0, 16267, {0}, 0},{'e', 16270, 16268, {0}, 0}, + {'\0', 0, 16269, {0}, 0},{'4', 16273, 16270, {0}, 0},{'f', 16275, 16271, {0}, 0}, + {'\0', 0, 16272, {0}, 0},{';', 0, 16273, {8756}, 1},{'\0', 0, 16274, {0}, 0}, + {'o', 16277, 16275, {0}, 0},{'\0', 0, 16276, {0}, 0},{'r', 16279, 16277, {0}, 0}, + {'\0', 0, 16278, {0}, 0},{'e', 16281, 16279, {0}, 0},{'\0', 0, 16280, {0}, 0}, + {';', 0, 16281, {8756}, 1},{'\0', 0, 16282, {0}, 0},{'a', 16285, 16283, {0}, 0}, + {'\0', 0, 16284, {0}, 0},{';', 0, 16285, {952}, 1},{'s', 16289, 16286, {0}, 0}, + {'v', 16295, 16287, {0}, 0},{'\0', 0, 16288, {0}, 0},{'y', 16291, 16289, {0}, 0}, + {'\0', 0, 16290, {0}, 0},{'m', 16293, 16291, {0}, 0},{'\0', 0, 16292, {0}, 0}, + {';', 0, 16293, {977}, 1},{'\0', 0, 16294, {0}, 0},{';', 0, 16295, {977}, 1}, + {'\0', 0, 16296, {0}, 0},{'c', 16300, 16297, {0}, 0},{'n', 16323, 16298, {0}, 0}, + {'\0', 0, 16299, {0}, 0},{'k', 16302, 16300, {0}, 0},{'\0', 0, 16301, {0}, 0}, + {'a', 16305, 16302, {0}, 0},{'s', 16317, 16303, {0}, 0},{'\0', 0, 16304, {0}, 0}, + {'p', 16307, 16305, {0}, 0},{'\0', 0, 16306, {0}, 0},{'p', 16309, 16307, {0}, 0}, + {'\0', 0, 16308, {0}, 0},{'r', 16311, 16309, {0}, 0},{'\0', 0, 16310, {0}, 0}, + {'o', 16313, 16311, {0}, 0},{'\0', 0, 16312, {0}, 0},{'x', 16315, 16313, {0}, 0}, + {'\0', 0, 16314, {0}, 0},{';', 0, 16315, {8776}, 1},{'\0', 0, 16316, {0}, 0}, + {'i', 16319, 16317, {0}, 0},{'\0', 0, 16318, {0}, 0},{'m', 16321, 16319, {0}, 0}, + {'\0', 0, 16320, {0}, 0},{';', 0, 16321, {8764}, 1},{'\0', 0, 16322, {0}, 0}, + {'s', 16325, 16323, {0}, 0},{'\0', 0, 16324, {0}, 0},{'p', 16327, 16325, {0}, 0}, + {'\0', 0, 16326, {0}, 0},{';', 0, 16327, {8201}, 1},{'\0', 0, 16328, {0}, 0}, + {'a', 16332, 16329, {0}, 0},{'s', 16336, 16330, {0}, 0},{'\0', 0, 16331, {0}, 0}, + {'p', 16334, 16332, {0}, 0},{'\0', 0, 16333, {0}, 0},{';', 0, 16334, {8776}, 1}, + {'\0', 0, 16335, {0}, 0},{'i', 16338, 16336, {0}, 0},{'\0', 0, 16337, {0}, 0}, + {'m', 16340, 16338, {0}, 0},{'\0', 0, 16339, {0}, 0},{';', 0, 16340, {8764}, 1}, + {'\0', 0, 16341, {0}, 0},{'r', 16344, 16342, {0}, 0},{'\0', 0, 16343, {0}, 0}, + {'n', 16346, 16344, {254}, 1},{'\0', 0, 16345, {0}, 0},{';', 0, 16346, {254}, 1}, + {'\0', 0, 16347, {0}, 0},{'l', 16352, 16348, {0}, 0},{'m', 16358, 16349, {0}, 0}, + {'n', 16375, 16350, {0}, 0},{'\0', 0, 16351, {0}, 0},{'d', 16354, 16352, {0}, 0}, + {'\0', 0, 16353, {0}, 0},{'e', 16356, 16354, {0}, 0},{'\0', 0, 16355, {0}, 0}, + {';', 0, 16356, {732}, 1},{'\0', 0, 16357, {0}, 0},{'e', 16360, 16358, {0}, 0}, + {'\0', 0, 16359, {0}, 0},{'s', 16362, 16360, {215}, 1},{'\0', 0, 16361, {0}, 0}, + {';', 0, 16362, {215}, 1},{'b', 16366, 16363, {0}, 0},{'d', 16373, 16364, {0}, 0}, + {'\0', 0, 16365, {0}, 0},{';', 0, 16366, {8864}, 1},{'a', 16369, 16367, {0}, 0}, + {'\0', 0, 16368, {0}, 0},{'r', 16371, 16369, {0}, 0},{'\0', 0, 16370, {0}, 0}, + {';', 0, 16371, {10801}, 1},{'\0', 0, 16372, {0}, 0},{';', 0, 16373, {10800}, 1}, + {'\0', 0, 16374, {0}, 0},{'t', 16377, 16375, {0}, 0},{'\0', 0, 16376, {0}, 0}, + {';', 0, 16377, {8749}, 1},{'\0', 0, 16378, {0}, 0},{'e', 16383, 16379, {0}, 0}, + {'p', 16387, 16380, {0}, 0},{'s', 16413, 16381, {0}, 0},{'\0', 0, 16382, {0}, 0}, + {'a', 16385, 16383, {0}, 0},{'\0', 0, 16384, {0}, 0},{';', 0, 16385, {10536}, 1}, + {'\0', 0, 16386, {0}, 0},{';', 0, 16387, {8868}, 1},{'b', 16392, 16388, {0}, 0}, + {'c', 16398, 16389, {0}, 0},{'f', 16404, 16390, {0}, 0},{'\0', 0, 16391, {0}, 0}, + {'o', 16394, 16392, {0}, 0},{'\0', 0, 16393, {0}, 0},{'t', 16396, 16394, {0}, 0}, + {'\0', 0, 16395, {0}, 0},{';', 0, 16396, {9014}, 1},{'\0', 0, 16397, {0}, 0}, + {'i', 16400, 16398, {0}, 0},{'\0', 0, 16399, {0}, 0},{'r', 16402, 16400, {0}, 0}, + {'\0', 0, 16401, {0}, 0},{';', 0, 16402, {10993}, 1},{'\0', 0, 16403, {0}, 0}, + {';', 0, 16404, {120165}, 1},{'o', 16407, 16405, {0}, 0},{'\0', 0, 16406, {0}, 0}, + {'r', 16409, 16407, {0}, 0},{'\0', 0, 16408, {0}, 0},{'k', 16411, 16409, {0}, 0}, + {'\0', 0, 16410, {0}, 0},{';', 0, 16411, {10970}, 1},{'\0', 0, 16412, {0}, 0}, + {'a', 16415, 16413, {0}, 0},{'\0', 0, 16414, {0}, 0},{';', 0, 16415, {10537}, 1}, + {'\0', 0, 16416, {0}, 0},{'r', 16419, 16417, {0}, 0},{'\0', 0, 16418, {0}, 0}, + {'i', 16421, 16419, {0}, 0},{'\0', 0, 16420, {0}, 0},{'m', 16423, 16421, {0}, 0}, + {'\0', 0, 16422, {0}, 0},{'e', 16425, 16423, {0}, 0},{'\0', 0, 16424, {0}, 0}, + {';', 0, 16425, {8244}, 1},{'\0', 0, 16426, {0}, 0},{'a', 16431, 16427, {0}, 0}, + {'i', 16437, 16428, {0}, 0},{'p', 16535, 16429, {0}, 0},{'\0', 0, 16430, {0}, 0}, + {'d', 16433, 16431, {0}, 0},{'\0', 0, 16432, {0}, 0},{'e', 16435, 16433, {0}, 0}, + {'\0', 0, 16434, {0}, 0},{';', 0, 16435, {8482}, 1},{'\0', 0, 16436, {0}, 0}, + {'a', 16445, 16437, {0}, 0},{'d', 16497, 16438, {0}, 0},{'e', 16503, 16439, {0}, 0}, + {'m', 16505, 16440, {0}, 0},{'p', 16515, 16441, {0}, 0},{'s', 16523, 16442, {0}, 0}, + {'t', 16527, 16443, {0}, 0},{'\0', 0, 16444, {0}, 0},{'n', 16447, 16445, {0}, 0}, + {'\0', 0, 16446, {0}, 0},{'g', 16449, 16447, {0}, 0},{'\0', 0, 16448, {0}, 0}, + {'l', 16451, 16449, {0}, 0},{'\0', 0, 16450, {0}, 0},{'e', 16453, 16451, {0}, 0}, + {'\0', 0, 16452, {0}, 0},{';', 0, 16453, {9653}, 1},{'d', 16459, 16454, {0}, 0}, + {'l', 16467, 16455, {0}, 0},{'q', 16480, 16456, {0}, 0},{'r', 16482, 16457, {0}, 0}, + {'\0', 0, 16458, {0}, 0},{'o', 16461, 16459, {0}, 0},{'\0', 0, 16460, {0}, 0}, + {'w', 16463, 16461, {0}, 0},{'\0', 0, 16462, {0}, 0},{'n', 16465, 16463, {0}, 0}, + {'\0', 0, 16464, {0}, 0},{';', 0, 16465, {9663}, 1},{'\0', 0, 16466, {0}, 0}, + {'e', 16469, 16467, {0}, 0},{'\0', 0, 16468, {0}, 0},{'f', 16471, 16469, {0}, 0}, + {'\0', 0, 16470, {0}, 0},{'t', 16473, 16471, {0}, 0},{'\0', 0, 16472, {0}, 0}, + {';', 0, 16473, {9667}, 1},{'e', 16476, 16474, {0}, 0},{'\0', 0, 16475, {0}, 0}, + {'q', 16478, 16476, {0}, 0},{'\0', 0, 16477, {0}, 0},{';', 0, 16478, {8884}, 1}, + {'\0', 0, 16479, {0}, 0},{';', 0, 16480, {8796}, 1},{'\0', 0, 16481, {0}, 0}, + {'i', 16484, 16482, {0}, 0},{'\0', 0, 16483, {0}, 0},{'g', 16486, 16484, {0}, 0}, + {'\0', 0, 16485, {0}, 0},{'h', 16488, 16486, {0}, 0},{'\0', 0, 16487, {0}, 0}, + {'t', 16490, 16488, {0}, 0},{'\0', 0, 16489, {0}, 0},{';', 0, 16490, {9657}, 1}, + {'e', 16493, 16491, {0}, 0},{'\0', 0, 16492, {0}, 0},{'q', 16495, 16493, {0}, 0}, + {'\0', 0, 16494, {0}, 0},{';', 0, 16495, {8885}, 1},{'\0', 0, 16496, {0}, 0}, + {'o', 16499, 16497, {0}, 0},{'\0', 0, 16498, {0}, 0},{'t', 16501, 16499, {0}, 0}, + {'\0', 0, 16500, {0}, 0},{';', 0, 16501, {9708}, 1},{'\0', 0, 16502, {0}, 0}, + {';', 0, 16503, {8796}, 1},{'\0', 0, 16504, {0}, 0},{'i', 16507, 16505, {0}, 0}, + {'\0', 0, 16506, {0}, 0},{'n', 16509, 16507, {0}, 0},{'\0', 0, 16508, {0}, 0}, + {'u', 16511, 16509, {0}, 0},{'\0', 0, 16510, {0}, 0},{'s', 16513, 16511, {0}, 0}, + {'\0', 0, 16512, {0}, 0},{';', 0, 16513, {10810}, 1},{'\0', 0, 16514, {0}, 0}, + {'l', 16517, 16515, {0}, 0},{'\0', 0, 16516, {0}, 0},{'u', 16519, 16517, {0}, 0}, + {'\0', 0, 16518, {0}, 0},{'s', 16521, 16519, {0}, 0},{'\0', 0, 16520, {0}, 0}, + {';', 0, 16521, {10809}, 1},{'\0', 0, 16522, {0}, 0},{'b', 16525, 16523, {0}, 0}, + {'\0', 0, 16524, {0}, 0},{';', 0, 16525, {10701}, 1},{'\0', 0, 16526, {0}, 0}, + {'i', 16529, 16527, {0}, 0},{'\0', 0, 16528, {0}, 0},{'m', 16531, 16529, {0}, 0}, + {'\0', 0, 16530, {0}, 0},{'e', 16533, 16531, {0}, 0},{'\0', 0, 16532, {0}, 0}, + {';', 0, 16533, {10811}, 1},{'\0', 0, 16534, {0}, 0},{'e', 16537, 16535, {0}, 0}, + {'\0', 0, 16536, {0}, 0},{'z', 16539, 16537, {0}, 0},{'\0', 0, 16538, {0}, 0}, + {'i', 16541, 16539, {0}, 0},{'\0', 0, 16540, {0}, 0},{'u', 16543, 16541, {0}, 0}, + {'\0', 0, 16542, {0}, 0},{'m', 16545, 16543, {0}, 0},{'\0', 0, 16544, {0}, 0}, + {';', 0, 16545, {9186}, 1},{'\0', 0, 16546, {0}, 0},{'c', 16551, 16547, {0}, 0}, + {'h', 16558, 16548, {0}, 0},{'t', 16564, 16549, {0}, 0},{'\0', 0, 16550, {0}, 0}, + {'r', 16554, 16551, {0}, 0},{'y', 16556, 16552, {0}, 0},{'\0', 0, 16553, {0}, 0}, + {';', 0, 16554, {120009}, 1},{'\0', 0, 16555, {0}, 0},{';', 0, 16556, {1094}, 1}, + {'\0', 0, 16557, {0}, 0},{'c', 16560, 16558, {0}, 0},{'\0', 0, 16559, {0}, 0}, + {'y', 16562, 16560, {0}, 0},{'\0', 0, 16561, {0}, 0},{';', 0, 16562, {1115}, 1}, + {'\0', 0, 16563, {0}, 0},{'r', 16566, 16564, {0}, 0},{'\0', 0, 16565, {0}, 0}, + {'o', 16568, 16566, {0}, 0},{'\0', 0, 16567, {0}, 0},{'k', 16570, 16568, {0}, 0}, + {'\0', 0, 16569, {0}, 0},{';', 0, 16570, {359}, 1},{'\0', 0, 16571, {0}, 0}, + {'i', 16575, 16572, {0}, 0},{'o', 16581, 16573, {0}, 0},{'\0', 0, 16574, {0}, 0}, + {'x', 16577, 16575, {0}, 0},{'\0', 0, 16576, {0}, 0},{'t', 16579, 16577, {0}, 0}, + {'\0', 0, 16578, {0}, 0},{';', 0, 16579, {8812}, 1},{'\0', 0, 16580, {0}, 0}, + {'h', 16583, 16581, {0}, 0},{'\0', 0, 16582, {0}, 0},{'e', 16585, 16583, {0}, 0}, + {'\0', 0, 16584, {0}, 0},{'a', 16587, 16585, {0}, 0},{'\0', 0, 16586, {0}, 0}, + {'d', 16589, 16587, {0}, 0},{'\0', 0, 16588, {0}, 0},{'l', 16592, 16589, {0}, 0}, + {'r', 16610, 16590, {0}, 0},{'\0', 0, 16591, {0}, 0},{'e', 16594, 16592, {0}, 0}, + {'\0', 0, 16593, {0}, 0},{'f', 16596, 16594, {0}, 0},{'\0', 0, 16595, {0}, 0}, + {'t', 16598, 16596, {0}, 0},{'\0', 0, 16597, {0}, 0},{'a', 16600, 16598, {0}, 0}, + {'\0', 0, 16599, {0}, 0},{'r', 16602, 16600, {0}, 0},{'\0', 0, 16601, {0}, 0}, + {'r', 16604, 16602, {0}, 0},{'\0', 0, 16603, {0}, 0},{'o', 16606, 16604, {0}, 0}, + {'\0', 0, 16605, {0}, 0},{'w', 16608, 16606, {0}, 0},{'\0', 0, 16607, {0}, 0}, + {';', 0, 16608, {8606}, 1},{'\0', 0, 16609, {0}, 0},{'i', 16612, 16610, {0}, 0}, + {'\0', 0, 16611, {0}, 0},{'g', 16614, 16612, {0}, 0},{'\0', 0, 16613, {0}, 0}, + {'h', 16616, 16614, {0}, 0},{'\0', 0, 16615, {0}, 0},{'t', 16618, 16616, {0}, 0}, + {'\0', 0, 16617, {0}, 0},{'a', 16620, 16618, {0}, 0},{'\0', 0, 16619, {0}, 0}, + {'r', 16622, 16620, {0}, 0},{'\0', 0, 16621, {0}, 0},{'r', 16624, 16622, {0}, 0}, + {'\0', 0, 16623, {0}, 0},{'o', 16626, 16624, {0}, 0},{'\0', 0, 16625, {0}, 0}, + {'w', 16628, 16626, {0}, 0},{'\0', 0, 16627, {0}, 0},{';', 0, 16628, {8608}, 1}, + {'\0', 0, 16629, {0}, 0},{'A', 16649, 16630, {0}, 0},{'H', 16655, 16631, {0}, 0}, + {'a', 16661, 16632, {0}, 0},{'b', 16676, 16633, {0}, 0},{'c', 16691, 16634, {0}, 0}, + {'d', 16702, 16635, {0}, 0},{'f', 16726, 16636, {0}, 0},{'g', 16739, 16637, {0}, 0}, + {'h', 16749, 16638, {0}, 0},{'l', 16767, 16639, {0}, 0},{'m', 16796, 16640, {0}, 0}, + {'o', 16807, 16641, {0}, 0},{'p', 16820, 16642, {0}, 0},{'r', 16924, 16643, {0}, 0}, + {'s', 16960, 16644, {0}, 0},{'t', 16966, 16645, {0}, 0},{'u', 16991, 16646, {0}, 0}, + {'w', 17004, 16647, {0}, 0},{'\0', 0, 16648, {0}, 0},{'r', 16651, 16649, {0}, 0}, + {'\0', 0, 16650, {0}, 0},{'r', 16653, 16651, {0}, 0},{'\0', 0, 16652, {0}, 0}, + {';', 0, 16653, {8657}, 1},{'\0', 0, 16654, {0}, 0},{'a', 16657, 16655, {0}, 0}, + {'\0', 0, 16656, {0}, 0},{'r', 16659, 16657, {0}, 0},{'\0', 0, 16658, {0}, 0}, + {';', 0, 16659, {10595}, 1},{'\0', 0, 16660, {0}, 0},{'c', 16664, 16661, {0}, 0}, + {'r', 16672, 16662, {0}, 0},{'\0', 0, 16663, {0}, 0},{'u', 16666, 16664, {0}, 0}, + {'\0', 0, 16665, {0}, 0},{'t', 16668, 16666, {0}, 0},{'\0', 0, 16667, {0}, 0}, + {'e', 16670, 16668, {250}, 1},{'\0', 0, 16669, {0}, 0},{';', 0, 16670, {250}, 1}, + {'\0', 0, 16671, {0}, 0},{'r', 16674, 16672, {0}, 0},{'\0', 0, 16673, {0}, 0}, + {';', 0, 16674, {8593}, 1},{'\0', 0, 16675, {0}, 0},{'r', 16678, 16676, {0}, 0}, + {'\0', 0, 16677, {0}, 0},{'c', 16681, 16678, {0}, 0},{'e', 16685, 16679, {0}, 0}, + {'\0', 0, 16680, {0}, 0},{'y', 16683, 16681, {0}, 0},{'\0', 0, 16682, {0}, 0}, + {';', 0, 16683, {1118}, 1},{'\0', 0, 16684, {0}, 0},{'v', 16687, 16685, {0}, 0}, + {'\0', 0, 16686, {0}, 0},{'e', 16689, 16687, {0}, 0},{'\0', 0, 16688, {0}, 0}, + {';', 0, 16689, {365}, 1},{'\0', 0, 16690, {0}, 0},{'i', 16694, 16691, {0}, 0}, + {'y', 16700, 16692, {0}, 0},{'\0', 0, 16693, {0}, 0},{'r', 16696, 16694, {0}, 0}, + {'\0', 0, 16695, {0}, 0},{'c', 16698, 16696, {251}, 1},{'\0', 0, 16697, {0}, 0}, + {';', 0, 16698, {251}, 1},{'\0', 0, 16699, {0}, 0},{';', 0, 16700, {1091}, 1}, + {'\0', 0, 16701, {0}, 0},{'a', 16706, 16702, {0}, 0},{'b', 16712, 16703, {0}, 0}, + {'h', 16720, 16704, {0}, 0},{'\0', 0, 16705, {0}, 0},{'r', 16708, 16706, {0}, 0}, + {'\0', 0, 16707, {0}, 0},{'r', 16710, 16708, {0}, 0},{'\0', 0, 16709, {0}, 0}, + {';', 0, 16710, {8645}, 1},{'\0', 0, 16711, {0}, 0},{'l', 16714, 16712, {0}, 0}, + {'\0', 0, 16713, {0}, 0},{'a', 16716, 16714, {0}, 0},{'\0', 0, 16715, {0}, 0}, + {'c', 16718, 16716, {0}, 0},{'\0', 0, 16717, {0}, 0},{';', 0, 16718, {369}, 1}, + {'\0', 0, 16719, {0}, 0},{'a', 16722, 16720, {0}, 0},{'\0', 0, 16721, {0}, 0}, + {'r', 16724, 16722, {0}, 0},{'\0', 0, 16723, {0}, 0},{';', 0, 16724, {10606}, 1}, + {'\0', 0, 16725, {0}, 0},{'i', 16729, 16726, {0}, 0},{'r', 16737, 16727, {0}, 0}, + {'\0', 0, 16728, {0}, 0},{'s', 16731, 16729, {0}, 0},{'\0', 0, 16730, {0}, 0}, + {'h', 16733, 16731, {0}, 0},{'\0', 0, 16732, {0}, 0},{'t', 16735, 16733, {0}, 0}, + {'\0', 0, 16734, {0}, 0},{';', 0, 16735, {10622}, 1},{'\0', 0, 16736, {0}, 0}, + {';', 0, 16737, {120114}, 1},{'\0', 0, 16738, {0}, 0},{'r', 16741, 16739, {0}, 0}, + {'\0', 0, 16740, {0}, 0},{'a', 16743, 16741, {0}, 0},{'\0', 0, 16742, {0}, 0}, + {'v', 16745, 16743, {0}, 0},{'\0', 0, 16744, {0}, 0},{'e', 16747, 16745, {249}, 1}, + {'\0', 0, 16746, {0}, 0},{';', 0, 16747, {249}, 1},{'\0', 0, 16748, {0}, 0}, + {'a', 16752, 16749, {0}, 0},{'b', 16761, 16750, {0}, 0},{'\0', 0, 16751, {0}, 0}, + {'r', 16754, 16752, {0}, 0},{'\0', 0, 16753, {0}, 0},{'l', 16757, 16754, {0}, 0}, + {'r', 16759, 16755, {0}, 0},{'\0', 0, 16756, {0}, 0},{';', 0, 16757, {8639}, 1}, + {'\0', 0, 16758, {0}, 0},{';', 0, 16759, {8638}, 1},{'\0', 0, 16760, {0}, 0}, + {'l', 16763, 16761, {0}, 0},{'\0', 0, 16762, {0}, 0},{'k', 16765, 16763, {0}, 0}, + {'\0', 0, 16764, {0}, 0},{';', 0, 16765, {9600}, 1},{'\0', 0, 16766, {0}, 0}, + {'c', 16770, 16767, {0}, 0},{'t', 16790, 16768, {0}, 0},{'\0', 0, 16769, {0}, 0}, + {'o', 16773, 16770, {0}, 0},{'r', 16784, 16771, {0}, 0},{'\0', 0, 16772, {0}, 0}, + {'r', 16775, 16773, {0}, 0},{'\0', 0, 16774, {0}, 0},{'n', 16777, 16775, {0}, 0}, + {'\0', 0, 16776, {0}, 0},{';', 0, 16777, {8988}, 1},{'e', 16780, 16778, {0}, 0}, + {'\0', 0, 16779, {0}, 0},{'r', 16782, 16780, {0}, 0},{'\0', 0, 16781, {0}, 0}, + {';', 0, 16782, {8988}, 1},{'\0', 0, 16783, {0}, 0},{'o', 16786, 16784, {0}, 0}, + {'\0', 0, 16785, {0}, 0},{'p', 16788, 16786, {0}, 0},{'\0', 0, 16787, {0}, 0}, + {';', 0, 16788, {8975}, 1},{'\0', 0, 16789, {0}, 0},{'r', 16792, 16790, {0}, 0}, + {'\0', 0, 16791, {0}, 0},{'i', 16794, 16792, {0}, 0},{'\0', 0, 16793, {0}, 0}, + {';', 0, 16794, {9720}, 1},{'\0', 0, 16795, {0}, 0},{'a', 16799, 16796, {0}, 0}, + {'l', 16805, 16797, {168}, 1},{'\0', 0, 16798, {0}, 0},{'c', 16801, 16799, {0}, 0}, + {'\0', 0, 16800, {0}, 0},{'r', 16803, 16801, {0}, 0},{'\0', 0, 16802, {0}, 0}, + {';', 0, 16803, {363}, 1},{'\0', 0, 16804, {0}, 0},{';', 0, 16805, {168}, 1}, + {'\0', 0, 16806, {0}, 0},{'g', 16810, 16807, {0}, 0},{'p', 16816, 16808, {0}, 0}, + {'\0', 0, 16809, {0}, 0},{'o', 16812, 16810, {0}, 0},{'\0', 0, 16811, {0}, 0}, + {'n', 16814, 16812, {0}, 0},{'\0', 0, 16813, {0}, 0},{';', 0, 16814, {371}, 1}, + {'\0', 0, 16815, {0}, 0},{'f', 16818, 16816, {0}, 0},{'\0', 0, 16817, {0}, 0}, + {';', 0, 16818, {120166}, 1},{'\0', 0, 16819, {0}, 0},{'a', 16827, 16820, {0}, 0}, + {'d', 16837, 16821, {0}, 0},{'h', 16855, 16822, {0}, 0},{'l', 16888, 16823, {0}, 0}, + {'s', 16894, 16824, {0}, 0},{'u', 16908, 16825, {0}, 0},{'\0', 0, 16826, {0}, 0}, + {'r', 16829, 16827, {0}, 0},{'\0', 0, 16828, {0}, 0},{'r', 16831, 16829, {0}, 0}, + {'\0', 0, 16830, {0}, 0},{'o', 16833, 16831, {0}, 0},{'\0', 0, 16832, {0}, 0}, + {'w', 16835, 16833, {0}, 0},{'\0', 0, 16834, {0}, 0},{';', 0, 16835, {8593}, 1}, + {'\0', 0, 16836, {0}, 0},{'o', 16839, 16837, {0}, 0},{'\0', 0, 16838, {0}, 0}, + {'w', 16841, 16839, {0}, 0},{'\0', 0, 16840, {0}, 0},{'n', 16843, 16841, {0}, 0}, + {'\0', 0, 16842, {0}, 0},{'a', 16845, 16843, {0}, 0},{'\0', 0, 16844, {0}, 0}, + {'r', 16847, 16845, {0}, 0},{'\0', 0, 16846, {0}, 0},{'r', 16849, 16847, {0}, 0}, + {'\0', 0, 16848, {0}, 0},{'o', 16851, 16849, {0}, 0},{'\0', 0, 16850, {0}, 0}, + {'w', 16853, 16851, {0}, 0},{'\0', 0, 16852, {0}, 0},{';', 0, 16853, {8597}, 1}, + {'\0', 0, 16854, {0}, 0},{'a', 16857, 16855, {0}, 0},{'\0', 0, 16856, {0}, 0}, + {'r', 16859, 16857, {0}, 0},{'\0', 0, 16858, {0}, 0},{'p', 16861, 16859, {0}, 0}, + {'\0', 0, 16860, {0}, 0},{'o', 16863, 16861, {0}, 0},{'\0', 0, 16862, {0}, 0}, + {'o', 16865, 16863, {0}, 0},{'\0', 0, 16864, {0}, 0},{'n', 16867, 16865, {0}, 0}, + {'\0', 0, 16866, {0}, 0},{'l', 16870, 16867, {0}, 0},{'r', 16878, 16868, {0}, 0}, + {'\0', 0, 16869, {0}, 0},{'e', 16872, 16870, {0}, 0},{'\0', 0, 16871, {0}, 0}, + {'f', 16874, 16872, {0}, 0},{'\0', 0, 16873, {0}, 0},{'t', 16876, 16874, {0}, 0}, + {'\0', 0, 16875, {0}, 0},{';', 0, 16876, {8639}, 1},{'\0', 0, 16877, {0}, 0}, + {'i', 16880, 16878, {0}, 0},{'\0', 0, 16879, {0}, 0},{'g', 16882, 16880, {0}, 0}, + {'\0', 0, 16881, {0}, 0},{'h', 16884, 16882, {0}, 0},{'\0', 0, 16883, {0}, 0}, + {'t', 16886, 16884, {0}, 0},{'\0', 0, 16885, {0}, 0},{';', 0, 16886, {8638}, 1}, + {'\0', 0, 16887, {0}, 0},{'u', 16890, 16888, {0}, 0},{'\0', 0, 16889, {0}, 0}, + {'s', 16892, 16890, {0}, 0},{'\0', 0, 16891, {0}, 0},{';', 0, 16892, {8846}, 1}, + {'\0', 0, 16893, {0}, 0},{'i', 16896, 16894, {0}, 0},{'\0', 0, 16895, {0}, 0}, + {';', 0, 16896, {965}, 1},{'h', 16900, 16897, {0}, 0},{'l', 16902, 16898, {0}, 0}, + {'\0', 0, 16899, {0}, 0},{';', 0, 16900, {978}, 1},{'\0', 0, 16901, {0}, 0}, + {'o', 16904, 16902, {0}, 0},{'\0', 0, 16903, {0}, 0},{'n', 16906, 16904, {0}, 0}, + {'\0', 0, 16905, {0}, 0},{';', 0, 16906, {965}, 1},{'\0', 0, 16907, {0}, 0}, + {'p', 16910, 16908, {0}, 0},{'\0', 0, 16909, {0}, 0},{'a', 16912, 16910, {0}, 0}, + {'\0', 0, 16911, {0}, 0},{'r', 16914, 16912, {0}, 0},{'\0', 0, 16913, {0}, 0}, + {'r', 16916, 16914, {0}, 0},{'\0', 0, 16915, {0}, 0},{'o', 16918, 16916, {0}, 0}, + {'\0', 0, 16917, {0}, 0},{'w', 16920, 16918, {0}, 0},{'\0', 0, 16919, {0}, 0}, + {'s', 16922, 16920, {0}, 0},{'\0', 0, 16921, {0}, 0},{';', 0, 16922, {8648}, 1}, + {'\0', 0, 16923, {0}, 0},{'c', 16928, 16924, {0}, 0},{'i', 16948, 16925, {0}, 0}, + {'t', 16954, 16926, {0}, 0},{'\0', 0, 16927, {0}, 0},{'o', 16931, 16928, {0}, 0}, + {'r', 16942, 16929, {0}, 0},{'\0', 0, 16930, {0}, 0},{'r', 16933, 16931, {0}, 0}, + {'\0', 0, 16932, {0}, 0},{'n', 16935, 16933, {0}, 0},{'\0', 0, 16934, {0}, 0}, + {';', 0, 16935, {8989}, 1},{'e', 16938, 16936, {0}, 0},{'\0', 0, 16937, {0}, 0}, + {'r', 16940, 16938, {0}, 0},{'\0', 0, 16939, {0}, 0},{';', 0, 16940, {8989}, 1}, + {'\0', 0, 16941, {0}, 0},{'o', 16944, 16942, {0}, 0},{'\0', 0, 16943, {0}, 0}, + {'p', 16946, 16944, {0}, 0},{'\0', 0, 16945, {0}, 0},{';', 0, 16946, {8974}, 1}, + {'\0', 0, 16947, {0}, 0},{'n', 16950, 16948, {0}, 0},{'\0', 0, 16949, {0}, 0}, + {'g', 16952, 16950, {0}, 0},{'\0', 0, 16951, {0}, 0},{';', 0, 16952, {367}, 1}, + {'\0', 0, 16953, {0}, 0},{'r', 16956, 16954, {0}, 0},{'\0', 0, 16955, {0}, 0}, + {'i', 16958, 16956, {0}, 0},{'\0', 0, 16957, {0}, 0},{';', 0, 16958, {9721}, 1}, + {'\0', 0, 16959, {0}, 0},{'c', 16962, 16960, {0}, 0},{'\0', 0, 16961, {0}, 0}, + {'r', 16964, 16962, {0}, 0},{'\0', 0, 16963, {0}, 0},{';', 0, 16964, {120010}, 1}, + {'\0', 0, 16965, {0}, 0},{'d', 16970, 16966, {0}, 0},{'i', 16976, 16967, {0}, 0}, + {'r', 16984, 16968, {0}, 0},{'\0', 0, 16969, {0}, 0},{'o', 16972, 16970, {0}, 0}, + {'\0', 0, 16971, {0}, 0},{'t', 16974, 16972, {0}, 0},{'\0', 0, 16973, {0}, 0}, + {';', 0, 16974, {8944}, 1},{'\0', 0, 16975, {0}, 0},{'l', 16978, 16976, {0}, 0}, + {'\0', 0, 16977, {0}, 0},{'d', 16980, 16978, {0}, 0},{'\0', 0, 16979, {0}, 0}, + {'e', 16982, 16980, {0}, 0},{'\0', 0, 16981, {0}, 0},{';', 0, 16982, {361}, 1}, + {'\0', 0, 16983, {0}, 0},{'i', 16986, 16984, {0}, 0},{'\0', 0, 16985, {0}, 0}, + {';', 0, 16986, {9653}, 1},{'f', 16989, 16987, {0}, 0},{'\0', 0, 16988, {0}, 0}, + {';', 0, 16989, {9652}, 1},{'\0', 0, 16990, {0}, 0},{'a', 16994, 16991, {0}, 0}, + {'m', 17000, 16992, {0}, 0},{'\0', 0, 16993, {0}, 0},{'r', 16996, 16994, {0}, 0}, + {'\0', 0, 16995, {0}, 0},{'r', 16998, 16996, {0}, 0},{'\0', 0, 16997, {0}, 0}, + {';', 0, 16998, {8648}, 1},{'\0', 0, 16999, {0}, 0},{'l', 17002, 17000, {252}, 1}, + {'\0', 0, 17001, {0}, 0},{';', 0, 17002, {252}, 1},{'\0', 0, 17003, {0}, 0}, + {'a', 17006, 17004, {0}, 0},{'\0', 0, 17005, {0}, 0},{'n', 17008, 17006, {0}, 0}, + {'\0', 0, 17007, {0}, 0},{'g', 17010, 17008, {0}, 0},{'\0', 0, 17009, {0}, 0}, + {'l', 17012, 17010, {0}, 0},{'\0', 0, 17011, {0}, 0},{'e', 17014, 17012, {0}, 0}, + {'\0', 0, 17013, {0}, 0},{';', 0, 17014, {10663}, 1},{'\0', 0, 17015, {0}, 0}, + {'A', 17032, 17016, {0}, 0},{'B', 17038, 17017, {0}, 0},{'D', 17047, 17018, {0}, 0}, + {'a', 17055, 17019, {0}, 0},{'c', 17231, 17020, {0}, 0},{'d', 17235, 17021, {0}, 0}, + {'e', 17243, 17022, {0}, 0},{'f', 17280, 17023, {0}, 0},{'l', 17284, 17024, {0}, 0}, + {'n', 17292, 17025, {0}, 0},{'o', 17303, 17026, {0}, 0},{'p', 17309, 17027, {0}, 0}, + {'r', 17317, 17028, {0}, 0},{'s', 17325, 17029, {0}, 0},{'z', 17353, 17030, {0}, 0}, + {'\0', 0, 17031, {0}, 0},{'r', 17034, 17032, {0}, 0},{'\0', 0, 17033, {0}, 0}, + {'r', 17036, 17034, {0}, 0},{'\0', 0, 17035, {0}, 0},{';', 0, 17036, {8661}, 1}, + {'\0', 0, 17037, {0}, 0},{'a', 17040, 17038, {0}, 0},{'\0', 0, 17039, {0}, 0}, + {'r', 17042, 17040, {0}, 0},{'\0', 0, 17041, {0}, 0},{';', 0, 17042, {10984}, 1}, + {'v', 17045, 17043, {0}, 0},{'\0', 0, 17044, {0}, 0},{';', 0, 17045, {10985}, 1}, + {'\0', 0, 17046, {0}, 0},{'a', 17049, 17047, {0}, 0},{'\0', 0, 17048, {0}, 0}, + {'s', 17051, 17049, {0}, 0},{'\0', 0, 17050, {0}, 0},{'h', 17053, 17051, {0}, 0}, + {'\0', 0, 17052, {0}, 0},{';', 0, 17053, {8872}, 1},{'\0', 0, 17054, {0}, 0}, + {'n', 17058, 17055, {0}, 0},{'r', 17066, 17056, {0}, 0},{'\0', 0, 17057, {0}, 0}, + {'g', 17060, 17058, {0}, 0},{'\0', 0, 17059, {0}, 0},{'r', 17062, 17060, {0}, 0}, + {'\0', 0, 17061, {0}, 0},{'t', 17064, 17062, {0}, 0},{'\0', 0, 17063, {0}, 0}, + {';', 0, 17064, {10652}, 1},{'\0', 0, 17065, {0}, 0},{'e', 17074, 17066, {0}, 0}, + {'k', 17088, 17067, {0}, 0},{'n', 17098, 17068, {0}, 0},{'p', 17112, 17069, {0}, 0}, + {'r', 17132, 17070, {0}, 0},{'s', 17139, 17071, {0}, 0},{'t', 17187, 17072, {0}, 0}, + {'\0', 0, 17073, {0}, 0},{'p', 17076, 17074, {0}, 0},{'\0', 0, 17075, {0}, 0}, + {'s', 17078, 17076, {0}, 0},{'\0', 0, 17077, {0}, 0},{'i', 17080, 17078, {0}, 0}, + {'\0', 0, 17079, {0}, 0},{'l', 17082, 17080, {0}, 0},{'\0', 0, 17081, {0}, 0}, + {'o', 17084, 17082, {0}, 0},{'\0', 0, 17083, {0}, 0},{'n', 17086, 17084, {0}, 0}, + {'\0', 0, 17085, {0}, 0},{';', 0, 17086, {1013}, 1},{'\0', 0, 17087, {0}, 0}, + {'a', 17090, 17088, {0}, 0},{'\0', 0, 17089, {0}, 0},{'p', 17092, 17090, {0}, 0}, + {'\0', 0, 17091, {0}, 0},{'p', 17094, 17092, {0}, 0},{'\0', 0, 17093, {0}, 0}, + {'a', 17096, 17094, {0}, 0},{'\0', 0, 17095, {0}, 0},{';', 0, 17096, {1008}, 1}, + {'\0', 0, 17097, {0}, 0},{'o', 17100, 17098, {0}, 0},{'\0', 0, 17099, {0}, 0}, + {'t', 17102, 17100, {0}, 0},{'\0', 0, 17101, {0}, 0},{'h', 17104, 17102, {0}, 0}, + {'\0', 0, 17103, {0}, 0},{'i', 17106, 17104, {0}, 0},{'\0', 0, 17105, {0}, 0}, + {'n', 17108, 17106, {0}, 0},{'\0', 0, 17107, {0}, 0},{'g', 17110, 17108, {0}, 0}, + {'\0', 0, 17109, {0}, 0},{';', 0, 17110, {8709}, 1},{'\0', 0, 17111, {0}, 0}, + {'h', 17116, 17112, {0}, 0},{'i', 17120, 17113, {0}, 0},{'r', 17122, 17114, {0}, 0}, + {'\0', 0, 17115, {0}, 0},{'i', 17118, 17116, {0}, 0},{'\0', 0, 17117, {0}, 0}, + {';', 0, 17118, {981}, 1},{'\0', 0, 17119, {0}, 0},{';', 0, 17120, {982}, 1}, + {'\0', 0, 17121, {0}, 0},{'o', 17124, 17122, {0}, 0},{'\0', 0, 17123, {0}, 0}, + {'p', 17126, 17124, {0}, 0},{'\0', 0, 17125, {0}, 0},{'t', 17128, 17126, {0}, 0}, + {'\0', 0, 17127, {0}, 0},{'o', 17130, 17128, {0}, 0},{'\0', 0, 17129, {0}, 0}, + {';', 0, 17130, {8733}, 1},{'\0', 0, 17131, {0}, 0},{';', 0, 17132, {8597}, 1}, + {'h', 17135, 17133, {0}, 0},{'\0', 0, 17134, {0}, 0},{'o', 17137, 17135, {0}, 0}, + {'\0', 0, 17136, {0}, 0},{';', 0, 17137, {1009}, 1},{'\0', 0, 17138, {0}, 0}, + {'i', 17142, 17139, {0}, 0},{'u', 17150, 17140, {0}, 0},{'\0', 0, 17141, {0}, 0}, + {'g', 17144, 17142, {0}, 0},{'\0', 0, 17143, {0}, 0},{'m', 17146, 17144, {0}, 0}, + {'\0', 0, 17145, {0}, 0},{'a', 17148, 17146, {0}, 0},{'\0', 0, 17147, {0}, 0}, + {';', 0, 17148, {962}, 1},{'\0', 0, 17149, {0}, 0},{'b', 17153, 17150, {0}, 0}, + {'p', 17170, 17151, {0}, 0},{'\0', 0, 17152, {0}, 0},{'s', 17155, 17153, {0}, 0}, + {'\0', 0, 17154, {0}, 0},{'e', 17157, 17155, {0}, 0},{'\0', 0, 17156, {0}, 0}, + {'t', 17159, 17157, {0}, 0},{'\0', 0, 17158, {0}, 0},{'n', 17161, 17159, {0}, 0}, + {'\0', 0, 17160, {0}, 0},{'e', 17163, 17161, {0}, 0},{'\0', 0, 17162, {0}, 0}, + {'q', 17165, 17163, {0}, 0},{'\0', 0, 17164, {0}, 0},{';', 0, 17165, {8842,65024}, 2}, + {'q', 17168, 17166, {0}, 0},{'\0', 0, 17167, {0}, 0},{';', 0, 17168, {10955,65024}, 2}, + {'\0', 0, 17169, {0}, 0},{'s', 17172, 17170, {0}, 0},{'\0', 0, 17171, {0}, 0}, + {'e', 17174, 17172, {0}, 0},{'\0', 0, 17173, {0}, 0},{'t', 17176, 17174, {0}, 0}, + {'\0', 0, 17175, {0}, 0},{'n', 17178, 17176, {0}, 0},{'\0', 0, 17177, {0}, 0}, + {'e', 17180, 17178, {0}, 0},{'\0', 0, 17179, {0}, 0},{'q', 17182, 17180, {0}, 0}, + {'\0', 0, 17181, {0}, 0},{';', 0, 17182, {8843,65024}, 2},{'q', 17185, 17183, {0}, 0}, + {'\0', 0, 17184, {0}, 0},{';', 0, 17185, {10956,65024}, 2},{'\0', 0, 17186, {0}, 0}, + {'h', 17190, 17187, {0}, 0},{'r', 17198, 17188, {0}, 0},{'\0', 0, 17189, {0}, 0}, + {'e', 17192, 17190, {0}, 0},{'\0', 0, 17191, {0}, 0},{'t', 17194, 17192, {0}, 0}, + {'\0', 0, 17193, {0}, 0},{'a', 17196, 17194, {0}, 0},{'\0', 0, 17195, {0}, 0}, + {';', 0, 17196, {977}, 1},{'\0', 0, 17197, {0}, 0},{'i', 17200, 17198, {0}, 0}, + {'\0', 0, 17199, {0}, 0},{'a', 17202, 17200, {0}, 0},{'\0', 0, 17201, {0}, 0}, + {'n', 17204, 17202, {0}, 0},{'\0', 0, 17203, {0}, 0},{'g', 17206, 17204, {0}, 0}, + {'\0', 0, 17205, {0}, 0},{'l', 17208, 17206, {0}, 0},{'\0', 0, 17207, {0}, 0}, + {'e', 17210, 17208, {0}, 0},{'\0', 0, 17209, {0}, 0},{'l', 17213, 17210, {0}, 0}, + {'r', 17221, 17211, {0}, 0},{'\0', 0, 17212, {0}, 0},{'e', 17215, 17213, {0}, 0}, + {'\0', 0, 17214, {0}, 0},{'f', 17217, 17215, {0}, 0},{'\0', 0, 17216, {0}, 0}, + {'t', 17219, 17217, {0}, 0},{'\0', 0, 17218, {0}, 0},{';', 0, 17219, {8882}, 1}, + {'\0', 0, 17220, {0}, 0},{'i', 17223, 17221, {0}, 0},{'\0', 0, 17222, {0}, 0}, + {'g', 17225, 17223, {0}, 0},{'\0', 0, 17224, {0}, 0},{'h', 17227, 17225, {0}, 0}, + {'\0', 0, 17226, {0}, 0},{'t', 17229, 17227, {0}, 0},{'\0', 0, 17228, {0}, 0}, + {';', 0, 17229, {8883}, 1},{'\0', 0, 17230, {0}, 0},{'y', 17233, 17231, {0}, 0}, + {'\0', 0, 17232, {0}, 0},{';', 0, 17233, {1074}, 1},{'\0', 0, 17234, {0}, 0}, + {'a', 17237, 17235, {0}, 0},{'\0', 0, 17236, {0}, 0},{'s', 17239, 17237, {0}, 0}, + {'\0', 0, 17238, {0}, 0},{'h', 17241, 17239, {0}, 0},{'\0', 0, 17240, {0}, 0}, + {';', 0, 17241, {8866}, 1},{'\0', 0, 17242, {0}, 0},{'e', 17247, 17243, {0}, 0}, + {'l', 17261, 17244, {0}, 0},{'r', 17269, 17245, {0}, 0},{'\0', 0, 17246, {0}, 0}, + {';', 0, 17247, {8744}, 1},{'b', 17251, 17248, {0}, 0},{'e', 17257, 17249, {0}, 0}, + {'\0', 0, 17250, {0}, 0},{'a', 17253, 17251, {0}, 0},{'\0', 0, 17252, {0}, 0}, + {'r', 17255, 17253, {0}, 0},{'\0', 0, 17254, {0}, 0},{';', 0, 17255, {8891}, 1}, + {'\0', 0, 17256, {0}, 0},{'q', 17259, 17257, {0}, 0},{'\0', 0, 17258, {0}, 0}, + {';', 0, 17259, {8794}, 1},{'\0', 0, 17260, {0}, 0},{'l', 17263, 17261, {0}, 0}, + {'\0', 0, 17262, {0}, 0},{'i', 17265, 17263, {0}, 0},{'\0', 0, 17264, {0}, 0}, + {'p', 17267, 17265, {0}, 0},{'\0', 0, 17266, {0}, 0},{';', 0, 17267, {8942}, 1}, + {'\0', 0, 17268, {0}, 0},{'b', 17272, 17269, {0}, 0},{'t', 17278, 17270, {0}, 0}, + {'\0', 0, 17271, {0}, 0},{'a', 17274, 17272, {0}, 0},{'\0', 0, 17273, {0}, 0}, + {'r', 17276, 17274, {0}, 0},{'\0', 0, 17275, {0}, 0},{';', 0, 17276, {124}, 1}, + {'\0', 0, 17277, {0}, 0},{';', 0, 17278, {124}, 1},{'\0', 0, 17279, {0}, 0}, + {'r', 17282, 17280, {0}, 0},{'\0', 0, 17281, {0}, 0},{';', 0, 17282, {120115}, 1}, + {'\0', 0, 17283, {0}, 0},{'t', 17286, 17284, {0}, 0},{'\0', 0, 17285, {0}, 0}, + {'r', 17288, 17286, {0}, 0},{'\0', 0, 17287, {0}, 0},{'i', 17290, 17288, {0}, 0}, + {'\0', 0, 17289, {0}, 0},{';', 0, 17290, {8882}, 1},{'\0', 0, 17291, {0}, 0}, + {'s', 17294, 17292, {0}, 0},{'\0', 0, 17293, {0}, 0},{'u', 17296, 17294, {0}, 0}, + {'\0', 0, 17295, {0}, 0},{'b', 17299, 17296, {0}, 0},{'p', 17301, 17297, {0}, 0}, + {'\0', 0, 17298, {0}, 0},{';', 0, 17299, {8834,8402}, 2},{'\0', 0, 17300, {0}, 0}, + {';', 0, 17301, {8835,8402}, 2},{'\0', 0, 17302, {0}, 0},{'p', 17305, 17303, {0}, 0}, + {'\0', 0, 17304, {0}, 0},{'f', 17307, 17305, {0}, 0},{'\0', 0, 17306, {0}, 0}, + {';', 0, 17307, {120167}, 1},{'\0', 0, 17308, {0}, 0},{'r', 17311, 17309, {0}, 0}, + {'\0', 0, 17310, {0}, 0},{'o', 17313, 17311, {0}, 0},{'\0', 0, 17312, {0}, 0}, + {'p', 17315, 17313, {0}, 0},{'\0', 0, 17314, {0}, 0},{';', 0, 17315, {8733}, 1}, + {'\0', 0, 17316, {0}, 0},{'t', 17319, 17317, {0}, 0},{'\0', 0, 17318, {0}, 0}, + {'r', 17321, 17319, {0}, 0},{'\0', 0, 17320, {0}, 0},{'i', 17323, 17321, {0}, 0}, + {'\0', 0, 17322, {0}, 0},{';', 0, 17323, {8883}, 1},{'\0', 0, 17324, {0}, 0}, + {'c', 17328, 17325, {0}, 0},{'u', 17332, 17326, {0}, 0},{'\0', 0, 17327, {0}, 0}, + {'r', 17330, 17328, {0}, 0},{'\0', 0, 17329, {0}, 0},{';', 0, 17330, {120011}, 1}, + {'\0', 0, 17331, {0}, 0},{'b', 17335, 17332, {0}, 0},{'p', 17344, 17333, {0}, 0}, + {'\0', 0, 17334, {0}, 0},{'n', 17337, 17335, {0}, 0},{'\0', 0, 17336, {0}, 0}, + {'E', 17340, 17337, {0}, 0},{'e', 17342, 17338, {0}, 0},{'\0', 0, 17339, {0}, 0}, + {';', 0, 17340, {10955,65024}, 2},{'\0', 0, 17341, {0}, 0},{';', 0, 17342, {8842,65024}, 2}, + {'\0', 0, 17343, {0}, 0},{'n', 17346, 17344, {0}, 0},{'\0', 0, 17345, {0}, 0}, + {'E', 17349, 17346, {0}, 0},{'e', 17351, 17347, {0}, 0},{'\0', 0, 17348, {0}, 0}, + {';', 0, 17349, {10956,65024}, 2},{'\0', 0, 17350, {0}, 0},{';', 0, 17351, {8843,65024}, 2}, + {'\0', 0, 17352, {0}, 0},{'i', 17355, 17353, {0}, 0},{'\0', 0, 17354, {0}, 0}, + {'g', 17357, 17355, {0}, 0},{'\0', 0, 17356, {0}, 0},{'z', 17359, 17357, {0}, 0}, + {'\0', 0, 17358, {0}, 0},{'a', 17361, 17359, {0}, 0},{'\0', 0, 17360, {0}, 0}, + {'g', 17363, 17361, {0}, 0},{'\0', 0, 17362, {0}, 0},{';', 0, 17363, {10650}, 1}, + {'\0', 0, 17364, {0}, 0},{'c', 17373, 17365, {0}, 0},{'e', 17381, 17366, {0}, 0}, + {'f', 17408, 17367, {0}, 0},{'o', 17412, 17368, {0}, 0},{'p', 17418, 17369, {0}, 0}, + {'r', 17420, 17370, {0}, 0},{'s', 17431, 17371, {0}, 0},{'\0', 0, 17372, {0}, 0}, + {'i', 17375, 17373, {0}, 0},{'\0', 0, 17374, {0}, 0},{'r', 17377, 17375, {0}, 0}, + {'\0', 0, 17376, {0}, 0},{'c', 17379, 17377, {0}, 0},{'\0', 0, 17378, {0}, 0}, + {';', 0, 17379, {373}, 1},{'\0', 0, 17380, {0}, 0},{'d', 17384, 17381, {0}, 0}, + {'i', 17400, 17382, {0}, 0},{'\0', 0, 17383, {0}, 0},{'b', 17387, 17384, {0}, 0}, + {'g', 17393, 17385, {0}, 0},{'\0', 0, 17386, {0}, 0},{'a', 17389, 17387, {0}, 0}, + {'\0', 0, 17388, {0}, 0},{'r', 17391, 17389, {0}, 0},{'\0', 0, 17390, {0}, 0}, + {';', 0, 17391, {10847}, 1},{'\0', 0, 17392, {0}, 0},{'e', 17395, 17393, {0}, 0}, + {'\0', 0, 17394, {0}, 0},{';', 0, 17395, {8743}, 1},{'q', 17398, 17396, {0}, 0}, + {'\0', 0, 17397, {0}, 0},{';', 0, 17398, {8793}, 1},{'\0', 0, 17399, {0}, 0}, + {'e', 17402, 17400, {0}, 0},{'\0', 0, 17401, {0}, 0},{'r', 17404, 17402, {0}, 0}, + {'\0', 0, 17403, {0}, 0},{'p', 17406, 17404, {0}, 0},{'\0', 0, 17405, {0}, 0}, + {';', 0, 17406, {8472}, 1},{'\0', 0, 17407, {0}, 0},{'r', 17410, 17408, {0}, 0}, + {'\0', 0, 17409, {0}, 0},{';', 0, 17410, {120116}, 1},{'\0', 0, 17411, {0}, 0}, + {'p', 17414, 17412, {0}, 0},{'\0', 0, 17413, {0}, 0},{'f', 17416, 17414, {0}, 0}, + {'\0', 0, 17415, {0}, 0},{';', 0, 17416, {120168}, 1},{'\0', 0, 17417, {0}, 0}, + {';', 0, 17418, {8472}, 1},{'\0', 0, 17419, {0}, 0},{';', 0, 17420, {8768}, 1}, + {'e', 17423, 17421, {0}, 0},{'\0', 0, 17422, {0}, 0},{'a', 17425, 17423, {0}, 0}, + {'\0', 0, 17424, {0}, 0},{'t', 17427, 17425, {0}, 0},{'\0', 0, 17426, {0}, 0}, + {'h', 17429, 17427, {0}, 0},{'\0', 0, 17428, {0}, 0},{';', 0, 17429, {8768}, 1}, + {'\0', 0, 17430, {0}, 0},{'c', 17433, 17431, {0}, 0},{'\0', 0, 17432, {0}, 0}, + {'r', 17435, 17433, {0}, 0},{'\0', 0, 17434, {0}, 0},{';', 0, 17435, {120012}, 1}, + {'\0', 0, 17436, {0}, 0},{'c', 17452, 17437, {0}, 0},{'d', 17470, 17438, {0}, 0}, + {'f', 17478, 17439, {0}, 0},{'h', 17482, 17440, {0}, 0},{'i', 17497, 17441, {0}, 0}, + {'l', 17499, 17442, {0}, 0},{'m', 17514, 17443, {0}, 0},{'n', 17520, 17444, {0}, 0}, + {'o', 17526, 17445, {0}, 0},{'r', 17555, 17446, {0}, 0},{'s', 17570, 17447, {0}, 0}, + {'u', 17585, 17448, {0}, 0},{'v', 17602, 17449, {0}, 0},{'w', 17608, 17450, {0}, 0}, + {'\0', 0, 17451, {0}, 0},{'a', 17456, 17452, {0}, 0},{'i', 17460, 17453, {0}, 0}, + {'u', 17466, 17454, {0}, 0},{'\0', 0, 17455, {0}, 0},{'p', 17458, 17456, {0}, 0}, + {'\0', 0, 17457, {0}, 0},{';', 0, 17458, {8898}, 1},{'\0', 0, 17459, {0}, 0}, + {'r', 17462, 17460, {0}, 0},{'\0', 0, 17461, {0}, 0},{'c', 17464, 17462, {0}, 0}, + {'\0', 0, 17463, {0}, 0},{';', 0, 17464, {9711}, 1},{'\0', 0, 17465, {0}, 0}, + {'p', 17468, 17466, {0}, 0},{'\0', 0, 17467, {0}, 0},{';', 0, 17468, {8899}, 1}, + {'\0', 0, 17469, {0}, 0},{'t', 17472, 17470, {0}, 0},{'\0', 0, 17471, {0}, 0}, + {'r', 17474, 17472, {0}, 0},{'\0', 0, 17473, {0}, 0},{'i', 17476, 17474, {0}, 0}, + {'\0', 0, 17475, {0}, 0},{';', 0, 17476, {9661}, 1},{'\0', 0, 17477, {0}, 0}, + {'r', 17480, 17478, {0}, 0},{'\0', 0, 17479, {0}, 0},{';', 0, 17480, {120117}, 1}, + {'\0', 0, 17481, {0}, 0},{'A', 17485, 17482, {0}, 0},{'a', 17491, 17483, {0}, 0}, + {'\0', 0, 17484, {0}, 0},{'r', 17487, 17485, {0}, 0},{'\0', 0, 17486, {0}, 0}, + {'r', 17489, 17487, {0}, 0},{'\0', 0, 17488, {0}, 0},{';', 0, 17489, {10234}, 1}, + {'\0', 0, 17490, {0}, 0},{'r', 17493, 17491, {0}, 0},{'\0', 0, 17492, {0}, 0}, + {'r', 17495, 17493, {0}, 0},{'\0', 0, 17494, {0}, 0},{';', 0, 17495, {10231}, 1}, + {'\0', 0, 17496, {0}, 0},{';', 0, 17497, {958}, 1},{'\0', 0, 17498, {0}, 0}, + {'A', 17502, 17499, {0}, 0},{'a', 17508, 17500, {0}, 0},{'\0', 0, 17501, {0}, 0}, + {'r', 17504, 17502, {0}, 0},{'\0', 0, 17503, {0}, 0},{'r', 17506, 17504, {0}, 0}, + {'\0', 0, 17505, {0}, 0},{';', 0, 17506, {10232}, 1},{'\0', 0, 17507, {0}, 0}, + {'r', 17510, 17508, {0}, 0},{'\0', 0, 17509, {0}, 0},{'r', 17512, 17510, {0}, 0}, + {'\0', 0, 17511, {0}, 0},{';', 0, 17512, {10229}, 1},{'\0', 0, 17513, {0}, 0}, + {'a', 17516, 17514, {0}, 0},{'\0', 0, 17515, {0}, 0},{'p', 17518, 17516, {0}, 0}, + {'\0', 0, 17517, {0}, 0},{';', 0, 17518, {10236}, 1},{'\0', 0, 17519, {0}, 0}, + {'i', 17522, 17520, {0}, 0},{'\0', 0, 17521, {0}, 0},{'s', 17524, 17522, {0}, 0}, + {'\0', 0, 17523, {0}, 0},{';', 0, 17524, {8955}, 1},{'\0', 0, 17525, {0}, 0}, + {'d', 17530, 17526, {0}, 0},{'p', 17536, 17527, {0}, 0},{'t', 17547, 17528, {0}, 0}, + {'\0', 0, 17529, {0}, 0},{'o', 17532, 17530, {0}, 0},{'\0', 0, 17531, {0}, 0}, + {'t', 17534, 17532, {0}, 0},{'\0', 0, 17533, {0}, 0},{';', 0, 17534, {10752}, 1}, + {'\0', 0, 17535, {0}, 0},{'f', 17539, 17536, {0}, 0},{'l', 17541, 17537, {0}, 0}, + {'\0', 0, 17538, {0}, 0},{';', 0, 17539, {120169}, 1},{'\0', 0, 17540, {0}, 0}, + {'u', 17543, 17541, {0}, 0},{'\0', 0, 17542, {0}, 0},{'s', 17545, 17543, {0}, 0}, + {'\0', 0, 17544, {0}, 0},{';', 0, 17545, {10753}, 1},{'\0', 0, 17546, {0}, 0}, + {'i', 17549, 17547, {0}, 0},{'\0', 0, 17548, {0}, 0},{'m', 17551, 17549, {0}, 0}, + {'\0', 0, 17550, {0}, 0},{'e', 17553, 17551, {0}, 0},{'\0', 0, 17552, {0}, 0}, + {';', 0, 17553, {10754}, 1},{'\0', 0, 17554, {0}, 0},{'A', 17558, 17555, {0}, 0}, + {'a', 17564, 17556, {0}, 0},{'\0', 0, 17557, {0}, 0},{'r', 17560, 17558, {0}, 0}, + {'\0', 0, 17559, {0}, 0},{'r', 17562, 17560, {0}, 0},{'\0', 0, 17561, {0}, 0}, + {';', 0, 17562, {10233}, 1},{'\0', 0, 17563, {0}, 0},{'r', 17566, 17564, {0}, 0}, + {'\0', 0, 17565, {0}, 0},{'r', 17568, 17566, {0}, 0},{'\0', 0, 17567, {0}, 0}, + {';', 0, 17568, {10230}, 1},{'\0', 0, 17569, {0}, 0},{'c', 17573, 17570, {0}, 0}, + {'q', 17577, 17571, {0}, 0},{'\0', 0, 17572, {0}, 0},{'r', 17575, 17573, {0}, 0}, + {'\0', 0, 17574, {0}, 0},{';', 0, 17575, {120013}, 1},{'\0', 0, 17576, {0}, 0}, + {'c', 17579, 17577, {0}, 0},{'\0', 0, 17578, {0}, 0},{'u', 17581, 17579, {0}, 0}, + {'\0', 0, 17580, {0}, 0},{'p', 17583, 17581, {0}, 0},{'\0', 0, 17582, {0}, 0}, + {';', 0, 17583, {10758}, 1},{'\0', 0, 17584, {0}, 0},{'p', 17588, 17585, {0}, 0}, + {'t', 17596, 17586, {0}, 0},{'\0', 0, 17587, {0}, 0},{'l', 17590, 17588, {0}, 0}, + {'\0', 0, 17589, {0}, 0},{'u', 17592, 17590, {0}, 0},{'\0', 0, 17591, {0}, 0}, + {'s', 17594, 17592, {0}, 0},{'\0', 0, 17593, {0}, 0},{';', 0, 17594, {10756}, 1}, + {'\0', 0, 17595, {0}, 0},{'r', 17598, 17596, {0}, 0},{'\0', 0, 17597, {0}, 0}, + {'i', 17600, 17598, {0}, 0},{'\0', 0, 17599, {0}, 0},{';', 0, 17600, {9651}, 1}, + {'\0', 0, 17601, {0}, 0},{'e', 17604, 17602, {0}, 0},{'\0', 0, 17603, {0}, 0}, + {'e', 17606, 17604, {0}, 0},{'\0', 0, 17605, {0}, 0},{';', 0, 17606, {8897}, 1}, + {'\0', 0, 17607, {0}, 0},{'e', 17610, 17608, {0}, 0},{'\0', 0, 17609, {0}, 0}, + {'d', 17612, 17610, {0}, 0},{'\0', 0, 17611, {0}, 0},{'g', 17614, 17612, {0}, 0}, + {'\0', 0, 17613, {0}, 0},{'e', 17616, 17614, {0}, 0},{'\0', 0, 17615, {0}, 0}, + {';', 0, 17616, {8896}, 1},{'\0', 0, 17617, {0}, 0},{'a', 17627, 17618, {0}, 0}, + {'c', 17640, 17619, {0}, 0},{'e', 17651, 17620, {0}, 0},{'f', 17655, 17621, {0}, 0}, + {'i', 17659, 17622, {0}, 0},{'o', 17665, 17623, {0}, 0},{'s', 17671, 17624, {0}, 0}, + {'u', 17677, 17625, {0}, 0},{'\0', 0, 17626, {0}, 0},{'c', 17629, 17627, {0}, 0}, + {'\0', 0, 17628, {0}, 0},{'u', 17632, 17629, {0}, 0},{'y', 17638, 17630, {0}, 0}, + {'\0', 0, 17631, {0}, 0},{'t', 17634, 17632, {0}, 0},{'\0', 0, 17633, {0}, 0}, + {'e', 17636, 17634, {253}, 1},{'\0', 0, 17635, {0}, 0},{';', 0, 17636, {253}, 1}, + {'\0', 0, 17637, {0}, 0},{';', 0, 17638, {1103}, 1},{'\0', 0, 17639, {0}, 0}, + {'i', 17643, 17640, {0}, 0},{'y', 17649, 17641, {0}, 0},{'\0', 0, 17642, {0}, 0}, + {'r', 17645, 17643, {0}, 0},{'\0', 0, 17644, {0}, 0},{'c', 17647, 17645, {0}, 0}, + {'\0', 0, 17646, {0}, 0},{';', 0, 17647, {375}, 1},{'\0', 0, 17648, {0}, 0}, + {';', 0, 17649, {1099}, 1},{'\0', 0, 17650, {0}, 0},{'n', 17653, 17651, {165}, 1}, + {'\0', 0, 17652, {0}, 0},{';', 0, 17653, {165}, 1},{'\0', 0, 17654, {0}, 0}, + {'r', 17657, 17655, {0}, 0},{'\0', 0, 17656, {0}, 0},{';', 0, 17657, {120118}, 1}, + {'\0', 0, 17658, {0}, 0},{'c', 17661, 17659, {0}, 0},{'\0', 0, 17660, {0}, 0}, + {'y', 17663, 17661, {0}, 0},{'\0', 0, 17662, {0}, 0},{';', 0, 17663, {1111}, 1}, + {'\0', 0, 17664, {0}, 0},{'p', 17667, 17665, {0}, 0},{'\0', 0, 17666, {0}, 0}, + {'f', 17669, 17667, {0}, 0},{'\0', 0, 17668, {0}, 0},{';', 0, 17669, {120170}, 1}, + {'\0', 0, 17670, {0}, 0},{'c', 17673, 17671, {0}, 0},{'\0', 0, 17672, {0}, 0}, + {'r', 17675, 17673, {0}, 0},{'\0', 0, 17674, {0}, 0},{';', 0, 17675, {120014}, 1}, + {'\0', 0, 17676, {0}, 0},{'c', 17680, 17677, {0}, 0},{'m', 17684, 17678, {0}, 0}, + {'\0', 0, 17679, {0}, 0},{'y', 17682, 17680, {0}, 0},{'\0', 0, 17681, {0}, 0}, + {';', 0, 17682, {1102}, 1},{'\0', 0, 17683, {0}, 0},{'l', 17686, 17684, {255}, 1}, + {'\0', 0, 17685, {0}, 0},{';', 0, 17686, {255}, 1},{'\0', 0, 17687, {0}, 0}, + {'a', 17699, 17688, {0}, 0},{'c', 17709, 17689, {0}, 0},{'d', 17722, 17690, {0}, 0}, + {'e', 17728, 17691, {0}, 0},{'f', 17743, 17692, {0}, 0},{'h', 17747, 17693, {0}, 0}, + {'i', 17753, 17694, {0}, 0},{'o', 17765, 17695, {0}, 0},{'s', 17771, 17696, {0}, 0}, + {'w', 17777, 17697, {0}, 0},{'\0', 0, 17698, {0}, 0},{'c', 17701, 17699, {0}, 0}, + {'\0', 0, 17700, {0}, 0},{'u', 17703, 17701, {0}, 0},{'\0', 0, 17702, {0}, 0}, + {'t', 17705, 17703, {0}, 0},{'\0', 0, 17704, {0}, 0},{'e', 17707, 17705, {0}, 0}, + {'\0', 0, 17706, {0}, 0},{';', 0, 17707, {378}, 1},{'\0', 0, 17708, {0}, 0}, + {'a', 17712, 17709, {0}, 0},{'y', 17720, 17710, {0}, 0},{'\0', 0, 17711, {0}, 0}, + {'r', 17714, 17712, {0}, 0},{'\0', 0, 17713, {0}, 0},{'o', 17716, 17714, {0}, 0}, + {'\0', 0, 17715, {0}, 0},{'n', 17718, 17716, {0}, 0},{'\0', 0, 17717, {0}, 0}, + {';', 0, 17718, {382}, 1},{'\0', 0, 17719, {0}, 0},{';', 0, 17720, {1079}, 1}, + {'\0', 0, 17721, {0}, 0},{'o', 17724, 17722, {0}, 0},{'\0', 0, 17723, {0}, 0}, + {'t', 17726, 17724, {0}, 0},{'\0', 0, 17725, {0}, 0},{';', 0, 17726, {380}, 1}, + {'\0', 0, 17727, {0}, 0},{'e', 17731, 17728, {0}, 0},{'t', 17739, 17729, {0}, 0}, + {'\0', 0, 17730, {0}, 0},{'t', 17733, 17731, {0}, 0},{'\0', 0, 17732, {0}, 0}, + {'r', 17735, 17733, {0}, 0},{'\0', 0, 17734, {0}, 0},{'f', 17737, 17735, {0}, 0}, + {'\0', 0, 17736, {0}, 0},{';', 0, 17737, {8488}, 1},{'\0', 0, 17738, {0}, 0}, + {'a', 17741, 17739, {0}, 0},{'\0', 0, 17740, {0}, 0},{';', 0, 17741, {950}, 1}, + {'\0', 0, 17742, {0}, 0},{'r', 17745, 17743, {0}, 0},{'\0', 0, 17744, {0}, 0}, + {';', 0, 17745, {120119}, 1},{'\0', 0, 17746, {0}, 0},{'c', 17749, 17747, {0}, 0}, + {'\0', 0, 17748, {0}, 0},{'y', 17751, 17749, {0}, 0},{'\0', 0, 17750, {0}, 0}, + {';', 0, 17751, {1078}, 1},{'\0', 0, 17752, {0}, 0},{'g', 17755, 17753, {0}, 0}, + {'\0', 0, 17754, {0}, 0},{'r', 17757, 17755, {0}, 0},{'\0', 0, 17756, {0}, 0}, + {'a', 17759, 17757, {0}, 0},{'\0', 0, 17758, {0}, 0},{'r', 17761, 17759, {0}, 0}, + {'\0', 0, 17760, {0}, 0},{'r', 17763, 17761, {0}, 0},{'\0', 0, 17762, {0}, 0}, + {';', 0, 17763, {8669}, 1},{'\0', 0, 17764, {0}, 0},{'p', 17767, 17765, {0}, 0}, + {'\0', 0, 17766, {0}, 0},{'f', 17769, 17767, {0}, 0},{'\0', 0, 17768, {0}, 0}, + {';', 0, 17769, {120171}, 1},{'\0', 0, 17770, {0}, 0},{'c', 17773, 17771, {0}, 0}, + {'\0', 0, 17772, {0}, 0},{'r', 17775, 17773, {0}, 0},{'\0', 0, 17774, {0}, 0}, + {';', 0, 17775, {120015}, 1},{'\0', 0, 17776, {0}, 0},{'j', 17780, 17777, {0}, 0}, + {'n', 17782, 17778, {0}, 0},{'\0', 0, 17779, {0}, 0},{';', 0, 17780, {8205}, 1}, + {'\0', 0, 17781, {0}, 0},{'j', 17784, 17782, {0}, 0},{'\0', 0, 17783, {0}, 0}, + {';', 0, 17784, {8204}, 1},{'\0', 0, 17785, {0}, 0} +}; + +#endif /* MyHTML_CHAREF_RESOURCE_H */ diff --git a/include/myhtml/data_process.h b/include/myhtml/data_process.h new file mode 100644 index 0000000..64e7bd6 --- /dev/null +++ b/include/myhtml/data_process.h @@ -0,0 +1,72 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_DATA_PROCESS_H +#define MyHTML_DATA_PROCESS_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +struct myhtml_data_process_entry { + /* current state for process data */ + myhtml_data_process_state_f state; + + /* for encodings */ + myhtml_encoding_t encoding; + myhtml_encoding_result_t res; + + /* temp */ + size_t tmp_str_pos_proc; + size_t tmp_str_pos; + size_t tmp_num; + + /* < current result */ + charef_entry_result_t charef_res; + + /* settings */ + bool is_attributes; + bool emit_null_char; +}; + +void myhtml_data_process_entry_clean(myhtml_data_process_entry_t* proc_entry); + +void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t size); +void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); + +size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char *data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_DATA_PROCESS_H */ + diff --git a/include/myhtml/def.h b/include/myhtml/def.h new file mode 100644 index 0000000..389b198 --- /dev/null +++ b/include/myhtml/def.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_def_H +#define MyHTML_def_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define myhtml_parser_skip_whitespace() \ +if(myhtml_whithspace(html[html_offset], ==, ||)) { \ + while (html_offset < html_size && (myhtml_whithspace(html[html_offset], ==, ||))) { \ + html_offset++; \ + } \ +} + +#define myhtml_parser_queue_set_attr(tree, token_node) \ + if(token_node->attr_first == NULL) { \ + token_node->attr_first = myhtml_tree_token_attr_current(tree); \ + token_node->attr_last = token_node->attr_first; \ + \ + tree->attr_current = token_node->attr_last; \ + tree->attr_current->next = NULL; \ + tree->attr_current->prev = NULL; \ + } \ + else { \ + token_node->attr_last->next = myhtml_tree_token_attr_current(tree); \ + token_node->attr_last->next->prev = token_node->attr_last; \ + token_node->attr_last = token_node->attr_last->next; \ + \ + token_node->attr_last->next = NULL; \ + tree->attr_current = token_node->attr_last; \ + } + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/include/myhtml/encoding.h b/include/myhtml/encoding.h new file mode 100644 index 0000000..d8c2e57 --- /dev/null +++ b/include/myhtml/encoding.h @@ -0,0 +1,146 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_ENCODING_H +#define MyHTML_ENCODING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +enum myhtml_encoding_status { + MyHTML_ENCODING_STATUS_OK = 0x00, + MyHTML_ENCODING_STATUS_ERROR = 0x01, + MyHTML_ENCODING_STATUS_CONTINUE = 0x02, + MyHTML_ENCODING_STATUS_DONE = 0x04 +} +typedef myhtml_encoding_status_t; + +struct myhtml_encoding_result { + unsigned long first; + unsigned long second; + unsigned long third; + unsigned long result; + unsigned long result_aux; + unsigned long flag; +} +typedef myhtml_encoding_result_t; + +struct myhtml_encoding_trigram { + const unsigned char trigram[3]; + size_t value; +} +typedef myhtml_encoding_trigram_t; + +struct myhtml_encoding_trigram_result { + size_t count; + size_t value; +} +typedef myhtml_encoding_trigram_result_t; + +struct myhtml_encoding_unicode_result { + size_t count_ascii; + size_t count_good; + size_t count_bad; +} +typedef myhtml_encoding_unicode_result_t; + +struct myhtml_encoding_detect_name_entry { + const char* name; + size_t name_length; + const char* label; + size_t label_length; + + myhtml_encoding_t encoding; + + size_t next; + size_t curr; +} +typedef myhtml_encoding_detect_name_entry_t; + +typedef myhtml_encoding_status_t (*myhtml_encoding_custom_f)(unsigned const char data, myhtml_encoding_result_t *res); + +myhtml_encoding_custom_f myhtml_encoding_get_function_by_id(myhtml_encoding_t idx); + +enum myhtml_encoding_status myhtml_encoding_decode_utf_8(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_ibm866(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_2(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_3(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_4(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_5(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_6(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_7(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8_i(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_10(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_13(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_14(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_15(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_16(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_koi8_r(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_koi8_u(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_macintosh(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_874(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1250(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1251(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1252(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1253(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1254(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1255(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1256(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1257(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1258(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_x_mac_cyrillic(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_gbk(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_gb18030(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_big5(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_euc_jp(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_2022_jp(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_shift_jis(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_euc_kr(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_shared_utf_16(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_utf_16be(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_utf_16le(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_x_user_defined(unsigned const char data, myhtml_encoding_result_t *res); + +size_t myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); +size_t myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data); +size_t myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); + +void myhtml_encoding_result_clean(myhtml_encoding_result_t *res); + +bool myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, const char **new_text, size_t *new_size); + +const myhtml_encoding_detect_name_entry_t * myhtml_encoding_name_entry_by_name(const char* name, size_t length); +bool myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* encoding_h */ diff --git a/include/myhtml/encoding_detect_resource.h b/include/myhtml/encoding_detect_resource.h new file mode 100644 index 0000000..5dc4a2c --- /dev/null +++ b/include/myhtml/encoding_detect_resource.h @@ -0,0 +1,5580 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_ENCODING_DETECT_RESOURCE_H +#define MyHTML_ENCODING_DETECT_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define MyHTML_ENCODING_DETECT_NAME_STATIC_SIZE 419 + +#include + +static const myhtml_encoding_detect_name_entry_t myhtml_encoding_detect_name_entry_static_list_index[] = +{ + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "x-cp1257", 8, MyHTML_ENCODING_WINDOWS_1257, 0, 7}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-874", 11, "tis-620", 7, MyHTML_ENCODING_WINDOWS_874, 0, 10}, + {"iso-8859-3", 10, "iso8859-3", 9, MyHTML_ENCODING_ISO_8859_3, 420, 11}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "ms932", 5, MyHTML_ENCODING_SHIFT_JIS, 0, 16}, + {"windows-1256", 12, "windows-1256", 12, MyHTML_ENCODING_WINDOWS_1256, 421, 17}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "csisolatincyrillic", 18, MyHTML_ENCODING_ISO_8859_5, 422, 20}, + {"windows-1250", 12, "cp1250", 6, MyHTML_ENCODING_WINDOWS_1250, 423, 21}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "shift-jis", 9, MyHTML_ENCODING_SHIFT_JIS, 424, 30}, + {"ibm866", 6, "csibm866", 8, MyHTML_ENCODING_IBM866, 425, 31}, + {"euc-kr", 6, "windows-949", 11, MyHTML_ENCODING_EUC_KR, 0, 32}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-2022-jp", 11, "csiso2022jp", 11, MyHTML_ENCODING_ISO_2022_JP, 0, 40}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "iso-8859-15", 11, MyHTML_ENCODING_ISO_8859_15, 426, 42}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ksc_5601", 8, MyHTML_ENCODING_EUC_KR, 0, 45}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "csiso58gb231280", 15, MyHTML_ENCODING_GBK, 0, 51}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "cyrillic", 8, MyHTML_ENCODING_ISO_8859_5, 0, 56}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "cp1255", 6, MyHTML_ENCODING_WINDOWS_1255, 427, 58}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "x-cp1254", 8, MyHTML_ENCODING_WINDOWS_1254, 0, 60}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "csisolatin9", 11, MyHTML_ENCODING_ISO_8859_15, 0, 62}, + {"koi8-u", 6, "koi8-ru", 7, MyHTML_ENCODING_KOI8_U, 0, 63}, + {"iso-8859-4", 10, "csisolatin4", 11, MyHTML_ENCODING_ISO_8859_4, 0, 64}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "windows-31j", 11, MyHTML_ENCODING_SHIFT_JIS, 0, 66}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "utf-8", 5, MyHTML_ENCODING_UTF_8, 0, 79}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"ibm866", 6, "ibm866", 6, MyHTML_ENCODING_IBM866, 0, 82}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi8", 4, MyHTML_ENCODING_KOI8_R, 0, 86}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "hebrew", 6, MyHTML_ENCODING_ISO_8859_8, 428, 94}, + {"iso-8859-7", 10, "csisolatingreek", 15, MyHTML_ENCODING_ISO_8859_7, 0, 95}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "iso88591", 8, MyHTML_ENCODING_WINDOWS_1252, 0, 99}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso88592", 8, MyHTML_ENCODING_ISO_8859_2, 0, 101}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "iso88593", 8, MyHTML_ENCODING_ISO_8859_3, 0, 103}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso88594", 8, MyHTML_ENCODING_ISO_8859_4, 0, 105}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "iso88595", 8, MyHTML_ENCODING_ISO_8859_5, 430, 107}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso88596", 8, MyHTML_ENCODING_ISO_8859_6, 431, 109}, + {"windows-1252", 12, "l1", 2, MyHTML_ENCODING_WINDOWS_1252, 432, 110}, + {"iso-8859-6", 10, "csisolatinarabic", 16, MyHTML_ENCODING_ISO_8859_6, 433, 111}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "iso88598", 8, MyHTML_ENCODING_ISO_8859_8, 435, 113}, + {"koi8-u", 6, "koi8-u", 6, MyHTML_ENCODING_KOI8_U, 0, 114}, + {"windows-1254", 12, "iso88599", 8, MyHTML_ENCODING_WINDOWS_1254, 0, 115}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "ecma-114", 8, MyHTML_ENCODING_ISO_8859_6, 0, 117}, + {"iso-8859-4", 10, "iso8859-4", 9, MyHTML_ENCODING_ISO_8859_4, 436, 118}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso-ir-110", 10, MyHTML_ENCODING_ISO_8859_4, 437, 121}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "l3", 2, MyHTML_ENCODING_ISO_8859_3, 0, 123}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso-8859-2", 10, MyHTML_ENCODING_ISO_8859_2, 439, 126}, + {"iso-8859-8", 10, "iso8859-8", 9, MyHTML_ENCODING_ISO_8859_8, 440, 127}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1258", 12, "x-cp1258", 8, MyHTML_ENCODING_WINDOWS_1258, 0, 129}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso-8859-4", 10, MyHTML_ENCODING_ISO_8859_4, 443, 131}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "iso-8859-10", 11, MyHTML_ENCODING_ISO_8859_10, 0, 133}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso-8859-6", 10, MyHTML_ENCODING_ISO_8859_6, 446, 136}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "latin2", 6, MyHTML_ENCODING_ISO_8859_2, 0, 138}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "iso-8859-8", 10, MyHTML_ENCODING_ISO_8859_8, 449, 141}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "cp819", 5, MyHTML_ENCODING_WINDOWS_1252, 0, 143}, + {"iso-8859-14", 11, "iso-8859-14", 11, MyHTML_ENCODING_ISO_8859_14, 0, 144}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "csisolatin6", 11, MyHTML_ENCODING_ISO_8859_10, 0, 147}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "csisolatin1", 11, MyHTML_ENCODING_WINDOWS_1252, 0, 149}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "l9", 2, MyHTML_ENCODING_ISO_8859_15, 0, 162}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1258", 12, "cp1258", 6, MyHTML_ENCODING_WINDOWS_1258, 0, 164}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "windows-1252", 12, MyHTML_ENCODING_WINDOWS_1252, 0, 171}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "sun_eu_greek", 12, MyHTML_ENCODING_ISO_8859_7, 0, 173}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "cseucpkdfmtjapanese", 19, MyHTML_ENCODING_EUC_JP, 0, 175}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "latin4", 6, MyHTML_ENCODING_ISO_8859_4, 0, 177}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "x-cp1255", 8, MyHTML_ENCODING_WINDOWS_1255, 452, 182}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi", 3, MyHTML_ENCODING_KOI8_R, 0, 186}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "windows-1257", 12, MyHTML_ENCODING_WINDOWS_1257, 0, 188}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-874", 11, "windows-874", 11, MyHTML_ENCODING_WINDOWS_874, 0, 191}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1251", 12, "cp1251", 6, MyHTML_ENCODING_WINDOWS_1251, 0, 196}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-16le", 8, "utf-16", 6, MyHTML_ENCODING_UTF_16LE, 0, 199}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "visual", 6, MyHTML_ENCODING_ISO_8859_8, 0, 207}, + {"macintosh", 9, "macintosh", 9, MyHTML_ENCODING_MACINTOSH, 0, 208}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "ansi_x3.4-1968", 14, MyHTML_ENCODING_WINDOWS_1252, 0, 210}, + {"iso-8859-3", 10, "iso_8859-3:1988", 15, MyHTML_ENCODING_ISO_8859_3, 453, 211}, + {"iso-8859-6", 10, "csiso88596e", 11, MyHTML_ENCODING_ISO_8859_6, 456, 212}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "csgb2312", 8, MyHTML_ENCODING_GBK, 0, 215}, + {"iso-8859-6", 10, "arabic", 6, MyHTML_ENCODING_ISO_8859_6, 457, 216}, + {"iso-8859-7", 10, "greek", 5, MyHTML_ENCODING_ISO_8859_7, 0, 217}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "ms_kanji", 8, MyHTML_ENCODING_SHIFT_JIS, 0, 219}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "iso8859-5", 9, MyHTML_ENCODING_ISO_8859_5, 460, 225}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"macintosh", 9, "x-mac-roman", 11, MyHTML_ENCODING_MACINTOSH, 461, 227}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "korean", 6, MyHTML_ENCODING_EUC_KR, 0, 229}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "utf8", 4, MyHTML_ENCODING_UTF_8, 462, 231}, + {"iso-8859-3", 10, "csisolatin3", 11, MyHTML_ENCODING_ISO_8859_3, 0, 232}, + {"windows-1256", 12, "cp1256", 6, MyHTML_ENCODING_WINDOWS_1256, 464, 233}, + {"windows-1254", 12, "iso8859-9", 9, MyHTML_ENCODING_WINDOWS_1254, 0, 234}, + {"windows-1252", 12, "us-ascii", 8, MyHTML_ENCODING_WINDOWS_1252, 465, 235}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-13", 11, "iso-8859-13", 11, MyHTML_ENCODING_ISO_8859_13, 466, 246}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1250", 12, "windows-1250", 12, MyHTML_ENCODING_WINDOWS_1250, 0, 248}, + {"euc-kr", 6, "ksc5601", 7, MyHTML_ENCODING_EUC_KR, 0, 249}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "greek8", 6, MyHTML_ENCODING_ISO_8859_7, 467, 251}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "x-euc-jp", 8, MyHTML_ENCODING_EUC_JP, 0, 257}, + {"shift_jis", 9, "x-sjis", 6, MyHTML_ENCODING_SHIFT_JIS, 0, 258}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-16be", 8, "utf-16be", 8, MyHTML_ENCODING_UTF_16BE, 468, 262}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "windows-1255", 12, MyHTML_ENCODING_WINDOWS_1255, 0, 265}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ks_c_5601-1987", 14, MyHTML_ENCODING_EUC_KR, 0, 267}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"ibm866", 6, "866", 3, MyHTML_ENCODING_IBM866, 0, 274}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"big5", 4, "cn-big5", 7, MyHTML_ENCODING_BIG5, 0, 277}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi8-r", 6, MyHTML_ENCODING_KOI8_R, 469, 283}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "ibm819", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 296}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "asmo-708", 8, MyHTML_ENCODING_ISO_8859_6, 0, 300}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "cp1254", 6, MyHTML_ENCODING_WINDOWS_1254, 470, 302}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso-8859-6-e", 12, MyHTML_ENCODING_ISO_8859_6, 471, 304}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-2022-jp", 11, "iso-2022-jp", 11, MyHTML_ENCODING_ISO_2022_JP, 0, 309}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso_8859-2:1987", 15, MyHTML_ENCODING_ISO_8859_2, 473, 312}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gb2312", 6, MyHTML_ENCODING_GBK, 0, 314}, + {"windows-1254", 12, "csisolatin5", 11, MyHTML_ENCODING_WINDOWS_1254, 0, 315}, + {"iso-8859-6", 10, "iso-8859-6-i", 12, MyHTML_ENCODING_ISO_8859_6, 476, 316}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso8859-2", 9, MyHTML_ENCODING_ISO_8859_2, 0, 323}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "l2", 2, MyHTML_ENCODING_ISO_8859_2, 0, 326}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "latin1", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 328}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ks_c_5601-1989", 14, MyHTML_ENCODING_EUC_KR, 0, 330}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso8859-6", 9, MyHTML_ENCODING_ISO_8859_6, 0, 332}, + {"iso-8859-2", 10, "iso-ir-101", 10, MyHTML_ENCODING_ISO_8859_2, 477, 333}, + {"ibm866", 6, "cp866", 5, MyHTML_ENCODING_IBM866, 0, 334}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "iso-8859-3", 10, MyHTML_ENCODING_ISO_8859_3, 480, 338}, + {"iso-8859-4", 10, "l4", 2, MyHTML_ENCODING_ISO_8859_4, 0, 339}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1253", 12, "windows-1253", 12, MyHTML_ENCODING_WINDOWS_1253, 0, 342}, + {"iso-8859-5", 10, "iso-8859-5", 10, MyHTML_ENCODING_ISO_8859_5, 482, 343}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso-ir-127", 10, MyHTML_ENCODING_ISO_8859_6, 484, 348}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "unicode-1-1-utf-8", 17, MyHTML_ENCODING_UTF_8, 0, 350}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "l6", 2, MyHTML_ENCODING_ISO_8859_10, 0, 352}, + {"iso-8859-3", 10, "iso-ir-109", 10, MyHTML_ENCODING_ISO_8859_3, 487, 353}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1253", 12, "x-cp1253", 8, MyHTML_ENCODING_WINDOWS_1253, 0, 357}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-16", 11, "iso-8859-16", 11, MyHTML_ENCODING_ISO_8859_16, 490, 359}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8-i", 12, "logical", 7, MyHTML_ENCODING_ISO_8859_8_I, 0, 363}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "csisolatinhebrew", 16, MyHTML_ENCODING_ISO_8859_8, 0, 366}, + {"iso-8859-3", 10, "latin3", 6, MyHTML_ENCODING_ISO_8859_3, 491, 367}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "euc-kr", 6, MyHTML_ENCODING_EUC_KR, 0, 369}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "cp1252", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 371}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "csiso88596i", 11, MyHTML_ENCODING_ISO_8859_6, 492, 378}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gbk", 3, MyHTML_ENCODING_GBK, 0, 382}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "csksc56011987", 13, MyHTML_ENCODING_EUC_KR, 0, 394}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"x-mac-cyrillic", 14, "x-mac-cyrillic", 14, MyHTML_ENCODING_X_MAC_CYRILLIC, 0, 397}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "csisolatin2", 11, MyHTML_ENCODING_ISO_8859_2, 0, 400}, + {"x-user-defined", 14, "x-user-defined", 14, MyHTML_ENCODING_X_USER_DEFINED, 0, 401}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "latin5", 6, MyHTML_ENCODING_WINDOWS_1254, 0, 406}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "cp1257", 6, MyHTML_ENCODING_WINDOWS_1257, 0, 408}, + {"big5", 4, "big5-hkscs", 10, MyHTML_ENCODING_BIG5, 0, 409}, + {"windows-1250", 12, "x-cp1250", 8, MyHTML_ENCODING_WINDOWS_1250, 0, 410}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "euc-jp", 6, MyHTML_ENCODING_EUC_JP, 0, 414}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "ecma-118", 8, MyHTML_ENCODING_ISO_8859_7, 493, 416}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gb_2312-80", 10, MyHTML_ENCODING_GBK, 0, 418}, + {"windows-1251", 12, "windows-1251", 12, MyHTML_ENCODING_WINDOWS_1251, 0, 419}, + {"iso-8859-13", 11, "iso885913", 9, MyHTML_ENCODING_ISO_8859_13, 0, 420}, + {"gbk", 3, "gb_2312", 7, MyHTML_ENCODING_GBK, 0, 421}, + {"iso-8859-7", 10, "iso8859-7", 9, MyHTML_ENCODING_ISO_8859_7, 0, 422}, + {"gbk", 3, "chinese", 7, MyHTML_ENCODING_GBK, 0, 423}, + {"shift_jis", 9, "shift_jis", 9, MyHTML_ENCODING_SHIFT_JIS, 0, 424}, + {"windows-874", 11, "iso-8859-11", 11, MyHTML_ENCODING_WINDOWS_874, 0, 425}, + {"iso-8859-15", 11, "iso_8859-15", 11, MyHTML_ENCODING_ISO_8859_15, 0, 426}, + {"big5", 4, "csbig5", 6, MyHTML_ENCODING_BIG5, 0, 427}, + {"gbk", 3, "x-gbk", 5, MyHTML_ENCODING_GBK, 429, 428}, + {"windows-1254", 12, "windows-1254", 12, MyHTML_ENCODING_WINDOWS_1254, 0, 429}, + {"shift_jis", 9, "sjis", 4, MyHTML_ENCODING_SHIFT_JIS, 0, 430}, + {"iso-8859-10", 11, "iso885910", 9, MyHTML_ENCODING_ISO_8859_10, 0, 431}, + {"windows-1254", 12, "iso_8859-9:1989", 15, MyHTML_ENCODING_WINDOWS_1254, 0, 432}, + {"macintosh", 9, "mac", 3, MyHTML_ENCODING_MACINTOSH, 434, 433}, + {"iso-8859-7", 10, "iso88597", 8, MyHTML_ENCODING_ISO_8859_7, 0, 434}, + {"windows-1251", 12, "x-cp1251", 8, MyHTML_ENCODING_WINDOWS_1251, 0, 435}, + {"iso-8859-14", 11, "iso885914", 9, MyHTML_ENCODING_ISO_8859_14, 0, 436}, + {"iso-8859-10", 11, "iso8859-10", 10, MyHTML_ENCODING_ISO_8859_10, 438, 437}, + {"windows-1252", 12, "iso-ir-100", 10, MyHTML_ENCODING_WINDOWS_1252, 0, 438}, + {"iso-8859-2", 10, "iso_8859-2", 10, MyHTML_ENCODING_ISO_8859_2, 0, 439}, + {"windows-1253", 12, "cp1253", 6, MyHTML_ENCODING_WINDOWS_1253, 441, 440}, + {"gbk", 3, "iso-ir-58", 9, MyHTML_ENCODING_GBK, 442, 441}, + {"macintosh", 9, "csmacintosh", 11, MyHTML_ENCODING_MACINTOSH, 0, 442}, + {"iso-8859-4", 10, "iso_8859-4", 10, MyHTML_ENCODING_ISO_8859_4, 444, 443}, + {"iso-8859-5", 10, "iso-ir-144", 10, MyHTML_ENCODING_ISO_8859_5, 445, 444}, + {"iso-8859-14", 11, "iso8859-14", 10, MyHTML_ENCODING_ISO_8859_14, 0, 445}, + {"windows-1254", 12, "l5", 2, MyHTML_ENCODING_WINDOWS_1254, 447, 446}, + {"iso-8859-6", 10, "iso_8859-6", 10, MyHTML_ENCODING_ISO_8859_6, 448, 447}, + {"iso-8859-7", 10, "iso-ir-126", 10, MyHTML_ENCODING_ISO_8859_7, 0, 448}, + {"iso-8859-8", 10, "iso-ir-138", 10, MyHTML_ENCODING_ISO_8859_8, 450, 449}, + {"iso-8859-8", 10, "iso_8859-8", 10, MyHTML_ENCODING_ISO_8859_8, 451, 450}, + {"windows-1254", 12, "iso-ir-148", 10, MyHTML_ENCODING_WINDOWS_1254, 0, 451}, + {"big5", 4, "x-x-big5", 8, MyHTML_ENCODING_BIG5, 0, 452}, + {"iso-8859-4", 10, "iso_8859-4:1988", 15, MyHTML_ENCODING_ISO_8859_4, 454, 453}, + {"iso-8859-5", 10, "iso_8859-5:1988", 15, MyHTML_ENCODING_ISO_8859_5, 455, 454}, + {"iso-8859-8", 10, "iso_8859-8:1988", 15, MyHTML_ENCODING_ISO_8859_8, 0, 455}, + {"iso-8859-8", 10, "csiso88598e", 11, MyHTML_ENCODING_ISO_8859_8, 0, 456}, + {"iso-8859-10", 11, "latin6", 6, MyHTML_ENCODING_ISO_8859_10, 458, 457}, + {"windows-874", 11, "iso885911", 9, MyHTML_ENCODING_WINDOWS_874, 459, 458}, + {"windows-1252", 12, "iso8859-1", 9, MyHTML_ENCODING_WINDOWS_1252, 0, 459}, + {"iso-8859-15", 11, "iso885915", 9, MyHTML_ENCODING_ISO_8859_15, 0, 460}, + {"windows-1252", 12, "ascii", 5, MyHTML_ENCODING_WINDOWS_1252, 0, 461}, + {"koi8-r", 6, "cskoi8r", 7, MyHTML_ENCODING_KOI8_R, 463, 462}, + {"euc-kr", 6, "cseuckr", 7, MyHTML_ENCODING_EUC_KR, 0, 463}, + {"x-mac-cyrillic", 14, "x-mac-ukrainian", 15, MyHTML_ENCODING_X_MAC_CYRILLIC, 0, 464}, + {"windows-1252", 12, "x-cp1252", 8, MyHTML_ENCODING_WINDOWS_1252, 0, 465}, + {"big5", 4, "big5", 4, MyHTML_ENCODING_BIG5, 0, 466}, + {"gb18030", 7, "gb18030", 7, MyHTML_ENCODING_GB18030, 0, 467}, + {"utf-16le", 8, "utf-16le", 8, MyHTML_ENCODING_UTF_16LE, 0, 468}, + {"koi8-r", 6, "koi8_r", 6, MyHTML_ENCODING_KOI8_R, 0, 469}, + {"shift_jis", 9, "csshiftjis", 10, MyHTML_ENCODING_SHIFT_JIS, 0, 470}, + {"windows-1256", 12, "x-cp1256", 8, MyHTML_ENCODING_WINDOWS_1256, 472, 471}, + {"iso-8859-8", 10, "iso-8859-8-e", 12, MyHTML_ENCODING_ISO_8859_8, 0, 472}, + {"iso-8859-6", 10, "iso_8859-6:1987", 15, MyHTML_ENCODING_ISO_8859_6, 474, 473}, + {"iso-8859-7", 10, "iso_8859-7:1987", 15, MyHTML_ENCODING_ISO_8859_7, 475, 474}, + {"windows-1252", 12, "iso_8859-1:1987", 15, MyHTML_ENCODING_WINDOWS_1252, 0, 475}, + {"iso-8859-8-i", 12, "iso-8859-8-i", 12, MyHTML_ENCODING_ISO_8859_8_I, 0, 476}, + {"windows-874", 11, "iso8859-11", 10, MyHTML_ENCODING_WINDOWS_874, 478, 477}, + {"windows-1252", 12, "iso-8859-1", 10, MyHTML_ENCODING_WINDOWS_1252, 479, 478}, + {"windows-1252", 12, "iso_8859-1", 10, MyHTML_ENCODING_WINDOWS_1252, 0, 479}, + {"iso-8859-3", 10, "iso_8859-3", 10, MyHTML_ENCODING_ISO_8859_3, 481, 480}, + {"iso-8859-13", 11, "iso8859-13", 10, MyHTML_ENCODING_ISO_8859_13, 0, 481}, + {"iso-8859-5", 10, "iso_8859-5", 10, MyHTML_ENCODING_ISO_8859_5, 483, 482}, + {"iso-8859-15", 11, "iso8859-15", 10, MyHTML_ENCODING_ISO_8859_15, 0, 483}, + {"iso-8859-7", 10, "iso-8859-7", 10, MyHTML_ENCODING_ISO_8859_7, 485, 484}, + {"iso-8859-7", 10, "iso_8859-7", 10, MyHTML_ENCODING_ISO_8859_7, 486, 485}, + {"iso-8859-10", 11, "iso-ir-157", 10, MyHTML_ENCODING_ISO_8859_10, 0, 486}, + {"windows-1254", 12, "iso-8859-9", 10, MyHTML_ENCODING_WINDOWS_1254, 488, 487}, + {"windows-1254", 12, "iso_8859-9", 10, MyHTML_ENCODING_WINDOWS_1254, 489, 488}, + {"euc-kr", 6, "iso-ir-149", 10, MyHTML_ENCODING_EUC_KR, 0, 489}, + {"windows-1258", 12, "windows-1258", 12, MyHTML_ENCODING_WINDOWS_1258, 0, 490}, + {"windows-874", 11, "dos-874", 7, MyHTML_ENCODING_WINDOWS_874, 0, 491}, + {"iso-8859-8-i", 12, "csiso88598i", 11, MyHTML_ENCODING_ISO_8859_8_I, 0, 492}, + {"iso-8859-7", 10, "elot_928", 8, MyHTML_ENCODING_ISO_8859_7, 0, 493}, +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_ibm866[] = { + {{0xA5, 0xAD, 0xA8}, 991}, /* ени */ + {{0xAE, 0xA3, 0xAE}, 806}, /* ого */ + {{0xE1, 0xE2, 0xA2}, 659}, /* ств */ + {{0xAD, 0xA8, 0xEF}, 629}, /* ния */ + {{0xAE, 0xA2, 0xA0}, 566}, /* ова */ + {{0xE2, 0xA5, 0xAB}, 555}, /* тел */ + {{0xE0, 0xA5, 0xA4}, 507}, /* ред */ + {{0xA5, 0xAD, 0xAD}, 499}, /* енн */ + {{0xAE, 0xA2, 0xAE}, 443}, /* ово */ + {{0xA0, 0xAD, 0xA8}, 443}, /* ани */ + {{0xE2, 0xE0, 0xA0}, 429}, /* тра */ + {{0xAE, 0xE1, 0xE2}, 428}, /* ост */ + {{0xAD, 0xA8, 0xA5}, 419}, /* ние */ + {{0xAD, 0xAD, 0xAE}, 412}, /* нно */ + {{0xA0, 0xE5, 0xAE}, 396}, /* ахо */ + {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ + {{0xE0, 0xA0, 0xE5}, 386}, /* рах */ + {{0xE5, 0xAE, 0xA2}, 379}, /* хов */ + {{0xA5, 0xAB, 0xEC}, 365}, /* ель */ + {{0xA3, 0xAE, 0xA2}, 360}, /* гов */ + {{0xA2, 0xAE, 0xE0}, 356}, /* вор */ + {{0xA5, 0xE1, 0xE2}, 349}, /* ест */ + {{0xA0, 0xE2, 0xEC}, 345}, /* ать */ + {{0xE0, 0xA0, 0xA2}, 337}, /* рав */ + {{0xAF, 0xE0, 0xA8}, 330}, /* при */ + {{0xAF, 0xE0, 0xA5}, 323}, /* пре */ + {{0xA4, 0xAE, 0xA3}, 318}, /* дог */ + {{0xAD, 0xA5, 0xAD}, 310}, /* нен */ + {{0xAF, 0xE0, 0xA0}, 309}, /* пра */ + {{0xA2, 0xA0, 0xAD}, 304}, /* ван */ + {{0xA8, 0xE2, 0xA5}, 295}, /* ите */ + {{0xE2, 0xA2, 0xA5}, 281}, /* тве */ + {{0xAB, 0xA5, 0xAD}, 266}, /* лен */ + {{0xE1, 0xE2, 0xAE}, 261}, /* сто */ + {{0xE2, 0xA0, 0xE2}, 260}, /* тат */ + {{0xAD, 0xAD, 0xEB}, 260}, /* нны */ + {{0xAB, 0xEC, 0xAD}, 256}, /* льн */ + {{0xA2, 0xAE, 0xA7}, 255}, /* воз */ + {{0xA8, 0xAB, 0xA8}, 254}, /* или */ + {{0xA0, 0xE2, 0xA5}, 252}, /* ате */ + {{0xA5, 0xA3, 0xAE}, 241}, /* его */ + {{0xA5, 0xE2, 0xE1}, 238}, /* етс */ + {{0xAD, 0xAE, 0xE1}, 236}, /* нос */ + {{0xE9, 0xA5, 0xE1}, 235}, /* щес */ + {{0xAF, 0xAE, 0xAB}, 232}, /* пол */ + {{0xE0, 0xA0, 0xAD}, 231}, /* ран */ + {{0xAD, 0xAE, 0xA3}, 230}, /* ног */ + {{0xE1, 0xE2, 0xA0}, 229}, /* ста */ + {{0xE7, 0xA5, 0xAD}, 226}, /* чен */ + {{0xE2, 0xE0, 0xA5}, 224}, /* тре */ + {{0xA7, 0xAC, 0xA5}, 214}, /* зме */ + {{0xE3, 0xE9, 0xA5}, 212}, /* уще */ + {{0xE1, 0xE2, 0xA8}, 210}, /* сти */ + {{0xAA, 0xAE, 0xAC}, 207}, /* ком */ + {{0xAE, 0xE0, 0xAE}, 206}, /* оро */ + {{0xA2, 0xAB, 0xA5}, 195}, /* вле */ + {{0xA7, 0xA0, 0xAD}, 194}, /* зан */ + {{0xA0, 0xE1, 0xE2}, 193}, /* аст */ + {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ + {{0xE5, 0xE0, 0xA0}, 187}, /* хра */ + {{0xA0, 0xAD, 0xAD}, 182}, /* анн */ + {{0xA5, 0xE0, 0xA5}, 182}, /* ере */ + {{0xA2, 0xE0, 0xA5}, 178}, /* вре */ + {{0xAE, 0xA2, 0xA5}, 173}, /* ове */ + {{0xEC, 0xAD, 0xAE}, 173}, /* ьно */ + {{0xA2, 0xA5, 0xE0}, 172}, /* вер */ + {{0xAC, 0xA5, 0xAD}, 170}, /* мен */ + {{0xAB, 0xA8, 0xE6}, 168}, /* лиц */ + {{0xE2, 0xAE, 0xE0}, 167}, /* тор */ + {{0xE0, 0xA5, 0xAD}, 167}, /* рен */ + {{0xE9, 0xA5, 0xAD}, 165}, /* щен */ + {{0xAE, 0xA7, 0xAC}, 164}, /* озм */ + {{0xA5, 0xA4, 0xA0}, 163}, /* еда */ + {{0xE2, 0xA2, 0xA8}, 159}, /* тви */ + {{0xEF, 0xA7, 0xA0}, 159}, /* яза */ + {{0xA1, 0xEF, 0xA7}, 158}, /* бяз */ + {{0xAD, 0xA8, 0xA8}, 153}, /* нии */ + {{0xAD, 0xEB, 0xE5}, 153}, /* ных */ + {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ + {{0xAC, 0xA5, 0xE0}, 153}, /* мер */ + {{0xE1, 0xAB, 0xA8}, 150}, /* сли */ + {{0xE2, 0xAE, 0xA2}, 148}, /* тов */ + {{0xE2, 0xA2, 0xA0}, 147}, /* тва */ + {{0xAE, 0xE0, 0xA0}, 146}, /* ора */ + {{0xAD, 0xAE, 0xAC}, 144}, /* ном */ + {{0xA4, 0xA5, 0xAD}, 144}, /* ден */ + {{0xA0, 0xAD, 0xA5}, 142}, /* ане */ + {{0xAA, 0xAE, 0xAD}, 141}, /* кон */ + {{0xAB, 0xE3, 0xE7}, 141}, /* луч */ + {{0xAC, 0xE3, 0xE9}, 140}, /* мущ */ + {{0xAE, 0xA1, 0xEF}, 140}, /* обя */ + {{0xA2, 0xA0, 0xE2}, 138}, /* ват */ + {{0xA2, 0xA0, 0xE0}, 137}, /* вар */ + {{0xA5, 0xE9, 0xA5}, 137}, /* еще */ + {{0xAE, 0xE2, 0xE0}, 137}, /* отр */ + {{0xA4, 0xA5, 0xAB}, 137}, /* дел */ + {{0xAD, 0xEB, 0xAC}, 136}, /* ным */ + {{0xA8, 0xAC, 0xE3}, 136}, /* иму */ + {{0x91, 0xE2, 0xA0}, 134}, /* Ста */ + {{0xE3, 0xE7, 0xA0}, 133}, /* уча */ + {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ + {{0xA5, 0xAB, 0xEF}, 130}, /* еля */ + {{0xE1, 0xAB, 0xE3}, 130}, /* слу */ + {{0xA7, 0xA0, 0xAA}, 130}, /* зак */ + {{0xE2, 0xAE, 0xEF}, 129}, /* тоя */ + {{0xAE, 0xAC, 0xA8}, 128}, /* оми */ + {{0xAC, 0xA5, 0xE9}, 128}, /* мещ */ + {{0xA5, 0xA4, 0xE3}, 127}, /* еду */ + {{0xA2, 0xA5, 0xAD}, 127}, /* вен */ + {{0xAD, 0xAE, 0xA2}, 127}, /* нов */ + {{0xAD, 0xAE, 0xA5}, 126}, /* ное */ + {{0xAE, 0xE2, 0xA2}, 125}, /* отв */ + {{0xAA, 0xA0, 0xA7}, 125}, /* каз */ + {{0xA0, 0xA5, 0xE2}, 125}, /* ает */ + {{0xE1, 0xAA, 0xAE}, 125}, /* ско */ + {{0xA5, 0xAD, 0xE2}, 124}, /* ент */ + {{0xAC, 0xAE, 0xE2}, 123}, /* мот */ + {{0xA0, 0xA2, 0xAB}, 122}, /* авл */ + {{0xE1, 0xAC, 0xAE}, 122}, /* смо */ + {{0xA8, 0xE7, 0xA8}, 121}, /* ичи */ + {{0xA1, 0xEB, 0xE2}, 120}, /* быт */ + {{0xE3, 0xE1, 0xAC}, 118}, /* усм */ + {{0xE1, 0xE1, 0xA8}, 117}, /* сси */ + {{0xA4, 0xE3, 0xE1}, 117}, /* дус */ + {{0xE5, 0xAE, 0xA4}, 117}, /* ход */ + {{0xE0, 0xA8, 0xE7}, 117}, /* рич */ + {{0xE7, 0xA5, 0xE1}, 115}, /* чес */ + {{0xA3, 0xE0, 0xA0}, 114}, /* гра */ + {{0xAF, 0xE0, 0xAE}, 114}, /* про */ + {{0xA4, 0xAE, 0xA2}, 113}, /* дов */ + {{0xA2, 0xA5, 0xE2}, 112}, /* вет */ + {{0xA5, 0xA4, 0xA5}, 112}, /* еде */ + {{0xE8, 0xA5, 0xAD}, 111}, /* шен */ + {{0xE7, 0xA8, 0xAD}, 110}, /* чин */ + {{0xAD, 0xA0, 0xE1}, 109}, /* нас */ + {{0xA8, 0xE2, 0xEC}, 105}, /* ить */ + {{0xE2, 0xA2, 0xAE}, 105}, /* тво */ + {{0xAA, 0xAB, 0xEE}, 104}, /* клю */ + {{0xE0, 0xA8, 0xE2}, 104}, /* рит */ + {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ + {{0xAB, 0xEE, 0xE7}, 104}, /* люч */ + {{0xE2, 0xAE, 0xAC}, 104}, /* том */ + {{0xE1, 0xAB, 0xA5}, 103}, /* сле */ + {{0xE1, 0xAF, 0xAE}, 102}, /* спо */ + {{0xAE, 0xAB, 0xAD}, 102}, /* олн */ + {{0xA5, 0xE1, 0xAB}, 102}, /* есл */ + {{0xA5, 0xE0, 0xA8}, 101}, /* ери */ + {{0xAD, 0xAE, 0xA9}, 101}, /* ной */ + {{0xE0, 0xAE, 0xAC}, 101}, /* ром */ + {{0xAE, 0xE2, 0xAE}, 99}, /* ото */ + {{0xAD, 0xEB, 0xA5}, 99}, /* ные */ + {{0xA7, 0xAD, 0xA0}, 99}, /* зна */ + {{0xA2, 0xAB, 0xEF}, 99}, /* вля */ + {{0xE2, 0xA5, 0xE0}, 98}, /* тер */ + {{0xE3, 0xAF, 0xE0}, 97}, /* упр */ + {{0xA0, 0xAA, 0xAE}, 96}, /* ако */ + {{0xAA, 0xAE, 0xA3}, 96}, /* ког */ + {{0xAD, 0xEB, 0xA9}, 96}, /* ный */ + {{0xAE, 0xE0, 0xE3}, 96}, /* ору */ + {{0xA5, 0xAB, 0xA5}, 95}, /* еле */ + {{0xA5, 0xE1, 0xAA}, 95}, /* еск */ + {{0xA0, 0xA7, 0xA0}, 95}, /* аза */ + {{0xA9, 0xE1, 0xE2}, 93}, /* йст */ + {{0xAF, 0xAE, 0xE0}, 93}, /* пор */ + {{0xAE, 0xA6, 0xA5}, 92}, /* оже */ + {{0xA8, 0xAD, 0xA5}, 91}, /* ине */ + {{0xE9, 0xA5, 0xA9}, 90}, /* щей */ + {{0xA6, 0xA4, 0xA5}, 90}, /* жде */ + {{0xAF, 0xA5, 0xE0}, 89}, /* пер */ + {{0xAD, 0xA8, 0xE2}, 89}, /* нит */ + {{0xAE, 0xAB, 0xEC}, 89}, /* оль */ + {{0xA0, 0xA6, 0xA4}, 88}, /* ажд */ + {{0xA6, 0xA5, 0xAD}, 87}, /* жен */ + {{0xAB, 0xA0, 0xA4}, 87}, /* лад */ + {{0xA0, 0xAC, 0xA8}, 87}, /* ами */ + {{0xAA, 0xAE, 0xE2}, 86}, /* кот */ + {{0xE7, 0xA0, 0xA5}, 85}, /* чае */ + {{0xA2, 0xA5, 0xE9}, 85}, /* вещ */ + {{0xA2, 0xA8, 0xEF}, 85}, /* вия */ + {{0xEF, 0xE9, 0xA5}, 85}, /* яще */ + {{0xA8, 0xA5, 0xAC}, 85}, /* ием */ + {{0xAA, 0xAB, 0xA0}, 85}, /* кла */ + {{0xA5, 0xA9, 0xE1}, 84}, /* ейс */ + {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ + {{0xA0, 0xA2, 0xAE}, 84}, /* аво */ + {{0xE0, 0xA0, 0xA6}, 83}, /* раж */ + {{0xAB, 0xEC, 0xE1}, 83}, /* льс */ + {{0xAE, 0xEF, 0xE9}, 82}, /* оящ */ + {{0xA5, 0xAD, 0xAE}, 81}, /* ено */ + {{0xA4, 0xE1, 0xE2}, 81}, /* дст */ + {{0xA4, 0xA5, 0xA9}, 80}, /* дей */ + {{0xE0, 0xA5, 0xA1}, 80}, /* реб */ + {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ + {{0xA5, 0xA4, 0xE1}, 79}, /* едс */ + {{0xA0, 0xE0, 0xA8}, 79}, /* ари */ + {{0xA4, 0xA0, 0xAD}, 79}, /* дан */ + {{0xAC, 0xAE, 0xA6}, 78}, /* мож */ + {{0xA8, 0xAC, 0xA5}, 78}, /* име */ + {{0xA8, 0xAD, 0xAE}, 78}, /* ино */ + {{0xE0, 0xA8, 0xAD}, 77}, /* рин */ + {{0xA4, 0xAE, 0xE1}, 77}, /* дос */ + {{0xAF, 0xAE, 0xE1}, 77}, /* пос */ + {{0xE2, 0xA0, 0xAA}, 77}, /* так */ + {{0xE9, 0xA5, 0xA3}, 77}, /* щег */ + {{0xA4, 0xA0, 0xE2}, 77}, /* дат */ + {{0xAF, 0xAB, 0xA0}, 76}, /* пла */ + {{0xE3, 0xE1, 0xAB}, 76}, /* усл */ + {{0xA8, 0xE6, 0xA0}, 76}, /* ица */ + {{0xE0, 0xAE, 0xA2}, 75}, /* ров */ + {{0xED, 0xE2, 0xAE}, 75}, /* это */ + {{0xE3, 0xE7, 0xA5}, 74}, /* уче */ + {{0xA4, 0xAE, 0xAB}, 73}, /* дол */ + {{0xEC, 0xAD, 0xEB}, 73}, /* ьны */ + {{0xE0, 0xA0, 0xA7}, 73}, /* раз */ + {{0xAC, 0xA8, 0xE1}, 73}, /* мис */ + {{0xA0, 0xAD, 0xAE}, 72}, /* ано */ + {{0xE1, 0xE0, 0xAE}, 72}, /* сро */ + {{0xA0, 0xA2, 0xA8}, 72}, /* ави */ + {{0xE2, 0xEC, 0xA8}, 71}, /* тьи */ + {{0xEE, 0xE7, 0xA5}, 70}, /* юче */ + {{0xE1, 0xAA, 0xAB}, 70}, /* скл */ + {{0xA8, 0xE1, 0xE1}, 70}, /* исс */ + {{0xA6, 0xA5, 0xE2}, 69}, /* жет */ + {{0xA5, 0xA4, 0xAE}, 69}, /* едо */ + {{0xAB, 0xA5, 0xA4}, 69}, /* лед */ + {{0xAB, 0xAE, 0xA2}, 69}, /* лов */ + {{0xEE, 0xE9, 0xA8}, 68}, /* ющи */ + {{0xA8, 0xA1, 0xAE}, 68}, /* ибо */ + {{0xAB, 0xA0, 0xE2}, 67}, /* лат */ + {{0xE0, 0xAE, 0xAA}, 67}, /* рок */ + {{0xA0, 0xAA, 0xAB}, 67}, /* акл */ + {{0xE0, 0xA8, 0xE9}, 67}, /* рищ */ + {{0xA1, 0xAE, 0xA2}, 67}, /* бов */ + {{0xA8, 0xE1, 0xAA}, 67}, /* иск */ + {{0xA5, 0xA1, 0xAE}, 67}, /* ебо */ + {{0xAB, 0xEC, 0xA7}, 67}, /* льз */ + {{0xE3, 0xAA, 0xA0}, 67}, /* ука */ + {{0xAB, 0xA8, 0xA1}, 66}, /* либ */ + {{0xAE, 0xAC, 0xE3}, 66}, /* ому */ + {{0xAE, 0xA2, 0xAB}, 66}, /* овл */ + {{0xE2, 0xAD, 0xAE}, 65}, /* тно */ + {{0xA2, 0xAE, 0xA9}, 64}, /* вой */ + {{0xE2, 0xAE, 0xA3}, 64}, /* тог */ + {{0xE1, 0xAB, 0xAE}, 64}, /* сло */ + {{0xAE, 0xA7, 0xAD}, 64}, /* озн */ + {{0xE1, 0xAE, 0xAE}, 64}, /* соо */ + {{0xA7, 0xA0, 0xE2}, 63}, /* зат */ + {{0xA8, 0xE1, 0xAF}, 63}, /* исп */ + {{0xA0, 0xE7, 0xA5}, 63}, /* аче */ + {{0xAD, 0xA8, 0xEE}, 63}, /* нию */ + {{0xAE, 0xAD, 0xA5}, 63}, /* оне */ + {{0xAE, 0xAB, 0xA6}, 62}, /* олж */ + {{0xAE, 0xA2, 0xE9}, 61}, /* овщ */ + {{0xE0, 0xA0, 0xE1}, 61}, /* рас */ + {{0xA2, 0xA8, 0xA4}, 61}, /* вид */ + {{0xA2, 0xE9, 0xA8}, 61}, /* вщи */ + {{0xE1, 0xAD, 0xAE}, 61}, /* сно */ + {{0xA8, 0xE6, 0xAE}, 61}, /* ицо */ + {{0xA8, 0xE7, 0xA5}, 61}, /* иче */ + {{0xA0, 0xA2, 0xA5}, 61}, /* аве */ + {{0xA3, 0xAB, 0xA0}, 61}, /* гла */ + {{0xE7, 0xA5, 0xE2}, 61}, /* чет */ + {{0xE9, 0xA8, 0xAA}, 61}, /* щик */ + {{0xE0, 0xE3, 0xA3}, 60}, /* руг */ + {{0xE2, 0xA0, 0xAD}, 60}, /* тан */ + {{0xA8, 0xAC, 0xAE}, 60}, /* имо */ + {{0xA0, 0xAB, 0xEC}, 60}, /* аль */ + {{0xAE, 0xA2, 0xA8}, 60}, /* ови */ + {{0xA6, 0xA4, 0xA0}, 60}, /* жда */ + {{0xAF, 0xAE, 0xA2}, 60}, /* пов */ + {{0xA5, 0xAC, 0xE3}, 60}, /* ему */ + {{0xEF, 0xE2, 0xA5}, 60}, /* яте */ + {{0xE1, 0xA8, 0xA8}, 59}, /* сии */ + {{0xA1, 0xAE, 0xE2}, 59}, /* бот */ + {{0xA2, 0xEB, 0xAF}, 59}, /* вып */ + {{0xA0, 0xA1, 0xAE}, 59}, /* або */ + {{0xAB, 0xEF, 0xEE}, 59}, /* ляю */ + {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ + {{0xAE, 0xA4, 0xA5}, 58}, /* оде */ + {{0xA8, 0xAD, 0xA8}, 58}, /* ини */ + {{0xE0, 0xA0, 0xE2}, 58}, /* рат */ + {{0xEF, 0xA2, 0xAB}, 58}, /* явл */ + {{0xAD, 0xA0, 0xA3}, 57}, /* наг */ + {{0xA4, 0xE0, 0xE3}, 57}, /* дру */ + {{0xE0, 0xA0, 0xA1}, 57}, /* раб */ + {{0xA0, 0xA3, 0xE0}, 57}, /* агр */ + {{0xA8, 0xAE, 0xAD}, 57}, /* ион */ + {{0xAC, 0xA5, 0xE1}, 57}, /* мес */ + {{0xA0, 0xE6, 0xA8}, 56}, /* аци */ + {{0xAE, 0xE1, 0xE3}, 56}, /* осу */ + {{0xAA, 0xAE, 0xA9}, 55}, /* кой */ + {{0xE1, 0xA2, 0xAE}, 55}, /* сво */ + {{0xA7, 0xAE, 0xA2}, 55}, /* зов */ + {{0xAE, 0xAF, 0xE0}, 54}, /* опр */ + {{0xE1, 0xAE, 0xA1}, 54}, /* соб */ + {{0xA2, 0xAF, 0xE0}, 54}, /* впр */ + {{0xAB, 0xAD, 0xA5}, 54}, /* лне */ + {{0xAE, 0xAC, 0xAC}, 54}, /* омм */ + {{0xA5, 0xE0, 0xA0}, 54}, /* ера */ + {{0xE7, 0xA8, 0xE2}, 54}, /* чит */ + {{0xA5, 0xE0, 0xE7}, 54}, /* ерч */ + {{0xE0, 0xE7, 0xA5}, 54}, /* рче */ + {{0xA0, 0xE2, 0xA8}, 54}, /* ати */ + {{0xAD, 0xA8, 0xAA}, 54}, /* ник */ + {{0xAC, 0xAC, 0xA5}, 54}, /* мме */ + {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ + {{0xE2, 0xA5, 0xAD}, 53}, /* тен */ + {{0xA2, 0xA5, 0xA4}, 53}, /* вед */ + {{0xE1, 0xAE, 0xA2}, 52}, /* сов */ + {{0xA0, 0xA6, 0xA5}, 52}, /* аже */ + {{0xAE, 0xAA, 0xA0}, 52}, /* ока */ + {{0xEB, 0xAC, 0xA8}, 52}, /* ыми */ + {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ + {{0xAE, 0xAE, 0xE2}, 52}, /* оот */ + {{0xAC, 0xA8, 0xE2}, 52}, /* мит */ + {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ + {{0xA2, 0xE8, 0xA5}, 51}, /* вше */ + {{0xE1, 0xA8, 0xAE}, 51}, /* сио */ + {{0xAE, 0xAD, 0xAE}, 51}, /* оно */ + {{0xA0, 0xA2, 0xA0}, 51}, /* ава */ + {{0xA0, 0xE9, 0xA5}, 51}, /* аще */ + {{0xAB, 0xEF, 0xA5}, 50}, /* ляе */ + {{0xA5, 0xAD, 0xA5}, 50}, /* ене */ + {{0xAE, 0xA4, 0xA8}, 50}, /* оди */ + {{0xAF, 0xE3, 0xAD}, 49}, /* пун */ + {{0xAB, 0xA8, 0xE7}, 49}, /* лич */ + {{0xA2, 0xAE, 0xAC}, 49}, /* вом */ + {{0xAD, 0xAA, 0xE2}, 49}, /* нкт */ + {{0xAD, 0xA5, 0xE1}, 49}, /* нес */ + {{0xA2, 0xA8, 0xAB}, 49}, /* вил */ + {{0xA5, 0xA6, 0xA4}, 49}, /* ежд */ + {{0xE0, 0xA5, 0xE1}, 49}, /* рес */ + {{0xEE, 0xE9, 0xA5}, 49}, /* юще */ + {{0xEC, 0xA7, 0xAE}, 49}, /* ьзо */ + {{0xAF, 0xAE, 0xE2}, 49}, /* пот */ + {{0xE3, 0xAD, 0xAA}, 49}, /* унк */ + {{0xE1, 0xE2, 0xA5}, 49}, /* сте */ + {{0xAA, 0xAE, 0xA2}, 49}, /* ков */ + {{0xAE, 0xE1, 0xAB}, 48}, /* осл */ + {{0xEF, 0xA5, 0xE2}, 48}, /* яет */ + {{0x85, 0xE1, 0xAB}, 48}, /* Есл */ + {{0x8F, 0xE0, 0xA8}, 48}, /* При */ + {{0xE2, 0xA0, 0xA2}, 48}, /* тав */ + {{0xAD, 0xA5, 0xE0}, 48}, /* нер */ + {{0xE7, 0xAD, 0xAE}, 47}, /* чно */ + {{0xAF, 0xAE, 0xA4}, 47}, /* под */ + {{0xAD, 0xE2, 0xA0}, 47}, /* нта */ + {{0xA8, 0xE9, 0xA5}, 47}, /* ище */ + {{0xAE, 0xA1, 0xE9}, 47}, /* общ */ + {{0xA0, 0xA7, 0xAC}, 47}, /* азм */ + {{0xA6, 0xAD, 0xAE}, 47}, /* жно */ + {{0xA2, 0xA8, 0xA8}, 46}, /* вии */ + {{0xE0, 0xA0, 0xE9}, 46}, /* ращ */ + {{0xAE, 0xE0, 0xA5}, 46}, /* оре */ + {{0xA2, 0xE8, 0xA8}, 46}, /* вши */ + {{0xA5, 0xAA, 0xE1}, 46}, /* екс */ + {{0xA2, 0xAE, 0xA3}, 46}, /* вог */ + {{0xE7, 0xE2, 0xAE}, 46}, /* что */ + {{0xA8, 0xE7, 0xAD}, 45}, /* ичн */ + {{0xAB, 0xA5, 0xAC}, 45}, /* лем */ + {{0xAC, 0xAE, 0xA3}, 45}, /* мог */ + {{0xE2, 0xA2, 0xAB}, 45}, /* твл */ + {{0xA4, 0xAB, 0xA5}, 45}, /* дле */ + {{0xA4, 0xAB, 0xEF}, 45}, /* для */ + {{0xE0, 0xA5, 0xE2}, 45}, /* рет */ + {{0xA0, 0xE0, 0xA0}, 45}, /* ара */ + {{0xAD, 0xEF, 0xE2}, 44}, /* нят */ + {{0xA5, 0xE7, 0xA5}, 44}, /* ече */ + {{0xAE, 0xE2, 0xA5}, 44}, /* оте */ + {{0xAE, 0xE0, 0xEB}, 44}, /* оры */ + {{0xAE, 0xE1, 0xAD}, 43}, /* осн */ + {{0xAE, 0xA1, 0xAE}, 43}, /* обо */ + {{0xAE, 0xA3, 0xAB}, 43}, /* огл */ + {{0xA8, 0xAD, 0xEB}, 43}, /* ины */ + {{0xA5, 0xE1, 0xE1}, 43}, /* есс */ + {{0xAE, 0xA1, 0xE0}, 43}, /* обр */ + {{0xAA, 0xE0, 0xA0}, 43}, /* кра */ + {{0xA8, 0xEF, 0xAC}, 43}, /* иям */ + {{0xA0, 0xAB, 0xAE}, 43}, /* ало */ + {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ + {{0xAE, 0xE0, 0xA3}, 43}, /* орг */ + {{0xE7, 0xA0, 0xEF}, 42}, /* чая */ + {{0xAD, 0xA8, 0xAC}, 42}, /* ним */ + {{0xA8, 0xA7, 0xAD}, 42}, /* изн */ + {{0xAF, 0xAE, 0xAA}, 42}, /* пок */ + {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ + {{0xA5, 0xAB, 0xEE}, 42}, /* елю */ + {{0xE2, 0xA8, 0xE2}, 42}, /* тит */ + {{0xE6, 0xA5, 0xAD}, 42}, /* цен */ + {{0xE7, 0xA0, 0xE1}, 42}, /* час */ + {{0xA3, 0xA0, 0xAD}, 42}, /* ган */ + {{0xE0, 0xA3, 0xA0}, 42}, /* рга */ + {{0xE1, 0xE2, 0xAD}, 42}, /* стн */ + {{0xE0, 0xA5, 0xA6}, 42}, /* реж */ + {{0xE3, 0xAC, 0xAC}, 42}, /* умм */ + {{0xE2, 0xA2, 0xE3}, 41}, /* тву */ + {{0xE2, 0xE3, 0xAF}, 41}, /* туп */ + {{0xE1, 0xAA, 0xA8}, 40}, /* ски */ + {{0xA4, 0xA5, 0xAA}, 40}, /* дек */ + {{0xAB, 0xA5, 0xA6}, 40}, /* леж */ + {{0xA5, 0xE1, 0xA5}, 40}, /* есе */ + {{0xA2, 0xA8, 0xA5}, 40}, /* вие */ + {{0xE2, 0xAA, 0xA0}, 40}, /* тка */ + {{0xA5, 0xAA, 0xE0}, 40}, /* екр */ + {{0xAE, 0xA4, 0xAE}, 40}, /* одо */ + {{0xAA, 0xE1, 0xA0}, 40}, /* кса */ + {{0xE0, 0xA5, 0xAA}, 40}, /* рек */ + {{0xAD, 0xE2, 0xA5}, 40}, /* нте */ + {{0xE3, 0xA3, 0xA8}, 40}, /* уги */ + {{0xA1, 0xEB, 0xAB}, 40}, /* был */ + {{0xA8, 0xAD, 0xEF}, 40}, /* иня */ + {{0xA5, 0xE9, 0xA8}, 39}, /* ещи */ + {{0xA3, 0xA5, 0xAD}, 39}, /* ген */ + {{0x8A, 0xAE, 0xA4}, 39}, /* Код */ + {{0xA4, 0xA8, 0xE2}, 39}, /* дит */ + {{0xE1, 0xE5, 0xAE}, 39}, /* схо */ + {{0xA8, 0xAD, 0xE2}, 39}, /* инт */ + {{0xE1, 0xE3, 0xAC}, 39}, /* сум */ + {{0xE0, 0xAE, 0xAD}, 39}, /* рон */ + {{0xAE, 0xE2, 0xAA}, 39}, /* отк */ + {{0xA4, 0xAE, 0xAA}, 39}, /* док */ + {{0xA8, 0xAB, 0xA0}, 38}, /* ила */ + {{0xE6, 0xA5, 0xE1}, 38}, /* цес */ + {{0xA8, 0xAA, 0xA0}, 38}, /* ика */ + {{0xA7, 0xAD, 0xA8}, 38}, /* зни */ + {{0xAE, 0xA2, 0xEB}, 38}, /* овы */ + {{0xAB, 0xA6, 0xAD}, 38}, /* лжн */ + {{0xE3, 0xAF, 0xAB}, 38}, /* упл */ + {{0xA3, 0xA4, 0xA0}, 37}, /* гда */ + {{0xAB, 0xA0, 0xA6}, 37}, /* лаж */ + {{0xA6, 0xA5, 0xA4}, 37}, /* жед */ + {{0xA1, 0xA5, 0xA7}, 37}, /* без */ + {{0xA4, 0xA5, 0xE2}, 37}, /* дет */ + {{0xAE, 0xE0, 0xEF}, 37}, /* оря */ + {{0xE0, 0xAE, 0xE1}, 37}, /* рос */ + {{0xAE, 0xA1, 0xAB}, 37}, /* обл */ + {{0xE6, 0xA8, 0xA8}, 37}, /* ции */ + {{0xA4, 0xAE, 0xAC}, 37}, /* дом */ + {{0xAD, 0xE6, 0xA5}, 37}, /* нце */ + {{0xE8, 0xA5, 0xA3}, 37}, /* шег */ + {{0xAB, 0xAE, 0xA6}, 37}, /* лож */ + {{0xAE, 0xAD, 0xA0}, 37}, /* она */ + {{0xAE, 0xAA, 0xAB}, 37}, /* окл */ + {{0xAE, 0xA3, 0xA4}, 37}, /* огд */ + {{0xE0, 0xAE, 0xA4}, 37}, /* род */ + {{0xA5, 0xAD, 0xA0}, 37}, /* ена */ + {{0xAE, 0xAD, 0xE6}, 37}, /* онц */ + {{0xAE, 0xE2, 0xAD}, 37}, /* отн */ + {{0xE1, 0xAE, 0xA3}, 37}, /* сог */ + {{0xA5, 0xA2, 0xE8}, 37}, /* евш */ + {{0xA2, 0xA8, 0xE2}, 36}, /* вит */ + {{0xA5, 0xE0, 0xAF}, 36}, /* ерп */ + {{0xAE, 0xA4, 0xA0}, 36}, /* ода */ + {{0xA5, 0xE2, 0xA5}, 36}, /* ете */ + {{0xAD, 0xA5, 0xAE}, 36}, /* нео */ + {{0xE0, 0xAF, 0xA5}, 36}, /* рпе */ + {{0xA5, 0xE0, 0xE8}, 36}, /* ерш */ + {{0xA8, 0xAC, 0xA8}, 36}, /* ими */ + {{0xA8, 0xA2, 0xE8}, 36}, /* ивш */ + {{0xEB, 0xAF, 0xAB}, 36}, /* ыпл */ + {{0xAF, 0xA5, 0xA2}, 36}, /* пев */ + {{0xA0, 0xA4, 0xA0}, 36}, /* ада */ + {{0xAC, 0xAE, 0xE1}, 35}, /* мос */ + {{0xAE, 0xA1, 0xE1}, 35}, /* обс */ + {{0xAD, 0xA5, 0xA4}, 34}, /* нед */ + {{0xA8, 0xAA, 0xAE}, 34}, /* ико */ + {{0xE9, 0xA8, 0xAC}, 34}, /* щим */ + {{0xA4, 0xA5, 0xE0}, 34}, /* дер */ + {{0xE1, 0xAA, 0xA0}, 34}, /* ска */ + {{0xAE, 0xE0, 0xAC}, 34}, /* орм */ + {{0xE3, 0xAC, 0xA5}, 34}, /* уме */ + {{0xAE, 0xAE, 0xA1}, 34}, /* ооб */ + {{0xE0, 0xA8, 0xE1}, 34}, /* рис */ + {{0xAE, 0xA1, 0xEA}, 33}, /* объ */ + {{0xAE, 0xAB, 0xE3}, 33}, /* олу */ + {{0xEA, 0xEF, 0xA2}, 33}, /* ъяв */ + {{0xE0, 0xA5, 0xAC}, 33}, /* рем */ + {{0xE9, 0xA8, 0xE5}, 33}, /* щих */ + {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ + {{0xAA, 0xA6, 0xA5}, 33}, /* кже */ + {{0xA8, 0xA4, 0xA5}, 33}, /* иде */ + {{0xA1, 0xE1, 0xE2}, 33}, /* бст */ + {{0xA0, 0xAA, 0xA6}, 33}, /* акж */ + {{0xA2, 0xE3, 0xEE}, 33}, /* вую */ + {{0xA0, 0xE1, 0xE5}, 33}, /* асх */ + {{0xA0, 0xAD, 0xA0}, 32}, /* ана */ + {{0xAD, 0xA0, 0xA4}, 32}, /* над */ + {{0xAE, 0xA1, 0xA5}, 32}, /* обе */ + {{0xEB, 0xE2, 0xAA}, 32}, /* ытк */ + {{0xED, 0xE2, 0xA8}, 32}, /* эти */ + {{0xAE, 0xA6, 0xAD}, 32}, /* ожн */ + {{0xA0, 0xE2, 0xEB}, 31}, /* аты */ + {{0xE1, 0xA4, 0xA5}, 31}, /* сде */ + {{0xA0, 0xEE, 0xE2}, 31}, /* ают */ + {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ + {{0xAE, 0xEF, 0xE2}, 31}, /* оят */ + {{0xA5, 0xE2, 0xEC}, 31}, /* еть */ + {{0xA0, 0xA3, 0xA5}, 31}, /* аге */ + {{0xE7, 0xE0, 0xA5}, 31}, /* чре */ + {{0xA5, 0xAD, 0xEB}, 31}, /* ены */ + {{0xE3, 0xA1, 0xEB}, 31}, /* убы */ + {{0xA8, 0xE1, 0xE2}, 30}, /* ист */ + {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ + {{0xE0, 0xEF, 0xA4}, 30}, /* ряд */ + {{0xA3, 0xAE, 0xE1}, 30}, /* гос */ + {{0xA8, 0xAC, 0xA0}, 30}, /* има */ + {{0xA7, 0xA0, 0xE1}, 30}, /* зас */ + {{0xA0, 0xEE, 0xE9}, 30}, /* ающ */ + {{0xAE, 0xA7, 0xA2}, 30}, /* озв */ + {{0xA5, 0xA4, 0xA8}, 30}, /* еди */ + {{0xAE, 0xAC, 0xA5}, 30}, /* оме */ + {{0xAD, 0xA8, 0xA9}, 30}, /* ний */ + {{0xE1, 0xE3, 0xA4}, 30}, /* суд */ + {{0xA7, 0xA4, 0xAE}, 29}, /* здо */ + {{0xE1, 0xA2, 0xA8}, 29}, /* сви */ + {{0xAE, 0xAB, 0xA8}, 29}, /* оли */ + {{0xAE, 0xA2, 0xEC}, 29}, /* овь */ + {{0xA2, 0xA8, 0xA9}, 29}, /* вий */ + {{0xA4, 0xAE, 0xE0}, 29}, /* дор */ + {{0xA4, 0xA5, 0xEF}, 29}, /* дея */ + {{0xA5, 0xEF, 0xE2}, 29}, /* еят */ + {{0xE6, 0xAE, 0xAC}, 29}, /* цом */ + {{0xA8, 0xA7, 0xA0}, 28}, /* иза */ + {{0xE1, 0xE7, 0xA5}, 28}, /* сче */ + {{0xAA, 0xE2, 0xA0}, 28}, /* кта */ + {{0xAE, 0xA4, 0xAD}, 28}, /* одн */ + {{0xA1, 0xAB, 0xA0}, 28}, /* бла */ + {{0xAE, 0xA4, 0xAB}, 28}, /* одл */ + {{0xA8, 0xE2, 0xA0}, 28}, /* ита */ + {{0x84, 0xAE, 0xA3}, 28}, /* Дог */ + {{0xAE, 0xE1, 0xAE}, 28}, /* осо */ + {{0xAD, 0xAE, 0xE8}, 28}, /* нош */ + {{0xAA, 0xE3, 0xE0}, 28}, /* кур */ + {{0xA8, 0xAD, 0xA0}, 28}, /* ина */ + {{0xAE, 0xE8, 0xA5}, 28}, /* оше */ + {{0xAD, 0xA0, 0xAB}, 28}, /* нал */ + {{0xAD, 0xA8, 0xA7}, 27}, /* низ */ + {{0xA7, 0xA2, 0xE0}, 27}, /* звр */ + {{0xA2, 0xE0, 0xA0}, 27}, /* вра */ + {{0xAB, 0xA5, 0xE2}, 27}, /* лет */ + {{0xA5, 0xE9, 0xEC}, 27}, /* ещь */ + {{0xE0, 0xA8, 0xA4}, 27}, /* рид */ + {{0xA4, 0xAD, 0xAE}, 27}, /* дно */ + {{0xE0, 0xA8, 0xAE}, 27}, /* рио */ + {{0xAE, 0xA8, 0xAC}, 27}, /* оим */ + {{0xA5, 0xE0, 0xA6}, 27}, /* ерж */ + {{0xE3, 0xA2, 0xA5}, 26}, /* уве */ + {{0xAE, 0xAD, 0xAA}, 26}, /* онк */ + {{0xA5, 0xAB, 0xAA}, 26}, /* елк */ + {{0xAB, 0xA0, 0xA2}, 26}, /* лав */ + {{0xA0, 0xE2, 0xAE}, 26}, /* ато */ + {{0xEF, 0xAC, 0xA8}, 26}, /* ями */ + {{0xAC, 0xAC, 0xEB}, 26}, /* ммы */ + {{0xA5, 0xE1, 0xAF}, 26}, /* есп */ + {{0xAD, 0xAA, 0xE3}, 26}, /* нку */ + {{0xA8, 0xE6, 0xE3}, 25}, /* ицу */ + {{0xA4, 0xE1, 0xAA}, 25}, /* дск */ + {{0xAD, 0xA8, 0xAD}, 25}, /* нин */ + {{0xAF, 0xAB, 0xA5}, 25}, /* пле */ + {{0xE4, 0xAE, 0xE0}, 25}, /* фор */ + {{0xAB, 0xA0, 0xE1}, 25}, /* лас */ + {{0xA4, 0xA8, 0xAC}, 25}, /* дим */ + {{0xA5, 0xE1, 0xEF}, 25}, /* еся */ + {{0xAD, 0xA8, 0xE7}, 25}, /* нич */ + {{0xAE, 0xA2, 0xE0}, 25}, /* овр */ + {{0xA2, 0xE1, 0xAB}, 25}, /* всл */ + {{0xE0, 0xE8, 0xA5}, 25}, /* рше */ + {{0xA5, 0xE9, 0xA0}, 25}, /* еща */ + {{0xA6, 0xAD, 0xEB}, 25}, /* жны */ + {{0xE0, 0xA8, 0xAC}, 25}, /* рим */ + {{0xA7, 0xA0, 0xE6}, 25}, /* зац */ + {{0xA1, 0xE9, 0xA5}, 25}, /* бще */ + {{0xA0, 0xAA, 0xE2}, 25}, /* акт */ + {{0xA0, 0xA4, 0xE1}, 25}, /* адс */ + {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ + {{0xE9, 0xA8, 0xA5}, 25}, /* щие */ + {{0xA6, 0xA8, 0xE2}, 24}, /* жит */ + {{0xA1, 0xE0, 0xA5}, 24}, /* бре */ + {{0xE3, 0xA3, 0xAE}, 24}, /* уго */ + {{0xA8, 0xEF, 0xE5}, 24}, /* иях */ + {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ + {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ + {{0xA2, 0xAE, 0xA2}, 24}, /* вов */ + {{0xAE, 0xE7, 0xAD}, 24}, /* очн */ + {{0xA2, 0xAE, 0xAE}, 24}, /* воо */ + {{0xAE, 0xA4, 0xEB}, 24}, /* оды */ + {{0xAB, 0xAE, 0xA3}, 24}, /* лог */ + {{0xA2, 0xA0, 0xA5}, 24}, /* вае */ + {{0xA0, 0xEF, 0xE5}, 24}, /* аях */ + {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ + {{0xA4, 0xA8, 0xE7}, 24}, /* дич */ + {{0xAA, 0xA8, 0xE5}, 24}, /* ких */ + {{0xE6, 0xA0, 0xAC}, 24}, /* цам */ + {{0xA8, 0xA7, 0xA2}, 24}, /* изв */ + {{0xE2, 0xA8, 0xA2}, 24}, /* тив */ + {{0xA5, 0xAE, 0xA1}, 24}, /* еоб */ + {{0xE1, 0xAE, 0xE1}, 24}, /* сос */ + {{0xE8, 0xA8, 0xAC}, 24}, /* шим */ + {{0xEB, 0xAF, 0xAE}, 24}, /* ыпо */ + {{0xA5, 0xA6, 0xA0}, 24}, /* ежа */ + {{0xE2, 0xAE, 0xA8}, 24}, /* тои */ + {{0xAA, 0xE2, 0xAE}, 24}, /* кто */ + {{0xA5, 0xE7, 0xA0}, 24}, /* еча */ + {{0xA8, 0xA4, 0xA8}, 24}, /* иди */ + {{0xA1, 0xE9, 0xA8}, 23}, /* бщи */ + {{0xE2, 0xEC, 0xA5}, 23}, /* тье */ + {{0xA1, 0xEA, 0xEF}, 23}, /* бъя */ + {{0xAD, 0xA0, 0xE7}, 23}, /* нач */ + {{0xE2, 0xA5, 0xE7}, 23}, /* теч */ + {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ + {{0xA2, 0xA5, 0xE7}, 23}, /* веч */ + {{0xA5, 0xAC, 0xA5}, 23}, /* еме */ + {{0xAE, 0xA1, 0xE5}, 23}, /* обх */ + {{0xA1, 0xE5, 0xAE}, 23}, /* бхо */ + {{0xA4, 0xA0, 0xA5}, 23}, /* дае */ + {{0xE0, 0xA5, 0xA7}, 23}, /* рез */ + {{0xAA, 0xA0, 0xA6}, 22}, /* каж */ + {{0xAE, 0xAA, 0xE3}, 22}, /* оку */ + {{0xA0, 0xAC, 0xA5}, 22}, /* аме */ + {{0xAD, 0xA5, 0xA7}, 22}, /* нез */ + {{0xEB, 0xA2, 0xA0}, 22}, /* ыва */ + {{0xE1, 0xA2, 0xEF}, 22}, /* свя */ + {{0xE0, 0xA0, 0xA4}, 22}, /* рад */ + {{0xA5, 0xA7, 0xA0}, 22}, /* еза */ + {{0xA8, 0xA2, 0xA0}, 22}, /* ива */ + {{0xAA, 0xA0, 0xAC}, 22}, /* кам */ + {{0xAD, 0xA5, 0xAC}, 22}, /* нем */ + {{0xE2, 0xAA, 0xAE}, 22}, /* тко */ + {{0xA7, 0xA2, 0xA5}, 22}, /* зве */ + {{0xA2, 0xEF, 0xA7}, 22}, /* вяз */ + {{0xEF, 0xE2, 0xA8}, 22}, /* яти */ + {{0xAE, 0xE5, 0xE0}, 22}, /* охр */ + {{0xE0, 0xAE, 0xE2}, 22}, /* рот */ + {{0xAE, 0xAB, 0xA5}, 22}, /* оле */ + {{0xA1, 0xE0, 0xA0}, 22}, /* бра */ + {{0xA0, 0xA5, 0xAC}, 22}, /* аем */ + {{0xAB, 0xA0, 0xE8}, 21}, /* лаш */ + {{0xA8, 0xA7, 0xAC}, 21}, /* изм */ + {{0xA3, 0xE3, 0xE2}, 21}, /* гут */ + {{0xAE, 0xA6, 0xA4}, 21}, /* ожд */ + {{0xAA, 0xA0, 0xAA}, 21}, /* как */ + {{0xAA, 0xA0, 0xE7}, 21}, /* кач */ + {{0xAD, 0xA0, 0xAC}, 21}, /* нам */ + {{0xA4, 0xAE, 0xE5}, 21}, /* дох */ + {{0xAE, 0xE5, 0xAE}, 21}, /* охо */ + {{0xEE, 0xE0, 0xA8}, 21}, /* юри */ + {{0xA2, 0xA0, 0xAC}, 21}, /* вам */ + {{0xA7, 0xAC, 0xAE}, 21}, /* змо */ + {{0xA4, 0xAA, 0xA5}, 21}, /* дке */ + {{0xA1, 0xA0, 0xAD}, 21}, /* бан */ + {{0xA5, 0xAB, 0xA8}, 21}, /* ели */ + {{0xE0, 0xA8, 0xA7}, 21}, /* риз */ + {{0xAB, 0xAD, 0xAE}, 21}, /* лно */ + {{0xA2, 0xEB, 0xE8}, 21}, /* выш */ + {{0xA4, 0xE6, 0xA0}, 21}, /* дца */ + {{0xEF, 0xA4, 0xAA}, 21}, /* ядк */ + {{0xAE, 0xE2, 0xE1}, 21}, /* отс */ + {{0xE2, 0xA5, 0xA9}, 21}, /* тей */ + {{0xA0, 0xAD, 0xAA}, 21}, /* анк */ + {{0xAD, 0xA5, 0xA3}, 21}, /* нег */ + {{0xE6, 0xA0, 0xE2}, 21}, /* цат */ + {{0xA5, 0xAC, 0xEB}, 21}, /* емы */ + {{0xA2, 0xAE, 0xA5}, 21}, /* вое */ + {{0xA4, 0xA0, 0xE7}, 21}, /* дач */ + {{0xAE, 0xA3, 0xE3}, 21}, /* огу */ + {{0xAB, 0xA6, 0xA5}, 21}, /* лже */ + {{0xE2, 0xAD, 0xA8}, 21}, /* тни */ + {{0xA7, 0xA0, 0xA2}, 21}, /* зав */ + {{0xA2, 0xA5, 0xE1}, 21}, /* вес */ + {{0xE1, 0xA0, 0xAC}, 20}, /* сам */ + {{0xA0, 0xE0, 0xAD}, 20}, /* арн */ + {{0xE7, 0xAD, 0xEB}, 20}, /* чны */ + {{0xE1, 0xE0, 0xA5}, 20}, /* сре */ + {{0xE2, 0xA8, 0xEF}, 20}, /* тия */ + {{0xA8, 0xE1, 0xAB}, 20}, /* исл */ + {{0x91, 0xE2, 0xE0}, 20}, /* Стр */ + {{0xAD, 0xE2, 0xAE}, 20}, /* нто */ + {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ + {{0xA0, 0xE8, 0xA5}, 20}, /* аше */ + {{0xA5, 0xAB, 0xA0}, 20}, /* ела */ + {{0xE3, 0xA4, 0xAE}, 20}, /* удо */ + {{0xA6, 0xA8, 0xA7}, 19}, /* жиз */ + {{0xAF, 0xA8, 0xE1}, 19}, /* пис */ + {{0xA0, 0xA8, 0xAC}, 19}, /* аим */ + {{0xE7, 0xA8, 0xE1}, 19}, /* чис */ + {{0xA5, 0xA6, 0xA8}, 19}, /* ежи */ + {{0xA2, 0xE1, 0xA5}, 19}, /* все */ + {{0xAB, 0xEC, 0xAA}, 19}, /* льк */ + {{0xA0, 0xE2, 0xE3}, 19}, /* ату */ + {{0xE3, 0xA4, 0xA0}, 19}, /* уда */ + {{0xE8, 0xA8, 0xA9}, 19}, /* ший */ + {{0xA7, 0xA0, 0xE0}, 19}, /* зар */ + {{0xA5, 0xA4, 0xAD}, 19}, /* едн */ + {{0xA0, 0xA2, 0xE8}, 19}, /* авш */ + {{0xE0, 0xAE, 0xA8}, 19}, /* рои */ + {{0xA8, 0xA4, 0xA0}, 19}, /* ида */ + {{0xA0, 0xE0, 0xAE}, 19}, /* аро */ + {{0xE2, 0xAE, 0xA9}, 19}, /* той */ + {{0xA6, 0xA0, 0xE9}, 19}, /* жащ */ + {{0xA5, 0xE1, 0xAE}, 19}, /* есо */ + {{0xAF, 0xA0, 0xAB}, 19}, /* пал */ + {{0xE9, 0xA0, 0xA5}, 19}, /* щае */ + {{0xE0, 0xEB, 0xA5}, 19}, /* рые */ + {{0xA5, 0xAD, 0xEF}, 19}, /* еня */ + {{0xE9, 0xA8, 0xA9}, 19}, /* щий */ + {{0xAB, 0xE3, 0xA3}, 19}, /* луг */ + {{0xEE, 0xE7, 0xA8}, 18}, /* ючи */ + {{0xE3, 0xAB, 0xEC}, 18}, /* уль */ + {{0xAC, 0xEB, 0xE5}, 18}, /* мых */ + {{0xE0, 0xAE, 0xA3}, 18}, /* рог */ + {{0xE1, 0xAE, 0xE5}, 18}, /* сох */ + {{0xAA, 0xAE, 0xA5}, 18}, /* кое */ + {{0xAD, 0xE2, 0xE1}, 18}, /* нтс */ + {{0xA0, 0xA7, 0xAD}, 18}, /* азн */ + {{0xE2, 0xAD, 0xEB}, 18}, /* тны */ + {{0xAE, 0xA4, 0xEF}, 18}, /* одя */ + {{0xAE, 0xA1, 0xAD}, 18}, /* обн */ + {{0xA2, 0xEB, 0xA4}, 18}, /* выд */ + {{0xAE, 0xE1, 0xEF}, 18}, /* ося */ + {{0xEC, 0xE2, 0xA0}, 18}, /* ьта */ + {{0xAD, 0xEF, 0xEE}, 18}, /* няю */ + {{0xAD, 0xA0, 0xE0}, 18}, /* нар */ + {{0xA5, 0xA7, 0xE3}, 18}, /* езу */ + {{0xA0, 0xE1, 0xAD}, 18}, /* асн */ + {{0xA7, 0xE3, 0xAB}, 18}, /* зул */ + {{0xE6, 0xA8, 0xAF}, 18}, /* цип */ + {{0xAA, 0xE2, 0xA5}, 18}, /* кте */ + {{0xA4, 0xAE, 0xAF}, 18}, /* доп */ + {{0xAD, 0xE6, 0xA8}, 18}, /* нци */ + {{0xE1, 0xAF, 0xA5}, 18}, /* спе */ + {{0xA8, 0xAC, 0xEB}, 18}, /* имы */ + {{0xAC, 0xAE, 0xAC}, 18}, /* мом */ + {{0xAF, 0xA5, 0xE7}, 18}, /* печ */ + {{0x8E, 0xA1, 0xEF}, 18}, /* Обя */ + {{0x8F, 0xE0, 0xA0}, 18}, /* Пра */ + {{0xAE, 0xAB, 0xAE}, 18}, /* оло */ + {{0xE2, 0xE1, 0xAA}, 18}, /* тск */ + {{0xAB, 0xAD, 0xA8}, 18}, /* лни */ + {{0xA5, 0xE0, 0xE2}, 18}, /* ерт */ + {{0xA8, 0xE1, 0xEC}, 18}, /* ись */ + {{0xAB, 0xEC, 0xE2}, 18}, /* льт */ + {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ + {{0xA2, 0xAE, 0xA1}, 17}, /* воб */ + {{0xE0, 0xAD, 0xEB}, 17}, /* рны */ + {{0xA1, 0xAD, 0xEB}, 17}, /* бны */ + {{0xEB, 0xA4, 0xA0}, 17}, /* ыда */ + {{0xEC, 0xA7, 0xE3}, 17}, /* ьзу */ + {{0xA5, 0xA4, 0xAF}, 17}, /* едп */ + {{0xA0, 0xA4, 0xA5}, 17}, /* аде */ + {{0xA8, 0xAF, 0xA0}, 17}, /* ипа */ + {{0xE1, 0xA5, 0xA9}, 17}, /* сей */ + {{0xA5, 0xA5, 0xE1}, 17}, /* еес */ + {{0xAE, 0xA8, 0xA7}, 17}, /* оиз */ + {{0xAE, 0xE1, 0xA2}, 17}, /* осв */ + {{0xA4, 0xA8, 0xA2}, 17}, /* див */ + {{0xAD, 0xA0, 0xAD}, 17}, /* нан */ + {{0xA5, 0xE2, 0xA0}, 17}, /* ета */ + {{0xA4, 0xAD, 0xA5}, 17}, /* дне */ + {{0xA8, 0xAE, 0xA1}, 17}, /* иоб */ + {{0xE3, 0xA5, 0xE2}, 17}, /* ует */ + {{0xAD, 0xA0, 0xE5}, 17}, /* нах */ + {{0xE1, 0xAC, 0xA5}, 17}, /* сме */ + {{0xA0, 0xAB, 0xA8}, 17}, /* али */ + {{0xA1, 0xEA, 0xA5}, 17}, /* бъе */ + {{0xAF, 0xA0, 0xE1}, 17}, /* пас */ + {{0xA7, 0xA0, 0xAB}, 17}, /* зал */ + {{0xE0, 0xA6, 0xA0}, 16}, /* ржа */ + {{0xEF, 0xA2, 0xA8}, 16}, /* яви */ + {{0xA6, 0xA0, 0xE2}, 16}, /* жат */ + {{0xA1, 0xAE, 0xA6}, 16}, /* бож */ + {{0xE1, 0xA8, 0xAB}, 16}, /* сил */ + {{0xAD, 0xE3, 0xEE}, 16}, /* ную */ + {{0xAF, 0xA5, 0xAD}, 16}, /* пен */ + {{0xAC, 0xA0, 0xE2}, 16}, /* мат */ + {{0xAE, 0xAD, 0xAD}, 16}, /* онн */ + {{0xA2, 0xA8, 0xAD}, 16}, /* вин */ + {{0xE2, 0xAA, 0xA8}, 16}, /* тки */ + {{0xE2, 0xAE, 0xE7}, 16}, /* точ */ + {{0xE1, 0xE7, 0xA8}, 16}, /* счи */ + {{0xAD, 0xA8, 0xE6}, 16}, /* ниц */ + {{0xE9, 0xA5, 0xA5}, 16}, /* щее */ + {{0xA1, 0xA5, 0xE1}, 16}, /* бес */ + {{0xA0, 0xA4, 0xE6}, 16}, /* адц */ + {{0x8A, 0xAE, 0xAC}, 16}, /* Ком */ + {{0xEC, 0xA8, 0xAC}, 16}, /* ьим */ + {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ + {{0xA0, 0xE7, 0xA8}, 16}, /* ачи */ + {{0xAF, 0xAE, 0xAD}, 16}, /* пон */ + {{0xAA, 0xA0, 0xA5}, 16}, /* кае */ + {{0xA8, 0xA3, 0xE0}, 16}, /* игр */ + {{0xA0, 0xAA, 0xA8}, 16}, /* аки */ + {{0xA0, 0xE9, 0xA8}, 16}, /* ащи */ + {{0xAB, 0xEC, 0xE6}, 16}, /* льц */ + {{0xA2, 0xAD, 0xAE}, 16}, /* вно */ + {{0xEB, 0xE8, 0xA5}, 15}, /* ыше */ + {{0x8B, 0xA8, 0xE6}, 15}, /* Лиц */ + {{0xEC, 0xA5, 0xA9}, 15}, /* ьей */ + {{0xE8, 0xA5, 0xAC}, 15}, /* шем */ + {{0xE3, 0xA1, 0xAB}, 15}, /* убл */ + {{0xE0, 0xA0, 0xE6}, 15}, /* рац */ + {{0xAA, 0xE3, 0xAC}, 15}, /* кум */ + {{0xE0, 0xA5, 0xA3}, 15}, /* рег */ + {{0xAE, 0xAF, 0xA0}, 15}, /* опа */ + {{0x82, 0xAE, 0xA7}, 15}, /* Воз */ + {{0xE2, 0xA0, 0xA5}, 15}, /* тае */ + {{0xAE, 0xA1, 0xEB}, 15}, /* обы */ + {{0xA1, 0xAB, 0xA8}, 15}, /* бли */ + {{0xE0, 0xAC, 0xA5}, 15}, /* рме */ + {{0xA2, 0xAE, 0xE1}, 15}, /* вос */ + {{0xA0, 0xE1, 0xA8}, 15}, /* аси */ + {{0xE2, 0xA0, 0xAC}, 15}, /* там */ + {{0xEC, 0xAC, 0xA5}, 15}, /* ьме */ + {{0xAE, 0xA3, 0xA0}, 15}, /* ога */ + {{0xA8, 0xAB, 0xAE}, 15}, /* ило */ + {{0xE1, 0xEC, 0xAC}, 15}, /* сьм */ + {{0xE0, 0xE2, 0xA8}, 15}, /* рти */ + {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ + {{0xE1, 0xA5, 0xAD}, 15}, /* сен */ + {{0xE2, 0xA0, 0xAB}, 15}, /* тал */ + {{0xA4, 0xA0, 0xE0}, 15}, /* дар */ + {{0xA0, 0xAC, 0xAE}, 15}, /* амо */ + {{0xA5, 0xA4, 0xAB}, 15}, /* едл */ + {{0xE1, 0xE3, 0xA1}, 15}, /* суб */ + {{0xA5, 0xA9, 0xE4}, 15}, /* ейф */ + {{0x95, 0xE0, 0xA0}, 15}, /* Хра */ + {{0xAB, 0xA0, 0xAC}, 14}, /* лам */ + {{0xA0, 0xE0, 0xE3}, 14}, /* ару */ + {{0xA3, 0xA8, 0xE5}, 14}, /* гих */ + {{0xE6, 0xA8, 0xEF}, 14}, /* ция */ + {{0xA4, 0xA0, 0xA2}, 14}, /* дав */ + {{0xAB, 0xA8, 0xE8}, 14}, /* лиш */ + {{0xEE, 0xE7, 0xA0}, 14}, /* юча */ + {{0xA0, 0xAD, 0xE1}, 14}, /* анс */ + {{0xAE, 0xA3, 0xE0}, 14}, /* огр */ + {{0xA8, 0xE9, 0xA0}, 14}, /* ища */ + {{0xA5, 0xAD, 0xEC}, 14}, /* ень */ + {{0xAE, 0xE2, 0xA8}, 14}, /* оти */ + {{0xA0, 0xA4, 0xEB}, 13}, /* ады */ + {{0xA0, 0xE9, 0xA0}, 13}, /* аща */ + {{0xA2, 0xAE, 0xA8}, 13}, /* вои */ + {{0xA2, 0xEB, 0xAC}, 13}, /* вым */ + {{0xA2, 0xEC, 0xEF}, 13}, /* вья */ + {{0xAA, 0xA8, 0xA5}, 13}, /* кие */ + {{0xAB, 0xA8, 0xE1}, 13}, /* лис */ + {{0xAC, 0xA5, 0xA4}, 13}, /* мед */ + {{0xE2, 0xA8, 0xE5}, 13}, /* тих */ + {{0xA5, 0xE2, 0xAE}, 13}, /* ето */ + {{0xA7, 0xAB, 0xAE}, 13}, /* зло */ + {{0xAE, 0xAF, 0xA5}, 13}, /* опе */ + {{0xE1, 0xA8, 0xAC}, 13}, /* сим */ + {{0xEF, 0xA7, 0xA8}, 13}, /* язи */ + {{0xA8, 0xAD, 0xA4}, 13}, /* инд */ + {{0xE7, 0xE3, 0xA6}, 13}, /* чуж */ + {{0xAB, 0xAA, 0xA8}, 13}, /* лки */ + {{0xA4, 0xAF, 0xE0}, 13}, /* дпр */ + {{0xAD, 0xA4, 0xA8}, 13}, /* нди */ + {{0xAE, 0xE2, 0xA0}, 13}, /* ота */ + {{0xAE, 0xE2, 0xEB}, 13}, /* оты */ + {{0xAB, 0xA0, 0xE7}, 13}, /* лач */ + {{0xAA, 0xA8, 0xAC}, 13}, /* ким */ + {{0xA8, 0xE1, 0xA8}, 13}, /* иси */ + {{0xA2, 0xA0, 0xAB}, 13}, /* вал */ + {{0xA5, 0xAC, 0xAE}, 13}, /* емо */ + {{0xAF, 0xE3, 0xA1}, 13}, /* пуб */ + {{0xEF, 0xA5, 0xAC}, 13}, /* яем */ + {{0xA1, 0xAE, 0xAB}, 13}, /* бол */ + {{0xAD, 0xE2, 0xE3}, 13}, /* нту */ + {{0xAD, 0xA5, 0xA9}, 13}, /* ней */ + {{0xAD, 0xA0, 0xEF}, 13}, /* ная */ + {{0xA5, 0xE1, 0xA0}, 13}, /* еса */ + {{0xE0, 0xAD, 0xAE}, 13}, /* рно */ + {{0xE9, 0xA5, 0xAC}, 13}, /* щем */ + {{0xA0, 0xAD, 0xEB}, 13}, /* аны */ + {{0x84, 0xAE, 0xA2}, 13}, /* Дов */ + {{0xE7, 0xA8, 0xA2}, 13}, /* чив */ + {{0xA2, 0xA8, 0xE1}, 13}, /* вис */ + {{0xAE, 0xAF, 0xAE}, 13}, /* опо */ + {{0xA2, 0xEC, 0xEE}, 13}, /* вью */ + {{0xA0, 0xAB, 0xA0}, 13}, /* ала */ + {{0xAB, 0xA5, 0xA9}, 12}, /* лей */ + {{0xA0, 0xE7, 0xA0}, 12}, /* ача */ + {{0xA5, 0xA7, 0xA2}, 12}, /* езв */ + {{0xA2, 0xA0, 0xEF}, 12}, /* вая */ + {{0xA5, 0xAE, 0xE1}, 12}, /* еос */ + {{0xEF, 0xE9, 0xA8}, 12}, /* ящи */ + {{0xA8, 0xA2, 0xA8}, 12}, /* иви */ + {{0xAD, 0xA5, 0xA5}, 12}, /* нее */ + {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ + {{0xE8, 0xA5, 0xA5}, 12}, /* шее */ + {{0xE1, 0xA0, 0xE5}, 12}, /* сах */ + {{0xA8, 0xAD, 0xE6}, 12}, /* инц */ + {{0xAE, 0xAC, 0xAF}, 12}, /* омп */ + {{0xE3, 0xA6, 0xAE}, 12}, /* ужо */ + {{0xE3, 0xA0, 0xAB}, 12}, /* уал */ + {{0xAD, 0xA0, 0xE2}, 12}, /* нат */ + {{0xA8, 0xA4, 0xE3}, 12}, /* иду */ + {{0xA2, 0xAB, 0xA0}, 12}, /* вла */ + {{0xA7, 0xA2, 0xA0}, 12}, /* зва */ + {{0xAB, 0xA5, 0xA5}, 12}, /* лее */ + {{0xE0, 0xA5, 0xE5}, 12}, /* рех */ + {{0xA6, 0xA4, 0xE3}, 12}, /* жду */ + {{0xAC, 0xA0, 0xAB}, 12}, /* мал */ + {{0xA5, 0xAD, 0xE1}, 12}, /* енс */ + {{0xA8, 0xA9, 0xE1}, 12}, /* ийс */ + {{0xAA, 0xAE, 0xAB}, 12}, /* кол */ + {{0xAD, 0xA0, 0xA7}, 12}, /* наз */ + {{0xA4, 0xE3, 0xA0}, 12}, /* дуа */ + {{0xAE, 0xAD, 0xA8}, 12}, /* они */ + {{0xE1, 0xA5, 0xAC}, 12}, /* сем */ + {{0xA3, 0xAE, 0xA4}, 12}, /* год */ + {{0xAC, 0xA5, 0xA6}, 12}, /* меж */ + {{0xAE, 0xA7, 0xAB}, 12}, /* озл */ + {{0xA2, 0xAC, 0xA5}, 12}, /* вме */ + {{0xE3, 0xA4, 0xA5}, 12}, /* уде */ + {{0xEC, 0xAA, 0xAE}, 12}, /* ько */ + {{0xA5, 0xA2, 0xEB}, 12}, /* евы */ + {{0xA7, 0xA0, 0xAC}, 12}, /* зам */ + {{0xE1, 0xAE, 0xA4}, 12}, /* сод */ + {{0xE0, 0xAE, 0xA5}, 11}, /* рое */ + {{0xAE, 0xE2, 0xA4}, 11}, /* отд */ + {{0xE1, 0xA8, 0xEF}, 11}, /* сия */ + {{0xA8, 0xAA, 0xE3}, 11}, /* ику */ + {{0xEB, 0xAB, 0xA8}, 11}, /* ыли */ + {{0xA3, 0xA8, 0xAC}, 11}, /* гим */ + {{0xAD, 0xEC, 0xE8}, 11}, /* ньш */ + {{0xE2, 0xA8, 0xE7}, 11}, /* тич */ + {{0xE0, 0xA0, 0xAB}, 11}, /* рал */ + {{0xE3, 0xE7, 0xA8}, 11}, /* учи */ + {{0xAC, 0xA5, 0xEE}, 11}, /* мею */ + {{0xE2, 0xA5, 0xAA}, 11}, /* тек */ + {{0xAE, 0xA1, 0xE3}, 11}, /* обу */ + {{0xAD, 0xAD, 0xE3}, 11}, /* нну */ + {{0xAD, 0xA5, 0xAF}, 11}, /* неп */ + {{0xA2, 0xA5, 0xAB}, 11}, /* вел */ + {{0xE2, 0xAC, 0xA5}, 11}, /* тме */ + {{0xA1, 0xAE, 0xA3}, 11}, /* бог */ + {{0xAE, 0xE0, 0xA8}, 11}, /* ори */ + {{0xA0, 0xA2, 0xAD}, 11}, /* авн */ + {{0xA4, 0xA5, 0xA5}, 11}, /* дее */ + {{0xA6, 0xAE, 0xAC}, 11}, /* жом */ + {{0x82, 0xE0, 0xA5}, 11}, /* Вре */ + {{0xAC, 0xEB, 0xA5}, 11}, /* мые */ + {{0xEC, 0xE6, 0xA0}, 11}, /* ьца */ + {{0xAE, 0xE6, 0xA5}, 11}, /* оце */ + {{0xA8, 0xE2, 0xEB}, 10}, /* иты */ + {{0xA7, 0xE0, 0xA0}, 10}, /* зра */ + {{0xAE, 0xAD, 0xEB}, 10}, /* оны */ + {{0xE0, 0xA5, 0xE8}, 10}, /* реш */ + {{0xE3, 0xE8, 0xA5}, 10}, /* уше */ + {{0xE0, 0xA5, 0xA2}, 10}, /* рев */ + {{0xAE, 0xAF, 0xE3}, 10}, /* опу */ + {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ + {{0xE2, 0xA0, 0xE7}, 10}, /* тач */ + {{0xA5, 0xE0, 0xAE}, 10}, /* еро */ + {{0xA2, 0xAA, 0xAB}, 10}, /* вкл */ + {{0xA7, 0xEB, 0xA2}, 10}, /* зыв */ + {{0xA0, 0xAF, 0xE0}, 10}, /* апр */ + {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ + {{0x8E, 0xE2, 0xA2}, 10}, /* Отв */ + {{0xE0, 0xE1, 0xA0}, 10}, /* рса */ + {{0xA5, 0xAA, 0xE2}, 10}, /* ект */ + {{0xAB, 0xA5, 0xAA}, 10}, /* лек */ + {{0xA5, 0xA5, 0xE2}, 10}, /* еет */ + {{0xAE, 0xAF, 0xAB}, 10}, /* опл */ + {{0xE2, 0xE7, 0xA5}, 10}, /* тче */ + {{0xA3, 0xAE, 0xAC}, 10}, /* гом */ + {{0xE2, 0xAE, 0xA6}, 10}, /* тож */ + {{0xAB, 0xA5, 0xE7}, 10}, /* леч */ + {{0xA5, 0xE2, 0xEB}, 10}, /* еты */ + {{0xAE, 0xA6, 0xA8}, 10}, /* ожи */ + {{0xAC, 0xAD, 0xAE}, 10}, /* мно */ + {{0xAC, 0xAE, 0xA9}, 10}, /* мой */ + {{0xE6, 0xA5, 0xAB}, 10}, /* цел */ + {{0xE3, 0xAF, 0xA8}, 10}, /* упи */ + {{0xA0, 0xA5, 0xA2}, 10}, /* аев */ + {{0xAF, 0xAE, 0xAC}, 10}, /* пом */ + {{0xA4, 0xEF, 0xE9}, 10}, /* дящ */ + {{0xE2, 0xE0, 0xA8}, 10}, /* три */ + {{0xE8, 0xA8, 0xA5}, 10}, /* шие */ + {{0xA5, 0xAA, 0xA0}, 10}, /* ека */ + {{0xA5, 0xE8, 0xA5}, 10}, /* еше */ + {{0xA7, 0xA0, 0xA8}, 10}, /* заи */ + {{0xA8, 0xE2, 0xAE}, 10}, /* ито */ + {{0xA7, 0xAD, 0xEB}, 10}, /* зны */ + {{0xAE, 0xEF, 0xAD}, 10}, /* оян */ + {{0xA8, 0xA6, 0xA5}, 10}, /* иже */ + {{0xA2, 0xAD, 0xA5}, 10}, /* вне */ + {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ + {{0xA5, 0xAC, 0xEF}, 10}, /* емя */ + {{0xAD, 0xA0, 0xA8}, 10}, /* наи */ + {{0xE2, 0xAE, 0xAB}, 10}, /* тол */ + {{0xAB, 0xA8, 0xE2}, 10}, /* лит */ + {{0xAE, 0xE1, 0xE0}, 10}, /* оср */ + {{0xE2, 0xA4, 0xA5}, 10}, /* тде */ + {{0xA5, 0xAC, 0xA8}, 10}, /* еми */ + {{0xAC, 0xA5, 0xA5}, 10}, /* мее */ + {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ + {{0xAD, 0xA8, 0xA2}, 10}, /* нив */ + {{0xA5, 0xE0, 0xE3}, 10}, /* еру */ + {{0xE7, 0xA5, 0xAC}, 10}, /* чем */ + {{0xA4, 0xAE, 0xA1}, 10}, /* доб */ + {{0xA5, 0xAB, 0xAE}, 10}, /* ело */ + {{0xA8, 0xAB, 0xE3}, 10}, /* илу */ + {{0xA0, 0xA4, 0xAB}, 10}, /* адл */ + {{0xA8, 0xE7, 0xE2}, 10}, /* ичт */ + {{0xAC, 0xAB, 0xA5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_iso_8859_5[] = { + {{0xD5, 0xDD, 0xD8}, 991}, /* ени */ + {{0xDE, 0xD3, 0xDE}, 806}, /* ого */ + {{0xE1, 0xE2, 0xD2}, 659}, /* ств */ + {{0xDD, 0xD8, 0xEF}, 629}, /* ния */ + {{0xDE, 0xD2, 0xD0}, 566}, /* ова */ + {{0xE2, 0xD5, 0xDB}, 555}, /* тел */ + {{0xE0, 0xD5, 0xD4}, 507}, /* ред */ + {{0xD5, 0xDD, 0xDD}, 499}, /* енн */ + {{0xDE, 0xD2, 0xDE}, 443}, /* ово */ + {{0xD0, 0xDD, 0xD8}, 443}, /* ани */ + {{0xE2, 0xE0, 0xD0}, 429}, /* тра */ + {{0xDE, 0xE1, 0xE2}, 428}, /* ост */ + {{0xDD, 0xD8, 0xD5}, 419}, /* ние */ + {{0xDD, 0xDD, 0xDE}, 412}, /* нно */ + {{0xD0, 0xE5, 0xDE}, 396}, /* ахо */ + {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ + {{0xE0, 0xD0, 0xE5}, 386}, /* рах */ + {{0xE5, 0xDE, 0xD2}, 379}, /* хов */ + {{0xD5, 0xDB, 0xEC}, 365}, /* ель */ + {{0xD3, 0xDE, 0xD2}, 360}, /* гов */ + {{0xD2, 0xDE, 0xE0}, 356}, /* вор */ + {{0xD5, 0xE1, 0xE2}, 349}, /* ест */ + {{0xD0, 0xE2, 0xEC}, 345}, /* ать */ + {{0xE0, 0xD0, 0xD2}, 337}, /* рав */ + {{0xDF, 0xE0, 0xD8}, 330}, /* при */ + {{0xDF, 0xE0, 0xD5}, 323}, /* пре */ + {{0xD4, 0xDE, 0xD3}, 318}, /* дог */ + {{0xDD, 0xD5, 0xDD}, 310}, /* нен */ + {{0xDF, 0xE0, 0xD0}, 309}, /* пра */ + {{0xD2, 0xD0, 0xDD}, 304}, /* ван */ + {{0xD8, 0xE2, 0xD5}, 295}, /* ите */ + {{0xE2, 0xD2, 0xD5}, 281}, /* тве */ + {{0xDB, 0xD5, 0xDD}, 266}, /* лен */ + {{0xE1, 0xE2, 0xDE}, 261}, /* сто */ + {{0xE2, 0xD0, 0xE2}, 260}, /* тат */ + {{0xDD, 0xDD, 0xEB}, 260}, /* нны */ + {{0xDB, 0xEC, 0xDD}, 256}, /* льн */ + {{0xD2, 0xDE, 0xD7}, 255}, /* воз */ + {{0xD8, 0xDB, 0xD8}, 254}, /* или */ + {{0xD0, 0xE2, 0xD5}, 252}, /* ате */ + {{0xD5, 0xD3, 0xDE}, 241}, /* его */ + {{0xD5, 0xE2, 0xE1}, 238}, /* етс */ + {{0xDD, 0xDE, 0xE1}, 236}, /* нос */ + {{0xE9, 0xD5, 0xE1}, 235}, /* щес */ + {{0xDF, 0xDE, 0xDB}, 232}, /* пол */ + {{0xE0, 0xD0, 0xDD}, 231}, /* ран */ + {{0xDD, 0xDE, 0xD3}, 230}, /* ног */ + {{0xE1, 0xE2, 0xD0}, 229}, /* ста */ + {{0xE7, 0xD5, 0xDD}, 226}, /* чен */ + {{0xE2, 0xE0, 0xD5}, 224}, /* тре */ + {{0xD7, 0xDC, 0xD5}, 214}, /* зме */ + {{0xE3, 0xE9, 0xD5}, 212}, /* уще */ + {{0xE1, 0xE2, 0xD8}, 210}, /* сти */ + {{0xDA, 0xDE, 0xDC}, 207}, /* ком */ + {{0xDE, 0xE0, 0xDE}, 206}, /* оро */ + {{0xD2, 0xDB, 0xD5}, 195}, /* вле */ + {{0xD7, 0xD0, 0xDD}, 194}, /* зан */ + {{0xD0, 0xE1, 0xE2}, 193}, /* аст */ + {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ + {{0xE5, 0xE0, 0xD0}, 187}, /* хра */ + {{0xD0, 0xDD, 0xDD}, 182}, /* анн */ + {{0xD5, 0xE0, 0xD5}, 182}, /* ере */ + {{0xD2, 0xE0, 0xD5}, 178}, /* вре */ + {{0xDE, 0xD2, 0xD5}, 173}, /* ове */ + {{0xEC, 0xDD, 0xDE}, 173}, /* ьно */ + {{0xD2, 0xD5, 0xE0}, 172}, /* вер */ + {{0xDC, 0xD5, 0xDD}, 170}, /* мен */ + {{0xDB, 0xD8, 0xE6}, 168}, /* лиц */ + {{0xE2, 0xDE, 0xE0}, 167}, /* тор */ + {{0xE0, 0xD5, 0xDD}, 167}, /* рен */ + {{0xE9, 0xD5, 0xDD}, 165}, /* щен */ + {{0xDE, 0xD7, 0xDC}, 164}, /* озм */ + {{0xD5, 0xD4, 0xD0}, 163}, /* еда */ + {{0xE2, 0xD2, 0xD8}, 159}, /* тви */ + {{0xEF, 0xD7, 0xD0}, 159}, /* яза */ + {{0xD1, 0xEF, 0xD7}, 158}, /* бяз */ + {{0xDD, 0xD8, 0xD8}, 153}, /* нии */ + {{0xDD, 0xEB, 0xE5}, 153}, /* ных */ + {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ + {{0xDC, 0xD5, 0xE0}, 153}, /* мер */ + {{0xE1, 0xDB, 0xD8}, 150}, /* сли */ + {{0xE2, 0xDE, 0xD2}, 148}, /* тов */ + {{0xE2, 0xD2, 0xD0}, 147}, /* тва */ + {{0xDE, 0xE0, 0xD0}, 146}, /* ора */ + {{0xDD, 0xDE, 0xDC}, 144}, /* ном */ + {{0xD4, 0xD5, 0xDD}, 144}, /* ден */ + {{0xD0, 0xDD, 0xD5}, 142}, /* ане */ + {{0xDA, 0xDE, 0xDD}, 141}, /* кон */ + {{0xDB, 0xE3, 0xE7}, 141}, /* луч */ + {{0xDC, 0xE3, 0xE9}, 140}, /* мущ */ + {{0xDE, 0xD1, 0xEF}, 140}, /* обя */ + {{0xD2, 0xD0, 0xE2}, 138}, /* ват */ + {{0xD2, 0xD0, 0xE0}, 137}, /* вар */ + {{0xD5, 0xE9, 0xD5}, 137}, /* еще */ + {{0xDE, 0xE2, 0xE0}, 137}, /* отр */ + {{0xD4, 0xD5, 0xDB}, 137}, /* дел */ + {{0xDD, 0xEB, 0xDC}, 136}, /* ным */ + {{0xD8, 0xDC, 0xE3}, 136}, /* иму */ + {{0xC1, 0xE2, 0xD0}, 134}, /* Ста */ + {{0xE3, 0xE7, 0xD0}, 133}, /* уча */ + {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ + {{0xD5, 0xDB, 0xEF}, 130}, /* еля */ + {{0xE1, 0xDB, 0xE3}, 130}, /* слу */ + {{0xD7, 0xD0, 0xDA}, 130}, /* зак */ + {{0xE2, 0xDE, 0xEF}, 129}, /* тоя */ + {{0xDE, 0xDC, 0xD8}, 128}, /* оми */ + {{0xDC, 0xD5, 0xE9}, 128}, /* мещ */ + {{0xD5, 0xD4, 0xE3}, 127}, /* еду */ + {{0xD2, 0xD5, 0xDD}, 127}, /* вен */ + {{0xDD, 0xDE, 0xD2}, 127}, /* нов */ + {{0xDD, 0xDE, 0xD5}, 126}, /* ное */ + {{0xDE, 0xE2, 0xD2}, 125}, /* отв */ + {{0xDA, 0xD0, 0xD7}, 125}, /* каз */ + {{0xD0, 0xD5, 0xE2}, 125}, /* ает */ + {{0xE1, 0xDA, 0xDE}, 125}, /* ско */ + {{0xD5, 0xDD, 0xE2}, 124}, /* ент */ + {{0xDC, 0xDE, 0xE2}, 123}, /* мот */ + {{0xD0, 0xD2, 0xDB}, 122}, /* авл */ + {{0xE1, 0xDC, 0xDE}, 122}, /* смо */ + {{0xD8, 0xE7, 0xD8}, 121}, /* ичи */ + {{0xD1, 0xEB, 0xE2}, 120}, /* быт */ + {{0xE3, 0xE1, 0xDC}, 118}, /* усм */ + {{0xE1, 0xE1, 0xD8}, 117}, /* сси */ + {{0xD4, 0xE3, 0xE1}, 117}, /* дус */ + {{0xE5, 0xDE, 0xD4}, 117}, /* ход */ + {{0xE0, 0xD8, 0xE7}, 117}, /* рич */ + {{0xE7, 0xD5, 0xE1}, 115}, /* чес */ + {{0xD3, 0xE0, 0xD0}, 114}, /* гра */ + {{0xDF, 0xE0, 0xDE}, 114}, /* про */ + {{0xD4, 0xDE, 0xD2}, 113}, /* дов */ + {{0xD2, 0xD5, 0xE2}, 112}, /* вет */ + {{0xD5, 0xD4, 0xD5}, 112}, /* еде */ + {{0xE8, 0xD5, 0xDD}, 111}, /* шен */ + {{0xE7, 0xD8, 0xDD}, 110}, /* чин */ + {{0xDD, 0xD0, 0xE1}, 109}, /* нас */ + {{0xD8, 0xE2, 0xEC}, 105}, /* ить */ + {{0xE2, 0xD2, 0xDE}, 105}, /* тво */ + {{0xDA, 0xDB, 0xEE}, 104}, /* клю */ + {{0xE0, 0xD8, 0xE2}, 104}, /* рит */ + {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ + {{0xDB, 0xEE, 0xE7}, 104}, /* люч */ + {{0xE2, 0xDE, 0xDC}, 104}, /* том */ + {{0xE1, 0xDB, 0xD5}, 103}, /* сле */ + {{0xE1, 0xDF, 0xDE}, 102}, /* спо */ + {{0xDE, 0xDB, 0xDD}, 102}, /* олн */ + {{0xD5, 0xE1, 0xDB}, 102}, /* есл */ + {{0xD5, 0xE0, 0xD8}, 101}, /* ери */ + {{0xDD, 0xDE, 0xD9}, 101}, /* ной */ + {{0xE0, 0xDE, 0xDC}, 101}, /* ром */ + {{0xDE, 0xE2, 0xDE}, 99}, /* ото */ + {{0xDD, 0xEB, 0xD5}, 99}, /* ные */ + {{0xD7, 0xDD, 0xD0}, 99}, /* зна */ + {{0xD2, 0xDB, 0xEF}, 99}, /* вля */ + {{0xE2, 0xD5, 0xE0}, 98}, /* тер */ + {{0xE3, 0xDF, 0xE0}, 97}, /* упр */ + {{0xD0, 0xDA, 0xDE}, 96}, /* ако */ + {{0xDA, 0xDE, 0xD3}, 96}, /* ког */ + {{0xDD, 0xEB, 0xD9}, 96}, /* ный */ + {{0xDE, 0xE0, 0xE3}, 96}, /* ору */ + {{0xD5, 0xDB, 0xD5}, 95}, /* еле */ + {{0xD5, 0xE1, 0xDA}, 95}, /* еск */ + {{0xD0, 0xD7, 0xD0}, 95}, /* аза */ + {{0xD9, 0xE1, 0xE2}, 93}, /* йст */ + {{0xDF, 0xDE, 0xE0}, 93}, /* пор */ + {{0xDE, 0xD6, 0xD5}, 92}, /* оже */ + {{0xD8, 0xDD, 0xD5}, 91}, /* ине */ + {{0xE9, 0xD5, 0xD9}, 90}, /* щей */ + {{0xD6, 0xD4, 0xD5}, 90}, /* жде */ + {{0xDF, 0xD5, 0xE0}, 89}, /* пер */ + {{0xDD, 0xD8, 0xE2}, 89}, /* нит */ + {{0xDE, 0xDB, 0xEC}, 89}, /* оль */ + {{0xD0, 0xD6, 0xD4}, 88}, /* ажд */ + {{0xD6, 0xD5, 0xDD}, 87}, /* жен */ + {{0xDB, 0xD0, 0xD4}, 87}, /* лад */ + {{0xD0, 0xDC, 0xD8}, 87}, /* ами */ + {{0xDA, 0xDE, 0xE2}, 86}, /* кот */ + {{0xE7, 0xD0, 0xD5}, 85}, /* чае */ + {{0xD2, 0xD5, 0xE9}, 85}, /* вещ */ + {{0xD2, 0xD8, 0xEF}, 85}, /* вия */ + {{0xEF, 0xE9, 0xD5}, 85}, /* яще */ + {{0xD8, 0xD5, 0xDC}, 85}, /* ием */ + {{0xDA, 0xDB, 0xD0}, 85}, /* кла */ + {{0xD5, 0xD9, 0xE1}, 84}, /* ейс */ + {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ + {{0xD0, 0xD2, 0xDE}, 84}, /* аво */ + {{0xE0, 0xD0, 0xD6}, 83}, /* раж */ + {{0xDB, 0xEC, 0xE1}, 83}, /* льс */ + {{0xDE, 0xEF, 0xE9}, 82}, /* оящ */ + {{0xD5, 0xDD, 0xDE}, 81}, /* ено */ + {{0xD4, 0xE1, 0xE2}, 81}, /* дст */ + {{0xD4, 0xD5, 0xD9}, 80}, /* дей */ + {{0xE0, 0xD5, 0xD1}, 80}, /* реб */ + {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ + {{0xD5, 0xD4, 0xE1}, 79}, /* едс */ + {{0xD0, 0xE0, 0xD8}, 79}, /* ари */ + {{0xD4, 0xD0, 0xDD}, 79}, /* дан */ + {{0xDC, 0xDE, 0xD6}, 78}, /* мож */ + {{0xD8, 0xDC, 0xD5}, 78}, /* име */ + {{0xD8, 0xDD, 0xDE}, 78}, /* ино */ + {{0xE0, 0xD8, 0xDD}, 77}, /* рин */ + {{0xD4, 0xDE, 0xE1}, 77}, /* дос */ + {{0xDF, 0xDE, 0xE1}, 77}, /* пос */ + {{0xE2, 0xD0, 0xDA}, 77}, /* так */ + {{0xE9, 0xD5, 0xD3}, 77}, /* щег */ + {{0xD4, 0xD0, 0xE2}, 77}, /* дат */ + {{0xDF, 0xDB, 0xD0}, 76}, /* пла */ + {{0xE3, 0xE1, 0xDB}, 76}, /* усл */ + {{0xD8, 0xE6, 0xD0}, 76}, /* ица */ + {{0xE0, 0xDE, 0xD2}, 75}, /* ров */ + {{0xED, 0xE2, 0xDE}, 75}, /* это */ + {{0xE3, 0xE7, 0xD5}, 74}, /* уче */ + {{0xD4, 0xDE, 0xDB}, 73}, /* дол */ + {{0xEC, 0xDD, 0xEB}, 73}, /* ьны */ + {{0xE0, 0xD0, 0xD7}, 73}, /* раз */ + {{0xDC, 0xD8, 0xE1}, 73}, /* мис */ + {{0xD0, 0xDD, 0xDE}, 72}, /* ано */ + {{0xE1, 0xE0, 0xDE}, 72}, /* сро */ + {{0xD0, 0xD2, 0xD8}, 72}, /* ави */ + {{0xE2, 0xEC, 0xD8}, 71}, /* тьи */ + {{0xEE, 0xE7, 0xD5}, 70}, /* юче */ + {{0xE1, 0xDA, 0xDB}, 70}, /* скл */ + {{0xD8, 0xE1, 0xE1}, 70}, /* исс */ + {{0xD6, 0xD5, 0xE2}, 69}, /* жет */ + {{0xD5, 0xD4, 0xDE}, 69}, /* едо */ + {{0xDB, 0xD5, 0xD4}, 69}, /* лед */ + {{0xDB, 0xDE, 0xD2}, 69}, /* лов */ + {{0xEE, 0xE9, 0xD8}, 68}, /* ющи */ + {{0xD8, 0xD1, 0xDE}, 68}, /* ибо */ + {{0xDB, 0xD0, 0xE2}, 67}, /* лат */ + {{0xE0, 0xDE, 0xDA}, 67}, /* рок */ + {{0xD0, 0xDA, 0xDB}, 67}, /* акл */ + {{0xE0, 0xD8, 0xE9}, 67}, /* рищ */ + {{0xD1, 0xDE, 0xD2}, 67}, /* бов */ + {{0xD8, 0xE1, 0xDA}, 67}, /* иск */ + {{0xD5, 0xD1, 0xDE}, 67}, /* ебо */ + {{0xDB, 0xEC, 0xD7}, 67}, /* льз */ + {{0xE3, 0xDA, 0xD0}, 67}, /* ука */ + {{0xDB, 0xD8, 0xD1}, 66}, /* либ */ + {{0xDE, 0xDC, 0xE3}, 66}, /* ому */ + {{0xDE, 0xD2, 0xDB}, 66}, /* овл */ + {{0xE2, 0xDD, 0xDE}, 65}, /* тно */ + {{0xD2, 0xDE, 0xD9}, 64}, /* вой */ + {{0xE2, 0xDE, 0xD3}, 64}, /* тог */ + {{0xE1, 0xDB, 0xDE}, 64}, /* сло */ + {{0xDE, 0xD7, 0xDD}, 64}, /* озн */ + {{0xE1, 0xDE, 0xDE}, 64}, /* соо */ + {{0xD7, 0xD0, 0xE2}, 63}, /* зат */ + {{0xD8, 0xE1, 0xDF}, 63}, /* исп */ + {{0xD0, 0xE7, 0xD5}, 63}, /* аче */ + {{0xDD, 0xD8, 0xEE}, 63}, /* нию */ + {{0xDE, 0xDD, 0xD5}, 63}, /* оне */ + {{0xDE, 0xDB, 0xD6}, 62}, /* олж */ + {{0xDE, 0xD2, 0xE9}, 61}, /* овщ */ + {{0xE0, 0xD0, 0xE1}, 61}, /* рас */ + {{0xD2, 0xD8, 0xD4}, 61}, /* вид */ + {{0xD2, 0xE9, 0xD8}, 61}, /* вщи */ + {{0xE1, 0xDD, 0xDE}, 61}, /* сно */ + {{0xD8, 0xE6, 0xDE}, 61}, /* ицо */ + {{0xD8, 0xE7, 0xD5}, 61}, /* иче */ + {{0xD0, 0xD2, 0xD5}, 61}, /* аве */ + {{0xD3, 0xDB, 0xD0}, 61}, /* гла */ + {{0xE7, 0xD5, 0xE2}, 61}, /* чет */ + {{0xE9, 0xD8, 0xDA}, 61}, /* щик */ + {{0xE0, 0xE3, 0xD3}, 60}, /* руг */ + {{0xE2, 0xD0, 0xDD}, 60}, /* тан */ + {{0xD8, 0xDC, 0xDE}, 60}, /* имо */ + {{0xD0, 0xDB, 0xEC}, 60}, /* аль */ + {{0xDE, 0xD2, 0xD8}, 60}, /* ови */ + {{0xD6, 0xD4, 0xD0}, 60}, /* жда */ + {{0xDF, 0xDE, 0xD2}, 60}, /* пов */ + {{0xD5, 0xDC, 0xE3}, 60}, /* ему */ + {{0xEF, 0xE2, 0xD5}, 60}, /* яте */ + {{0xE1, 0xD8, 0xD8}, 59}, /* сии */ + {{0xD1, 0xDE, 0xE2}, 59}, /* бот */ + {{0xD2, 0xEB, 0xDF}, 59}, /* вып */ + {{0xD0, 0xD1, 0xDE}, 59}, /* або */ + {{0xDB, 0xEF, 0xEE}, 59}, /* ляю */ + {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ + {{0xDE, 0xD4, 0xD5}, 58}, /* оде */ + {{0xD8, 0xDD, 0xD8}, 58}, /* ини */ + {{0xE0, 0xD0, 0xE2}, 58}, /* рат */ + {{0xEF, 0xD2, 0xDB}, 58}, /* явл */ + {{0xDD, 0xD0, 0xD3}, 57}, /* наг */ + {{0xD4, 0xE0, 0xE3}, 57}, /* дру */ + {{0xE0, 0xD0, 0xD1}, 57}, /* раб */ + {{0xD0, 0xD3, 0xE0}, 57}, /* агр */ + {{0xD8, 0xDE, 0xDD}, 57}, /* ион */ + {{0xDC, 0xD5, 0xE1}, 57}, /* мес */ + {{0xD0, 0xE6, 0xD8}, 56}, /* аци */ + {{0xDE, 0xE1, 0xE3}, 56}, /* осу */ + {{0xDA, 0xDE, 0xD9}, 55}, /* кой */ + {{0xE1, 0xD2, 0xDE}, 55}, /* сво */ + {{0xD7, 0xDE, 0xD2}, 55}, /* зов */ + {{0xDE, 0xDF, 0xE0}, 54}, /* опр */ + {{0xE1, 0xDE, 0xD1}, 54}, /* соб */ + {{0xD2, 0xDF, 0xE0}, 54}, /* впр */ + {{0xDB, 0xDD, 0xD5}, 54}, /* лне */ + {{0xDE, 0xDC, 0xDC}, 54}, /* омм */ + {{0xD5, 0xE0, 0xD0}, 54}, /* ера */ + {{0xE7, 0xD8, 0xE2}, 54}, /* чит */ + {{0xD5, 0xE0, 0xE7}, 54}, /* ерч */ + {{0xE0, 0xE7, 0xD5}, 54}, /* рче */ + {{0xD0, 0xE2, 0xD8}, 54}, /* ати */ + {{0xDD, 0xD8, 0xDA}, 54}, /* ник */ + {{0xDC, 0xDC, 0xD5}, 54}, /* мме */ + {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ + {{0xE2, 0xD5, 0xDD}, 53}, /* тен */ + {{0xD2, 0xD5, 0xD4}, 53}, /* вед */ + {{0xE1, 0xDE, 0xD2}, 52}, /* сов */ + {{0xD0, 0xD6, 0xD5}, 52}, /* аже */ + {{0xDE, 0xDA, 0xD0}, 52}, /* ока */ + {{0xEB, 0xDC, 0xD8}, 52}, /* ыми */ + {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ + {{0xDE, 0xDE, 0xE2}, 52}, /* оот */ + {{0xDC, 0xD8, 0xE2}, 52}, /* мит */ + {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ + {{0xD2, 0xE8, 0xD5}, 51}, /* вше */ + {{0xE1, 0xD8, 0xDE}, 51}, /* сио */ + {{0xDE, 0xDD, 0xDE}, 51}, /* оно */ + {{0xD0, 0xD2, 0xD0}, 51}, /* ава */ + {{0xD0, 0xE9, 0xD5}, 51}, /* аще */ + {{0xDB, 0xEF, 0xD5}, 50}, /* ляе */ + {{0xD5, 0xDD, 0xD5}, 50}, /* ене */ + {{0xDE, 0xD4, 0xD8}, 50}, /* оди */ + {{0xDF, 0xE3, 0xDD}, 49}, /* пун */ + {{0xDB, 0xD8, 0xE7}, 49}, /* лич */ + {{0xD2, 0xDE, 0xDC}, 49}, /* вом */ + {{0xDD, 0xDA, 0xE2}, 49}, /* нкт */ + {{0xDD, 0xD5, 0xE1}, 49}, /* нес */ + {{0xD2, 0xD8, 0xDB}, 49}, /* вил */ + {{0xD5, 0xD6, 0xD4}, 49}, /* ежд */ + {{0xE0, 0xD5, 0xE1}, 49}, /* рес */ + {{0xEE, 0xE9, 0xD5}, 49}, /* юще */ + {{0xEC, 0xD7, 0xDE}, 49}, /* ьзо */ + {{0xDF, 0xDE, 0xE2}, 49}, /* пот */ + {{0xE3, 0xDD, 0xDA}, 49}, /* унк */ + {{0xE1, 0xE2, 0xD5}, 49}, /* сте */ + {{0xDA, 0xDE, 0xD2}, 49}, /* ков */ + {{0xDE, 0xE1, 0xDB}, 48}, /* осл */ + {{0xEF, 0xD5, 0xE2}, 48}, /* яет */ + {{0xB5, 0xE1, 0xDB}, 48}, /* Есл */ + {{0xBF, 0xE0, 0xD8}, 48}, /* При */ + {{0xE2, 0xD0, 0xD2}, 48}, /* тав */ + {{0xDD, 0xD5, 0xE0}, 48}, /* нер */ + {{0xE7, 0xDD, 0xDE}, 47}, /* чно */ + {{0xDF, 0xDE, 0xD4}, 47}, /* под */ + {{0xDD, 0xE2, 0xD0}, 47}, /* нта */ + {{0xD8, 0xE9, 0xD5}, 47}, /* ище */ + {{0xDE, 0xD1, 0xE9}, 47}, /* общ */ + {{0xD0, 0xD7, 0xDC}, 47}, /* азм */ + {{0xD6, 0xDD, 0xDE}, 47}, /* жно */ + {{0xD2, 0xD8, 0xD8}, 46}, /* вии */ + {{0xE0, 0xD0, 0xE9}, 46}, /* ращ */ + {{0xDE, 0xE0, 0xD5}, 46}, /* оре */ + {{0xD2, 0xE8, 0xD8}, 46}, /* вши */ + {{0xD5, 0xDA, 0xE1}, 46}, /* екс */ + {{0xD2, 0xDE, 0xD3}, 46}, /* вог */ + {{0xE7, 0xE2, 0xDE}, 46}, /* что */ + {{0xD8, 0xE7, 0xDD}, 45}, /* ичн */ + {{0xDB, 0xD5, 0xDC}, 45}, /* лем */ + {{0xDC, 0xDE, 0xD3}, 45}, /* мог */ + {{0xE2, 0xD2, 0xDB}, 45}, /* твл */ + {{0xD4, 0xDB, 0xD5}, 45}, /* дле */ + {{0xD4, 0xDB, 0xEF}, 45}, /* для */ + {{0xE0, 0xD5, 0xE2}, 45}, /* рет */ + {{0xD0, 0xE0, 0xD0}, 45}, /* ара */ + {{0xDD, 0xEF, 0xE2}, 44}, /* нят */ + {{0xD5, 0xE7, 0xD5}, 44}, /* ече */ + {{0xDE, 0xE2, 0xD5}, 44}, /* оте */ + {{0xDE, 0xE0, 0xEB}, 44}, /* оры */ + {{0xDE, 0xE1, 0xDD}, 43}, /* осн */ + {{0xDE, 0xD1, 0xDE}, 43}, /* обо */ + {{0xDE, 0xD3, 0xDB}, 43}, /* огл */ + {{0xD8, 0xDD, 0xEB}, 43}, /* ины */ + {{0xD5, 0xE1, 0xE1}, 43}, /* есс */ + {{0xDE, 0xD1, 0xE0}, 43}, /* обр */ + {{0xDA, 0xE0, 0xD0}, 43}, /* кра */ + {{0xD8, 0xEF, 0xDC}, 43}, /* иям */ + {{0xD0, 0xDB, 0xDE}, 43}, /* ало */ + {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ + {{0xDE, 0xE0, 0xD3}, 43}, /* орг */ + {{0xE7, 0xD0, 0xEF}, 42}, /* чая */ + {{0xDD, 0xD8, 0xDC}, 42}, /* ним */ + {{0xD8, 0xD7, 0xDD}, 42}, /* изн */ + {{0xDF, 0xDE, 0xDA}, 42}, /* пок */ + {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ + {{0xD5, 0xDB, 0xEE}, 42}, /* елю */ + {{0xE2, 0xD8, 0xE2}, 42}, /* тит */ + {{0xE6, 0xD5, 0xDD}, 42}, /* цен */ + {{0xE7, 0xD0, 0xE1}, 42}, /* час */ + {{0xD3, 0xD0, 0xDD}, 42}, /* ган */ + {{0xE0, 0xD3, 0xD0}, 42}, /* рга */ + {{0xE1, 0xE2, 0xDD}, 42}, /* стн */ + {{0xE0, 0xD5, 0xD6}, 42}, /* реж */ + {{0xE3, 0xDC, 0xDC}, 42}, /* умм */ + {{0xE2, 0xD2, 0xE3}, 41}, /* тву */ + {{0xE2, 0xE3, 0xDF}, 41}, /* туп */ + {{0xE1, 0xDA, 0xD8}, 40}, /* ски */ + {{0xD4, 0xD5, 0xDA}, 40}, /* дек */ + {{0xDB, 0xD5, 0xD6}, 40}, /* леж */ + {{0xD5, 0xE1, 0xD5}, 40}, /* есе */ + {{0xD2, 0xD8, 0xD5}, 40}, /* вие */ + {{0xE2, 0xDA, 0xD0}, 40}, /* тка */ + {{0xD5, 0xDA, 0xE0}, 40}, /* екр */ + {{0xDE, 0xD4, 0xDE}, 40}, /* одо */ + {{0xDA, 0xE1, 0xD0}, 40}, /* кса */ + {{0xE0, 0xD5, 0xDA}, 40}, /* рек */ + {{0xDD, 0xE2, 0xD5}, 40}, /* нте */ + {{0xE3, 0xD3, 0xD8}, 40}, /* уги */ + {{0xD1, 0xEB, 0xDB}, 40}, /* был */ + {{0xD8, 0xDD, 0xEF}, 40}, /* иня */ + {{0xD5, 0xE9, 0xD8}, 39}, /* ещи */ + {{0xD3, 0xD5, 0xDD}, 39}, /* ген */ + {{0xBA, 0xDE, 0xD4}, 39}, /* Код */ + {{0xD4, 0xD8, 0xE2}, 39}, /* дит */ + {{0xE1, 0xE5, 0xDE}, 39}, /* схо */ + {{0xD8, 0xDD, 0xE2}, 39}, /* инт */ + {{0xE1, 0xE3, 0xDC}, 39}, /* сум */ + {{0xE0, 0xDE, 0xDD}, 39}, /* рон */ + {{0xDE, 0xE2, 0xDA}, 39}, /* отк */ + {{0xD4, 0xDE, 0xDA}, 39}, /* док */ + {{0xD8, 0xDB, 0xD0}, 38}, /* ила */ + {{0xE6, 0xD5, 0xE1}, 38}, /* цес */ + {{0xD8, 0xDA, 0xD0}, 38}, /* ика */ + {{0xD7, 0xDD, 0xD8}, 38}, /* зни */ + {{0xDE, 0xD2, 0xEB}, 38}, /* овы */ + {{0xDB, 0xD6, 0xDD}, 38}, /* лжн */ + {{0xE3, 0xDF, 0xDB}, 38}, /* упл */ + {{0xD3, 0xD4, 0xD0}, 37}, /* гда */ + {{0xDB, 0xD0, 0xD6}, 37}, /* лаж */ + {{0xD6, 0xD5, 0xD4}, 37}, /* жед */ + {{0xD1, 0xD5, 0xD7}, 37}, /* без */ + {{0xD4, 0xD5, 0xE2}, 37}, /* дет */ + {{0xDE, 0xE0, 0xEF}, 37}, /* оря */ + {{0xE0, 0xDE, 0xE1}, 37}, /* рос */ + {{0xDE, 0xD1, 0xDB}, 37}, /* обл */ + {{0xE6, 0xD8, 0xD8}, 37}, /* ции */ + {{0xD4, 0xDE, 0xDC}, 37}, /* дом */ + {{0xDD, 0xE6, 0xD5}, 37}, /* нце */ + {{0xE8, 0xD5, 0xD3}, 37}, /* шег */ + {{0xDB, 0xDE, 0xD6}, 37}, /* лож */ + {{0xDE, 0xDD, 0xD0}, 37}, /* она */ + {{0xDE, 0xDA, 0xDB}, 37}, /* окл */ + {{0xDE, 0xD3, 0xD4}, 37}, /* огд */ + {{0xE0, 0xDE, 0xD4}, 37}, /* род */ + {{0xD5, 0xDD, 0xD0}, 37}, /* ена */ + {{0xDE, 0xDD, 0xE6}, 37}, /* онц */ + {{0xDE, 0xE2, 0xDD}, 37}, /* отн */ + {{0xE1, 0xDE, 0xD3}, 37}, /* сог */ + {{0xD5, 0xD2, 0xE8}, 37}, /* евш */ + {{0xD2, 0xD8, 0xE2}, 36}, /* вит */ + {{0xD5, 0xE0, 0xDF}, 36}, /* ерп */ + {{0xDE, 0xD4, 0xD0}, 36}, /* ода */ + {{0xD5, 0xE2, 0xD5}, 36}, /* ете */ + {{0xDD, 0xD5, 0xDE}, 36}, /* нео */ + {{0xE0, 0xDF, 0xD5}, 36}, /* рпе */ + {{0xD5, 0xE0, 0xE8}, 36}, /* ерш */ + {{0xD8, 0xDC, 0xD8}, 36}, /* ими */ + {{0xD8, 0xD2, 0xE8}, 36}, /* ивш */ + {{0xEB, 0xDF, 0xDB}, 36}, /* ыпл */ + {{0xDF, 0xD5, 0xD2}, 36}, /* пев */ + {{0xD0, 0xD4, 0xD0}, 36}, /* ада */ + {{0xDC, 0xDE, 0xE1}, 35}, /* мос */ + {{0xDE, 0xD1, 0xE1}, 35}, /* обс */ + {{0xDD, 0xD5, 0xD4}, 34}, /* нед */ + {{0xD8, 0xDA, 0xDE}, 34}, /* ико */ + {{0xE9, 0xD8, 0xDC}, 34}, /* щим */ + {{0xD4, 0xD5, 0xE0}, 34}, /* дер */ + {{0xE1, 0xDA, 0xD0}, 34}, /* ска */ + {{0xDE, 0xE0, 0xDC}, 34}, /* орм */ + {{0xE3, 0xDC, 0xD5}, 34}, /* уме */ + {{0xDE, 0xDE, 0xD1}, 34}, /* ооб */ + {{0xE0, 0xD8, 0xE1}, 34}, /* рис */ + {{0xDE, 0xD1, 0xEA}, 33}, /* объ */ + {{0xDE, 0xDB, 0xE3}, 33}, /* олу */ + {{0xEA, 0xEF, 0xD2}, 33}, /* ъяв */ + {{0xE0, 0xD5, 0xDC}, 33}, /* рем */ + {{0xE9, 0xD8, 0xE5}, 33}, /* щих */ + {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ + {{0xDA, 0xD6, 0xD5}, 33}, /* кже */ + {{0xD8, 0xD4, 0xD5}, 33}, /* иде */ + {{0xD1, 0xE1, 0xE2}, 33}, /* бст */ + {{0xD0, 0xDA, 0xD6}, 33}, /* акж */ + {{0xD2, 0xE3, 0xEE}, 33}, /* вую */ + {{0xD0, 0xE1, 0xE5}, 33}, /* асх */ + {{0xD0, 0xDD, 0xD0}, 32}, /* ана */ + {{0xDD, 0xD0, 0xD4}, 32}, /* над */ + {{0xDE, 0xD1, 0xD5}, 32}, /* обе */ + {{0xEB, 0xE2, 0xDA}, 32}, /* ытк */ + {{0xED, 0xE2, 0xD8}, 32}, /* эти */ + {{0xDE, 0xD6, 0xDD}, 32}, /* ожн */ + {{0xD0, 0xE2, 0xEB}, 31}, /* аты */ + {{0xE1, 0xD4, 0xD5}, 31}, /* сде */ + {{0xD0, 0xEE, 0xE2}, 31}, /* ают */ + {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ + {{0xDE, 0xEF, 0xE2}, 31}, /* оят */ + {{0xD5, 0xE2, 0xEC}, 31}, /* еть */ + {{0xD0, 0xD3, 0xD5}, 31}, /* аге */ + {{0xE7, 0xE0, 0xD5}, 31}, /* чре */ + {{0xD5, 0xDD, 0xEB}, 31}, /* ены */ + {{0xE3, 0xD1, 0xEB}, 31}, /* убы */ + {{0xD8, 0xE1, 0xE2}, 30}, /* ист */ + {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ + {{0xE0, 0xEF, 0xD4}, 30}, /* ряд */ + {{0xD3, 0xDE, 0xE1}, 30}, /* гос */ + {{0xD8, 0xDC, 0xD0}, 30}, /* има */ + {{0xD7, 0xD0, 0xE1}, 30}, /* зас */ + {{0xD0, 0xEE, 0xE9}, 30}, /* ающ */ + {{0xDE, 0xD7, 0xD2}, 30}, /* озв */ + {{0xD5, 0xD4, 0xD8}, 30}, /* еди */ + {{0xDE, 0xDC, 0xD5}, 30}, /* оме */ + {{0xDD, 0xD8, 0xD9}, 30}, /* ний */ + {{0xE1, 0xE3, 0xD4}, 30}, /* суд */ + {{0xD7, 0xD4, 0xDE}, 29}, /* здо */ + {{0xE1, 0xD2, 0xD8}, 29}, /* сви */ + {{0xDE, 0xDB, 0xD8}, 29}, /* оли */ + {{0xDE, 0xD2, 0xEC}, 29}, /* овь */ + {{0xD2, 0xD8, 0xD9}, 29}, /* вий */ + {{0xD4, 0xDE, 0xE0}, 29}, /* дор */ + {{0xD4, 0xD5, 0xEF}, 29}, /* дея */ + {{0xD5, 0xEF, 0xE2}, 29}, /* еят */ + {{0xE6, 0xDE, 0xDC}, 29}, /* цом */ + {{0xD8, 0xD7, 0xD0}, 28}, /* иза */ + {{0xE1, 0xE7, 0xD5}, 28}, /* сче */ + {{0xDA, 0xE2, 0xD0}, 28}, /* кта */ + {{0xDE, 0xD4, 0xDD}, 28}, /* одн */ + {{0xD1, 0xDB, 0xD0}, 28}, /* бла */ + {{0xDE, 0xD4, 0xDB}, 28}, /* одл */ + {{0xD8, 0xE2, 0xD0}, 28}, /* ита */ + {{0xB4, 0xDE, 0xD3}, 28}, /* Дог */ + {{0xDE, 0xE1, 0xDE}, 28}, /* осо */ + {{0xDD, 0xDE, 0xE8}, 28}, /* нош */ + {{0xDA, 0xE3, 0xE0}, 28}, /* кур */ + {{0xD8, 0xDD, 0xD0}, 28}, /* ина */ + {{0xDE, 0xE8, 0xD5}, 28}, /* оше */ + {{0xDD, 0xD0, 0xDB}, 28}, /* нал */ + {{0xDD, 0xD8, 0xD7}, 27}, /* низ */ + {{0xD7, 0xD2, 0xE0}, 27}, /* звр */ + {{0xD2, 0xE0, 0xD0}, 27}, /* вра */ + {{0xDB, 0xD5, 0xE2}, 27}, /* лет */ + {{0xD5, 0xE9, 0xEC}, 27}, /* ещь */ + {{0xE0, 0xD8, 0xD4}, 27}, /* рид */ + {{0xD4, 0xDD, 0xDE}, 27}, /* дно */ + {{0xE0, 0xD8, 0xDE}, 27}, /* рио */ + {{0xDE, 0xD8, 0xDC}, 27}, /* оим */ + {{0xD5, 0xE0, 0xD6}, 27}, /* ерж */ + {{0xE3, 0xD2, 0xD5}, 26}, /* уве */ + {{0xDE, 0xDD, 0xDA}, 26}, /* онк */ + {{0xD5, 0xDB, 0xDA}, 26}, /* елк */ + {{0xDB, 0xD0, 0xD2}, 26}, /* лав */ + {{0xD0, 0xE2, 0xDE}, 26}, /* ато */ + {{0xEF, 0xDC, 0xD8}, 26}, /* ями */ + {{0xDC, 0xDC, 0xEB}, 26}, /* ммы */ + {{0xD5, 0xE1, 0xDF}, 26}, /* есп */ + {{0xDD, 0xDA, 0xE3}, 26}, /* нку */ + {{0xD8, 0xE6, 0xE3}, 25}, /* ицу */ + {{0xD4, 0xE1, 0xDA}, 25}, /* дск */ + {{0xDD, 0xD8, 0xDD}, 25}, /* нин */ + {{0xDF, 0xDB, 0xD5}, 25}, /* пле */ + {{0xE4, 0xDE, 0xE0}, 25}, /* фор */ + {{0xDB, 0xD0, 0xE1}, 25}, /* лас */ + {{0xD4, 0xD8, 0xDC}, 25}, /* дим */ + {{0xD5, 0xE1, 0xEF}, 25}, /* еся */ + {{0xDD, 0xD8, 0xE7}, 25}, /* нич */ + {{0xDE, 0xD2, 0xE0}, 25}, /* овр */ + {{0xD2, 0xE1, 0xDB}, 25}, /* всл */ + {{0xE0, 0xE8, 0xD5}, 25}, /* рше */ + {{0xD5, 0xE9, 0xD0}, 25}, /* еща */ + {{0xD6, 0xDD, 0xEB}, 25}, /* жны */ + {{0xE0, 0xD8, 0xDC}, 25}, /* рим */ + {{0xD7, 0xD0, 0xE6}, 25}, /* зац */ + {{0xD1, 0xE9, 0xD5}, 25}, /* бще */ + {{0xD0, 0xDA, 0xE2}, 25}, /* акт */ + {{0xD0, 0xD4, 0xE1}, 25}, /* адс */ + {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ + {{0xE9, 0xD8, 0xD5}, 25}, /* щие */ + {{0xD6, 0xD8, 0xE2}, 24}, /* жит */ + {{0xD1, 0xE0, 0xD5}, 24}, /* бре */ + {{0xE3, 0xD3, 0xDE}, 24}, /* уго */ + {{0xD8, 0xEF, 0xE5}, 24}, /* иях */ + {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ + {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ + {{0xD2, 0xDE, 0xD2}, 24}, /* вов */ + {{0xDE, 0xE7, 0xDD}, 24}, /* очн */ + {{0xD2, 0xDE, 0xDE}, 24}, /* воо */ + {{0xDE, 0xD4, 0xEB}, 24}, /* оды */ + {{0xDB, 0xDE, 0xD3}, 24}, /* лог */ + {{0xD2, 0xD0, 0xD5}, 24}, /* вае */ + {{0xD0, 0xEF, 0xE5}, 24}, /* аях */ + {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ + {{0xD4, 0xD8, 0xE7}, 24}, /* дич */ + {{0xDA, 0xD8, 0xE5}, 24}, /* ких */ + {{0xE6, 0xD0, 0xDC}, 24}, /* цам */ + {{0xD8, 0xD7, 0xD2}, 24}, /* изв */ + {{0xE2, 0xD8, 0xD2}, 24}, /* тив */ + {{0xD5, 0xDE, 0xD1}, 24}, /* еоб */ + {{0xE1, 0xDE, 0xE1}, 24}, /* сос */ + {{0xE8, 0xD8, 0xDC}, 24}, /* шим */ + {{0xEB, 0xDF, 0xDE}, 24}, /* ыпо */ + {{0xD5, 0xD6, 0xD0}, 24}, /* ежа */ + {{0xE2, 0xDE, 0xD8}, 24}, /* тои */ + {{0xDA, 0xE2, 0xDE}, 24}, /* кто */ + {{0xD5, 0xE7, 0xD0}, 24}, /* еча */ + {{0xD8, 0xD4, 0xD8}, 24}, /* иди */ + {{0xD1, 0xE9, 0xD8}, 23}, /* бщи */ + {{0xE2, 0xEC, 0xD5}, 23}, /* тье */ + {{0xD1, 0xEA, 0xEF}, 23}, /* бъя */ + {{0xDD, 0xD0, 0xE7}, 23}, /* нач */ + {{0xE2, 0xD5, 0xE7}, 23}, /* теч */ + {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ + {{0xD2, 0xD5, 0xE7}, 23}, /* веч */ + {{0xD5, 0xDC, 0xD5}, 23}, /* еме */ + {{0xDE, 0xD1, 0xE5}, 23}, /* обх */ + {{0xD1, 0xE5, 0xDE}, 23}, /* бхо */ + {{0xD4, 0xD0, 0xD5}, 23}, /* дае */ + {{0xE0, 0xD5, 0xD7}, 23}, /* рез */ + {{0xDA, 0xD0, 0xD6}, 22}, /* каж */ + {{0xDE, 0xDA, 0xE3}, 22}, /* оку */ + {{0xD0, 0xDC, 0xD5}, 22}, /* аме */ + {{0xDD, 0xD5, 0xD7}, 22}, /* нез */ + {{0xEB, 0xD2, 0xD0}, 22}, /* ыва */ + {{0xE1, 0xD2, 0xEF}, 22}, /* свя */ + {{0xE0, 0xD0, 0xD4}, 22}, /* рад */ + {{0xD5, 0xD7, 0xD0}, 22}, /* еза */ + {{0xD8, 0xD2, 0xD0}, 22}, /* ива */ + {{0xDA, 0xD0, 0xDC}, 22}, /* кам */ + {{0xDD, 0xD5, 0xDC}, 22}, /* нем */ + {{0xE2, 0xDA, 0xDE}, 22}, /* тко */ + {{0xD7, 0xD2, 0xD5}, 22}, /* зве */ + {{0xD2, 0xEF, 0xD7}, 22}, /* вяз */ + {{0xEF, 0xE2, 0xD8}, 22}, /* яти */ + {{0xDE, 0xE5, 0xE0}, 22}, /* охр */ + {{0xE0, 0xDE, 0xE2}, 22}, /* рот */ + {{0xDE, 0xDB, 0xD5}, 22}, /* оле */ + {{0xD1, 0xE0, 0xD0}, 22}, /* бра */ + {{0xD0, 0xD5, 0xDC}, 22}, /* аем */ + {{0xDB, 0xD0, 0xE8}, 21}, /* лаш */ + {{0xD8, 0xD7, 0xDC}, 21}, /* изм */ + {{0xD3, 0xE3, 0xE2}, 21}, /* гут */ + {{0xDE, 0xD6, 0xD4}, 21}, /* ожд */ + {{0xDA, 0xD0, 0xDA}, 21}, /* как */ + {{0xDA, 0xD0, 0xE7}, 21}, /* кач */ + {{0xDD, 0xD0, 0xDC}, 21}, /* нам */ + {{0xD4, 0xDE, 0xE5}, 21}, /* дох */ + {{0xDE, 0xE5, 0xDE}, 21}, /* охо */ + {{0xEE, 0xE0, 0xD8}, 21}, /* юри */ + {{0xD2, 0xD0, 0xDC}, 21}, /* вам */ + {{0xD7, 0xDC, 0xDE}, 21}, /* змо */ + {{0xD4, 0xDA, 0xD5}, 21}, /* дке */ + {{0xD1, 0xD0, 0xDD}, 21}, /* бан */ + {{0xD5, 0xDB, 0xD8}, 21}, /* ели */ + {{0xE0, 0xD8, 0xD7}, 21}, /* риз */ + {{0xDB, 0xDD, 0xDE}, 21}, /* лно */ + {{0xD2, 0xEB, 0xE8}, 21}, /* выш */ + {{0xD4, 0xE6, 0xD0}, 21}, /* дца */ + {{0xEF, 0xD4, 0xDA}, 21}, /* ядк */ + {{0xDE, 0xE2, 0xE1}, 21}, /* отс */ + {{0xE2, 0xD5, 0xD9}, 21}, /* тей */ + {{0xD0, 0xDD, 0xDA}, 21}, /* анк */ + {{0xDD, 0xD5, 0xD3}, 21}, /* нег */ + {{0xE6, 0xD0, 0xE2}, 21}, /* цат */ + {{0xD5, 0xDC, 0xEB}, 21}, /* емы */ + {{0xD2, 0xDE, 0xD5}, 21}, /* вое */ + {{0xD4, 0xD0, 0xE7}, 21}, /* дач */ + {{0xDE, 0xD3, 0xE3}, 21}, /* огу */ + {{0xDB, 0xD6, 0xD5}, 21}, /* лже */ + {{0xE2, 0xDD, 0xD8}, 21}, /* тни */ + {{0xD7, 0xD0, 0xD2}, 21}, /* зав */ + {{0xD2, 0xD5, 0xE1}, 21}, /* вес */ + {{0xE1, 0xD0, 0xDC}, 20}, /* сам */ + {{0xD0, 0xE0, 0xDD}, 20}, /* арн */ + {{0xE7, 0xDD, 0xEB}, 20}, /* чны */ + {{0xE1, 0xE0, 0xD5}, 20}, /* сре */ + {{0xE2, 0xD8, 0xEF}, 20}, /* тия */ + {{0xD8, 0xE1, 0xDB}, 20}, /* исл */ + {{0xC1, 0xE2, 0xE0}, 20}, /* Стр */ + {{0xDD, 0xE2, 0xDE}, 20}, /* нто */ + {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ + {{0xD0, 0xE8, 0xD5}, 20}, /* аше */ + {{0xD5, 0xDB, 0xD0}, 20}, /* ела */ + {{0xE3, 0xD4, 0xDE}, 20}, /* удо */ + {{0xD6, 0xD8, 0xD7}, 19}, /* жиз */ + {{0xDF, 0xD8, 0xE1}, 19}, /* пис */ + {{0xD0, 0xD8, 0xDC}, 19}, /* аим */ + {{0xE7, 0xD8, 0xE1}, 19}, /* чис */ + {{0xD5, 0xD6, 0xD8}, 19}, /* ежи */ + {{0xD2, 0xE1, 0xD5}, 19}, /* все */ + {{0xDB, 0xEC, 0xDA}, 19}, /* льк */ + {{0xD0, 0xE2, 0xE3}, 19}, /* ату */ + {{0xE3, 0xD4, 0xD0}, 19}, /* уда */ + {{0xE8, 0xD8, 0xD9}, 19}, /* ший */ + {{0xD7, 0xD0, 0xE0}, 19}, /* зар */ + {{0xD5, 0xD4, 0xDD}, 19}, /* едн */ + {{0xD0, 0xD2, 0xE8}, 19}, /* авш */ + {{0xE0, 0xDE, 0xD8}, 19}, /* рои */ + {{0xD8, 0xD4, 0xD0}, 19}, /* ида */ + {{0xD0, 0xE0, 0xDE}, 19}, /* аро */ + {{0xE2, 0xDE, 0xD9}, 19}, /* той */ + {{0xD6, 0xD0, 0xE9}, 19}, /* жащ */ + {{0xD5, 0xE1, 0xDE}, 19}, /* есо */ + {{0xDF, 0xD0, 0xDB}, 19}, /* пал */ + {{0xE9, 0xD0, 0xD5}, 19}, /* щае */ + {{0xE0, 0xEB, 0xD5}, 19}, /* рые */ + {{0xD5, 0xDD, 0xEF}, 19}, /* еня */ + {{0xE9, 0xD8, 0xD9}, 19}, /* щий */ + {{0xDB, 0xE3, 0xD3}, 19}, /* луг */ + {{0xEE, 0xE7, 0xD8}, 18}, /* ючи */ + {{0xE3, 0xDB, 0xEC}, 18}, /* уль */ + {{0xDC, 0xEB, 0xE5}, 18}, /* мых */ + {{0xE0, 0xDE, 0xD3}, 18}, /* рог */ + {{0xE1, 0xDE, 0xE5}, 18}, /* сох */ + {{0xDA, 0xDE, 0xD5}, 18}, /* кое */ + {{0xDD, 0xE2, 0xE1}, 18}, /* нтс */ + {{0xD0, 0xD7, 0xDD}, 18}, /* азн */ + {{0xE2, 0xDD, 0xEB}, 18}, /* тны */ + {{0xDE, 0xD4, 0xEF}, 18}, /* одя */ + {{0xDE, 0xD1, 0xDD}, 18}, /* обн */ + {{0xD2, 0xEB, 0xD4}, 18}, /* выд */ + {{0xDE, 0xE1, 0xEF}, 18}, /* ося */ + {{0xEC, 0xE2, 0xD0}, 18}, /* ьта */ + {{0xDD, 0xEF, 0xEE}, 18}, /* няю */ + {{0xDD, 0xD0, 0xE0}, 18}, /* нар */ + {{0xD5, 0xD7, 0xE3}, 18}, /* езу */ + {{0xD0, 0xE1, 0xDD}, 18}, /* асн */ + {{0xD7, 0xE3, 0xDB}, 18}, /* зул */ + {{0xE6, 0xD8, 0xDF}, 18}, /* цип */ + {{0xDA, 0xE2, 0xD5}, 18}, /* кте */ + {{0xD4, 0xDE, 0xDF}, 18}, /* доп */ + {{0xDD, 0xE6, 0xD8}, 18}, /* нци */ + {{0xE1, 0xDF, 0xD5}, 18}, /* спе */ + {{0xD8, 0xDC, 0xEB}, 18}, /* имы */ + {{0xDC, 0xDE, 0xDC}, 18}, /* мом */ + {{0xDF, 0xD5, 0xE7}, 18}, /* печ */ + {{0xBE, 0xD1, 0xEF}, 18}, /* Обя */ + {{0xBF, 0xE0, 0xD0}, 18}, /* Пра */ + {{0xDE, 0xDB, 0xDE}, 18}, /* оло */ + {{0xE2, 0xE1, 0xDA}, 18}, /* тск */ + {{0xDB, 0xDD, 0xD8}, 18}, /* лни */ + {{0xD5, 0xE0, 0xE2}, 18}, /* ерт */ + {{0xD8, 0xE1, 0xEC}, 18}, /* ись */ + {{0xDB, 0xEC, 0xE2}, 18}, /* льт */ + {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ + {{0xD2, 0xDE, 0xD1}, 17}, /* воб */ + {{0xE0, 0xDD, 0xEB}, 17}, /* рны */ + {{0xD1, 0xDD, 0xEB}, 17}, /* бны */ + {{0xEB, 0xD4, 0xD0}, 17}, /* ыда */ + {{0xEC, 0xD7, 0xE3}, 17}, /* ьзу */ + {{0xD5, 0xD4, 0xDF}, 17}, /* едп */ + {{0xD0, 0xD4, 0xD5}, 17}, /* аде */ + {{0xD8, 0xDF, 0xD0}, 17}, /* ипа */ + {{0xE1, 0xD5, 0xD9}, 17}, /* сей */ + {{0xD5, 0xD5, 0xE1}, 17}, /* еес */ + {{0xDE, 0xD8, 0xD7}, 17}, /* оиз */ + {{0xDE, 0xE1, 0xD2}, 17}, /* осв */ + {{0xD4, 0xD8, 0xD2}, 17}, /* див */ + {{0xDD, 0xD0, 0xDD}, 17}, /* нан */ + {{0xD5, 0xE2, 0xD0}, 17}, /* ета */ + {{0xD4, 0xDD, 0xD5}, 17}, /* дне */ + {{0xD8, 0xDE, 0xD1}, 17}, /* иоб */ + {{0xE3, 0xD5, 0xE2}, 17}, /* ует */ + {{0xDD, 0xD0, 0xE5}, 17}, /* нах */ + {{0xE1, 0xDC, 0xD5}, 17}, /* сме */ + {{0xD0, 0xDB, 0xD8}, 17}, /* али */ + {{0xD1, 0xEA, 0xD5}, 17}, /* бъе */ + {{0xDF, 0xD0, 0xE1}, 17}, /* пас */ + {{0xD7, 0xD0, 0xDB}, 17}, /* зал */ + {{0xE0, 0xD6, 0xD0}, 16}, /* ржа */ + {{0xEF, 0xD2, 0xD8}, 16}, /* яви */ + {{0xD6, 0xD0, 0xE2}, 16}, /* жат */ + {{0xD1, 0xDE, 0xD6}, 16}, /* бож */ + {{0xE1, 0xD8, 0xDB}, 16}, /* сил */ + {{0xDD, 0xE3, 0xEE}, 16}, /* ную */ + {{0xDF, 0xD5, 0xDD}, 16}, /* пен */ + {{0xDC, 0xD0, 0xE2}, 16}, /* мат */ + {{0xDE, 0xDD, 0xDD}, 16}, /* онн */ + {{0xD2, 0xD8, 0xDD}, 16}, /* вин */ + {{0xE2, 0xDA, 0xD8}, 16}, /* тки */ + {{0xE2, 0xDE, 0xE7}, 16}, /* точ */ + {{0xE1, 0xE7, 0xD8}, 16}, /* счи */ + {{0xDD, 0xD8, 0xE6}, 16}, /* ниц */ + {{0xE9, 0xD5, 0xD5}, 16}, /* щее */ + {{0xD1, 0xD5, 0xE1}, 16}, /* бес */ + {{0xD0, 0xD4, 0xE6}, 16}, /* адц */ + {{0xBA, 0xDE, 0xDC}, 16}, /* Ком */ + {{0xEC, 0xD8, 0xDC}, 16}, /* ьим */ + {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ + {{0xD0, 0xE7, 0xD8}, 16}, /* ачи */ + {{0xDF, 0xDE, 0xDD}, 16}, /* пон */ + {{0xDA, 0xD0, 0xD5}, 16}, /* кае */ + {{0xD8, 0xD3, 0xE0}, 16}, /* игр */ + {{0xD0, 0xDA, 0xD8}, 16}, /* аки */ + {{0xD0, 0xE9, 0xD8}, 16}, /* ащи */ + {{0xDB, 0xEC, 0xE6}, 16}, /* льц */ + {{0xD2, 0xDD, 0xDE}, 16}, /* вно */ + {{0xEB, 0xE8, 0xD5}, 15}, /* ыше */ + {{0xBB, 0xD8, 0xE6}, 15}, /* Лиц */ + {{0xEC, 0xD5, 0xD9}, 15}, /* ьей */ + {{0xE8, 0xD5, 0xDC}, 15}, /* шем */ + {{0xE3, 0xD1, 0xDB}, 15}, /* убл */ + {{0xE0, 0xD0, 0xE6}, 15}, /* рац */ + {{0xDA, 0xE3, 0xDC}, 15}, /* кум */ + {{0xE0, 0xD5, 0xD3}, 15}, /* рег */ + {{0xDE, 0xDF, 0xD0}, 15}, /* опа */ + {{0xB2, 0xDE, 0xD7}, 15}, /* Воз */ + {{0xE2, 0xD0, 0xD5}, 15}, /* тае */ + {{0xDE, 0xD1, 0xEB}, 15}, /* обы */ + {{0xD1, 0xDB, 0xD8}, 15}, /* бли */ + {{0xE0, 0xDC, 0xD5}, 15}, /* рме */ + {{0xD2, 0xDE, 0xE1}, 15}, /* вос */ + {{0xD0, 0xE1, 0xD8}, 15}, /* аси */ + {{0xE2, 0xD0, 0xDC}, 15}, /* там */ + {{0xEC, 0xDC, 0xD5}, 15}, /* ьме */ + {{0xDE, 0xD3, 0xD0}, 15}, /* ога */ + {{0xD8, 0xDB, 0xDE}, 15}, /* ило */ + {{0xE1, 0xEC, 0xDC}, 15}, /* сьм */ + {{0xE0, 0xE2, 0xD8}, 15}, /* рти */ + {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ + {{0xE1, 0xD5, 0xDD}, 15}, /* сен */ + {{0xE2, 0xD0, 0xDB}, 15}, /* тал */ + {{0xD4, 0xD0, 0xE0}, 15}, /* дар */ + {{0xD0, 0xDC, 0xDE}, 15}, /* амо */ + {{0xD5, 0xD4, 0xDB}, 15}, /* едл */ + {{0xE1, 0xE3, 0xD1}, 15}, /* суб */ + {{0xD5, 0xD9, 0xE4}, 15}, /* ейф */ + {{0xC5, 0xE0, 0xD0}, 15}, /* Хра */ + {{0xDB, 0xD0, 0xDC}, 14}, /* лам */ + {{0xD0, 0xE0, 0xE3}, 14}, /* ару */ + {{0xD3, 0xD8, 0xE5}, 14}, /* гих */ + {{0xE6, 0xD8, 0xEF}, 14}, /* ция */ + {{0xD4, 0xD0, 0xD2}, 14}, /* дав */ + {{0xDB, 0xD8, 0xE8}, 14}, /* лиш */ + {{0xEE, 0xE7, 0xD0}, 14}, /* юча */ + {{0xD0, 0xDD, 0xE1}, 14}, /* анс */ + {{0xDE, 0xD3, 0xE0}, 14}, /* огр */ + {{0xD8, 0xE9, 0xD0}, 14}, /* ища */ + {{0xD5, 0xDD, 0xEC}, 14}, /* ень */ + {{0xDE, 0xE2, 0xD8}, 14}, /* оти */ + {{0xD0, 0xD4, 0xEB}, 13}, /* ады */ + {{0xD0, 0xE9, 0xD0}, 13}, /* аща */ + {{0xD2, 0xDE, 0xD8}, 13}, /* вои */ + {{0xD2, 0xEB, 0xDC}, 13}, /* вым */ + {{0xD2, 0xEC, 0xEF}, 13}, /* вья */ + {{0xDA, 0xD8, 0xD5}, 13}, /* кие */ + {{0xDB, 0xD8, 0xE1}, 13}, /* лис */ + {{0xDC, 0xD5, 0xD4}, 13}, /* мед */ + {{0xE2, 0xD8, 0xE5}, 13}, /* тих */ + {{0xD5, 0xE2, 0xDE}, 13}, /* ето */ + {{0xD7, 0xDB, 0xDE}, 13}, /* зло */ + {{0xDE, 0xDF, 0xD5}, 13}, /* опе */ + {{0xE1, 0xD8, 0xDC}, 13}, /* сим */ + {{0xEF, 0xD7, 0xD8}, 13}, /* язи */ + {{0xD8, 0xDD, 0xD4}, 13}, /* инд */ + {{0xE7, 0xE3, 0xD6}, 13}, /* чуж */ + {{0xDB, 0xDA, 0xD8}, 13}, /* лки */ + {{0xD4, 0xDF, 0xE0}, 13}, /* дпр */ + {{0xDD, 0xD4, 0xD8}, 13}, /* нди */ + {{0xDE, 0xE2, 0xD0}, 13}, /* ота */ + {{0xDE, 0xE2, 0xEB}, 13}, /* оты */ + {{0xDB, 0xD0, 0xE7}, 13}, /* лач */ + {{0xDA, 0xD8, 0xDC}, 13}, /* ким */ + {{0xD8, 0xE1, 0xD8}, 13}, /* иси */ + {{0xD2, 0xD0, 0xDB}, 13}, /* вал */ + {{0xD5, 0xDC, 0xDE}, 13}, /* емо */ + {{0xDF, 0xE3, 0xD1}, 13}, /* пуб */ + {{0xEF, 0xD5, 0xDC}, 13}, /* яем */ + {{0xD1, 0xDE, 0xDB}, 13}, /* бол */ + {{0xDD, 0xE2, 0xE3}, 13}, /* нту */ + {{0xDD, 0xD5, 0xD9}, 13}, /* ней */ + {{0xDD, 0xD0, 0xEF}, 13}, /* ная */ + {{0xD5, 0xE1, 0xD0}, 13}, /* еса */ + {{0xE0, 0xDD, 0xDE}, 13}, /* рно */ + {{0xE9, 0xD5, 0xDC}, 13}, /* щем */ + {{0xD0, 0xDD, 0xEB}, 13}, /* аны */ + {{0xB4, 0xDE, 0xD2}, 13}, /* Дов */ + {{0xE7, 0xD8, 0xD2}, 13}, /* чив */ + {{0xD2, 0xD8, 0xE1}, 13}, /* вис */ + {{0xDE, 0xDF, 0xDE}, 13}, /* опо */ + {{0xD2, 0xEC, 0xEE}, 13}, /* вью */ + {{0xD0, 0xDB, 0xD0}, 13}, /* ала */ + {{0xDB, 0xD5, 0xD9}, 12}, /* лей */ + {{0xD0, 0xE7, 0xD0}, 12}, /* ача */ + {{0xD5, 0xD7, 0xD2}, 12}, /* езв */ + {{0xD2, 0xD0, 0xEF}, 12}, /* вая */ + {{0xD5, 0xDE, 0xE1}, 12}, /* еос */ + {{0xEF, 0xE9, 0xD8}, 12}, /* ящи */ + {{0xD8, 0xD2, 0xD8}, 12}, /* иви */ + {{0xDD, 0xD5, 0xD5}, 12}, /* нее */ + {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ + {{0xE8, 0xD5, 0xD5}, 12}, /* шее */ + {{0xE1, 0xD0, 0xE5}, 12}, /* сах */ + {{0xD8, 0xDD, 0xE6}, 12}, /* инц */ + {{0xDE, 0xDC, 0xDF}, 12}, /* омп */ + {{0xE3, 0xD6, 0xDE}, 12}, /* ужо */ + {{0xE3, 0xD0, 0xDB}, 12}, /* уал */ + {{0xDD, 0xD0, 0xE2}, 12}, /* нат */ + {{0xD8, 0xD4, 0xE3}, 12}, /* иду */ + {{0xD2, 0xDB, 0xD0}, 12}, /* вла */ + {{0xD7, 0xD2, 0xD0}, 12}, /* зва */ + {{0xDB, 0xD5, 0xD5}, 12}, /* лее */ + {{0xE0, 0xD5, 0xE5}, 12}, /* рех */ + {{0xD6, 0xD4, 0xE3}, 12}, /* жду */ + {{0xDC, 0xD0, 0xDB}, 12}, /* мал */ + {{0xD5, 0xDD, 0xE1}, 12}, /* енс */ + {{0xD8, 0xD9, 0xE1}, 12}, /* ийс */ + {{0xDA, 0xDE, 0xDB}, 12}, /* кол */ + {{0xDD, 0xD0, 0xD7}, 12}, /* наз */ + {{0xD4, 0xE3, 0xD0}, 12}, /* дуа */ + {{0xDE, 0xDD, 0xD8}, 12}, /* они */ + {{0xE1, 0xD5, 0xDC}, 12}, /* сем */ + {{0xD3, 0xDE, 0xD4}, 12}, /* год */ + {{0xDC, 0xD5, 0xD6}, 12}, /* меж */ + {{0xDE, 0xD7, 0xDB}, 12}, /* озл */ + {{0xD2, 0xDC, 0xD5}, 12}, /* вме */ + {{0xE3, 0xD4, 0xD5}, 12}, /* уде */ + {{0xEC, 0xDA, 0xDE}, 12}, /* ько */ + {{0xD5, 0xD2, 0xEB}, 12}, /* евы */ + {{0xD7, 0xD0, 0xDC}, 12}, /* зам */ + {{0xE1, 0xDE, 0xD4}, 12}, /* сод */ + {{0xE0, 0xDE, 0xD5}, 11}, /* рое */ + {{0xDE, 0xE2, 0xD4}, 11}, /* отд */ + {{0xE1, 0xD8, 0xEF}, 11}, /* сия */ + {{0xD8, 0xDA, 0xE3}, 11}, /* ику */ + {{0xEB, 0xDB, 0xD8}, 11}, /* ыли */ + {{0xD3, 0xD8, 0xDC}, 11}, /* гим */ + {{0xDD, 0xEC, 0xE8}, 11}, /* ньш */ + {{0xE2, 0xD8, 0xE7}, 11}, /* тич */ + {{0xE0, 0xD0, 0xDB}, 11}, /* рал */ + {{0xE3, 0xE7, 0xD8}, 11}, /* учи */ + {{0xDC, 0xD5, 0xEE}, 11}, /* мею */ + {{0xE2, 0xD5, 0xDA}, 11}, /* тек */ + {{0xDE, 0xD1, 0xE3}, 11}, /* обу */ + {{0xDD, 0xDD, 0xE3}, 11}, /* нну */ + {{0xDD, 0xD5, 0xDF}, 11}, /* неп */ + {{0xD2, 0xD5, 0xDB}, 11}, /* вел */ + {{0xE2, 0xDC, 0xD5}, 11}, /* тме */ + {{0xD1, 0xDE, 0xD3}, 11}, /* бог */ + {{0xDE, 0xE0, 0xD8}, 11}, /* ори */ + {{0xD0, 0xD2, 0xDD}, 11}, /* авн */ + {{0xD4, 0xD5, 0xD5}, 11}, /* дее */ + {{0xD6, 0xDE, 0xDC}, 11}, /* жом */ + {{0xB2, 0xE0, 0xD5}, 11}, /* Вре */ + {{0xDC, 0xEB, 0xD5}, 11}, /* мые */ + {{0xEC, 0xE6, 0xD0}, 11}, /* ьца */ + {{0xDE, 0xE6, 0xD5}, 11}, /* оце */ + {{0xD8, 0xE2, 0xEB}, 10}, /* иты */ + {{0xD7, 0xE0, 0xD0}, 10}, /* зра */ + {{0xDE, 0xDD, 0xEB}, 10}, /* оны */ + {{0xE0, 0xD5, 0xE8}, 10}, /* реш */ + {{0xE3, 0xE8, 0xD5}, 10}, /* уше */ + {{0xE0, 0xD5, 0xD2}, 10}, /* рев */ + {{0xDE, 0xDF, 0xE3}, 10}, /* опу */ + {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ + {{0xE2, 0xD0, 0xE7}, 10}, /* тач */ + {{0xD5, 0xE0, 0xDE}, 10}, /* еро */ + {{0xD2, 0xDA, 0xDB}, 10}, /* вкл */ + {{0xD7, 0xEB, 0xD2}, 10}, /* зыв */ + {{0xD0, 0xDF, 0xE0}, 10}, /* апр */ + {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ + {{0xBE, 0xE2, 0xD2}, 10}, /* Отв */ + {{0xE0, 0xE1, 0xD0}, 10}, /* рса */ + {{0xD5, 0xDA, 0xE2}, 10}, /* ект */ + {{0xDB, 0xD5, 0xDA}, 10}, /* лек */ + {{0xD5, 0xD5, 0xE2}, 10}, /* еет */ + {{0xDE, 0xDF, 0xDB}, 10}, /* опл */ + {{0xE2, 0xE7, 0xD5}, 10}, /* тче */ + {{0xD3, 0xDE, 0xDC}, 10}, /* гом */ + {{0xE2, 0xDE, 0xD6}, 10}, /* тож */ + {{0xDB, 0xD5, 0xE7}, 10}, /* леч */ + {{0xD5, 0xE2, 0xEB}, 10}, /* еты */ + {{0xDE, 0xD6, 0xD8}, 10}, /* ожи */ + {{0xDC, 0xDD, 0xDE}, 10}, /* мно */ + {{0xDC, 0xDE, 0xD9}, 10}, /* мой */ + {{0xE6, 0xD5, 0xDB}, 10}, /* цел */ + {{0xE3, 0xDF, 0xD8}, 10}, /* упи */ + {{0xD0, 0xD5, 0xD2}, 10}, /* аев */ + {{0xDF, 0xDE, 0xDC}, 10}, /* пом */ + {{0xD4, 0xEF, 0xE9}, 10}, /* дящ */ + {{0xE2, 0xE0, 0xD8}, 10}, /* три */ + {{0xE8, 0xD8, 0xD5}, 10}, /* шие */ + {{0xD5, 0xDA, 0xD0}, 10}, /* ека */ + {{0xD5, 0xE8, 0xD5}, 10}, /* еше */ + {{0xD7, 0xD0, 0xD8}, 10}, /* заи */ + {{0xD8, 0xE2, 0xDE}, 10}, /* ито */ + {{0xD7, 0xDD, 0xEB}, 10}, /* зны */ + {{0xDE, 0xEF, 0xDD}, 10}, /* оян */ + {{0xD8, 0xD6, 0xD5}, 10}, /* иже */ + {{0xD2, 0xDD, 0xD5}, 10}, /* вне */ + {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ + {{0xD5, 0xDC, 0xEF}, 10}, /* емя */ + {{0xDD, 0xD0, 0xD8}, 10}, /* наи */ + {{0xE2, 0xDE, 0xDB}, 10}, /* тол */ + {{0xDB, 0xD8, 0xE2}, 10}, /* лит */ + {{0xDE, 0xE1, 0xE0}, 10}, /* оср */ + {{0xE2, 0xD4, 0xD5}, 10}, /* тде */ + {{0xD5, 0xDC, 0xD8}, 10}, /* еми */ + {{0xDC, 0xD5, 0xD5}, 10}, /* мее */ + {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ + {{0xDD, 0xD8, 0xD2}, 10}, /* нив */ + {{0xD5, 0xE0, 0xE3}, 10}, /* еру */ + {{0xE7, 0xD5, 0xDC}, 10}, /* чем */ + {{0xD4, 0xDE, 0xD1}, 10}, /* доб */ + {{0xD5, 0xDB, 0xDE}, 10}, /* ело */ + {{0xD8, 0xDB, 0xE3}, 10}, /* илу */ + {{0xD0, 0xD4, 0xDB}, 10}, /* адл */ + {{0xD8, 0xE7, 0xE2}, 10}, /* ичт */ + {{0xDC, 0xDB, 0xD5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_koi8_r[] = { + {{0xC5, 0xCE, 0xC9}, 991}, /* ени */ + {{0xCF, 0xC7, 0xCF}, 806}, /* ого */ + {{0xD3, 0xD4, 0xD7}, 659}, /* ств */ + {{0xCE, 0xC9, 0xD1}, 629}, /* ния */ + {{0xCF, 0xD7, 0xC1}, 566}, /* ова */ + {{0xD4, 0xC5, 0xCC}, 555}, /* тел */ + {{0xD2, 0xC5, 0xC4}, 507}, /* ред */ + {{0xC5, 0xCE, 0xCE}, 499}, /* енн */ + {{0xCF, 0xD7, 0xCF}, 443}, /* ово */ + {{0xC1, 0xCE, 0xC9}, 443}, /* ани */ + {{0xD4, 0xD2, 0xC1}, 429}, /* тра */ + {{0xCF, 0xD3, 0xD4}, 428}, /* ост */ + {{0xCE, 0xC9, 0xC5}, 419}, /* ние */ + {{0xCE, 0xCE, 0xCF}, 412}, /* нно */ + {{0xC1, 0xC8, 0xCF}, 396}, /* ахо */ + {{0xD3, 0xD4, 0xD2}, 392}, /* стр */ + {{0xD2, 0xC1, 0xC8}, 386}, /* рах */ + {{0xC8, 0xCF, 0xD7}, 379}, /* хов */ + {{0xC5, 0xCC, 0xD8}, 365}, /* ель */ + {{0xC7, 0xCF, 0xD7}, 360}, /* гов */ + {{0xD7, 0xCF, 0xD2}, 356}, /* вор */ + {{0xC5, 0xD3, 0xD4}, 349}, /* ест */ + {{0xC1, 0xD4, 0xD8}, 345}, /* ать */ + {{0xD2, 0xC1, 0xD7}, 337}, /* рав */ + {{0xD0, 0xD2, 0xC9}, 330}, /* при */ + {{0xD0, 0xD2, 0xC5}, 323}, /* пре */ + {{0xC4, 0xCF, 0xC7}, 318}, /* дог */ + {{0xCE, 0xC5, 0xCE}, 310}, /* нен */ + {{0xD0, 0xD2, 0xC1}, 309}, /* пра */ + {{0xD7, 0xC1, 0xCE}, 304}, /* ван */ + {{0xC9, 0xD4, 0xC5}, 295}, /* ите */ + {{0xD4, 0xD7, 0xC5}, 281}, /* тве */ + {{0xCC, 0xC5, 0xCE}, 266}, /* лен */ + {{0xD3, 0xD4, 0xCF}, 261}, /* сто */ + {{0xD4, 0xC1, 0xD4}, 260}, /* тат */ + {{0xCE, 0xCE, 0xD9}, 260}, /* нны */ + {{0xCC, 0xD8, 0xCE}, 256}, /* льн */ + {{0xD7, 0xCF, 0xDA}, 255}, /* воз */ + {{0xC9, 0xCC, 0xC9}, 254}, /* или */ + {{0xC1, 0xD4, 0xC5}, 252}, /* ате */ + {{0xC5, 0xC7, 0xCF}, 241}, /* его */ + {{0xC5, 0xD4, 0xD3}, 238}, /* етс */ + {{0xCE, 0xCF, 0xD3}, 236}, /* нос */ + {{0xDD, 0xC5, 0xD3}, 235}, /* щес */ + {{0xD0, 0xCF, 0xCC}, 232}, /* пол */ + {{0xD2, 0xC1, 0xCE}, 231}, /* ран */ + {{0xCE, 0xCF, 0xC7}, 230}, /* ног */ + {{0xD3, 0xD4, 0xC1}, 229}, /* ста */ + {{0xDE, 0xC5, 0xCE}, 226}, /* чен */ + {{0xD4, 0xD2, 0xC5}, 224}, /* тре */ + {{0xDA, 0xCD, 0xC5}, 214}, /* зме */ + {{0xD5, 0xDD, 0xC5}, 212}, /* уще */ + {{0xD3, 0xD4, 0xC9}, 210}, /* сти */ + {{0xCB, 0xCF, 0xCD}, 207}, /* ком */ + {{0xCF, 0xD2, 0xCF}, 206}, /* оро */ + {{0xD7, 0xCC, 0xC5}, 195}, /* вле */ + {{0xDA, 0xC1, 0xCE}, 194}, /* зан */ + {{0xC1, 0xD3, 0xD4}, 193}, /* аст */ + {{0xD4, 0xD3, 0xD1}, 191}, /* тся */ + {{0xC8, 0xD2, 0xC1}, 187}, /* хра */ + {{0xC1, 0xCE, 0xCE}, 182}, /* анн */ + {{0xC5, 0xD2, 0xC5}, 182}, /* ере */ + {{0xD7, 0xD2, 0xC5}, 178}, /* вре */ + {{0xCF, 0xD7, 0xC5}, 173}, /* ове */ + {{0xD8, 0xCE, 0xCF}, 173}, /* ьно */ + {{0xD7, 0xC5, 0xD2}, 172}, /* вер */ + {{0xCD, 0xC5, 0xCE}, 170}, /* мен */ + {{0xCC, 0xC9, 0xC3}, 168}, /* лиц */ + {{0xD4, 0xCF, 0xD2}, 167}, /* тор */ + {{0xD2, 0xC5, 0xCE}, 167}, /* рен */ + {{0xDD, 0xC5, 0xCE}, 165}, /* щен */ + {{0xCF, 0xDA, 0xCD}, 164}, /* озм */ + {{0xC5, 0xC4, 0xC1}, 163}, /* еда */ + {{0xD4, 0xD7, 0xC9}, 159}, /* тви */ + {{0xD1, 0xDA, 0xC1}, 159}, /* яза */ + {{0xC2, 0xD1, 0xDA}, 158}, /* бяз */ + {{0xCE, 0xC9, 0xC9}, 153}, /* нии */ + {{0xCE, 0xD9, 0xC8}, 153}, /* ных */ + {{0xD4, 0xD8, 0xD1}, 153}, /* тья */ + {{0xCD, 0xC5, 0xD2}, 153}, /* мер */ + {{0xD3, 0xCC, 0xC9}, 150}, /* сли */ + {{0xD4, 0xCF, 0xD7}, 148}, /* тов */ + {{0xD4, 0xD7, 0xC1}, 147}, /* тва */ + {{0xCF, 0xD2, 0xC1}, 146}, /* ора */ + {{0xCE, 0xCF, 0xCD}, 144}, /* ном */ + {{0xC4, 0xC5, 0xCE}, 144}, /* ден */ + {{0xC1, 0xCE, 0xC5}, 142}, /* ане */ + {{0xCB, 0xCF, 0xCE}, 141}, /* кон */ + {{0xCC, 0xD5, 0xDE}, 141}, /* луч */ + {{0xCD, 0xD5, 0xDD}, 140}, /* мущ */ + {{0xCF, 0xC2, 0xD1}, 140}, /* обя */ + {{0xD7, 0xC1, 0xD4}, 138}, /* ват */ + {{0xD7, 0xC1, 0xD2}, 137}, /* вар */ + {{0xC5, 0xDD, 0xC5}, 137}, /* еще */ + {{0xCF, 0xD4, 0xD2}, 137}, /* отр */ + {{0xC4, 0xC5, 0xCC}, 137}, /* дел */ + {{0xCE, 0xD9, 0xCD}, 136}, /* ным */ + {{0xC9, 0xCD, 0xD5}, 136}, /* иму */ + {{0xF3, 0xD4, 0xC1}, 134}, /* Ста */ + {{0xD5, 0xDE, 0xC1}, 133}, /* уча */ + {{0xD4, 0xD3, 0xD4}, 131}, /* тст */ + {{0xC5, 0xCC, 0xD1}, 130}, /* еля */ + {{0xD3, 0xCC, 0xD5}, 130}, /* слу */ + {{0xDA, 0xC1, 0xCB}, 130}, /* зак */ + {{0xD4, 0xCF, 0xD1}, 129}, /* тоя */ + {{0xCF, 0xCD, 0xC9}, 128}, /* оми */ + {{0xCD, 0xC5, 0xDD}, 128}, /* мещ */ + {{0xC5, 0xC4, 0xD5}, 127}, /* еду */ + {{0xD7, 0xC5, 0xCE}, 127}, /* вен */ + {{0xCE, 0xCF, 0xD7}, 127}, /* нов */ + {{0xCE, 0xCF, 0xC5}, 126}, /* ное */ + {{0xCF, 0xD4, 0xD7}, 125}, /* отв */ + {{0xCB, 0xC1, 0xDA}, 125}, /* каз */ + {{0xC1, 0xC5, 0xD4}, 125}, /* ает */ + {{0xD3, 0xCB, 0xCF}, 125}, /* ско */ + {{0xC5, 0xCE, 0xD4}, 124}, /* ент */ + {{0xCD, 0xCF, 0xD4}, 123}, /* мот */ + {{0xC1, 0xD7, 0xCC}, 122}, /* авл */ + {{0xD3, 0xCD, 0xCF}, 122}, /* смо */ + {{0xC9, 0xDE, 0xC9}, 121}, /* ичи */ + {{0xC2, 0xD9, 0xD4}, 120}, /* быт */ + {{0xD5, 0xD3, 0xCD}, 118}, /* усм */ + {{0xD3, 0xD3, 0xC9}, 117}, /* сси */ + {{0xC4, 0xD5, 0xD3}, 117}, /* дус */ + {{0xC8, 0xCF, 0xC4}, 117}, /* ход */ + {{0xD2, 0xC9, 0xDE}, 117}, /* рич */ + {{0xDE, 0xC5, 0xD3}, 115}, /* чес */ + {{0xC7, 0xD2, 0xC1}, 114}, /* гра */ + {{0xD0, 0xD2, 0xCF}, 114}, /* про */ + {{0xC4, 0xCF, 0xD7}, 113}, /* дов */ + {{0xD7, 0xC5, 0xD4}, 112}, /* вет */ + {{0xC5, 0xC4, 0xC5}, 112}, /* еде */ + {{0xDB, 0xC5, 0xCE}, 111}, /* шен */ + {{0xDE, 0xC9, 0xCE}, 110}, /* чин */ + {{0xCE, 0xC1, 0xD3}, 109}, /* нас */ + {{0xC9, 0xD4, 0xD8}, 105}, /* ить */ + {{0xD4, 0xD7, 0xCF}, 105}, /* тво */ + {{0xCB, 0xCC, 0xC0}, 104}, /* клю */ + {{0xD2, 0xC9, 0xD4}, 104}, /* рит */ + {{0xD3, 0xD4, 0xD8}, 104}, /* сть */ + {{0xCC, 0xC0, 0xDE}, 104}, /* люч */ + {{0xD4, 0xCF, 0xCD}, 104}, /* том */ + {{0xD3, 0xCC, 0xC5}, 103}, /* сле */ + {{0xD3, 0xD0, 0xCF}, 102}, /* спо */ + {{0xCF, 0xCC, 0xCE}, 102}, /* олн */ + {{0xC5, 0xD3, 0xCC}, 102}, /* есл */ + {{0xC5, 0xD2, 0xC9}, 101}, /* ери */ + {{0xCE, 0xCF, 0xCA}, 101}, /* ной */ + {{0xD2, 0xCF, 0xCD}, 101}, /* ром */ + {{0xCF, 0xD4, 0xCF}, 99}, /* ото */ + {{0xCE, 0xD9, 0xC5}, 99}, /* ные */ + {{0xDA, 0xCE, 0xC1}, 99}, /* зна */ + {{0xD7, 0xCC, 0xD1}, 99}, /* вля */ + {{0xD4, 0xC5, 0xD2}, 98}, /* тер */ + {{0xD5, 0xD0, 0xD2}, 97}, /* упр */ + {{0xC1, 0xCB, 0xCF}, 96}, /* ако */ + {{0xCB, 0xCF, 0xC7}, 96}, /* ког */ + {{0xCE, 0xD9, 0xCA}, 96}, /* ный */ + {{0xCF, 0xD2, 0xD5}, 96}, /* ору */ + {{0xC5, 0xCC, 0xC5}, 95}, /* еле */ + {{0xC5, 0xD3, 0xCB}, 95}, /* еск */ + {{0xC1, 0xDA, 0xC1}, 95}, /* аза */ + {{0xCA, 0xD3, 0xD4}, 93}, /* йст */ + {{0xD0, 0xCF, 0xD2}, 93}, /* пор */ + {{0xCF, 0xD6, 0xC5}, 92}, /* оже */ + {{0xC9, 0xCE, 0xC5}, 91}, /* ине */ + {{0xDD, 0xC5, 0xCA}, 90}, /* щей */ + {{0xD6, 0xC4, 0xC5}, 90}, /* жде */ + {{0xD0, 0xC5, 0xD2}, 89}, /* пер */ + {{0xCE, 0xC9, 0xD4}, 89}, /* нит */ + {{0xCF, 0xCC, 0xD8}, 89}, /* оль */ + {{0xC1, 0xD6, 0xC4}, 88}, /* ажд */ + {{0xD6, 0xC5, 0xCE}, 87}, /* жен */ + {{0xCC, 0xC1, 0xC4}, 87}, /* лад */ + {{0xC1, 0xCD, 0xC9}, 87}, /* ами */ + {{0xCB, 0xCF, 0xD4}, 86}, /* кот */ + {{0xDE, 0xC1, 0xC5}, 85}, /* чае */ + {{0xD7, 0xC5, 0xDD}, 85}, /* вещ */ + {{0xD7, 0xC9, 0xD1}, 85}, /* вия */ + {{0xD1, 0xDD, 0xC5}, 85}, /* яще */ + {{0xC9, 0xC5, 0xCD}, 85}, /* ием */ + {{0xCB, 0xCC, 0xC1}, 85}, /* кла */ + {{0xC5, 0xCA, 0xD3}, 84}, /* ейс */ + {{0xD9, 0xD4, 0xD8}, 84}, /* ыть */ + {{0xC1, 0xD7, 0xCF}, 84}, /* аво */ + {{0xD2, 0xC1, 0xD6}, 83}, /* раж */ + {{0xCC, 0xD8, 0xD3}, 83}, /* льс */ + {{0xCF, 0xD1, 0xDD}, 82}, /* оящ */ + {{0xC5, 0xCE, 0xCF}, 81}, /* ено */ + {{0xC4, 0xD3, 0xD4}, 81}, /* дст */ + {{0xC4, 0xC5, 0xCA}, 80}, /* дей */ + {{0xD2, 0xC5, 0xC2}, 80}, /* реб */ + {{0xD8, 0xD3, 0xD4}, 79}, /* ьст */ + {{0xC5, 0xC4, 0xD3}, 79}, /* едс */ + {{0xC1, 0xD2, 0xC9}, 79}, /* ари */ + {{0xC4, 0xC1, 0xCE}, 79}, /* дан */ + {{0xCD, 0xCF, 0xD6}, 78}, /* мож */ + {{0xC9, 0xCD, 0xC5}, 78}, /* име */ + {{0xC9, 0xCE, 0xCF}, 78}, /* ино */ + {{0xD2, 0xC9, 0xCE}, 77}, /* рин */ + {{0xC4, 0xCF, 0xD3}, 77}, /* дос */ + {{0xD0, 0xCF, 0xD3}, 77}, /* пос */ + {{0xD4, 0xC1, 0xCB}, 77}, /* так */ + {{0xDD, 0xC5, 0xC7}, 77}, /* щег */ + {{0xC4, 0xC1, 0xD4}, 77}, /* дат */ + {{0xD0, 0xCC, 0xC1}, 76}, /* пла */ + {{0xD5, 0xD3, 0xCC}, 76}, /* усл */ + {{0xC9, 0xC3, 0xC1}, 76}, /* ица */ + {{0xD2, 0xCF, 0xD7}, 75}, /* ров */ + {{0xDC, 0xD4, 0xCF}, 75}, /* это */ + {{0xD5, 0xDE, 0xC5}, 74}, /* уче */ + {{0xC4, 0xCF, 0xCC}, 73}, /* дол */ + {{0xD8, 0xCE, 0xD9}, 73}, /* ьны */ + {{0xD2, 0xC1, 0xDA}, 73}, /* раз */ + {{0xCD, 0xC9, 0xD3}, 73}, /* мис */ + {{0xC1, 0xCE, 0xCF}, 72}, /* ано */ + {{0xD3, 0xD2, 0xCF}, 72}, /* сро */ + {{0xC1, 0xD7, 0xC9}, 72}, /* ави */ + {{0xD4, 0xD8, 0xC9}, 71}, /* тьи */ + {{0xC0, 0xDE, 0xC5}, 70}, /* юче */ + {{0xD3, 0xCB, 0xCC}, 70}, /* скл */ + {{0xC9, 0xD3, 0xD3}, 70}, /* исс */ + {{0xD6, 0xC5, 0xD4}, 69}, /* жет */ + {{0xC5, 0xC4, 0xCF}, 69}, /* едо */ + {{0xCC, 0xC5, 0xC4}, 69}, /* лед */ + {{0xCC, 0xCF, 0xD7}, 69}, /* лов */ + {{0xC0, 0xDD, 0xC9}, 68}, /* ющи */ + {{0xC9, 0xC2, 0xCF}, 68}, /* ибо */ + {{0xCC, 0xC1, 0xD4}, 67}, /* лат */ + {{0xD2, 0xCF, 0xCB}, 67}, /* рок */ + {{0xC1, 0xCB, 0xCC}, 67}, /* акл */ + {{0xD2, 0xC9, 0xDD}, 67}, /* рищ */ + {{0xC2, 0xCF, 0xD7}, 67}, /* бов */ + {{0xC9, 0xD3, 0xCB}, 67}, /* иск */ + {{0xC5, 0xC2, 0xCF}, 67}, /* ебо */ + {{0xCC, 0xD8, 0xDA}, 67}, /* льз */ + {{0xD5, 0xCB, 0xC1}, 67}, /* ука */ + {{0xCC, 0xC9, 0xC2}, 66}, /* либ */ + {{0xCF, 0xCD, 0xD5}, 66}, /* ому */ + {{0xCF, 0xD7, 0xCC}, 66}, /* овл */ + {{0xD4, 0xCE, 0xCF}, 65}, /* тно */ + {{0xD7, 0xCF, 0xCA}, 64}, /* вой */ + {{0xD4, 0xCF, 0xC7}, 64}, /* тог */ + {{0xD3, 0xCC, 0xCF}, 64}, /* сло */ + {{0xCF, 0xDA, 0xCE}, 64}, /* озн */ + {{0xD3, 0xCF, 0xCF}, 64}, /* соо */ + {{0xDA, 0xC1, 0xD4}, 63}, /* зат */ + {{0xC9, 0xD3, 0xD0}, 63}, /* исп */ + {{0xC1, 0xDE, 0xC5}, 63}, /* аче */ + {{0xCE, 0xC9, 0xC0}, 63}, /* нию */ + {{0xCF, 0xCE, 0xC5}, 63}, /* оне */ + {{0xCF, 0xCC, 0xD6}, 62}, /* олж */ + {{0xCF, 0xD7, 0xDD}, 61}, /* овщ */ + {{0xD2, 0xC1, 0xD3}, 61}, /* рас */ + {{0xD7, 0xC9, 0xC4}, 61}, /* вид */ + {{0xD7, 0xDD, 0xC9}, 61}, /* вщи */ + {{0xD3, 0xCE, 0xCF}, 61}, /* сно */ + {{0xC9, 0xC3, 0xCF}, 61}, /* ицо */ + {{0xC9, 0xDE, 0xC5}, 61}, /* иче */ + {{0xC1, 0xD7, 0xC5}, 61}, /* аве */ + {{0xC7, 0xCC, 0xC1}, 61}, /* гла */ + {{0xDE, 0xC5, 0xD4}, 61}, /* чет */ + {{0xDD, 0xC9, 0xCB}, 61}, /* щик */ + {{0xD2, 0xD5, 0xC7}, 60}, /* руг */ + {{0xD4, 0xC1, 0xCE}, 60}, /* тан */ + {{0xC9, 0xCD, 0xCF}, 60}, /* имо */ + {{0xC1, 0xCC, 0xD8}, 60}, /* аль */ + {{0xCF, 0xD7, 0xC9}, 60}, /* ови */ + {{0xD6, 0xC4, 0xC1}, 60}, /* жда */ + {{0xD0, 0xCF, 0xD7}, 60}, /* пов */ + {{0xC5, 0xCD, 0xD5}, 60}, /* ему */ + {{0xD1, 0xD4, 0xC5}, 60}, /* яте */ + {{0xD3, 0xC9, 0xC9}, 59}, /* сии */ + {{0xC2, 0xCF, 0xD4}, 59}, /* бот */ + {{0xD7, 0xD9, 0xD0}, 59}, /* вып */ + {{0xC1, 0xC2, 0xCF}, 59}, /* або */ + {{0xCC, 0xD1, 0xC0}, 59}, /* ляю */ + {{0xD3, 0xD5, 0xDD}, 58}, /* сущ */ + {{0xCF, 0xC4, 0xC5}, 58}, /* оде */ + {{0xC9, 0xCE, 0xC9}, 58}, /* ини */ + {{0xD2, 0xC1, 0xD4}, 58}, /* рат */ + {{0xD1, 0xD7, 0xCC}, 58}, /* явл */ + {{0xCE, 0xC1, 0xC7}, 57}, /* наг */ + {{0xC4, 0xD2, 0xD5}, 57}, /* дру */ + {{0xD2, 0xC1, 0xC2}, 57}, /* раб */ + {{0xC1, 0xC7, 0xD2}, 57}, /* агр */ + {{0xC9, 0xCF, 0xCE}, 57}, /* ион */ + {{0xCD, 0xC5, 0xD3}, 57}, /* мес */ + {{0xC1, 0xC3, 0xC9}, 56}, /* аци */ + {{0xCF, 0xD3, 0xD5}, 56}, /* осу */ + {{0xCB, 0xCF, 0xCA}, 55}, /* кой */ + {{0xD3, 0xD7, 0xCF}, 55}, /* сво */ + {{0xDA, 0xCF, 0xD7}, 55}, /* зов */ + {{0xCF, 0xD0, 0xD2}, 54}, /* опр */ + {{0xD3, 0xCF, 0xC2}, 54}, /* соб */ + {{0xD7, 0xD0, 0xD2}, 54}, /* впр */ + {{0xCC, 0xCE, 0xC5}, 54}, /* лне */ + {{0xCF, 0xCD, 0xCD}, 54}, /* омм */ + {{0xC5, 0xD2, 0xC1}, 54}, /* ера */ + {{0xDE, 0xC9, 0xD4}, 54}, /* чит */ + {{0xC5, 0xD2, 0xDE}, 54}, /* ерч */ + {{0xD2, 0xDE, 0xC5}, 54}, /* рче */ + {{0xC1, 0xD4, 0xC9}, 54}, /* ати */ + {{0xCE, 0xC9, 0xCB}, 54}, /* ник */ + {{0xCD, 0xCD, 0xC5}, 54}, /* мме */ + {{0xD5, 0xD3, 0xD4}, 53}, /* уст */ + {{0xD4, 0xC5, 0xCE}, 53}, /* тен */ + {{0xD7, 0xC5, 0xC4}, 53}, /* вед */ + {{0xD3, 0xCF, 0xD7}, 52}, /* сов */ + {{0xC1, 0xD6, 0xC5}, 52}, /* аже */ + {{0xCF, 0xCB, 0xC1}, 52}, /* ока */ + {{0xD9, 0xCD, 0xC9}, 52}, /* ыми */ + {{0xC0, 0xD4, 0xD3}, 52}, /* ютс */ + {{0xCF, 0xCF, 0xD4}, 52}, /* оот */ + {{0xCD, 0xC9, 0xD4}, 52}, /* мит */ + {{0xD1, 0xC0, 0xDD}, 51}, /* яющ */ + {{0xD7, 0xDB, 0xC5}, 51}, /* вше */ + {{0xD3, 0xC9, 0xCF}, 51}, /* сио */ + {{0xCF, 0xCE, 0xCF}, 51}, /* оно */ + {{0xC1, 0xD7, 0xC1}, 51}, /* ава */ + {{0xC1, 0xDD, 0xC5}, 51}, /* аще */ + {{0xCC, 0xD1, 0xC5}, 50}, /* ляе */ + {{0xC5, 0xCE, 0xC5}, 50}, /* ене */ + {{0xCF, 0xC4, 0xC9}, 50}, /* оди */ + {{0xD0, 0xD5, 0xCE}, 49}, /* пун */ + {{0xCC, 0xC9, 0xDE}, 49}, /* лич */ + {{0xD7, 0xCF, 0xCD}, 49}, /* вом */ + {{0xCE, 0xCB, 0xD4}, 49}, /* нкт */ + {{0xCE, 0xC5, 0xD3}, 49}, /* нес */ + {{0xD7, 0xC9, 0xCC}, 49}, /* вил */ + {{0xC5, 0xD6, 0xC4}, 49}, /* ежд */ + {{0xD2, 0xC5, 0xD3}, 49}, /* рес */ + {{0xC0, 0xDD, 0xC5}, 49}, /* юще */ + {{0xD8, 0xDA, 0xCF}, 49}, /* ьзо */ + {{0xD0, 0xCF, 0xD4}, 49}, /* пот */ + {{0xD5, 0xCE, 0xCB}, 49}, /* унк */ + {{0xD3, 0xD4, 0xC5}, 49}, /* сте */ + {{0xCB, 0xCF, 0xD7}, 49}, /* ков */ + {{0xCF, 0xD3, 0xCC}, 48}, /* осл */ + {{0xD1, 0xC5, 0xD4}, 48}, /* яет */ + {{0xE5, 0xD3, 0xCC}, 48}, /* Есл */ + {{0xF0, 0xD2, 0xC9}, 48}, /* При */ + {{0xD4, 0xC1, 0xD7}, 48}, /* тав */ + {{0xCE, 0xC5, 0xD2}, 48}, /* нер */ + {{0xDE, 0xCE, 0xCF}, 47}, /* чно */ + {{0xD0, 0xCF, 0xC4}, 47}, /* под */ + {{0xCE, 0xD4, 0xC1}, 47}, /* нта */ + {{0xC9, 0xDD, 0xC5}, 47}, /* ище */ + {{0xCF, 0xC2, 0xDD}, 47}, /* общ */ + {{0xC1, 0xDA, 0xCD}, 47}, /* азм */ + {{0xD6, 0xCE, 0xCF}, 47}, /* жно */ + {{0xD7, 0xC9, 0xC9}, 46}, /* вии */ + {{0xD2, 0xC1, 0xDD}, 46}, /* ращ */ + {{0xCF, 0xD2, 0xC5}, 46}, /* оре */ + {{0xD7, 0xDB, 0xC9}, 46}, /* вши */ + {{0xC5, 0xCB, 0xD3}, 46}, /* екс */ + {{0xD7, 0xCF, 0xC7}, 46}, /* вог */ + {{0xDE, 0xD4, 0xCF}, 46}, /* что */ + {{0xC9, 0xDE, 0xCE}, 45}, /* ичн */ + {{0xCC, 0xC5, 0xCD}, 45}, /* лем */ + {{0xCD, 0xCF, 0xC7}, 45}, /* мог */ + {{0xD4, 0xD7, 0xCC}, 45}, /* твл */ + {{0xC4, 0xCC, 0xC5}, 45}, /* дле */ + {{0xC4, 0xCC, 0xD1}, 45}, /* для */ + {{0xD2, 0xC5, 0xD4}, 45}, /* рет */ + {{0xC1, 0xD2, 0xC1}, 45}, /* ара */ + {{0xCE, 0xD1, 0xD4}, 44}, /* нят */ + {{0xC5, 0xDE, 0xC5}, 44}, /* ече */ + {{0xCF, 0xD4, 0xC5}, 44}, /* оте */ + {{0xCF, 0xD2, 0xD9}, 44}, /* оры */ + {{0xCF, 0xD3, 0xCE}, 43}, /* осн */ + {{0xCF, 0xC2, 0xCF}, 43}, /* обо */ + {{0xCF, 0xC7, 0xCC}, 43}, /* огл */ + {{0xC9, 0xCE, 0xD9}, 43}, /* ины */ + {{0xC5, 0xD3, 0xD3}, 43}, /* есс */ + {{0xCF, 0xC2, 0xD2}, 43}, /* обр */ + {{0xCB, 0xD2, 0xC1}, 43}, /* кра */ + {{0xC9, 0xD1, 0xCD}, 43}, /* иям */ + {{0xC1, 0xCC, 0xCF}, 43}, /* ало */ + {{0xD2, 0xD5, 0xDE}, 43}, /* руч */ + {{0xCF, 0xD2, 0xC7}, 43}, /* орг */ + {{0xDE, 0xC1, 0xD1}, 42}, /* чая */ + {{0xCE, 0xC9, 0xCD}, 42}, /* ним */ + {{0xC9, 0xDA, 0xCE}, 42}, /* изн */ + {{0xD0, 0xCF, 0xCB}, 42}, /* пок */ + {{0xD3, 0xD4, 0xD5}, 42}, /* сту */ + {{0xC5, 0xCC, 0xC0}, 42}, /* елю */ + {{0xD4, 0xC9, 0xD4}, 42}, /* тит */ + {{0xC3, 0xC5, 0xCE}, 42}, /* цен */ + {{0xDE, 0xC1, 0xD3}, 42}, /* час */ + {{0xC7, 0xC1, 0xCE}, 42}, /* ган */ + {{0xD2, 0xC7, 0xC1}, 42}, /* рга */ + {{0xD3, 0xD4, 0xCE}, 42}, /* стн */ + {{0xD2, 0xC5, 0xD6}, 42}, /* реж */ + {{0xD5, 0xCD, 0xCD}, 42}, /* умм */ + {{0xD4, 0xD7, 0xD5}, 41}, /* тву */ + {{0xD4, 0xD5, 0xD0}, 41}, /* туп */ + {{0xD3, 0xCB, 0xC9}, 40}, /* ски */ + {{0xC4, 0xC5, 0xCB}, 40}, /* дек */ + {{0xCC, 0xC5, 0xD6}, 40}, /* леж */ + {{0xC5, 0xD3, 0xC5}, 40}, /* есе */ + {{0xD7, 0xC9, 0xC5}, 40}, /* вие */ + {{0xD4, 0xCB, 0xC1}, 40}, /* тка */ + {{0xC5, 0xCB, 0xD2}, 40}, /* екр */ + {{0xCF, 0xC4, 0xCF}, 40}, /* одо */ + {{0xCB, 0xD3, 0xC1}, 40}, /* кса */ + {{0xD2, 0xC5, 0xCB}, 40}, /* рек */ + {{0xCE, 0xD4, 0xC5}, 40}, /* нте */ + {{0xD5, 0xC7, 0xC9}, 40}, /* уги */ + {{0xC2, 0xD9, 0xCC}, 40}, /* был */ + {{0xC9, 0xCE, 0xD1}, 40}, /* иня */ + {{0xC5, 0xDD, 0xC9}, 39}, /* ещи */ + {{0xC7, 0xC5, 0xCE}, 39}, /* ген */ + {{0xEB, 0xCF, 0xC4}, 39}, /* Код */ + {{0xC4, 0xC9, 0xD4}, 39}, /* дит */ + {{0xD3, 0xC8, 0xCF}, 39}, /* схо */ + {{0xC9, 0xCE, 0xD4}, 39}, /* инт */ + {{0xD3, 0xD5, 0xCD}, 39}, /* сум */ + {{0xD2, 0xCF, 0xCE}, 39}, /* рон */ + {{0xCF, 0xD4, 0xCB}, 39}, /* отк */ + {{0xC4, 0xCF, 0xCB}, 39}, /* док */ + {{0xC9, 0xCC, 0xC1}, 38}, /* ила */ + {{0xC3, 0xC5, 0xD3}, 38}, /* цес */ + {{0xC9, 0xCB, 0xC1}, 38}, /* ика */ + {{0xDA, 0xCE, 0xC9}, 38}, /* зни */ + {{0xCF, 0xD7, 0xD9}, 38}, /* овы */ + {{0xCC, 0xD6, 0xCE}, 38}, /* лжн */ + {{0xD5, 0xD0, 0xCC}, 38}, /* упл */ + {{0xC7, 0xC4, 0xC1}, 37}, /* гда */ + {{0xCC, 0xC1, 0xD6}, 37}, /* лаж */ + {{0xD6, 0xC5, 0xC4}, 37}, /* жед */ + {{0xC2, 0xC5, 0xDA}, 37}, /* без */ + {{0xC4, 0xC5, 0xD4}, 37}, /* дет */ + {{0xCF, 0xD2, 0xD1}, 37}, /* оря */ + {{0xD2, 0xCF, 0xD3}, 37}, /* рос */ + {{0xCF, 0xC2, 0xCC}, 37}, /* обл */ + {{0xC3, 0xC9, 0xC9}, 37}, /* ции */ + {{0xC4, 0xCF, 0xCD}, 37}, /* дом */ + {{0xCE, 0xC3, 0xC5}, 37}, /* нце */ + {{0xDB, 0xC5, 0xC7}, 37}, /* шег */ + {{0xCC, 0xCF, 0xD6}, 37}, /* лож */ + {{0xCF, 0xCE, 0xC1}, 37}, /* она */ + {{0xCF, 0xCB, 0xCC}, 37}, /* окл */ + {{0xCF, 0xC7, 0xC4}, 37}, /* огд */ + {{0xD2, 0xCF, 0xC4}, 37}, /* род */ + {{0xC5, 0xCE, 0xC1}, 37}, /* ена */ + {{0xCF, 0xCE, 0xC3}, 37}, /* онц */ + {{0xCF, 0xD4, 0xCE}, 37}, /* отн */ + {{0xD3, 0xCF, 0xC7}, 37}, /* сог */ + {{0xC5, 0xD7, 0xDB}, 37}, /* евш */ + {{0xD7, 0xC9, 0xD4}, 36}, /* вит */ + {{0xC5, 0xD2, 0xD0}, 36}, /* ерп */ + {{0xCF, 0xC4, 0xC1}, 36}, /* ода */ + {{0xC5, 0xD4, 0xC5}, 36}, /* ете */ + {{0xCE, 0xC5, 0xCF}, 36}, /* нео */ + {{0xD2, 0xD0, 0xC5}, 36}, /* рпе */ + {{0xC5, 0xD2, 0xDB}, 36}, /* ерш */ + {{0xC9, 0xCD, 0xC9}, 36}, /* ими */ + {{0xC9, 0xD7, 0xDB}, 36}, /* ивш */ + {{0xD9, 0xD0, 0xCC}, 36}, /* ыпл */ + {{0xD0, 0xC5, 0xD7}, 36}, /* пев */ + {{0xC1, 0xC4, 0xC1}, 36}, /* ада */ + {{0xCD, 0xCF, 0xD3}, 35}, /* мос */ + {{0xCF, 0xC2, 0xD3}, 35}, /* обс */ + {{0xCE, 0xC5, 0xC4}, 34}, /* нед */ + {{0xC9, 0xCB, 0xCF}, 34}, /* ико */ + {{0xDD, 0xC9, 0xCD}, 34}, /* щим */ + {{0xC4, 0xC5, 0xD2}, 34}, /* дер */ + {{0xD3, 0xCB, 0xC1}, 34}, /* ска */ + {{0xCF, 0xD2, 0xCD}, 34}, /* орм */ + {{0xD5, 0xCD, 0xC5}, 34}, /* уме */ + {{0xCF, 0xCF, 0xC2}, 34}, /* ооб */ + {{0xD2, 0xC9, 0xD3}, 34}, /* рис */ + {{0xCF, 0xC2, 0xDF}, 33}, /* объ */ + {{0xCF, 0xCC, 0xD5}, 33}, /* олу */ + {{0xDF, 0xD1, 0xD7}, 33}, /* ъяв */ + {{0xD2, 0xC5, 0xCD}, 33}, /* рем */ + {{0xDD, 0xC9, 0xC8}, 33}, /* щих */ + {{0xD5, 0xC0, 0xDD}, 33}, /* ующ */ + {{0xCB, 0xD6, 0xC5}, 33}, /* кже */ + {{0xC9, 0xC4, 0xC5}, 33}, /* иде */ + {{0xC2, 0xD3, 0xD4}, 33}, /* бст */ + {{0xC1, 0xCB, 0xD6}, 33}, /* акж */ + {{0xD7, 0xD5, 0xC0}, 33}, /* вую */ + {{0xC1, 0xD3, 0xC8}, 33}, /* асх */ + {{0xC1, 0xCE, 0xC1}, 32}, /* ана */ + {{0xCE, 0xC1, 0xC4}, 32}, /* над */ + {{0xCF, 0xC2, 0xC5}, 32}, /* обе */ + {{0xD9, 0xD4, 0xCB}, 32}, /* ытк */ + {{0xDC, 0xD4, 0xC9}, 32}, /* эти */ + {{0xCF, 0xD6, 0xCE}, 32}, /* ожн */ + {{0xC1, 0xD4, 0xD9}, 31}, /* аты */ + {{0xD3, 0xC4, 0xC5}, 31}, /* сде */ + {{0xC1, 0xC0, 0xD4}, 31}, /* ают */ + {{0xD1, 0xD4, 0xD8}, 31}, /* ять */ + {{0xCF, 0xD1, 0xD4}, 31}, /* оят */ + {{0xC5, 0xD4, 0xD8}, 31}, /* еть */ + {{0xC1, 0xC7, 0xC5}, 31}, /* аге */ + {{0xDE, 0xD2, 0xC5}, 31}, /* чре */ + {{0xC5, 0xCE, 0xD9}, 31}, /* ены */ + {{0xD5, 0xC2, 0xD9}, 31}, /* убы */ + {{0xC9, 0xD3, 0xD4}, 30}, /* ист */ + {{0xD1, 0xC0, 0xD4}, 30}, /* яют */ + {{0xD2, 0xD1, 0xC4}, 30}, /* ряд */ + {{0xC7, 0xCF, 0xD3}, 30}, /* гос */ + {{0xC9, 0xCD, 0xC1}, 30}, /* има */ + {{0xDA, 0xC1, 0xD3}, 30}, /* зас */ + {{0xC1, 0xC0, 0xDD}, 30}, /* ающ */ + {{0xCF, 0xDA, 0xD7}, 30}, /* озв */ + {{0xC5, 0xC4, 0xC9}, 30}, /* еди */ + {{0xCF, 0xCD, 0xC5}, 30}, /* оме */ + {{0xCE, 0xC9, 0xCA}, 30}, /* ний */ + {{0xD3, 0xD5, 0xC4}, 30}, /* суд */ + {{0xDA, 0xC4, 0xCF}, 29}, /* здо */ + {{0xD3, 0xD7, 0xC9}, 29}, /* сви */ + {{0xCF, 0xCC, 0xC9}, 29}, /* оли */ + {{0xCF, 0xD7, 0xD8}, 29}, /* овь */ + {{0xD7, 0xC9, 0xCA}, 29}, /* вий */ + {{0xC4, 0xCF, 0xD2}, 29}, /* дор */ + {{0xC4, 0xC5, 0xD1}, 29}, /* дея */ + {{0xC5, 0xD1, 0xD4}, 29}, /* еят */ + {{0xC3, 0xCF, 0xCD}, 29}, /* цом */ + {{0xC9, 0xDA, 0xC1}, 28}, /* иза */ + {{0xD3, 0xDE, 0xC5}, 28}, /* сче */ + {{0xCB, 0xD4, 0xC1}, 28}, /* кта */ + {{0xCF, 0xC4, 0xCE}, 28}, /* одн */ + {{0xC2, 0xCC, 0xC1}, 28}, /* бла */ + {{0xCF, 0xC4, 0xCC}, 28}, /* одл */ + {{0xC9, 0xD4, 0xC1}, 28}, /* ита */ + {{0xE4, 0xCF, 0xC7}, 28}, /* Дог */ + {{0xCF, 0xD3, 0xCF}, 28}, /* осо */ + {{0xCE, 0xCF, 0xDB}, 28}, /* нош */ + {{0xCB, 0xD5, 0xD2}, 28}, /* кур */ + {{0xC9, 0xCE, 0xC1}, 28}, /* ина */ + {{0xCF, 0xDB, 0xC5}, 28}, /* оше */ + {{0xCE, 0xC1, 0xCC}, 28}, /* нал */ + {{0xCE, 0xC9, 0xDA}, 27}, /* низ */ + {{0xDA, 0xD7, 0xD2}, 27}, /* звр */ + {{0xD7, 0xD2, 0xC1}, 27}, /* вра */ + {{0xCC, 0xC5, 0xD4}, 27}, /* лет */ + {{0xC5, 0xDD, 0xD8}, 27}, /* ещь */ + {{0xD2, 0xC9, 0xC4}, 27}, /* рид */ + {{0xC4, 0xCE, 0xCF}, 27}, /* дно */ + {{0xD2, 0xC9, 0xCF}, 27}, /* рио */ + {{0xCF, 0xC9, 0xCD}, 27}, /* оим */ + {{0xC5, 0xD2, 0xD6}, 27}, /* ерж */ + {{0xD5, 0xD7, 0xC5}, 26}, /* уве */ + {{0xCF, 0xCE, 0xCB}, 26}, /* онк */ + {{0xC5, 0xCC, 0xCB}, 26}, /* елк */ + {{0xCC, 0xC1, 0xD7}, 26}, /* лав */ + {{0xC1, 0xD4, 0xCF}, 26}, /* ато */ + {{0xD1, 0xCD, 0xC9}, 26}, /* ями */ + {{0xCD, 0xCD, 0xD9}, 26}, /* ммы */ + {{0xC5, 0xD3, 0xD0}, 26}, /* есп */ + {{0xCE, 0xCB, 0xD5}, 26}, /* нку */ + {{0xC9, 0xC3, 0xD5}, 25}, /* ицу */ + {{0xC4, 0xD3, 0xCB}, 25}, /* дск */ + {{0xCE, 0xC9, 0xCE}, 25}, /* нин */ + {{0xD0, 0xCC, 0xC5}, 25}, /* пле */ + {{0xC6, 0xCF, 0xD2}, 25}, /* фор */ + {{0xCC, 0xC1, 0xD3}, 25}, /* лас */ + {{0xC4, 0xC9, 0xCD}, 25}, /* дим */ + {{0xC5, 0xD3, 0xD1}, 25}, /* еся */ + {{0xCE, 0xC9, 0xDE}, 25}, /* нич */ + {{0xCF, 0xD7, 0xD2}, 25}, /* овр */ + {{0xD7, 0xD3, 0xCC}, 25}, /* всл */ + {{0xD2, 0xDB, 0xC5}, 25}, /* рше */ + {{0xC5, 0xDD, 0xC1}, 25}, /* еща */ + {{0xD6, 0xCE, 0xD9}, 25}, /* жны */ + {{0xD2, 0xC9, 0xCD}, 25}, /* рим */ + {{0xDA, 0xC1, 0xC3}, 25}, /* зац */ + {{0xC2, 0xDD, 0xC5}, 25}, /* бще */ + {{0xC1, 0xCB, 0xD4}, 25}, /* акт */ + {{0xC1, 0xC4, 0xD3}, 25}, /* адс */ + {{0xD5, 0xDE, 0xD2}, 25}, /* учр */ + {{0xDD, 0xC9, 0xC5}, 25}, /* щие */ + {{0xD6, 0xC9, 0xD4}, 24}, /* жит */ + {{0xC2, 0xD2, 0xC5}, 24}, /* бре */ + {{0xD5, 0xC7, 0xCF}, 24}, /* уго */ + {{0xC9, 0xD1, 0xC8}, 24}, /* иях */ + {{0xD4, 0xD8, 0xC0}, 24}, /* тью */ + {{0xD8, 0xD3, 0xD1}, 24}, /* ься */ + {{0xD7, 0xCF, 0xD7}, 24}, /* вов */ + {{0xCF, 0xDE, 0xCE}, 24}, /* очн */ + {{0xD7, 0xCF, 0xCF}, 24}, /* воо */ + {{0xCF, 0xC4, 0xD9}, 24}, /* оды */ + {{0xCC, 0xCF, 0xC7}, 24}, /* лог */ + {{0xD7, 0xC1, 0xC5}, 24}, /* вае */ + {{0xC1, 0xD1, 0xC8}, 24}, /* аях */ + {{0xD4, 0xD8, 0xD3}, 24}, /* тьс */ + {{0xC4, 0xC9, 0xDE}, 24}, /* дич */ + {{0xCB, 0xC9, 0xC8}, 24}, /* ких */ + {{0xC3, 0xC1, 0xCD}, 24}, /* цам */ + {{0xC9, 0xDA, 0xD7}, 24}, /* изв */ + {{0xD4, 0xC9, 0xD7}, 24}, /* тив */ + {{0xC5, 0xCF, 0xC2}, 24}, /* еоб */ + {{0xD3, 0xCF, 0xD3}, 24}, /* сос */ + {{0xDB, 0xC9, 0xCD}, 24}, /* шим */ + {{0xD9, 0xD0, 0xCF}, 24}, /* ыпо */ + {{0xC5, 0xD6, 0xC1}, 24}, /* ежа */ + {{0xD4, 0xCF, 0xC9}, 24}, /* тои */ + {{0xCB, 0xD4, 0xCF}, 24}, /* кто */ + {{0xC5, 0xDE, 0xC1}, 24}, /* еча */ + {{0xC9, 0xC4, 0xC9}, 24}, /* иди */ + {{0xC2, 0xDD, 0xC9}, 23}, /* бщи */ + {{0xD4, 0xD8, 0xC5}, 23}, /* тье */ + {{0xC2, 0xDF, 0xD1}, 23}, /* бъя */ + {{0xCE, 0xC1, 0xDE}, 23}, /* нач */ + {{0xD4, 0xC5, 0xDE}, 23}, /* теч */ + {{0xD5, 0xD2, 0xD3}, 23}, /* урс */ + {{0xD7, 0xC5, 0xDE}, 23}, /* веч */ + {{0xC5, 0xCD, 0xC5}, 23}, /* еме */ + {{0xCF, 0xC2, 0xC8}, 23}, /* обх */ + {{0xC2, 0xC8, 0xCF}, 23}, /* бхо */ + {{0xC4, 0xC1, 0xC5}, 23}, /* дае */ + {{0xD2, 0xC5, 0xDA}, 23}, /* рез */ + {{0xCB, 0xC1, 0xD6}, 22}, /* каж */ + {{0xCF, 0xCB, 0xD5}, 22}, /* оку */ + {{0xC1, 0xCD, 0xC5}, 22}, /* аме */ + {{0xCE, 0xC5, 0xDA}, 22}, /* нез */ + {{0xD9, 0xD7, 0xC1}, 22}, /* ыва */ + {{0xD3, 0xD7, 0xD1}, 22}, /* свя */ + {{0xD2, 0xC1, 0xC4}, 22}, /* рад */ + {{0xC5, 0xDA, 0xC1}, 22}, /* еза */ + {{0xC9, 0xD7, 0xC1}, 22}, /* ива */ + {{0xCB, 0xC1, 0xCD}, 22}, /* кам */ + {{0xCE, 0xC5, 0xCD}, 22}, /* нем */ + {{0xD4, 0xCB, 0xCF}, 22}, /* тко */ + {{0xDA, 0xD7, 0xC5}, 22}, /* зве */ + {{0xD7, 0xD1, 0xDA}, 22}, /* вяз */ + {{0xD1, 0xD4, 0xC9}, 22}, /* яти */ + {{0xCF, 0xC8, 0xD2}, 22}, /* охр */ + {{0xD2, 0xCF, 0xD4}, 22}, /* рот */ + {{0xCF, 0xCC, 0xC5}, 22}, /* оле */ + {{0xC2, 0xD2, 0xC1}, 22}, /* бра */ + {{0xC1, 0xC5, 0xCD}, 22}, /* аем */ + {{0xCC, 0xC1, 0xDB}, 21}, /* лаш */ + {{0xC9, 0xDA, 0xCD}, 21}, /* изм */ + {{0xC7, 0xD5, 0xD4}, 21}, /* гут */ + {{0xCF, 0xD6, 0xC4}, 21}, /* ожд */ + {{0xCB, 0xC1, 0xCB}, 21}, /* как */ + {{0xCB, 0xC1, 0xDE}, 21}, /* кач */ + {{0xCE, 0xC1, 0xCD}, 21}, /* нам */ + {{0xC4, 0xCF, 0xC8}, 21}, /* дох */ + {{0xCF, 0xC8, 0xCF}, 21}, /* охо */ + {{0xC0, 0xD2, 0xC9}, 21}, /* юри */ + {{0xD7, 0xC1, 0xCD}, 21}, /* вам */ + {{0xDA, 0xCD, 0xCF}, 21}, /* змо */ + {{0xC4, 0xCB, 0xC5}, 21}, /* дке */ + {{0xC2, 0xC1, 0xCE}, 21}, /* бан */ + {{0xC5, 0xCC, 0xC9}, 21}, /* ели */ + {{0xD2, 0xC9, 0xDA}, 21}, /* риз */ + {{0xCC, 0xCE, 0xCF}, 21}, /* лно */ + {{0xD7, 0xD9, 0xDB}, 21}, /* выш */ + {{0xC4, 0xC3, 0xC1}, 21}, /* дца */ + {{0xD1, 0xC4, 0xCB}, 21}, /* ядк */ + {{0xCF, 0xD4, 0xD3}, 21}, /* отс */ + {{0xD4, 0xC5, 0xCA}, 21}, /* тей */ + {{0xC1, 0xCE, 0xCB}, 21}, /* анк */ + {{0xCE, 0xC5, 0xC7}, 21}, /* нег */ + {{0xC3, 0xC1, 0xD4}, 21}, /* цат */ + {{0xC5, 0xCD, 0xD9}, 21}, /* емы */ + {{0xD7, 0xCF, 0xC5}, 21}, /* вое */ + {{0xC4, 0xC1, 0xDE}, 21}, /* дач */ + {{0xCF, 0xC7, 0xD5}, 21}, /* огу */ + {{0xCC, 0xD6, 0xC5}, 21}, /* лже */ + {{0xD4, 0xCE, 0xC9}, 21}, /* тни */ + {{0xDA, 0xC1, 0xD7}, 21}, /* зав */ + {{0xD7, 0xC5, 0xD3}, 21}, /* вес */ + {{0xD3, 0xC1, 0xCD}, 20}, /* сам */ + {{0xC1, 0xD2, 0xCE}, 20}, /* арн */ + {{0xDE, 0xCE, 0xD9}, 20}, /* чны */ + {{0xD3, 0xD2, 0xC5}, 20}, /* сре */ + {{0xD4, 0xC9, 0xD1}, 20}, /* тия */ + {{0xC9, 0xD3, 0xCC}, 20}, /* исл */ + {{0xF3, 0xD4, 0xD2}, 20}, /* Стр */ + {{0xCE, 0xD4, 0xCF}, 20}, /* нто */ + {{0xD5, 0xD4, 0xD2}, 20}, /* утр */ + {{0xC1, 0xDB, 0xC5}, 20}, /* аше */ + {{0xC5, 0xCC, 0xC1}, 20}, /* ела */ + {{0xD5, 0xC4, 0xCF}, 20}, /* удо */ + {{0xD6, 0xC9, 0xDA}, 19}, /* жиз */ + {{0xD0, 0xC9, 0xD3}, 19}, /* пис */ + {{0xC1, 0xC9, 0xCD}, 19}, /* аим */ + {{0xDE, 0xC9, 0xD3}, 19}, /* чис */ + {{0xC5, 0xD6, 0xC9}, 19}, /* ежи */ + {{0xD7, 0xD3, 0xC5}, 19}, /* все */ + {{0xCC, 0xD8, 0xCB}, 19}, /* льк */ + {{0xC1, 0xD4, 0xD5}, 19}, /* ату */ + {{0xD5, 0xC4, 0xC1}, 19}, /* уда */ + {{0xDB, 0xC9, 0xCA}, 19}, /* ший */ + {{0xDA, 0xC1, 0xD2}, 19}, /* зар */ + {{0xC5, 0xC4, 0xCE}, 19}, /* едн */ + {{0xC1, 0xD7, 0xDB}, 19}, /* авш */ + {{0xD2, 0xCF, 0xC9}, 19}, /* рои */ + {{0xC9, 0xC4, 0xC1}, 19}, /* ида */ + {{0xC1, 0xD2, 0xCF}, 19}, /* аро */ + {{0xD4, 0xCF, 0xCA}, 19}, /* той */ + {{0xD6, 0xC1, 0xDD}, 19}, /* жащ */ + {{0xC5, 0xD3, 0xCF}, 19}, /* есо */ + {{0xD0, 0xC1, 0xCC}, 19}, /* пал */ + {{0xDD, 0xC1, 0xC5}, 19}, /* щае */ + {{0xD2, 0xD9, 0xC5}, 19}, /* рые */ + {{0xC5, 0xCE, 0xD1}, 19}, /* еня */ + {{0xDD, 0xC9, 0xCA}, 19}, /* щий */ + {{0xCC, 0xD5, 0xC7}, 19}, /* луг */ + {{0xC0, 0xDE, 0xC9}, 18}, /* ючи */ + {{0xD5, 0xCC, 0xD8}, 18}, /* уль */ + {{0xCD, 0xD9, 0xC8}, 18}, /* мых */ + {{0xD2, 0xCF, 0xC7}, 18}, /* рог */ + {{0xD3, 0xCF, 0xC8}, 18}, /* сох */ + {{0xCB, 0xCF, 0xC5}, 18}, /* кое */ + {{0xCE, 0xD4, 0xD3}, 18}, /* нтс */ + {{0xC1, 0xDA, 0xCE}, 18}, /* азн */ + {{0xD4, 0xCE, 0xD9}, 18}, /* тны */ + {{0xCF, 0xC4, 0xD1}, 18}, /* одя */ + {{0xCF, 0xC2, 0xCE}, 18}, /* обн */ + {{0xD7, 0xD9, 0xC4}, 18}, /* выд */ + {{0xCF, 0xD3, 0xD1}, 18}, /* ося */ + {{0xD8, 0xD4, 0xC1}, 18}, /* ьта */ + {{0xCE, 0xD1, 0xC0}, 18}, /* няю */ + {{0xCE, 0xC1, 0xD2}, 18}, /* нар */ + {{0xC5, 0xDA, 0xD5}, 18}, /* езу */ + {{0xC1, 0xD3, 0xCE}, 18}, /* асн */ + {{0xDA, 0xD5, 0xCC}, 18}, /* зул */ + {{0xC3, 0xC9, 0xD0}, 18}, /* цип */ + {{0xCB, 0xD4, 0xC5}, 18}, /* кте */ + {{0xC4, 0xCF, 0xD0}, 18}, /* доп */ + {{0xCE, 0xC3, 0xC9}, 18}, /* нци */ + {{0xD3, 0xD0, 0xC5}, 18}, /* спе */ + {{0xC9, 0xCD, 0xD9}, 18}, /* имы */ + {{0xCD, 0xCF, 0xCD}, 18}, /* мом */ + {{0xD0, 0xC5, 0xDE}, 18}, /* печ */ + {{0xEF, 0xC2, 0xD1}, 18}, /* Обя */ + {{0xF0, 0xD2, 0xC1}, 18}, /* Пра */ + {{0xCF, 0xCC, 0xCF}, 18}, /* оло */ + {{0xD4, 0xD3, 0xCB}, 18}, /* тск */ + {{0xCC, 0xCE, 0xC9}, 18}, /* лни */ + {{0xC5, 0xD2, 0xD4}, 18}, /* ерт */ + {{0xC9, 0xD3, 0xD8}, 18}, /* ись */ + {{0xCC, 0xD8, 0xD4}, 18}, /* льт */ + {{0xD3, 0xD5, 0xD4}, 18}, /* сут */ + {{0xD7, 0xCF, 0xC2}, 17}, /* воб */ + {{0xD2, 0xCE, 0xD9}, 17}, /* рны */ + {{0xC2, 0xCE, 0xD9}, 17}, /* бны */ + {{0xD9, 0xC4, 0xC1}, 17}, /* ыда */ + {{0xD8, 0xDA, 0xD5}, 17}, /* ьзу */ + {{0xC5, 0xC4, 0xD0}, 17}, /* едп */ + {{0xC1, 0xC4, 0xC5}, 17}, /* аде */ + {{0xC9, 0xD0, 0xC1}, 17}, /* ипа */ + {{0xD3, 0xC5, 0xCA}, 17}, /* сей */ + {{0xC5, 0xC5, 0xD3}, 17}, /* еес */ + {{0xCF, 0xC9, 0xDA}, 17}, /* оиз */ + {{0xCF, 0xD3, 0xD7}, 17}, /* осв */ + {{0xC4, 0xC9, 0xD7}, 17}, /* див */ + {{0xCE, 0xC1, 0xCE}, 17}, /* нан */ + {{0xC5, 0xD4, 0xC1}, 17}, /* ета */ + {{0xC4, 0xCE, 0xC5}, 17}, /* дне */ + {{0xC9, 0xCF, 0xC2}, 17}, /* иоб */ + {{0xD5, 0xC5, 0xD4}, 17}, /* ует */ + {{0xCE, 0xC1, 0xC8}, 17}, /* нах */ + {{0xD3, 0xCD, 0xC5}, 17}, /* сме */ + {{0xC1, 0xCC, 0xC9}, 17}, /* али */ + {{0xC2, 0xDF, 0xC5}, 17}, /* бъе */ + {{0xD0, 0xC1, 0xD3}, 17}, /* пас */ + {{0xDA, 0xC1, 0xCC}, 17}, /* зал */ + {{0xD2, 0xD6, 0xC1}, 16}, /* ржа */ + {{0xD1, 0xD7, 0xC9}, 16}, /* яви */ + {{0xD6, 0xC1, 0xD4}, 16}, /* жат */ + {{0xC2, 0xCF, 0xD6}, 16}, /* бож */ + {{0xD3, 0xC9, 0xCC}, 16}, /* сил */ + {{0xCE, 0xD5, 0xC0}, 16}, /* ную */ + {{0xD0, 0xC5, 0xCE}, 16}, /* пен */ + {{0xCD, 0xC1, 0xD4}, 16}, /* мат */ + {{0xCF, 0xCE, 0xCE}, 16}, /* онн */ + {{0xD7, 0xC9, 0xCE}, 16}, /* вин */ + {{0xD4, 0xCB, 0xC9}, 16}, /* тки */ + {{0xD4, 0xCF, 0xDE}, 16}, /* точ */ + {{0xD3, 0xDE, 0xC9}, 16}, /* счи */ + {{0xCE, 0xC9, 0xC3}, 16}, /* ниц */ + {{0xDD, 0xC5, 0xC5}, 16}, /* щее */ + {{0xC2, 0xC5, 0xD3}, 16}, /* бес */ + {{0xC1, 0xC4, 0xC3}, 16}, /* адц */ + {{0xEB, 0xCF, 0xCD}, 16}, /* Ком */ + {{0xD8, 0xC9, 0xCD}, 16}, /* ьим */ + {{0xD5, 0xD4, 0xD3}, 16}, /* утс */ + {{0xC1, 0xDE, 0xC9}, 16}, /* ачи */ + {{0xD0, 0xCF, 0xCE}, 16}, /* пон */ + {{0xCB, 0xC1, 0xC5}, 16}, /* кае */ + {{0xC9, 0xC7, 0xD2}, 16}, /* игр */ + {{0xC1, 0xCB, 0xC9}, 16}, /* аки */ + {{0xC1, 0xDD, 0xC9}, 16}, /* ащи */ + {{0xCC, 0xD8, 0xC3}, 16}, /* льц */ + {{0xD7, 0xCE, 0xCF}, 16}, /* вно */ + {{0xD9, 0xDB, 0xC5}, 15}, /* ыше */ + {{0xEC, 0xC9, 0xC3}, 15}, /* Лиц */ + {{0xD8, 0xC5, 0xCA}, 15}, /* ьей */ + {{0xDB, 0xC5, 0xCD}, 15}, /* шем */ + {{0xD5, 0xC2, 0xCC}, 15}, /* убл */ + {{0xD2, 0xC1, 0xC3}, 15}, /* рац */ + {{0xCB, 0xD5, 0xCD}, 15}, /* кум */ + {{0xD2, 0xC5, 0xC7}, 15}, /* рег */ + {{0xCF, 0xD0, 0xC1}, 15}, /* опа */ + {{0xF7, 0xCF, 0xDA}, 15}, /* Воз */ + {{0xD4, 0xC1, 0xC5}, 15}, /* тае */ + {{0xCF, 0xC2, 0xD9}, 15}, /* обы */ + {{0xC2, 0xCC, 0xC9}, 15}, /* бли */ + {{0xD2, 0xCD, 0xC5}, 15}, /* рме */ + {{0xD7, 0xCF, 0xD3}, 15}, /* вос */ + {{0xC1, 0xD3, 0xC9}, 15}, /* аси */ + {{0xD4, 0xC1, 0xCD}, 15}, /* там */ + {{0xD8, 0xCD, 0xC5}, 15}, /* ьме */ + {{0xCF, 0xC7, 0xC1}, 15}, /* ога */ + {{0xC9, 0xCC, 0xCF}, 15}, /* ило */ + {{0xD3, 0xD8, 0xCD}, 15}, /* сьм */ + {{0xD2, 0xD4, 0xC9}, 15}, /* рти */ + {{0xD4, 0xD3, 0xD5}, 15}, /* тсу */ + {{0xD3, 0xC5, 0xCE}, 15}, /* сен */ + {{0xD4, 0xC1, 0xCC}, 15}, /* тал */ + {{0xC4, 0xC1, 0xD2}, 15}, /* дар */ + {{0xC1, 0xCD, 0xCF}, 15}, /* амо */ + {{0xC5, 0xC4, 0xCC}, 15}, /* едл */ + {{0xD3, 0xD5, 0xC2}, 15}, /* суб */ + {{0xC5, 0xCA, 0xC6}, 15}, /* ейф */ + {{0xE8, 0xD2, 0xC1}, 15}, /* Хра */ + {{0xCC, 0xC1, 0xCD}, 14}, /* лам */ + {{0xC1, 0xD2, 0xD5}, 14}, /* ару */ + {{0xC7, 0xC9, 0xC8}, 14}, /* гих */ + {{0xC3, 0xC9, 0xD1}, 14}, /* ция */ + {{0xC4, 0xC1, 0xD7}, 14}, /* дав */ + {{0xCC, 0xC9, 0xDB}, 14}, /* лиш */ + {{0xC0, 0xDE, 0xC1}, 14}, /* юча */ + {{0xC1, 0xCE, 0xD3}, 14}, /* анс */ + {{0xCF, 0xC7, 0xD2}, 14}, /* огр */ + {{0xC9, 0xDD, 0xC1}, 14}, /* ища */ + {{0xC5, 0xCE, 0xD8}, 14}, /* ень */ + {{0xCF, 0xD4, 0xC9}, 14}, /* оти */ + {{0xC1, 0xC4, 0xD9}, 13}, /* ады */ + {{0xC1, 0xDD, 0xC1}, 13}, /* аща */ + {{0xD7, 0xCF, 0xC9}, 13}, /* вои */ + {{0xD7, 0xD9, 0xCD}, 13}, /* вым */ + {{0xD7, 0xD8, 0xD1}, 13}, /* вья */ + {{0xCB, 0xC9, 0xC5}, 13}, /* кие */ + {{0xCC, 0xC9, 0xD3}, 13}, /* лис */ + {{0xCD, 0xC5, 0xC4}, 13}, /* мед */ + {{0xD4, 0xC9, 0xC8}, 13}, /* тих */ + {{0xC5, 0xD4, 0xCF}, 13}, /* ето */ + {{0xDA, 0xCC, 0xCF}, 13}, /* зло */ + {{0xCF, 0xD0, 0xC5}, 13}, /* опе */ + {{0xD3, 0xC9, 0xCD}, 13}, /* сим */ + {{0xD1, 0xDA, 0xC9}, 13}, /* язи */ + {{0xC9, 0xCE, 0xC4}, 13}, /* инд */ + {{0xDE, 0xD5, 0xD6}, 13}, /* чуж */ + {{0xCC, 0xCB, 0xC9}, 13}, /* лки */ + {{0xC4, 0xD0, 0xD2}, 13}, /* дпр */ + {{0xCE, 0xC4, 0xC9}, 13}, /* нди */ + {{0xCF, 0xD4, 0xC1}, 13}, /* ота */ + {{0xCF, 0xD4, 0xD9}, 13}, /* оты */ + {{0xCC, 0xC1, 0xDE}, 13}, /* лач */ + {{0xCB, 0xC9, 0xCD}, 13}, /* ким */ + {{0xC9, 0xD3, 0xC9}, 13}, /* иси */ + {{0xD7, 0xC1, 0xCC}, 13}, /* вал */ + {{0xC5, 0xCD, 0xCF}, 13}, /* емо */ + {{0xD0, 0xD5, 0xC2}, 13}, /* пуб */ + {{0xD1, 0xC5, 0xCD}, 13}, /* яем */ + {{0xC2, 0xCF, 0xCC}, 13}, /* бол */ + {{0xCE, 0xD4, 0xD5}, 13}, /* нту */ + {{0xCE, 0xC5, 0xCA}, 13}, /* ней */ + {{0xCE, 0xC1, 0xD1}, 13}, /* ная */ + {{0xC5, 0xD3, 0xC1}, 13}, /* еса */ + {{0xD2, 0xCE, 0xCF}, 13}, /* рно */ + {{0xDD, 0xC5, 0xCD}, 13}, /* щем */ + {{0xC1, 0xCE, 0xD9}, 13}, /* аны */ + {{0xE4, 0xCF, 0xD7}, 13}, /* Дов */ + {{0xDE, 0xC9, 0xD7}, 13}, /* чив */ + {{0xD7, 0xC9, 0xD3}, 13}, /* вис */ + {{0xCF, 0xD0, 0xCF}, 13}, /* опо */ + {{0xD7, 0xD8, 0xC0}, 13}, /* вью */ + {{0xC1, 0xCC, 0xC1}, 13}, /* ала */ + {{0xCC, 0xC5, 0xCA}, 12}, /* лей */ + {{0xC1, 0xDE, 0xC1}, 12}, /* ача */ + {{0xC5, 0xDA, 0xD7}, 12}, /* езв */ + {{0xD7, 0xC1, 0xD1}, 12}, /* вая */ + {{0xC5, 0xCF, 0xD3}, 12}, /* еос */ + {{0xD1, 0xDD, 0xC9}, 12}, /* ящи */ + {{0xC9, 0xD7, 0xC9}, 12}, /* иви */ + {{0xCE, 0xC5, 0xC5}, 12}, /* нее */ + {{0xD4, 0xD2, 0xD5}, 12}, /* тру */ + {{0xDB, 0xC5, 0xC5}, 12}, /* шее */ + {{0xD3, 0xC1, 0xC8}, 12}, /* сах */ + {{0xC9, 0xCE, 0xC3}, 12}, /* инц */ + {{0xCF, 0xCD, 0xD0}, 12}, /* омп */ + {{0xD5, 0xD6, 0xCF}, 12}, /* ужо */ + {{0xD5, 0xC1, 0xCC}, 12}, /* уал */ + {{0xCE, 0xC1, 0xD4}, 12}, /* нат */ + {{0xC9, 0xC4, 0xD5}, 12}, /* иду */ + {{0xD7, 0xCC, 0xC1}, 12}, /* вла */ + {{0xDA, 0xD7, 0xC1}, 12}, /* зва */ + {{0xCC, 0xC5, 0xC5}, 12}, /* лее */ + {{0xD2, 0xC5, 0xC8}, 12}, /* рех */ + {{0xD6, 0xC4, 0xD5}, 12}, /* жду */ + {{0xCD, 0xC1, 0xCC}, 12}, /* мал */ + {{0xC5, 0xCE, 0xD3}, 12}, /* енс */ + {{0xC9, 0xCA, 0xD3}, 12}, /* ийс */ + {{0xCB, 0xCF, 0xCC}, 12}, /* кол */ + {{0xCE, 0xC1, 0xDA}, 12}, /* наз */ + {{0xC4, 0xD5, 0xC1}, 12}, /* дуа */ + {{0xCF, 0xCE, 0xC9}, 12}, /* они */ + {{0xD3, 0xC5, 0xCD}, 12}, /* сем */ + {{0xC7, 0xCF, 0xC4}, 12}, /* год */ + {{0xCD, 0xC5, 0xD6}, 12}, /* меж */ + {{0xCF, 0xDA, 0xCC}, 12}, /* озл */ + {{0xD7, 0xCD, 0xC5}, 12}, /* вме */ + {{0xD5, 0xC4, 0xC5}, 12}, /* уде */ + {{0xD8, 0xCB, 0xCF}, 12}, /* ько */ + {{0xC5, 0xD7, 0xD9}, 12}, /* евы */ + {{0xDA, 0xC1, 0xCD}, 12}, /* зам */ + {{0xD3, 0xCF, 0xC4}, 12}, /* сод */ + {{0xD2, 0xCF, 0xC5}, 11}, /* рое */ + {{0xCF, 0xD4, 0xC4}, 11}, /* отд */ + {{0xD3, 0xC9, 0xD1}, 11}, /* сия */ + {{0xC9, 0xCB, 0xD5}, 11}, /* ику */ + {{0xD9, 0xCC, 0xC9}, 11}, /* ыли */ + {{0xC7, 0xC9, 0xCD}, 11}, /* гим */ + {{0xCE, 0xD8, 0xDB}, 11}, /* ньш */ + {{0xD4, 0xC9, 0xDE}, 11}, /* тич */ + {{0xD2, 0xC1, 0xCC}, 11}, /* рал */ + {{0xD5, 0xDE, 0xC9}, 11}, /* учи */ + {{0xCD, 0xC5, 0xC0}, 11}, /* мею */ + {{0xD4, 0xC5, 0xCB}, 11}, /* тек */ + {{0xCF, 0xC2, 0xD5}, 11}, /* обу */ + {{0xCE, 0xCE, 0xD5}, 11}, /* нну */ + {{0xCE, 0xC5, 0xD0}, 11}, /* неп */ + {{0xD7, 0xC5, 0xCC}, 11}, /* вел */ + {{0xD4, 0xCD, 0xC5}, 11}, /* тме */ + {{0xC2, 0xCF, 0xC7}, 11}, /* бог */ + {{0xCF, 0xD2, 0xC9}, 11}, /* ори */ + {{0xC1, 0xD7, 0xCE}, 11}, /* авн */ + {{0xC4, 0xC5, 0xC5}, 11}, /* дее */ + {{0xD6, 0xCF, 0xCD}, 11}, /* жом */ + {{0xF7, 0xD2, 0xC5}, 11}, /* Вре */ + {{0xCD, 0xD9, 0xC5}, 11}, /* мые */ + {{0xD8, 0xC3, 0xC1}, 11}, /* ьца */ + {{0xCF, 0xC3, 0xC5}, 11}, /* оце */ + {{0xC9, 0xD4, 0xD9}, 10}, /* иты */ + {{0xDA, 0xD2, 0xC1}, 10}, /* зра */ + {{0xCF, 0xCE, 0xD9}, 10}, /* оны */ + {{0xD2, 0xC5, 0xDB}, 10}, /* реш */ + {{0xD5, 0xDB, 0xC5}, 10}, /* уше */ + {{0xD2, 0xC5, 0xD7}, 10}, /* рев */ + {{0xCF, 0xD0, 0xD5}, 10}, /* опу */ + {{0xD1, 0xD4, 0xD9}, 10}, /* яты */ + {{0xD4, 0xC1, 0xDE}, 10}, /* тач */ + {{0xC5, 0xD2, 0xCF}, 10}, /* еро */ + {{0xD7, 0xCB, 0xCC}, 10}, /* вкл */ + {{0xDA, 0xD9, 0xD7}, 10}, /* зыв */ + {{0xC1, 0xD0, 0xD2}, 10}, /* апр */ + {{0xD2, 0xD5, 0xDB}, 10}, /* руш */ + {{0xEF, 0xD4, 0xD7}, 10}, /* Отв */ + {{0xD2, 0xD3, 0xC1}, 10}, /* рса */ + {{0xC5, 0xCB, 0xD4}, 10}, /* ект */ + {{0xCC, 0xC5, 0xCB}, 10}, /* лек */ + {{0xC5, 0xC5, 0xD4}, 10}, /* еет */ + {{0xCF, 0xD0, 0xCC}, 10}, /* опл */ + {{0xD4, 0xDE, 0xC5}, 10}, /* тче */ + {{0xC7, 0xCF, 0xCD}, 10}, /* гом */ + {{0xD4, 0xCF, 0xD6}, 10}, /* тож */ + {{0xCC, 0xC5, 0xDE}, 10}, /* леч */ + {{0xC5, 0xD4, 0xD9}, 10}, /* еты */ + {{0xCF, 0xD6, 0xC9}, 10}, /* ожи */ + {{0xCD, 0xCE, 0xCF}, 10}, /* мно */ + {{0xCD, 0xCF, 0xCA}, 10}, /* мой */ + {{0xC3, 0xC5, 0xCC}, 10}, /* цел */ + {{0xD5, 0xD0, 0xC9}, 10}, /* упи */ + {{0xC1, 0xC5, 0xD7}, 10}, /* аев */ + {{0xD0, 0xCF, 0xCD}, 10}, /* пом */ + {{0xC4, 0xD1, 0xDD}, 10}, /* дящ */ + {{0xD4, 0xD2, 0xC9}, 10}, /* три */ + {{0xDB, 0xC9, 0xC5}, 10}, /* шие */ + {{0xC5, 0xCB, 0xC1}, 10}, /* ека */ + {{0xC5, 0xDB, 0xC5}, 10}, /* еше */ + {{0xDA, 0xC1, 0xC9}, 10}, /* заи */ + {{0xC9, 0xD4, 0xCF}, 10}, /* ито */ + {{0xDA, 0xCE, 0xD9}, 10}, /* зны */ + {{0xCF, 0xD1, 0xCE}, 10}, /* оян */ + {{0xC9, 0xD6, 0xC5}, 10}, /* иже */ + {{0xD7, 0xCE, 0xC5}, 10}, /* вне */ + {{0xD2, 0xD3, 0xD4}, 10}, /* рст */ + {{0xC5, 0xCD, 0xD1}, 10}, /* емя */ + {{0xCE, 0xC1, 0xC9}, 10}, /* наи */ + {{0xD4, 0xCF, 0xCC}, 10}, /* тол */ + {{0xCC, 0xC9, 0xD4}, 10}, /* лит */ + {{0xCF, 0xD3, 0xD2}, 10}, /* оср */ + {{0xD4, 0xC4, 0xC5}, 10}, /* тде */ + {{0xC5, 0xCD, 0xC9}, 10}, /* еми */ + {{0xCD, 0xC5, 0xC5}, 10}, /* мее */ + {{0xD2, 0xD9, 0xC8}, 10}, /* рых */ + {{0xCE, 0xC9, 0xD7}, 10}, /* нив */ + {{0xC5, 0xD2, 0xD5}, 10}, /* еру */ + {{0xDE, 0xC5, 0xCD}, 10}, /* чем */ + {{0xC4, 0xCF, 0xC2}, 10}, /* доб */ + {{0xC5, 0xCC, 0xCF}, 10}, /* ело */ + {{0xC9, 0xCC, 0xD5}, 10}, /* илу */ + {{0xC1, 0xC4, 0xCC}, 10}, /* адл */ + {{0xC9, 0xDE, 0xD4}, 10}, /* ичт */ + {{0xCD, 0xCC, 0xC5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_windows_1251[] = { + {{0xE5, 0xED, 0xE8}, 991}, /* ени */ + {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ + {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ + {{0xED, 0xE8, 0xFF}, 629}, /* ния */ + {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ + {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ + {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ + {{0xE5, 0xED, 0xED}, 499}, /* енн */ + {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ + {{0xE0, 0xED, 0xE8}, 443}, /* ани */ + {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ + {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ + {{0xED, 0xE8, 0xE5}, 419}, /* ние */ + {{0xED, 0xED, 0xEE}, 412}, /* нно */ + {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ + {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ + {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ + {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ + {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ + {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ + {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ + {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ + {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ + {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ + {{0xEF, 0xF0, 0xE8}, 330}, /* при */ + {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ + {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ + {{0xED, 0xE5, 0xED}, 310}, /* нен */ + {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ + {{0xE2, 0xE0, 0xED}, 304}, /* ван */ + {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ + {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ + {{0xEB, 0xE5, 0xED}, 266}, /* лен */ + {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ + {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ + {{0xED, 0xED, 0xFB}, 260}, /* нны */ + {{0xEB, 0xFC, 0xED}, 256}, /* льн */ + {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ + {{0xE8, 0xEB, 0xE8}, 254}, /* или */ + {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ + {{0xE5, 0xE3, 0xEE}, 241}, /* его */ + {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ + {{0xED, 0xEE, 0xF1}, 236}, /* нос */ + {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ + {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ + {{0xF0, 0xE0, 0xED}, 231}, /* ран */ + {{0xED, 0xEE, 0xE3}, 230}, /* ног */ + {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ + {{0xF7, 0xE5, 0xED}, 226}, /* чен */ + {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ + {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ + {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ + {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ + {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ + {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ + {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ + {{0xE7, 0xE0, 0xED}, 194}, /* зан */ + {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ + {{0xF2, 0xF1, 0xFF}, 191}, /* тся */ + {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ + {{0xE0, 0xED, 0xED}, 182}, /* анн */ + {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ + {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ + {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ + {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ + {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ + {{0xEC, 0xE5, 0xED}, 170}, /* мен */ + {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ + {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ + {{0xF0, 0xE5, 0xED}, 167}, /* рен */ + {{0xF9, 0xE5, 0xED}, 165}, /* щен */ + {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ + {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ + {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ + {{0xFF, 0xE7, 0xE0}, 159}, /* яза */ + {{0xE1, 0xFF, 0xE7}, 158}, /* бяз */ + {{0xED, 0xE8, 0xE8}, 153}, /* нии */ + {{0xED, 0xFB, 0xF5}, 153}, /* ных */ + {{0xF2, 0xFC, 0xFF}, 153}, /* тья */ + {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ + {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ + {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ + {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ + {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ + {{0xED, 0xEE, 0xEC}, 144}, /* ном */ + {{0xE4, 0xE5, 0xED}, 144}, /* ден */ + {{0xE0, 0xED, 0xE5}, 142}, /* ане */ + {{0xEA, 0xEE, 0xED}, 141}, /* кон */ + {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ + {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ + {{0xEE, 0xE1, 0xFF}, 140}, /* обя */ + {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ + {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ + {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ + {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ + {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ + {{0xED, 0xFB, 0xEC}, 136}, /* ным */ + {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ + {{0xD1, 0xF2, 0xE0}, 134}, /* Ста */ + {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ + {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ + {{0xE5, 0xEB, 0xFF}, 130}, /* еля */ + {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ + {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ + {{0xF2, 0xEE, 0xFF}, 129}, /* тоя */ + {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ + {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ + {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ + {{0xE2, 0xE5, 0xED}, 127}, /* вен */ + {{0xED, 0xEE, 0xE2}, 127}, /* нов */ + {{0xED, 0xEE, 0xE5}, 126}, /* ное */ + {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ + {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ + {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ + {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ + {{0xE5, 0xED, 0xF2}, 124}, /* ент */ + {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ + {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ + {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ + {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ + {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ + {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ + {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ + {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ + {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ + {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ + {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ + {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ + {{0xEF, 0xF0, 0xEE}, 114}, /* про */ + {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ + {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ + {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ + {{0xF8, 0xE5, 0xED}, 111}, /* шен */ + {{0xF7, 0xE8, 0xED}, 110}, /* чин */ + {{0xED, 0xE0, 0xF1}, 109}, /* нас */ + {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ + {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ + {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ + {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ + {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ + {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ + {{0xF2, 0xEE, 0xEC}, 104}, /* том */ + {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ + {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ + {{0xEE, 0xEB, 0xED}, 102}, /* олн */ + {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ + {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ + {{0xED, 0xEE, 0xE9}, 101}, /* ной */ + {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ + {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ + {{0xED, 0xFB, 0xE5}, 99}, /* ные */ + {{0xE7, 0xED, 0xE0}, 99}, /* зна */ + {{0xE2, 0xEB, 0xFF}, 99}, /* вля */ + {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ + {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ + {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ + {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ + {{0xED, 0xFB, 0xE9}, 96}, /* ный */ + {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ + {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ + {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ + {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ + {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ + {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ + {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ + {{0xE8, 0xED, 0xE5}, 91}, /* ине */ + {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ + {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ + {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ + {{0xED, 0xE8, 0xF2}, 89}, /* нит */ + {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ + {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ + {{0xE6, 0xE5, 0xED}, 87}, /* жен */ + {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ + {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ + {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ + {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ + {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ + {{0xE2, 0xE8, 0xFF}, 85}, /* вия */ + {{0xFF, 0xF9, 0xE5}, 85}, /* яще */ + {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ + {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ + {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ + {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ + {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ + {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ + {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ + {{0xEE, 0xFF, 0xF9}, 82}, /* оящ */ + {{0xE5, 0xED, 0xEE}, 81}, /* ено */ + {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ + {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ + {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ + {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ + {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ + {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ + {{0xE4, 0xE0, 0xED}, 79}, /* дан */ + {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ + {{0xE8, 0xEC, 0xE5}, 78}, /* име */ + {{0xE8, 0xED, 0xEE}, 78}, /* ино */ + {{0xF0, 0xE8, 0xED}, 77}, /* рин */ + {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ + {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ + {{0xF2, 0xE0, 0xEA}, 77}, /* так */ + {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ + {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ + {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ + {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ + {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ + {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ + {{0xFD, 0xF2, 0xEE}, 75}, /* это */ + {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ + {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ + {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ + {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ + {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ + {{0xE0, 0xED, 0xEE}, 72}, /* ано */ + {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ + {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ + {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ + {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ + {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ + {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ + {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ + {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ + {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ + {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ + {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ + {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ + {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ + {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ + {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ + {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ + {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ + {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ + {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ + {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ + {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ + {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ + {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ + {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ + {{0xF2, 0xED, 0xEE}, 65}, /* тно */ + {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ + {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ + {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ + {{0xEE, 0xE7, 0xED}, 64}, /* озн */ + {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ + {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ + {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ + {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ + {{0xED, 0xE8, 0xFE}, 63}, /* нию */ + {{0xEE, 0xED, 0xE5}, 63}, /* оне */ + {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ + {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ + {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ + {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ + {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ + {{0xF1, 0xED, 0xEE}, 61}, /* сно */ + {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ + {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ + {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ + {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ + {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ + {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ + {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ + {{0xF2, 0xE0, 0xED}, 60}, /* тан */ + {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ + {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ + {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ + {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ + {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ + {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ + {{0xFF, 0xF2, 0xE5}, 60}, /* яте */ + {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ + {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ + {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ + {{0xE0, 0xE1, 0xEE}, 59}, /* або */ + {{0xEB, 0xFF, 0xFE}, 59}, /* ляю */ + {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ + {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ + {{0xE8, 0xED, 0xE8}, 58}, /* ини */ + {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ + {{0xFF, 0xE2, 0xEB}, 58}, /* явл */ + {{0xED, 0xE0, 0xE3}, 57}, /* наг */ + {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ + {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ + {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ + {{0xE8, 0xEE, 0xED}, 57}, /* ион */ + {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ + {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ + {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ + {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ + {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ + {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ + {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ + {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ + {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ + {{0xEB, 0xED, 0xE5}, 54}, /* лне */ + {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ + {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ + {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ + {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ + {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ + {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ + {{0xED, 0xE8, 0xEA}, 54}, /* ник */ + {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ + {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ + {{0xF2, 0xE5, 0xED}, 53}, /* тен */ + {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ + {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ + {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ + {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ + {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ + {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ + {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ + {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ + {{0xFF, 0xFE, 0xF9}, 51}, /* яющ */ + {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ + {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ + {{0xEE, 0xED, 0xEE}, 51}, /* оно */ + {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ + {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ + {{0xEB, 0xFF, 0xE5}, 50}, /* ляе */ + {{0xE5, 0xED, 0xE5}, 50}, /* ене */ + {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ + {{0xEF, 0xF3, 0xED}, 49}, /* пун */ + {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ + {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ + {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ + {{0xED, 0xE5, 0xF1}, 49}, /* нес */ + {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ + {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ + {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ + {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ + {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ + {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ + {{0xF3, 0xED, 0xEA}, 49}, /* унк */ + {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ + {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ + {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ + {{0xFF, 0xE5, 0xF2}, 48}, /* яет */ + {{0xC5, 0xF1, 0xEB}, 48}, /* Есл */ + {{0xCF, 0xF0, 0xE8}, 48}, /* При */ + {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ + {{0xED, 0xE5, 0xF0}, 48}, /* нер */ + {{0xF7, 0xED, 0xEE}, 47}, /* чно */ + {{0xEF, 0xEE, 0xE4}, 47}, /* под */ + {{0xED, 0xF2, 0xE0}, 47}, /* нта */ + {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ + {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ + {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ + {{0xE6, 0xED, 0xEE}, 47}, /* жно */ + {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ + {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ + {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ + {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ + {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ + {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ + {{0xF7, 0xF2, 0xEE}, 46}, /* что */ + {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ + {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ + {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ + {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ + {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ + {{0xE4, 0xEB, 0xFF}, 45}, /* для */ + {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ + {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ + {{0xED, 0xFF, 0xF2}, 44}, /* нят */ + {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ + {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ + {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ + {{0xEE, 0xF1, 0xED}, 43}, /* осн */ + {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ + {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ + {{0xE8, 0xED, 0xFB}, 43}, /* ины */ + {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ + {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ + {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ + {{0xE8, 0xFF, 0xEC}, 43}, /* иям */ + {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ + {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ + {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ + {{0xF7, 0xE0, 0xFF}, 42}, /* чая */ + {{0xED, 0xE8, 0xEC}, 42}, /* ним */ + {{0xE8, 0xE7, 0xED}, 42}, /* изн */ + {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ + {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ + {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ + {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ + {{0xF6, 0xE5, 0xED}, 42}, /* цен */ + {{0xF7, 0xE0, 0xF1}, 42}, /* час */ + {{0xE3, 0xE0, 0xED}, 42}, /* ган */ + {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ + {{0xF1, 0xF2, 0xED}, 42}, /* стн */ + {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ + {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ + {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ + {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ + {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ + {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ + {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ + {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ + {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ + {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ + {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ + {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ + {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ + {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ + {{0xED, 0xF2, 0xE5}, 40}, /* нте */ + {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ + {{0xE1, 0xFB, 0xEB}, 40}, /* был */ + {{0xE8, 0xED, 0xFF}, 40}, /* иня */ + {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ + {{0xE3, 0xE5, 0xED}, 39}, /* ген */ + {{0xCA, 0xEE, 0xE4}, 39}, /* Код */ + {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ + {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ + {{0xE8, 0xED, 0xF2}, 39}, /* инт */ + {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ + {{0xF0, 0xEE, 0xED}, 39}, /* рон */ + {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ + {{0xE4, 0xEE, 0xEA}, 39}, /* док */ + {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ + {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ + {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ + {{0xE7, 0xED, 0xE8}, 38}, /* зни */ + {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ + {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ + {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ + {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ + {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ + {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ + {{0xE1, 0xE5, 0xE7}, 37}, /* без */ + {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ + {{0xEE, 0xF0, 0xFF}, 37}, /* оря */ + {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ + {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ + {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ + {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ + {{0xED, 0xF6, 0xE5}, 37}, /* нце */ + {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ + {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ + {{0xEE, 0xED, 0xE0}, 37}, /* она */ + {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ + {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ + {{0xF0, 0xEE, 0xE4}, 37}, /* род */ + {{0xE5, 0xED, 0xE0}, 37}, /* ена */ + {{0xEE, 0xED, 0xF6}, 37}, /* онц */ + {{0xEE, 0xF2, 0xED}, 37}, /* отн */ + {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ + {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ + {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ + {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ + {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ + {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ + {{0xED, 0xE5, 0xEE}, 36}, /* нео */ + {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ + {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ + {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ + {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ + {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ + {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ + {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ + {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ + {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ + {{0xED, 0xE5, 0xE4}, 34}, /* нед */ + {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ + {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ + {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ + {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ + {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ + {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ + {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ + {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ + {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ + {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ + {{0xFA, 0xFF, 0xE2}, 33}, /* ъяв */ + {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ + {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ + {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ + {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ + {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ + {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ + {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ + {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ + {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ + {{0xE0, 0xED, 0xE0}, 32}, /* ана */ + {{0xED, 0xE0, 0xE4}, 32}, /* над */ + {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ + {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ + {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ + {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ + {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ + {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ + {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ + {{0xFF, 0xF2, 0xFC}, 31}, /* ять */ + {{0xEE, 0xFF, 0xF2}, 31}, /* оят */ + {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ + {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ + {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ + {{0xE5, 0xED, 0xFB}, 31}, /* ены */ + {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ + {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ + {{0xFF, 0xFE, 0xF2}, 30}, /* яют */ + {{0xF0, 0xFF, 0xE4}, 30}, /* ряд */ + {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ + {{0xE8, 0xEC, 0xE0}, 30}, /* има */ + {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ + {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ + {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ + {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ + {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ + {{0xED, 0xE8, 0xE9}, 30}, /* ний */ + {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ + {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ + {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ + {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ + {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ + {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ + {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ + {{0xE4, 0xE5, 0xFF}, 29}, /* дея */ + {{0xE5, 0xFF, 0xF2}, 29}, /* еят */ + {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ + {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ + {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ + {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ + {{0xEE, 0xE4, 0xED}, 28}, /* одн */ + {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ + {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ + {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ + {{0xC4, 0xEE, 0xE3}, 28}, /* Дог */ + {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ + {{0xED, 0xEE, 0xF8}, 28}, /* нош */ + {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ + {{0xE8, 0xED, 0xE0}, 28}, /* ина */ + {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ + {{0xED, 0xE0, 0xEB}, 28}, /* нал */ + {{0xED, 0xE8, 0xE7}, 27}, /* низ */ + {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ + {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ + {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ + {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ + {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ + {{0xE4, 0xED, 0xEE}, 27}, /* дно */ + {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ + {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ + {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ + {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ + {{0xEE, 0xED, 0xEA}, 26}, /* онк */ + {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ + {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ + {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ + {{0xFF, 0xEC, 0xE8}, 26}, /* ями */ + {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ + {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ + {{0xED, 0xEA, 0xF3}, 26}, /* нку */ + {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ + {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ + {{0xED, 0xE8, 0xED}, 25}, /* нин */ + {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ + {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ + {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ + {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ + {{0xE5, 0xF1, 0xFF}, 25}, /* еся */ + {{0xED, 0xE8, 0xF7}, 25}, /* нич */ + {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ + {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ + {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ + {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ + {{0xE6, 0xED, 0xFB}, 25}, /* жны */ + {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ + {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ + {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ + {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ + {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ + {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ + {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ + {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ + {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ + {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ + {{0xE8, 0xFF, 0xF5}, 24}, /* иях */ + {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ + {{0xFC, 0xF1, 0xFF}, 24}, /* ься */ + {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ + {{0xEE, 0xF7, 0xED}, 24}, /* очн */ + {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ + {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ + {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ + {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ + {{0xE0, 0xFF, 0xF5}, 24}, /* аях */ + {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ + {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ + {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ + {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ + {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ + {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ + {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ + {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ + {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ + {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ + {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ + {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ + {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ + {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ + {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ + {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ + {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ + {{0xE1, 0xFA, 0xFF}, 23}, /* бъя */ + {{0xED, 0xE0, 0xF7}, 23}, /* нач */ + {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ + {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ + {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ + {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ + {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ + {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ + {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ + {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ + {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ + {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ + {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ + {{0xED, 0xE5, 0xE7}, 22}, /* нез */ + {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ + {{0xF1, 0xE2, 0xFF}, 22}, /* свя */ + {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ + {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ + {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ + {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ + {{0xED, 0xE5, 0xEC}, 22}, /* нем */ + {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ + {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ + {{0xE2, 0xFF, 0xE7}, 22}, /* вяз */ + {{0xFF, 0xF2, 0xE8}, 22}, /* яти */ + {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ + {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ + {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ + {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ + {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ + {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ + {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ + {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ + {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ + {{0xEA, 0xE0, 0xEA}, 21}, /* как */ + {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ + {{0xED, 0xE0, 0xEC}, 21}, /* нам */ + {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ + {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ + {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ + {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ + {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ + {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ + {{0xE1, 0xE0, 0xED}, 21}, /* бан */ + {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ + {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ + {{0xEB, 0xED, 0xEE}, 21}, /* лно */ + {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ + {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ + {{0xFF, 0xE4, 0xEA}, 21}, /* ядк */ + {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ + {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ + {{0xE0, 0xED, 0xEA}, 21}, /* анк */ + {{0xED, 0xE5, 0xE3}, 21}, /* нег */ + {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ + {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ + {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ + {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ + {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ + {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ + {{0xF2, 0xED, 0xE8}, 21}, /* тни */ + {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ + {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ + {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ + {{0xE0, 0xF0, 0xED}, 20}, /* арн */ + {{0xF7, 0xED, 0xFB}, 20}, /* чны */ + {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ + {{0xF2, 0xE8, 0xFF}, 20}, /* тия */ + {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ + {{0xD1, 0xF2, 0xF0}, 20}, /* Стр */ + {{0xED, 0xF2, 0xEE}, 20}, /* нто */ + {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ + {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ + {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ + {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ + {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ + {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ + {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ + {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ + {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ + {{0xE2, 0xF1, 0xE5}, 19}, /* все */ + {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ + {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ + {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ + {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ + {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ + {{0xE5, 0xE4, 0xED}, 19}, /* едн */ + {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ + {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ + {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ + {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ + {{0xF2, 0xEE, 0xE9}, 19}, /* той */ + {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ + {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ + {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ + {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ + {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ + {{0xE5, 0xED, 0xFF}, 19}, /* еня */ + {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ + {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ + {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ + {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ + {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ + {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ + {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ + {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ + {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ + {{0xE0, 0xE7, 0xED}, 18}, /* азн */ + {{0xF2, 0xED, 0xFB}, 18}, /* тны */ + {{0xEE, 0xE4, 0xFF}, 18}, /* одя */ + {{0xEE, 0xE1, 0xED}, 18}, /* обн */ + {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ + {{0xEE, 0xF1, 0xFF}, 18}, /* ося */ + {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ + {{0xED, 0xFF, 0xFE}, 18}, /* няю */ + {{0xED, 0xE0, 0xF0}, 18}, /* нар */ + {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ + {{0xE0, 0xF1, 0xED}, 18}, /* асн */ + {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ + {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ + {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ + {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ + {{0xED, 0xF6, 0xE8}, 18}, /* нци */ + {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ + {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ + {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ + {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ + {{0xCE, 0xE1, 0xFF}, 18}, /* Обя */ + {{0xCF, 0xF0, 0xE0}, 18}, /* Пра */ + {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ + {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ + {{0xEB, 0xED, 0xE8}, 18}, /* лни */ + {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ + {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ + {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ + {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ + {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ + {{0xF0, 0xED, 0xFB}, 17}, /* рны */ + {{0xE1, 0xED, 0xFB}, 17}, /* бны */ + {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ + {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ + {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ + {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ + {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ + {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ + {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ + {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ + {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ + {{0xE4, 0xE8, 0xE2}, 17}, /* див */ + {{0xED, 0xE0, 0xED}, 17}, /* нан */ + {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ + {{0xE4, 0xED, 0xE5}, 17}, /* дне */ + {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ + {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ + {{0xED, 0xE0, 0xF5}, 17}, /* нах */ + {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ + {{0xE0, 0xEB, 0xE8}, 17}, /* али */ + {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ + {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ + {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ + {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ + {{0xFF, 0xE2, 0xE8}, 16}, /* яви */ + {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ + {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ + {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ + {{0xED, 0xF3, 0xFE}, 16}, /* ную */ + {{0xEF, 0xE5, 0xED}, 16}, /* пен */ + {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ + {{0xEE, 0xED, 0xED}, 16}, /* онн */ + {{0xE2, 0xE8, 0xED}, 16}, /* вин */ + {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ + {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ + {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ + {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ + {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ + {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ + {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ + {{0xCA, 0xEE, 0xEC}, 16}, /* Ком */ + {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ + {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ + {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ + {{0xEF, 0xEE, 0xED}, 16}, /* пон */ + {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ + {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ + {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ + {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ + {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ + {{0xE2, 0xED, 0xEE}, 16}, /* вно */ + {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ + {{0xCB, 0xE8, 0xF6}, 15}, /* Лиц */ + {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ + {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ + {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ + {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ + {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ + {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ + {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ + {{0xC2, 0xEE, 0xE7}, 15}, /* Воз */ + {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ + {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ + {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ + {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ + {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ + {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ + {{0xF2, 0xE0, 0xEC}, 15}, /* там */ + {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ + {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ + {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ + {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ + {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ + {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ + {{0xF1, 0xE5, 0xED}, 15}, /* сен */ + {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ + {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ + {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ + {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ + {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ + {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ + {{0xD5, 0xF0, 0xE0}, 15}, /* Хра */ + {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ + {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ + {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ + {{0xF6, 0xE8, 0xFF}, 14}, /* ция */ + {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ + {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ + {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ + {{0xE0, 0xED, 0xF1}, 14}, /* анс */ + {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ + {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ + {{0xE5, 0xED, 0xFC}, 14}, /* ень */ + {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ + {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ + {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ + {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ + {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ + {{0xE2, 0xFC, 0xFF}, 13}, /* вья */ + {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ + {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ + {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ + {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ + {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ + {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ + {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ + {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ + {{0xFF, 0xE7, 0xE8}, 13}, /* язи */ + {{0xE8, 0xED, 0xE4}, 13}, /* инд */ + {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ + {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ + {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ + {{0xED, 0xE4, 0xE8}, 13}, /* нди */ + {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ + {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ + {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ + {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ + {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ + {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ + {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ + {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ + {{0xFF, 0xE5, 0xEC}, 13}, /* яем */ + {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ + {{0xED, 0xF2, 0xF3}, 13}, /* нту */ + {{0xED, 0xE5, 0xE9}, 13}, /* ней */ + {{0xED, 0xE0, 0xFF}, 13}, /* ная */ + {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ + {{0xF0, 0xED, 0xEE}, 13}, /* рно */ + {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ + {{0xE0, 0xED, 0xFB}, 13}, /* аны */ + {{0xC4, 0xEE, 0xE2}, 13}, /* Дов */ + {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ + {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ + {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ + {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ + {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ + {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ + {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ + {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ + {{0xE2, 0xE0, 0xFF}, 12}, /* вая */ + {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ + {{0xFF, 0xF9, 0xE8}, 12}, /* ящи */ + {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ + {{0xED, 0xE5, 0xE5}, 12}, /* нее */ + {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ + {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ + {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ + {{0xE8, 0xED, 0xF6}, 12}, /* инц */ + {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ + {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ + {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ + {{0xED, 0xE0, 0xF2}, 12}, /* нат */ + {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ + {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ + {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ + {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ + {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ + {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ + {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ + {{0xE5, 0xED, 0xF1}, 12}, /* енс */ + {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ + {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ + {{0xED, 0xE0, 0xE7}, 12}, /* наз */ + {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ + {{0xEE, 0xED, 0xE8}, 12}, /* они */ + {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ + {{0xE3, 0xEE, 0xE4}, 12}, /* год */ + {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ + {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ + {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ + {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ + {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ + {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ + {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ + {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ + {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ + {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ + {{0xF1, 0xE8, 0xFF}, 11}, /* сия */ + {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ + {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ + {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ + {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ + {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ + {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ + {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ + {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ + {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ + {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ + {{0xED, 0xED, 0xF3}, 11}, /* нну */ + {{0xED, 0xE5, 0xEF}, 11}, /* неп */ + {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ + {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ + {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ + {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ + {{0xE0, 0xE2, 0xED}, 11}, /* авн */ + {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ + {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ + {{0xC2, 0xF0, 0xE5}, 11}, /* Вре */ + {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ + {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ + {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ + {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ + {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ + {{0xEE, 0xED, 0xFB}, 10}, /* оны */ + {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ + {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ + {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ + {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ + {{0xFF, 0xF2, 0xFB}, 10}, /* яты */ + {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ + {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ + {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ + {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ + {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ + {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ + {{0xCE, 0xF2, 0xE2}, 10}, /* Отв */ + {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ + {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ + {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ + {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ + {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ + {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ + {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ + {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ + {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ + {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ + {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ + {{0xEC, 0xED, 0xEE}, 10}, /* мно */ + {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ + {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ + {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ + {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ + {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ + {{0xE4, 0xFF, 0xF9}, 10}, /* дящ */ + {{0xF2, 0xF0, 0xE8}, 10}, /* три */ + {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ + {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ + {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ + {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ + {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ + {{0xE7, 0xED, 0xFB}, 10}, /* зны */ + {{0xEE, 0xFF, 0xED}, 10}, /* оян */ + {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ + {{0xE2, 0xED, 0xE5}, 10}, /* вне */ + {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ + {{0xE5, 0xEC, 0xFF}, 10}, /* емя */ + {{0xED, 0xE0, 0xE8}, 10}, /* наи */ + {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ + {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ + {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ + {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ + {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ + {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ + {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ + {{0xED, 0xE8, 0xE2}, 10}, /* нив */ + {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ + {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ + {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ + {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ + {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ + {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ + {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ + {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_x_mac_cyrillic[] = { + {{0xE5, 0xED, 0xE8}, 991}, /* ени */ + {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ + {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ + {{0xED, 0xE8, 0xDF}, 629}, /* ния */ + {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ + {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ + {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ + {{0xE5, 0xED, 0xED}, 499}, /* енн */ + {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ + {{0xE0, 0xED, 0xE8}, 443}, /* ани */ + {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ + {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ + {{0xED, 0xE8, 0xE5}, 419}, /* ние */ + {{0xED, 0xED, 0xEE}, 412}, /* нно */ + {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ + {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ + {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ + {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ + {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ + {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ + {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ + {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ + {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ + {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ + {{0xEF, 0xF0, 0xE8}, 330}, /* при */ + {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ + {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ + {{0xED, 0xE5, 0xED}, 310}, /* нен */ + {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ + {{0xE2, 0xE0, 0xED}, 304}, /* ван */ + {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ + {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ + {{0xEB, 0xE5, 0xED}, 266}, /* лен */ + {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ + {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ + {{0xED, 0xED, 0xFB}, 260}, /* нны */ + {{0xEB, 0xFC, 0xED}, 256}, /* льн */ + {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ + {{0xE8, 0xEB, 0xE8}, 254}, /* или */ + {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ + {{0xE5, 0xE3, 0xEE}, 241}, /* его */ + {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ + {{0xED, 0xEE, 0xF1}, 236}, /* нос */ + {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ + {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ + {{0xF0, 0xE0, 0xED}, 231}, /* ран */ + {{0xED, 0xEE, 0xE3}, 230}, /* ног */ + {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ + {{0xF7, 0xE5, 0xED}, 226}, /* чен */ + {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ + {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ + {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ + {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ + {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ + {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ + {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ + {{0xE7, 0xE0, 0xED}, 194}, /* зан */ + {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ + {{0xF2, 0xF1, 0xDF}, 191}, /* тся */ + {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ + {{0xE0, 0xED, 0xED}, 182}, /* анн */ + {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ + {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ + {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ + {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ + {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ + {{0xEC, 0xE5, 0xED}, 170}, /* мен */ + {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ + {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ + {{0xF0, 0xE5, 0xED}, 167}, /* рен */ + {{0xF9, 0xE5, 0xED}, 165}, /* щен */ + {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ + {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ + {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ + {{0xDF, 0xE7, 0xE0}, 159}, /* яза */ + {{0xE1, 0xDF, 0xE7}, 158}, /* бяз */ + {{0xED, 0xE8, 0xE8}, 153}, /* нии */ + {{0xED, 0xFB, 0xF5}, 153}, /* ных */ + {{0xF2, 0xFC, 0xDF}, 153}, /* тья */ + {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ + {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ + {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ + {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ + {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ + {{0xED, 0xEE, 0xEC}, 144}, /* ном */ + {{0xE4, 0xE5, 0xED}, 144}, /* ден */ + {{0xE0, 0xED, 0xE5}, 142}, /* ане */ + {{0xEA, 0xEE, 0xED}, 141}, /* кон */ + {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ + {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ + {{0xEE, 0xE1, 0xDF}, 140}, /* обя */ + {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ + {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ + {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ + {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ + {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ + {{0xED, 0xFB, 0xEC}, 136}, /* ным */ + {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ + {{0x91, 0xF2, 0xE0}, 134}, /* Ста */ + {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ + {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ + {{0xE5, 0xEB, 0xDF}, 130}, /* еля */ + {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ + {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ + {{0xF2, 0xEE, 0xDF}, 129}, /* тоя */ + {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ + {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ + {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ + {{0xE2, 0xE5, 0xED}, 127}, /* вен */ + {{0xED, 0xEE, 0xE2}, 127}, /* нов */ + {{0xED, 0xEE, 0xE5}, 126}, /* ное */ + {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ + {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ + {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ + {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ + {{0xE5, 0xED, 0xF2}, 124}, /* ент */ + {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ + {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ + {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ + {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ + {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ + {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ + {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ + {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ + {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ + {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ + {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ + {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ + {{0xEF, 0xF0, 0xEE}, 114}, /* про */ + {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ + {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ + {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ + {{0xF8, 0xE5, 0xED}, 111}, /* шен */ + {{0xF7, 0xE8, 0xED}, 110}, /* чин */ + {{0xED, 0xE0, 0xF1}, 109}, /* нас */ + {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ + {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ + {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ + {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ + {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ + {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ + {{0xF2, 0xEE, 0xEC}, 104}, /* том */ + {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ + {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ + {{0xEE, 0xEB, 0xED}, 102}, /* олн */ + {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ + {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ + {{0xED, 0xEE, 0xE9}, 101}, /* ной */ + {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ + {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ + {{0xED, 0xFB, 0xE5}, 99}, /* ные */ + {{0xE7, 0xED, 0xE0}, 99}, /* зна */ + {{0xE2, 0xEB, 0xDF}, 99}, /* вля */ + {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ + {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ + {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ + {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ + {{0xED, 0xFB, 0xE9}, 96}, /* ный */ + {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ + {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ + {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ + {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ + {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ + {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ + {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ + {{0xE8, 0xED, 0xE5}, 91}, /* ине */ + {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ + {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ + {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ + {{0xED, 0xE8, 0xF2}, 89}, /* нит */ + {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ + {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ + {{0xE6, 0xE5, 0xED}, 87}, /* жен */ + {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ + {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ + {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ + {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ + {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ + {{0xE2, 0xE8, 0xDF}, 85}, /* вия */ + {{0xDF, 0xF9, 0xE5}, 85}, /* яще */ + {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ + {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ + {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ + {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ + {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ + {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ + {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ + {{0xEE, 0xDF, 0xF9}, 82}, /* оящ */ + {{0xE5, 0xED, 0xEE}, 81}, /* ено */ + {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ + {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ + {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ + {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ + {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ + {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ + {{0xE4, 0xE0, 0xED}, 79}, /* дан */ + {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ + {{0xE8, 0xEC, 0xE5}, 78}, /* име */ + {{0xE8, 0xED, 0xEE}, 78}, /* ино */ + {{0xF0, 0xE8, 0xED}, 77}, /* рин */ + {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ + {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ + {{0xF2, 0xE0, 0xEA}, 77}, /* так */ + {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ + {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ + {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ + {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ + {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ + {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ + {{0xFD, 0xF2, 0xEE}, 75}, /* это */ + {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ + {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ + {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ + {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ + {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ + {{0xE0, 0xED, 0xEE}, 72}, /* ано */ + {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ + {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ + {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ + {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ + {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ + {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ + {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ + {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ + {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ + {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ + {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ + {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ + {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ + {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ + {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ + {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ + {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ + {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ + {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ + {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ + {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ + {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ + {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ + {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ + {{0xF2, 0xED, 0xEE}, 65}, /* тно */ + {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ + {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ + {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ + {{0xEE, 0xE7, 0xED}, 64}, /* озн */ + {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ + {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ + {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ + {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ + {{0xED, 0xE8, 0xFE}, 63}, /* нию */ + {{0xEE, 0xED, 0xE5}, 63}, /* оне */ + {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ + {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ + {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ + {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ + {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ + {{0xF1, 0xED, 0xEE}, 61}, /* сно */ + {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ + {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ + {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ + {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ + {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ + {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ + {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ + {{0xF2, 0xE0, 0xED}, 60}, /* тан */ + {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ + {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ + {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ + {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ + {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ + {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ + {{0xDF, 0xF2, 0xE5}, 60}, /* яте */ + {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ + {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ + {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ + {{0xE0, 0xE1, 0xEE}, 59}, /* або */ + {{0xEB, 0xDF, 0xFE}, 59}, /* ляю */ + {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ + {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ + {{0xE8, 0xED, 0xE8}, 58}, /* ини */ + {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ + {{0xDF, 0xE2, 0xEB}, 58}, /* явл */ + {{0xED, 0xE0, 0xE3}, 57}, /* наг */ + {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ + {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ + {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ + {{0xE8, 0xEE, 0xED}, 57}, /* ион */ + {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ + {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ + {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ + {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ + {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ + {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ + {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ + {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ + {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ + {{0xEB, 0xED, 0xE5}, 54}, /* лне */ + {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ + {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ + {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ + {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ + {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ + {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ + {{0xED, 0xE8, 0xEA}, 54}, /* ник */ + {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ + {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ + {{0xF2, 0xE5, 0xED}, 53}, /* тен */ + {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ + {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ + {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ + {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ + {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ + {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ + {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ + {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ + {{0xDF, 0xFE, 0xF9}, 51}, /* яющ */ + {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ + {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ + {{0xEE, 0xED, 0xEE}, 51}, /* оно */ + {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ + {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ + {{0xEB, 0xDF, 0xE5}, 50}, /* ляе */ + {{0xE5, 0xED, 0xE5}, 50}, /* ене */ + {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ + {{0xEF, 0xF3, 0xED}, 49}, /* пун */ + {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ + {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ + {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ + {{0xED, 0xE5, 0xF1}, 49}, /* нес */ + {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ + {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ + {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ + {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ + {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ + {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ + {{0xF3, 0xED, 0xEA}, 49}, /* унк */ + {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ + {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ + {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ + {{0xDF, 0xE5, 0xF2}, 48}, /* яет */ + {{0x85, 0xF1, 0xEB}, 48}, /* Есл */ + {{0x8F, 0xF0, 0xE8}, 48}, /* При */ + {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ + {{0xED, 0xE5, 0xF0}, 48}, /* нер */ + {{0xF7, 0xED, 0xEE}, 47}, /* чно */ + {{0xEF, 0xEE, 0xE4}, 47}, /* под */ + {{0xED, 0xF2, 0xE0}, 47}, /* нта */ + {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ + {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ + {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ + {{0xE6, 0xED, 0xEE}, 47}, /* жно */ + {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ + {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ + {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ + {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ + {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ + {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ + {{0xF7, 0xF2, 0xEE}, 46}, /* что */ + {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ + {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ + {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ + {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ + {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ + {{0xE4, 0xEB, 0xDF}, 45}, /* для */ + {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ + {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ + {{0xED, 0xDF, 0xF2}, 44}, /* нят */ + {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ + {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ + {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ + {{0xEE, 0xF1, 0xED}, 43}, /* осн */ + {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ + {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ + {{0xE8, 0xED, 0xFB}, 43}, /* ины */ + {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ + {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ + {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ + {{0xE8, 0xDF, 0xEC}, 43}, /* иям */ + {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ + {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ + {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ + {{0xF7, 0xE0, 0xDF}, 42}, /* чая */ + {{0xED, 0xE8, 0xEC}, 42}, /* ним */ + {{0xE8, 0xE7, 0xED}, 42}, /* изн */ + {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ + {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ + {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ + {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ + {{0xF6, 0xE5, 0xED}, 42}, /* цен */ + {{0xF7, 0xE0, 0xF1}, 42}, /* час */ + {{0xE3, 0xE0, 0xED}, 42}, /* ган */ + {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ + {{0xF1, 0xF2, 0xED}, 42}, /* стн */ + {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ + {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ + {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ + {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ + {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ + {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ + {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ + {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ + {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ + {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ + {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ + {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ + {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ + {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ + {{0xED, 0xF2, 0xE5}, 40}, /* нте */ + {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ + {{0xE1, 0xFB, 0xEB}, 40}, /* был */ + {{0xE8, 0xED, 0xDF}, 40}, /* иня */ + {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ + {{0xE3, 0xE5, 0xED}, 39}, /* ген */ + {{0x8A, 0xEE, 0xE4}, 39}, /* Код */ + {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ + {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ + {{0xE8, 0xED, 0xF2}, 39}, /* инт */ + {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ + {{0xF0, 0xEE, 0xED}, 39}, /* рон */ + {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ + {{0xE4, 0xEE, 0xEA}, 39}, /* док */ + {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ + {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ + {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ + {{0xE7, 0xED, 0xE8}, 38}, /* зни */ + {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ + {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ + {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ + {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ + {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ + {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ + {{0xE1, 0xE5, 0xE7}, 37}, /* без */ + {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ + {{0xEE, 0xF0, 0xDF}, 37}, /* оря */ + {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ + {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ + {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ + {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ + {{0xED, 0xF6, 0xE5}, 37}, /* нце */ + {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ + {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ + {{0xEE, 0xED, 0xE0}, 37}, /* она */ + {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ + {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ + {{0xF0, 0xEE, 0xE4}, 37}, /* род */ + {{0xE5, 0xED, 0xE0}, 37}, /* ена */ + {{0xEE, 0xED, 0xF6}, 37}, /* онц */ + {{0xEE, 0xF2, 0xED}, 37}, /* отн */ + {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ + {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ + {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ + {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ + {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ + {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ + {{0xED, 0xE5, 0xEE}, 36}, /* нео */ + {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ + {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ + {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ + {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ + {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ + {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ + {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ + {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ + {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ + {{0xED, 0xE5, 0xE4}, 34}, /* нед */ + {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ + {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ + {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ + {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ + {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ + {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ + {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ + {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ + {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ + {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ + {{0xFA, 0xDF, 0xE2}, 33}, /* ъяв */ + {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ + {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ + {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ + {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ + {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ + {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ + {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ + {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ + {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ + {{0xE0, 0xED, 0xE0}, 32}, /* ана */ + {{0xED, 0xE0, 0xE4}, 32}, /* над */ + {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ + {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ + {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ + {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ + {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ + {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ + {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ + {{0xDF, 0xF2, 0xFC}, 31}, /* ять */ + {{0xEE, 0xDF, 0xF2}, 31}, /* оят */ + {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ + {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ + {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ + {{0xE5, 0xED, 0xFB}, 31}, /* ены */ + {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ + {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ + {{0xDF, 0xFE, 0xF2}, 30}, /* яют */ + {{0xF0, 0xDF, 0xE4}, 30}, /* ряд */ + {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ + {{0xE8, 0xEC, 0xE0}, 30}, /* има */ + {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ + {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ + {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ + {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ + {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ + {{0xED, 0xE8, 0xE9}, 30}, /* ний */ + {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ + {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ + {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ + {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ + {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ + {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ + {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ + {{0xE4, 0xE5, 0xDF}, 29}, /* дея */ + {{0xE5, 0xDF, 0xF2}, 29}, /* еят */ + {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ + {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ + {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ + {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ + {{0xEE, 0xE4, 0xED}, 28}, /* одн */ + {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ + {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ + {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ + {{0x84, 0xEE, 0xE3}, 28}, /* Дог */ + {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ + {{0xED, 0xEE, 0xF8}, 28}, /* нош */ + {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ + {{0xE8, 0xED, 0xE0}, 28}, /* ина */ + {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ + {{0xED, 0xE0, 0xEB}, 28}, /* нал */ + {{0xED, 0xE8, 0xE7}, 27}, /* низ */ + {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ + {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ + {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ + {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ + {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ + {{0xE4, 0xED, 0xEE}, 27}, /* дно */ + {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ + {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ + {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ + {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ + {{0xEE, 0xED, 0xEA}, 26}, /* онк */ + {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ + {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ + {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ + {{0xDF, 0xEC, 0xE8}, 26}, /* ями */ + {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ + {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ + {{0xED, 0xEA, 0xF3}, 26}, /* нку */ + {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ + {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ + {{0xED, 0xE8, 0xED}, 25}, /* нин */ + {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ + {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ + {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ + {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ + {{0xE5, 0xF1, 0xDF}, 25}, /* еся */ + {{0xED, 0xE8, 0xF7}, 25}, /* нич */ + {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ + {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ + {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ + {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ + {{0xE6, 0xED, 0xFB}, 25}, /* жны */ + {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ + {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ + {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ + {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ + {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ + {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ + {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ + {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ + {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ + {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ + {{0xE8, 0xDF, 0xF5}, 24}, /* иях */ + {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ + {{0xFC, 0xF1, 0xDF}, 24}, /* ься */ + {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ + {{0xEE, 0xF7, 0xED}, 24}, /* очн */ + {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ + {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ + {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ + {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ + {{0xE0, 0xDF, 0xF5}, 24}, /* аях */ + {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ + {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ + {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ + {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ + {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ + {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ + {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ + {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ + {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ + {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ + {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ + {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ + {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ + {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ + {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ + {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ + {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ + {{0xE1, 0xFA, 0xDF}, 23}, /* бъя */ + {{0xED, 0xE0, 0xF7}, 23}, /* нач */ + {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ + {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ + {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ + {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ + {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ + {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ + {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ + {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ + {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ + {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ + {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ + {{0xED, 0xE5, 0xE7}, 22}, /* нез */ + {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ + {{0xF1, 0xE2, 0xDF}, 22}, /* свя */ + {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ + {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ + {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ + {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ + {{0xED, 0xE5, 0xEC}, 22}, /* нем */ + {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ + {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ + {{0xE2, 0xDF, 0xE7}, 22}, /* вяз */ + {{0xDF, 0xF2, 0xE8}, 22}, /* яти */ + {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ + {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ + {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ + {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ + {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ + {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ + {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ + {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ + {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ + {{0xEA, 0xE0, 0xEA}, 21}, /* как */ + {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ + {{0xED, 0xE0, 0xEC}, 21}, /* нам */ + {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ + {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ + {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ + {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ + {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ + {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ + {{0xE1, 0xE0, 0xED}, 21}, /* бан */ + {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ + {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ + {{0xEB, 0xED, 0xEE}, 21}, /* лно */ + {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ + {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ + {{0xDF, 0xE4, 0xEA}, 21}, /* ядк */ + {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ + {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ + {{0xE0, 0xED, 0xEA}, 21}, /* анк */ + {{0xED, 0xE5, 0xE3}, 21}, /* нег */ + {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ + {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ + {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ + {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ + {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ + {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ + {{0xF2, 0xED, 0xE8}, 21}, /* тни */ + {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ + {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ + {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ + {{0xE0, 0xF0, 0xED}, 20}, /* арн */ + {{0xF7, 0xED, 0xFB}, 20}, /* чны */ + {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ + {{0xF2, 0xE8, 0xDF}, 20}, /* тия */ + {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ + {{0x91, 0xF2, 0xF0}, 20}, /* Стр */ + {{0xED, 0xF2, 0xEE}, 20}, /* нто */ + {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ + {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ + {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ + {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ + {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ + {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ + {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ + {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ + {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ + {{0xE2, 0xF1, 0xE5}, 19}, /* все */ + {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ + {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ + {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ + {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ + {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ + {{0xE5, 0xE4, 0xED}, 19}, /* едн */ + {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ + {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ + {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ + {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ + {{0xF2, 0xEE, 0xE9}, 19}, /* той */ + {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ + {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ + {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ + {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ + {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ + {{0xE5, 0xED, 0xDF}, 19}, /* еня */ + {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ + {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ + {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ + {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ + {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ + {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ + {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ + {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ + {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ + {{0xE0, 0xE7, 0xED}, 18}, /* азн */ + {{0xF2, 0xED, 0xFB}, 18}, /* тны */ + {{0xEE, 0xE4, 0xDF}, 18}, /* одя */ + {{0xEE, 0xE1, 0xED}, 18}, /* обн */ + {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ + {{0xEE, 0xF1, 0xDF}, 18}, /* ося */ + {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ + {{0xED, 0xDF, 0xFE}, 18}, /* няю */ + {{0xED, 0xE0, 0xF0}, 18}, /* нар */ + {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ + {{0xE0, 0xF1, 0xED}, 18}, /* асн */ + {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ + {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ + {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ + {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ + {{0xED, 0xF6, 0xE8}, 18}, /* нци */ + {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ + {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ + {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ + {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ + {{0x8E, 0xE1, 0xDF}, 18}, /* Обя */ + {{0x8F, 0xF0, 0xE0}, 18}, /* Пра */ + {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ + {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ + {{0xEB, 0xED, 0xE8}, 18}, /* лни */ + {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ + {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ + {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ + {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ + {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ + {{0xF0, 0xED, 0xFB}, 17}, /* рны */ + {{0xE1, 0xED, 0xFB}, 17}, /* бны */ + {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ + {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ + {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ + {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ + {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ + {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ + {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ + {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ + {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ + {{0xE4, 0xE8, 0xE2}, 17}, /* див */ + {{0xED, 0xE0, 0xED}, 17}, /* нан */ + {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ + {{0xE4, 0xED, 0xE5}, 17}, /* дне */ + {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ + {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ + {{0xED, 0xE0, 0xF5}, 17}, /* нах */ + {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ + {{0xE0, 0xEB, 0xE8}, 17}, /* али */ + {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ + {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ + {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ + {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ + {{0xDF, 0xE2, 0xE8}, 16}, /* яви */ + {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ + {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ + {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ + {{0xED, 0xF3, 0xFE}, 16}, /* ную */ + {{0xEF, 0xE5, 0xED}, 16}, /* пен */ + {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ + {{0xEE, 0xED, 0xED}, 16}, /* онн */ + {{0xE2, 0xE8, 0xED}, 16}, /* вин */ + {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ + {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ + {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ + {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ + {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ + {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ + {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ + {{0x8A, 0xEE, 0xEC}, 16}, /* Ком */ + {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ + {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ + {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ + {{0xEF, 0xEE, 0xED}, 16}, /* пон */ + {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ + {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ + {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ + {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ + {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ + {{0xE2, 0xED, 0xEE}, 16}, /* вно */ + {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ + {{0x8B, 0xE8, 0xF6}, 15}, /* Лиц */ + {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ + {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ + {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ + {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ + {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ + {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ + {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ + {{0x82, 0xEE, 0xE7}, 15}, /* Воз */ + {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ + {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ + {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ + {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ + {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ + {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ + {{0xF2, 0xE0, 0xEC}, 15}, /* там */ + {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ + {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ + {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ + {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ + {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ + {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ + {{0xF1, 0xE5, 0xED}, 15}, /* сен */ + {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ + {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ + {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ + {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ + {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ + {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ + {{0x95, 0xF0, 0xE0}, 15}, /* Хра */ + {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ + {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ + {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ + {{0xF6, 0xE8, 0xDF}, 14}, /* ция */ + {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ + {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ + {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ + {{0xE0, 0xED, 0xF1}, 14}, /* анс */ + {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ + {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ + {{0xE5, 0xED, 0xFC}, 14}, /* ень */ + {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ + {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ + {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ + {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ + {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ + {{0xE2, 0xFC, 0xDF}, 13}, /* вья */ + {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ + {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ + {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ + {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ + {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ + {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ + {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ + {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ + {{0xDF, 0xE7, 0xE8}, 13}, /* язи */ + {{0xE8, 0xED, 0xE4}, 13}, /* инд */ + {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ + {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ + {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ + {{0xED, 0xE4, 0xE8}, 13}, /* нди */ + {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ + {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ + {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ + {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ + {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ + {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ + {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ + {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ + {{0xDF, 0xE5, 0xEC}, 13}, /* яем */ + {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ + {{0xED, 0xF2, 0xF3}, 13}, /* нту */ + {{0xED, 0xE5, 0xE9}, 13}, /* ней */ + {{0xED, 0xE0, 0xDF}, 13}, /* ная */ + {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ + {{0xF0, 0xED, 0xEE}, 13}, /* рно */ + {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ + {{0xE0, 0xED, 0xFB}, 13}, /* аны */ + {{0x84, 0xEE, 0xE2}, 13}, /* Дов */ + {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ + {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ + {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ + {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ + {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ + {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ + {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ + {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ + {{0xE2, 0xE0, 0xDF}, 12}, /* вая */ + {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ + {{0xDF, 0xF9, 0xE8}, 12}, /* ящи */ + {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ + {{0xED, 0xE5, 0xE5}, 12}, /* нее */ + {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ + {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ + {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ + {{0xE8, 0xED, 0xF6}, 12}, /* инц */ + {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ + {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ + {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ + {{0xED, 0xE0, 0xF2}, 12}, /* нат */ + {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ + {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ + {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ + {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ + {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ + {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ + {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ + {{0xE5, 0xED, 0xF1}, 12}, /* енс */ + {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ + {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ + {{0xED, 0xE0, 0xE7}, 12}, /* наз */ + {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ + {{0xEE, 0xED, 0xE8}, 12}, /* они */ + {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ + {{0xE3, 0xEE, 0xE4}, 12}, /* год */ + {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ + {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ + {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ + {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ + {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ + {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ + {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ + {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ + {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ + {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ + {{0xF1, 0xE8, 0xDF}, 11}, /* сия */ + {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ + {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ + {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ + {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ + {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ + {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ + {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ + {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ + {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ + {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ + {{0xED, 0xED, 0xF3}, 11}, /* нну */ + {{0xED, 0xE5, 0xEF}, 11}, /* неп */ + {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ + {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ + {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ + {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ + {{0xE0, 0xE2, 0xED}, 11}, /* авн */ + {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ + {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ + {{0x82, 0xF0, 0xE5}, 11}, /* Вре */ + {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ + {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ + {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ + {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ + {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ + {{0xEE, 0xED, 0xFB}, 10}, /* оны */ + {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ + {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ + {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ + {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ + {{0xDF, 0xF2, 0xFB}, 10}, /* яты */ + {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ + {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ + {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ + {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ + {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ + {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ + {{0x8E, 0xF2, 0xE2}, 10}, /* Отв */ + {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ + {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ + {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ + {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ + {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ + {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ + {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ + {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ + {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ + {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ + {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ + {{0xEC, 0xED, 0xEE}, 10}, /* мно */ + {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ + {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ + {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ + {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ + {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ + {{0xE4, 0xDF, 0xF9}, 10}, /* дящ */ + {{0xF2, 0xF0, 0xE8}, 10}, /* три */ + {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ + {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ + {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ + {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ + {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ + {{0xE7, 0xED, 0xFB}, 10}, /* зны */ + {{0xEE, 0xDF, 0xED}, 10}, /* оян */ + {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ + {{0xE2, 0xED, 0xE5}, 10}, /* вне */ + {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ + {{0xE5, 0xEC, 0xDF}, 10}, /* емя */ + {{0xED, 0xE0, 0xE8}, 10}, /* наи */ + {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ + {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ + {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ + {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ + {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ + {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ + {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ + {{0xED, 0xE8, 0xE2}, 10}, /* нив */ + {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ + {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ + {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ + {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ + {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ + {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ + {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ + {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_ENCODING_DETECT_RESOURCE_H */ diff --git a/include/myhtml/encoding_resource.h b/include/myhtml/encoding_resource.h new file mode 100644 index 0000000..6ec72e2 --- /dev/null +++ b/include/myhtml/encoding_resource.h @@ -0,0 +1,9330 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include + +#ifndef MyHTML_ENCODING_RESOURCE_H +#define MyHTML_ENCODING_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +static const unsigned long myhtml_encoding_map_big5[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 17392, 19506, 17923, 17830, 17784, 160359, 19831, 17843, + 162993, 19682, 163013, 15253, 18230, 18244, 19527, 19520, 148159, 144919, + 160594, 159371, 159954, 19543, 172881, 18255, 17882, 19589, 162924, 19719, + 19108, 18081, 158499, 29221, 154196, 137827, 146950, 147297, 26189, 22267, + 0x0000, 32149, 22813, 166841, 15860, 38708, 162799, 23515, 138590, 23204, + 13861, 171696, 23249, 23479, 23804, 26478, 34195, 170309, 29793, 29853, + 14453, 138579, 145054, 155681, 16108, 153822, 15093, 31484, 40855, 147809, + 166157, 143850, 133770, 143966, 17162, 33924, 40854, 37935, 18736, 34323, + 22678, 38730, 37400, 31184, 31282, 26208, 27177, 34973, 29772, 31685, + 26498, 31276, 21071, 36934, 13542, 29636, 155065, 29894, 40903, 22451, + 18735, 21580, 16689, 145038, 22552, 31346, 162661, 35727, 18094, 159368, + 16769, 155033, 31662, 140476, 40904, 140481, 140489, 140492, 40905, 34052, + 144827, 16564, 40906, 17633, 175615, 25281, 28782, 40907, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12736, + 12737, 12738, 12739, 12740, 131340, 12741, 131281, 131277, 12742, 12743, + 131275, 139240, 12744, 131274, 12745, 12746, 12747, 12748, 131342, 12749, + 12750, 256, 193, 461, 192, 274, 201, 282, 200, 332, + 211, 465, 210, 0x0000, 7870, 0x0000, 7872, 202, 257, 225, + 462, 224, 593, 275, 233, 283, 232, 299, 237, 464, + 236, 333, 243, 466, 242, 363, 250, 468, 249, 470, + 472, 474, 476, 252, 0x0000, 7871, 0x0000, 7873, 234, 609, + 9178, 9179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 172969, 135493, 0x0000, 25866, + 0x0000, 0x0000, 20029, 28381, 40270, 37343, 0x0000, 0x0000, 161589, 25745, + 20250, 20264, 20392, 20822, 20852, 20892, 20964, 21153, 21160, 21307, + 21326, 21457, 21464, 22242, 22768, 22788, 22791, 22834, 22836, 23398, + 23454, 23455, 23706, 24198, 24635, 25993, 26622, 26628, 26725, 27982, + 28860, 30005, 32420, 32428, 32442, 32455, 32463, 32479, 32518, 32567, + 33402, 33487, 33647, 35270, 35774, 35810, 36710, 36711, 36718, 29713, + 31996, 32205, 26950, 31433, 21031, 0x0000, 0x0000, 0x0000, 0x0000, 37260, + 30904, 37214, 32956, 0x0000, 36107, 33014, 133607, 0x0000, 0x0000, 32927, + 40647, 19661, 40393, 40460, 19518, 171510, 159758, 40458, 172339, 13761, + 0x0000, 28314, 33342, 29977, 0x0000, 18705, 39532, 39567, 40857, 31111, + 164972, 138698, 132560, 142054, 20004, 20097, 20096, 20103, 20159, 20203, + 20279, 13388, 20413, 15944, 20483, 20616, 13437, 13459, 13477, 20870, + 22789, 20955, 20988, 20997, 20105, 21113, 21136, 21287, 13767, 21417, + 13649, 21424, 13651, 21442, 21539, 13677, 13682, 13953, 21651, 21667, + 21684, 21689, 21712, 21743, 21784, 21795, 21800, 13720, 21823, 13733, + 13759, 21975, 13765, 163204, 21797, 0x0000, 134210, 134421, 151851, 21904, + 142534, 14828, 131905, 36422, 150968, 169189, 16467, 164030, 30586, 142392, + 14900, 18389, 164189, 158194, 151018, 25821, 134524, 135092, 134357, 135412, + 25741, 36478, 134806, 134155, 135012, 142505, 164438, 148691, 0x0000, 134470, + 170573, 164073, 18420, 151207, 142530, 39602, 14951, 169460, 16365, 13574, + 152263, 169940, 161992, 142660, 40302, 38933, 0x0000, 17369, 155813, 25780, + 21731, 142668, 142282, 135287, 14843, 135279, 157402, 157462, 162208, 25834, + 151634, 134211, 36456, 139681, 166732, 132913, 0x0000, 18443, 131497, 16378, + 22643, 142733, 0x0000, 148936, 132348, 155799, 134988, 134550, 21881, 16571, + 17338, 0x0000, 19124, 141926, 135325, 33194, 39157, 134556, 25465, 14846, + 141173, 36288, 22177, 25724, 15939, 0x0000, 173569, 134665, 142031, 142537, + 0x0000, 135368, 145858, 14738, 14854, 164507, 13688, 155209, 139463, 22098, + 134961, 142514, 169760, 13500, 27709, 151099, 0x0000, 0x0000, 161140, 142987, + 139784, 173659, 167117, 134778, 134196, 157724, 32659, 135375, 141315, 141625, + 13819, 152035, 134796, 135053, 134826, 16275, 134960, 134471, 135503, 134732, + 0x0000, 134827, 134057, 134472, 135360, 135485, 16377, 140950, 25650, 135085, + 144372, 161337, 142286, 134526, 134527, 142417, 142421, 14872, 134808, 135367, + 134958, 173618, 158544, 167122, 167321, 167114, 38314, 21708, 33476, 21945, + 0x0000, 171715, 39974, 39606, 161630, 142830, 28992, 33133, 33004, 23580, + 157042, 33076, 14231, 21343, 164029, 37302, 134906, 134671, 134775, 134907, + 13789, 151019, 13833, 134358, 22191, 141237, 135369, 134672, 134776, 135288, + 135496, 164359, 136277, 134777, 151120, 142756, 23124, 135197, 135198, 135413, + 135414, 22428, 134673, 161428, 164557, 135093, 134779, 151934, 14083, 135094, + 135552, 152280, 172733, 149978, 137274, 147831, 164476, 22681, 21096, 13850, + 153405, 31666, 23400, 18432, 19244, 40743, 18919, 39967, 39821, 154484, + 143677, 22011, 13810, 22153, 20008, 22786, 138177, 194680, 38737, 131206, + 20059, 20155, 13630, 23587, 24401, 24516, 14586, 25164, 25909, 27514, + 27701, 27706, 28780, 29227, 20012, 29357, 149737, 32594, 31035, 31993, + 32595, 156266, 13505, 0x0000, 156491, 32770, 32896, 157202, 158033, 21341, + 34916, 35265, 161970, 35744, 36125, 38021, 38264, 38271, 38376, 167439, + 38886, 39029, 39118, 39134, 39267, 170000, 40060, 40479, 40644, 27503, + 63751, 20023, 131207, 38429, 25143, 38050, 0x0000, 20539, 28158, 171123, + 40870, 15817, 34959, 147790, 28791, 23797, 19232, 152013, 13657, 154928, + 24866, 166450, 36775, 37366, 29073, 26393, 29626, 144001, 172295, 15499, + 137600, 19216, 30948, 29698, 20910, 165647, 16393, 27235, 172730, 16931, + 34319, 133743, 31274, 170311, 166634, 38741, 28749, 21284, 139390, 37876, + 30425, 166371, 40871, 30685, 20131, 20464, 20668, 20015, 20247, 40872, + 21556, 32139, 22674, 22736, 138678, 24210, 24217, 24514, 141074, 25995, + 144377, 26905, 27203, 146531, 27903, 0x0000, 29184, 148741, 29580, 16091, + 150035, 23317, 29881, 35715, 154788, 153237, 31379, 31724, 31939, 32364, + 33528, 34199, 40873, 34960, 40874, 36537, 40875, 36815, 34143, 39392, + 37409, 40876, 167353, 136255, 16497, 17058, 23066, 0x0000, 0x0000, 0x0000, + 39016, 26475, 17014, 22333, 0x0000, 34262, 149883, 33471, 160013, 19585, + 159092, 23931, 158485, 159678, 40877, 40878, 23446, 40879, 26343, 32347, + 28247, 31178, 15752, 17603, 143958, 141206, 17306, 17718, 0x0000, 23765, + 146202, 35577, 23672, 15634, 144721, 23928, 40882, 29015, 17752, 147692, + 138787, 19575, 14712, 13386, 131492, 158785, 35532, 20404, 131641, 22975, + 33132, 38998, 170234, 24379, 134047, 0x0000, 139713, 166253, 16642, 18107, + 168057, 16135, 40883, 172469, 16632, 14294, 18167, 158790, 16764, 165554, + 160767, 17773, 14548, 152730, 17761, 17691, 19849, 19579, 19830, 17898, + 16328, 150287, 13921, 17630, 17597, 16877, 23870, 23880, 23894, 15868, + 14351, 23972, 23993, 14368, 14392, 24130, 24253, 24357, 24451, 14600, + 14612, 14655, 14669, 24791, 24893, 23781, 14729, 25015, 25017, 25039, + 14776, 25132, 25232, 25317, 25368, 14840, 22193, 14851, 25570, 25595, + 25607, 25690, 14923, 25792, 23829, 22049, 40863, 14999, 25990, 15037, + 26111, 26195, 15090, 26258, 15138, 26390, 15170, 26532, 26624, 15192, + 26698, 26756, 15218, 15217, 15227, 26889, 26947, 29276, 26980, 27039, + 27013, 15292, 27094, 15325, 27237, 27252, 27249, 27266, 15340, 27289, + 15346, 27307, 27317, 27348, 27382, 27521, 27585, 27626, 27765, 27818, + 15563, 27906, 27910, 27942, 28033, 15599, 28068, 28081, 28181, 28184, + 28201, 28294, 166336, 28347, 28386, 28378, 40831, 28392, 28393, 28452, + 28468, 15686, 147265, 28545, 28606, 15722, 15733, 29111, 23705, 15754, + 28716, 15761, 28752, 28756, 28783, 28799, 28809, 131877, 17345, 13809, + 134872, 147159, 22462, 159443, 28990, 153568, 13902, 27042, 166889, 23412, + 31305, 153825, 169177, 31333, 31357, 154028, 31419, 31408, 31426, 31427, + 29137, 156813, 16842, 31450, 31453, 31466, 16879, 21682, 154625, 31499, + 31573, 31529, 152334, 154878, 31650, 31599, 33692, 154548, 158847, 31696, + 33825, 31634, 31672, 154912, 15789, 154725, 33938, 31738, 31750, 31797, + 154817, 31812, 31875, 149634, 31910, 26237, 148856, 31945, 31943, 31974, + 31860, 31987, 31989, 31950, 32359, 17693, 159300, 32093, 159446, 29837, + 32137, 32171, 28981, 32179, 32210, 147543, 155689, 32228, 15635, 32245, + 137209, 32229, 164717, 32285, 155937, 155994, 32366, 32402, 17195, 37996, + 32295, 32576, 32577, 32583, 31030, 156368, 39393, 32663, 156497, 32675, + 136801, 131176, 17756, 145254, 17667, 164666, 32762, 156809, 32773, 32776, + 32797, 32808, 32815, 172167, 158915, 32827, 32828, 32865, 141076, 18825, + 157222, 146915, 157416, 26405, 32935, 166472, 33031, 33050, 22704, 141046, + 27775, 156824, 151480, 25831, 136330, 33304, 137310, 27219, 150117, 150165, + 17530, 33321, 133901, 158290, 146814, 20473, 136445, 34018, 33634, 158474, + 149927, 144688, 137075, 146936, 33450, 26907, 194964, 16859, 34123, 33488, + 33562, 134678, 137140, 14017, 143741, 144730, 33403, 33506, 33560, 147083, + 159139, 158469, 158615, 144846, 15807, 33565, 21996, 33669, 17675, 159141, + 33708, 33729, 33747, 13438, 159444, 27223, 34138, 13462, 159298, 143087, + 33880, 154596, 33905, 15827, 17636, 27303, 33866, 146613, 31064, 33960, + 158614, 159351, 159299, 34014, 33807, 33681, 17568, 33939, 34020, 154769, + 16960, 154816, 17731, 34100, 23282, 159385, 17703, 34163, 17686, 26559, + 34326, 165413, 165435, 34241, 159880, 34306, 136578, 159949, 194994, 17770, + 34344, 13896, 137378, 21495, 160666, 34430, 34673, 172280, 34798, 142375, + 34737, 34778, 34831, 22113, 34412, 26710, 17935, 34885, 34886, 161248, + 146873, 161252, 34910, 34972, 18011, 34996, 34997, 25537, 35013, 30583, + 161551, 35207, 35210, 35238, 35241, 35239, 35260, 166437, 35303, 162084, + 162493, 35484, 30611, 37374, 35472, 162393, 31465, 162618, 147343, 18195, + 162616, 29052, 35596, 35615, 152624, 152933, 35647, 35660, 35661, 35497, + 150138, 35728, 35739, 35503, 136927, 17941, 34895, 35995, 163156, 163215, + 195028, 14117, 163155, 36054, 163224, 163261, 36114, 36099, 137488, 36059, + 28764, 36113, 150729, 16080, 36215, 36265, 163842, 135188, 149898, 15228, + 164284, 160012, 31463, 36525, 36534, 36547, 37588, 36633, 36653, 164709, + 164882, 36773, 37635, 172703, 133712, 36787, 18730, 166366, 165181, 146875, + 24312, 143970, 36857, 172052, 165564, 165121, 140069, 14720, 159447, 36919, + 165180, 162494, 36961, 165228, 165387, 37032, 165651, 37060, 165606, 37038, + 37117, 37223, 15088, 37289, 37316, 31916, 166195, 138889, 37390, 27807, + 37441, 37474, 153017, 37561, 166598, 146587, 166668, 153051, 134449, 37676, + 37739, 166625, 166891, 28815, 23235, 166626, 166629, 18789, 37444, 166892, + 166969, 166911, 37747, 37979, 36540, 38277, 38310, 37926, 38304, 28662, + 17081, 140922, 165592, 135804, 146990, 18911, 27676, 38523, 38550, 16748, + 38563, 159445, 25050, 38582, 30965, 166624, 38589, 21452, 18849, 158904, + 131700, 156688, 168111, 168165, 150225, 137493, 144138, 38705, 34370, 38710, + 18959, 17725, 17797, 150249, 28789, 23361, 38683, 38748, 168405, 38743, + 23370, 168427, 38751, 37925, 20688, 143543, 143548, 38793, 38815, 38833, + 38846, 38848, 38866, 38880, 152684, 38894, 29724, 169011, 38911, 38901, + 168989, 162170, 19153, 38964, 38963, 38987, 39014, 15118, 160117, 15697, + 132656, 147804, 153350, 39114, 39095, 39112, 39111, 19199, 159015, 136915, + 21936, 39137, 39142, 39148, 37752, 39225, 150057, 19314, 170071, 170245, + 39413, 39436, 39483, 39440, 39512, 153381, 14020, 168113, 170965, 39648, + 39650, 170757, 39668, 19470, 39700, 39725, 165376, 20532, 39732, 158120, + 14531, 143485, 39760, 39744, 171326, 23109, 137315, 39822, 148043, 39938, + 39935, 39948, 171624, 40404, 171959, 172434, 172459, 172257, 172323, 172511, + 40318, 40323, 172340, 40462, 26760, 40388, 139611, 172435, 172576, 137531, + 172595, 40249, 172217, 172724, 40592, 40597, 40606, 40610, 19764, 40618, + 40623, 148324, 40641, 15200, 14821, 15645, 20274, 14270, 166955, 40706, + 40712, 19350, 37924, 159138, 40727, 40726, 40761, 22175, 22154, 40773, + 39352, 168075, 38898, 33919, 40802, 40809, 31452, 40846, 29206, 19390, + 149877, 149947, 29047, 150008, 148296, 150097, 29598, 166874, 137466, 31135, + 166270, 167478, 37737, 37875, 166468, 37612, 37761, 37835, 166252, 148665, + 29207, 16107, 30578, 31299, 28880, 148595, 148472, 29054, 137199, 28835, + 137406, 144793, 16071, 137349, 152623, 137208, 14114, 136955, 137273, 14049, + 137076, 137425, 155467, 14115, 136896, 22363, 150053, 136190, 135848, 136134, + 136374, 34051, 145062, 34051, 33877, 149908, 160101, 146993, 152924, 147195, + 159826, 17652, 145134, 170397, 159526, 26617, 14131, 15381, 15847, 22636, + 137506, 26640, 16471, 145215, 147681, 147595, 147727, 158753, 21707, 22174, + 157361, 22162, 135135, 134056, 134669, 37830, 166675, 37788, 20216, 20779, + 14361, 148534, 20156, 132197, 131967, 20299, 20362, 153169, 23144, 131499, + 132043, 14745, 131850, 132116, 13365, 20265, 131776, 167603, 131701, 35546, + 131596, 20120, 20685, 20749, 20386, 20227, 150030, 147082, 20290, 20526, + 20588, 20609, 20428, 20453, 20568, 20732, 20825, 20827, 20829, 20830, + 28278, 144789, 147001, 147135, 28018, 137348, 147081, 20904, 20931, 132576, + 17629, 132259, 132242, 132241, 36218, 166556, 132878, 21081, 21156, 133235, + 21217, 37742, 18042, 29068, 148364, 134176, 149932, 135396, 27089, 134685, + 29817, 16094, 29849, 29716, 29782, 29592, 19342, 150204, 147597, 21456, + 13700, 29199, 147657, 21940, 131909, 21709, 134086, 22301, 37469, 38644, + 37734, 22493, 22413, 22399, 13886, 22731, 23193, 166470, 136954, 137071, + 136976, 23084, 22968, 37519, 23166, 23247, 23058, 153926, 137715, 137313, + 148117, 14069, 27909, 29763, 23073, 155267, 23169, 166871, 132115, 37856, + 29836, 135939, 28933, 18802, 37896, 166395, 37821, 14240, 23582, 23710, + 24158, 24136, 137622, 137596, 146158, 24269, 23375, 137475, 137476, 14081, + 137376, 14045, 136958, 14035, 33066, 166471, 138682, 144498, 166312, 24332, + 24334, 137511, 137131, 23147, 137019, 23364, 34324, 161277, 34912, 24702, + 141408, 140843, 24539, 16056, 140719, 140734, 168072, 159603, 25024, 131134, + 131142, 140827, 24985, 24984, 24693, 142491, 142599, 149204, 168269, 25713, + 149093, 142186, 14889, 142114, 144464, 170218, 142968, 25399, 173147, 25782, + 25393, 25553, 149987, 142695, 25252, 142497, 25659, 25963, 26994, 15348, + 143502, 144045, 149897, 144043, 21773, 144096, 137433, 169023, 26318, 144009, + 143795, 15072, 16784, 152964, 166690, 152975, 136956, 152923, 152613, 30958, + 143619, 137258, 143924, 13412, 143887, 143746, 148169, 26254, 159012, 26219, + 19347, 26160, 161904, 138731, 26211, 144082, 144097, 26142, 153714, 14545, + 145466, 145340, 15257, 145314, 144382, 29904, 15254, 26511, 149034, 26806, + 26654, 15300, 27326, 14435, 145365, 148615, 27187, 27218, 27337, 27397, + 137490, 25873, 26776, 27212, 15319, 27258, 27479, 147392, 146586, 37792, + 37618, 166890, 166603, 37513, 163870, 166364, 37991, 28069, 28427, 149996, + 28007, 147327, 15759, 28164, 147516, 23101, 28170, 22599, 27940, 30786, + 28987, 148250, 148086, 28913, 29264, 29319, 29332, 149391, 149285, 20857, + 150180, 132587, 29818, 147192, 144991, 150090, 149783, 155617, 16134, 16049, + 150239, 166947, 147253, 24743, 16115, 29900, 29756, 37767, 29751, 17567, + 159210, 17745, 30083, 16227, 150745, 150790, 16216, 30037, 30323, 173510, + 15129, 29800, 166604, 149931, 149902, 15099, 15821, 150094, 16127, 149957, + 149747, 37370, 22322, 37698, 166627, 137316, 20703, 152097, 152039, 30584, + 143922, 30478, 30479, 30587, 149143, 145281, 14942, 149744, 29752, 29851, + 16063, 150202, 150215, 16584, 150166, 156078, 37639, 152961, 30750, 30861, + 30856, 30930, 29648, 31065, 161601, 153315, 16654, 31131, 33942, 31141, + 27181, 147194, 31290, 31220, 16750, 136934, 16690, 37429, 31217, 134476, + 149900, 131737, 146874, 137070, 13719, 21867, 13680, 13994, 131540, 134157, + 31458, 23129, 141045, 154287, 154268, 23053, 131675, 30960, 23082, 154566, + 31486, 16889, 31837, 31853, 16913, 154547, 155324, 155302, 31949, 150009, + 137136, 31886, 31868, 31918, 27314, 32220, 32263, 32211, 32590, 156257, + 155996, 162632, 32151, 155266, 17002, 158581, 133398, 26582, 131150, 144847, + 22468, 156690, 156664, 149858, 32733, 31527, 133164, 154345, 154947, 31500, + 155150, 39398, 34373, 39523, 27164, 144447, 14818, 150007, 157101, 39455, + 157088, 33920, 160039, 158929, 17642, 33079, 17410, 32966, 33033, 33090, + 157620, 39107, 158274, 33378, 33381, 158289, 33875, 159143, 34320, 160283, + 23174, 16767, 137280, 23339, 137377, 23268, 137432, 34464, 195004, 146831, + 34861, 160802, 23042, 34926, 20293, 34951, 35007, 35046, 35173, 35149, + 153219, 35156, 161669, 161668, 166901, 166873, 166812, 166393, 16045, 33955, + 18165, 18127, 14322, 35389, 35356, 169032, 24397, 37419, 148100, 26068, + 28969, 28868, 137285, 40301, 35999, 36073, 163292, 22938, 30659, 23024, + 17262, 14036, 36394, 36519, 150537, 36656, 36682, 17140, 27736, 28603, + 140065, 18587, 28537, 28299, 137178, 39913, 14005, 149807, 37051, 37015, + 21873, 18694, 37307, 37892, 166475, 16482, 166652, 37927, 166941, 166971, + 34021, 35371, 38297, 38311, 38295, 38294, 167220, 29765, 16066, 149759, + 150082, 148458, 16103, 143909, 38543, 167655, 167526, 167525, 16076, 149997, + 150136, 147438, 29714, 29803, 16124, 38721, 168112, 26695, 18973, 168083, + 153567, 38749, 37736, 166281, 166950, 166703, 156606, 37562, 23313, 35689, + 18748, 29689, 147995, 38811, 38769, 39224, 134950, 24001, 166853, 150194, + 38943, 169178, 37622, 169431, 37349, 17600, 166736, 150119, 166756, 39132, + 166469, 16128, 37418, 18725, 33812, 39227, 39245, 162566, 15869, 39323, + 19311, 39338, 39516, 166757, 153800, 27279, 39457, 23294, 39471, 170225, + 19344, 170312, 39356, 19389, 19351, 37757, 22642, 135938, 22562, 149944, + 136424, 30788, 141087, 146872, 26821, 15741, 37976, 14631, 24912, 141185, + 141675, 24839, 40015, 40019, 40059, 39989, 39952, 39807, 39887, 171565, + 39839, 172533, 172286, 40225, 19630, 147716, 40472, 19632, 40204, 172468, + 172269, 172275, 170287, 40357, 33981, 159250, 159711, 158594, 34300, 17715, + 159140, 159364, 159216, 33824, 34286, 159232, 145367, 155748, 31202, 144796, + 144960, 18733, 149982, 15714, 37851, 37566, 37704, 131775, 30905, 37495, + 37965, 20452, 13376, 36964, 152925, 30781, 30804, 30902, 30795, 137047, + 143817, 149825, 13978, 20338, 28634, 28633, 28702, 28702, 21524, 147893, + 22459, 22771, 22410, 40214, 22487, 28980, 13487, 147884, 29163, 158784, + 151447, 23336, 137141, 166473, 24844, 23246, 23051, 17084, 148616, 14124, + 19323, 166396, 37819, 37816, 137430, 134941, 33906, 158912, 136211, 148218, + 142374, 148417, 22932, 146871, 157505, 32168, 155995, 155812, 149945, 149899, + 166394, 37605, 29666, 16105, 29876, 166755, 137375, 16097, 150195, 27352, + 29683, 29691, 16086, 150078, 150164, 137177, 150118, 132007, 136228, 149989, + 29768, 149782, 28837, 149878, 37508, 29670, 37727, 132350, 37681, 166606, + 166422, 37766, 166887, 153045, 18741, 166530, 29035, 149827, 134399, 22180, + 132634, 134123, 134328, 21762, 31172, 137210, 32254, 136898, 150096, 137298, + 17710, 37889, 14090, 166592, 149933, 22960, 137407, 137347, 160900, 23201, + 14050, 146779, 14000, 37471, 23161, 166529, 137314, 37748, 15565, 133812, + 19094, 14730, 20724, 15721, 15692, 136092, 29045, 17147, 164376, 28175, + 168164, 17643, 27991, 163407, 28775, 27823, 15574, 147437, 146989, 28162, + 28428, 15727, 132085, 30033, 14012, 13512, 18048, 16090, 18545, 22980, + 37486, 18750, 36673, 166940, 158656, 22546, 22472, 14038, 136274, 28926, + 148322, 150129, 143331, 135856, 140221, 26809, 26983, 136088, 144613, 162804, + 145119, 166531, 145366, 144378, 150687, 27162, 145069, 158903, 33854, 17631, + 17614, 159014, 159057, 158850, 159710, 28439, 160009, 33597, 137018, 33773, + 158848, 159827, 137179, 22921, 23170, 137139, 23137, 23153, 137477, 147964, + 14125, 23023, 137020, 14023, 29070, 37776, 26266, 148133, 23150, 23083, + 148115, 27179, 147193, 161590, 148571, 148170, 28957, 148057, 166369, 20400, + 159016, 23746, 148686, 163405, 148413, 27148, 148054, 135940, 28838, 28979, + 148457, 15781, 27871, 194597, 150095, 32357, 23019, 23855, 15859, 24412, + 150109, 137183, 32164, 33830, 21637, 146170, 144128, 131604, 22398, 133333, + 132633, 16357, 139166, 172726, 28675, 168283, 23920, 29583, 31955, 166489, + 168992, 20424, 32743, 29389, 29456, 162548, 29496, 29497, 153334, 29505, + 29512, 16041, 162584, 36972, 29173, 149746, 29665, 33270, 16074, 30476, + 16081, 27810, 22269, 29721, 29726, 29727, 16098, 16112, 16116, 16122, + 29907, 16142, 16211, 30018, 30061, 30066, 30093, 16252, 30152, 30172, + 16320, 30285, 16343, 30324, 16348, 30330, 151388, 29064, 22051, 35200, + 22633, 16413, 30531, 16441, 26465, 16453, 13787, 30616, 16490, 16495, + 23646, 30654, 30667, 22770, 30744, 28857, 30748, 16552, 30777, 30791, + 30801, 30822, 33864, 152885, 31027, 26627, 31026, 16643, 16649, 31121, + 31129, 36795, 31238, 36796, 16743, 31377, 16818, 31420, 33401, 16836, + 31439, 31451, 16847, 20001, 31586, 31596, 31611, 31762, 31771, 16992, + 17018, 31867, 31900, 17036, 31928, 17044, 31981, 36755, 28864, 134351, + 32207, 32212, 32208, 32253, 32686, 32692, 29343, 17303, 32800, 32805, + 31545, 32814, 32817, 32852, 15820, 22452, 28832, 32951, 33001, 17389, + 33036, 29482, 33038, 33042, 30048, 33044, 17409, 15161, 33110, 33113, + 33114, 17427, 22586, 33148, 33156, 17445, 33171, 17453, 33189, 22511, + 33217, 33252, 33364, 17551, 33446, 33398, 33482, 33496, 33535, 17584, + 33623, 38505, 27018, 33797, 28917, 33892, 24803, 33928, 17668, 33982, + 34017, 34040, 34064, 34104, 34130, 17723, 34159, 34160, 34272, 17783, + 34418, 34450, 34482, 34543, 38469, 34699, 17926, 17943, 34990, 35071, + 35108, 35143, 35217, 162151, 35369, 35384, 35476, 35508, 35921, 36052, + 36082, 36124, 18328, 22623, 36291, 18413, 20206, 36410, 21976, 22356, + 36465, 22005, 36528, 18487, 36558, 36578, 36580, 36589, 36594, 36791, + 36801, 36810, 36812, 36915, 39364, 18605, 39136, 37395, 18718, 37416, + 37464, 37483, 37553, 37550, 37567, 37603, 37611, 37619, 37620, 37629, + 37699, 37764, 37805, 18757, 18769, 40639, 37911, 21249, 37917, 37933, + 37950, 18794, 37972, 38009, 38189, 38306, 18855, 38388, 38451, 18917, + 26528, 18980, 38720, 18997, 38834, 38850, 22100, 19172, 24808, 39097, + 19225, 39153, 22596, 39182, 39193, 20916, 39196, 39223, 39234, 39261, + 39266, 19312, 39365, 19357, 39484, 39695, 31363, 39785, 39809, 39901, + 39921, 39924, 19565, 39968, 14191, 138178, 40265, 39994, 40702, 22096, + 40339, 40381, 40384, 40444, 38134, 36790, 40571, 40620, 40625, 40637, + 40646, 38108, 40674, 40689, 40696, 31432, 40772, 131220, 131767, 132000, + 26906, 38083, 22956, 132311, 22592, 38081, 14265, 132565, 132629, 132726, + 136890, 22359, 29043, 133826, 133837, 134079, 21610, 194619, 134091, 21662, + 134139, 134203, 134227, 134245, 134268, 24807, 134285, 22138, 134325, 134365, + 134381, 134511, 134578, 134600, 26965, 39983, 34725, 134660, 134670, 134871, + 135056, 134957, 134771, 23584, 135100, 24075, 135260, 135247, 135286, 26398, + 135291, 135304, 135318, 13895, 135359, 135379, 135471, 135483, 21348, 33965, + 135907, 136053, 135990, 35713, 136567, 136729, 137155, 137159, 20088, 28859, + 137261, 137578, 137773, 137797, 138282, 138352, 138412, 138952, 25283, 138965, + 139029, 29080, 26709, 139333, 27113, 14024, 139900, 140247, 140282, 141098, + 141425, 141647, 33533, 141671, 141715, 142037, 35237, 142056, 36768, 142094, + 38840, 142143, 38983, 39613, 142412, 0x0000, 142472, 142519, 154600, 142600, + 142610, 142775, 142741, 142914, 143220, 143308, 143411, 143462, 144159, 144350, + 24497, 26184, 26303, 162425, 144743, 144883, 29185, 149946, 30679, 144922, + 145174, 32391, 131910, 22709, 26382, 26904, 146087, 161367, 155618, 146961, + 147129, 161278, 139418, 18640, 19128, 147737, 166554, 148206, 148237, 147515, + 148276, 148374, 150085, 132554, 20946, 132625, 22943, 138920, 15294, 146687, + 148484, 148694, 22408, 149108, 14747, 149295, 165352, 170441, 14178, 139715, + 35678, 166734, 39382, 149522, 149755, 150037, 29193, 150208, 134264, 22885, + 151205, 151430, 132985, 36570, 151596, 21135, 22335, 29041, 152217, 152601, + 147274, 150183, 21948, 152646, 152686, 158546, 37332, 13427, 152895, 161330, + 152926, 18200, 152930, 152934, 153543, 149823, 153693, 20582, 13563, 144332, + 24798, 153859, 18300, 166216, 154286, 154505, 154630, 138640, 22433, 29009, + 28598, 155906, 162834, 36950, 156082, 151450, 35682, 156674, 156746, 23899, + 158711, 36662, 156804, 137500, 35562, 150006, 156808, 147439, 156946, 19392, + 157119, 157365, 141083, 37989, 153569, 24981, 23079, 194765, 20411, 22201, + 148769, 157436, 20074, 149812, 38486, 28047, 158909, 13848, 35191, 157593, + 157806, 156689, 157790, 29151, 157895, 31554, 168128, 133649, 157990, 37124, + 158009, 31301, 40432, 158202, 39462, 158253, 13919, 156777, 131105, 31107, + 158260, 158555, 23852, 144665, 33743, 158621, 18128, 158884, 30011, 34917, + 159150, 22710, 14108, 140685, 159819, 160205, 15444, 160384, 160389, 37505, + 139642, 160395, 37680, 160486, 149968, 27705, 38047, 160848, 134904, 34855, + 35061, 141606, 164979, 137137, 28344, 150058, 137248, 14756, 14009, 23568, + 31203, 17727, 26294, 171181, 170148, 35139, 161740, 161880, 22230, 16607, + 136714, 14753, 145199, 164072, 136133, 29101, 33638, 162269, 168360, 23143, + 19639, 159919, 166315, 162301, 162314, 162571, 163174, 147834, 31555, 31102, + 163849, 28597, 172767, 27139, 164632, 21410, 159239, 37823, 26678, 38749, + 164207, 163875, 158133, 136173, 143919, 163912, 23941, 166960, 163971, 22293, + 38947, 166217, 23979, 149896, 26046, 27093, 21458, 150181, 147329, 15377, + 26422, 163984, 164084, 164142, 139169, 164175, 164233, 164271, 164378, 164614, + 164655, 164746, 13770, 164968, 165546, 18682, 25574, 166230, 30728, 37461, + 166328, 17394, 166375, 17375, 166376, 166726, 166868, 23032, 166921, 36619, + 167877, 168172, 31569, 168208, 168252, 15863, 168286, 150218, 36816, 29327, + 22155, 169191, 169449, 169392, 169400, 169778, 170193, 170313, 170346, 170435, + 170536, 170766, 171354, 171419, 32415, 171768, 171811, 19620, 38215, 172691, + 29090, 172799, 19857, 36882, 173515, 19868, 134300, 36798, 21953, 36794, + 140464, 36793, 150163, 17673, 32383, 28502, 27313, 20202, 13540, 166700, + 161949, 14138, 36480, 137205, 163876, 166764, 166809, 162366, 157359, 15851, + 161365, 146615, 153141, 153942, 20122, 155265, 156248, 22207, 134765, 36366, + 23405, 147080, 150686, 25566, 25296, 137206, 137339, 25904, 22061, 154698, + 21530, 152337, 15814, 171416, 19581, 22050, 22046, 32585, 155352, 22901, + 146752, 34672, 19996, 135146, 134473, 145082, 33047, 40286, 36120, 30267, + 40005, 30286, 30649, 37701, 21554, 33096, 33527, 22053, 33074, 33816, + 32957, 21994, 31074, 22083, 21526, 134813, 13774, 22021, 22001, 26353, + 164578, 13869, 30004, 22000, 21946, 21655, 21874, 134209, 134294, 24272, + 151880, 134774, 142434, 134818, 40619, 32090, 21982, 135285, 25245, 38765, + 21652, 36045, 29174, 37238, 25596, 25529, 25598, 21865, 142147, 40050, + 143027, 20890, 13535, 134567, 20903, 21581, 21790, 21779, 30310, 36397, + 157834, 30129, 32950, 34820, 34694, 35015, 33206, 33820, 135361, 17644, + 29444, 149254, 23440, 33547, 157843, 22139, 141044, 163119, 147875, 163187, + 159440, 160438, 37232, 135641, 37384, 146684, 173737, 134828, 134905, 29286, + 138402, 18254, 151490, 163833, 135147, 16634, 40029, 25887, 142752, 18675, + 149472, 171388, 135148, 134666, 24674, 161187, 135149, 0x0000, 155720, 135559, + 29091, 32398, 40272, 19994, 19972, 13687, 23309, 27826, 21351, 13996, + 14812, 21373, 13989, 149016, 22682, 150382, 33325, 21579, 22442, 154261, + 133497, 0x0000, 14930, 140389, 29556, 171692, 19721, 39917, 146686, 171824, + 19547, 151465, 169374, 171998, 33884, 146870, 160434, 157619, 145184, 25390, + 32037, 147191, 146988, 14890, 36872, 21196, 15988, 13946, 17897, 132238, + 30272, 23280, 134838, 30842, 163630, 22695, 16575, 22140, 39819, 23924, + 30292, 173108, 40581, 19681, 30201, 14331, 24857, 143578, 148466, 0x0000, + 22109, 135849, 22439, 149859, 171526, 21044, 159918, 13741, 27722, 40316, + 31830, 39737, 22494, 137068, 23635, 25811, 169168, 156469, 160100, 34477, + 134440, 159010, 150242, 134513, 0x0000, 20990, 139023, 23950, 38659, 138705, + 40577, 36940, 31519, 39682, 23761, 31651, 25192, 25397, 39679, 31695, + 39722, 31870, 39726, 31810, 31878, 39957, 31740, 39689, 40727, 39963, + 149822, 40794, 21875, 23491, 20477, 40600, 20466, 21088, 15878, 21201, + 22375, 20566, 22967, 24082, 38856, 40363, 36700, 21609, 38836, 39232, + 38842, 21292, 24880, 26924, 21466, 39946, 40194, 19515, 38465, 27008, + 20646, 30022, 137069, 39386, 21107, 0x0000, 37209, 38529, 37212, 0x0000, + 37201, 167575, 25471, 159011, 27338, 22033, 37262, 30074, 25221, 132092, + 29519, 31856, 154657, 146685, 0x0000, 149785, 30422, 39837, 20010, 134356, + 33726, 34882, 0x0000, 23626, 27072, 20717, 22394, 21023, 24053, 20174, + 27697, 131570, 20281, 21660, 21722, 21146, 36226, 13822, 24332, 13811, + 0x0000, 27474, 37244, 40869, 39831, 38958, 39092, 39610, 40616, 40580, + 29050, 31508, 0x0000, 27642, 34840, 32632, 0x0000, 22048, 173642, 36471, + 40787, 0x0000, 36308, 36431, 40476, 36353, 25218, 164733, 36392, 36469, + 31443, 150135, 31294, 30936, 27882, 35431, 30215, 166490, 40742, 27854, + 34774, 30147, 172722, 30803, 194624, 36108, 29410, 29553, 35629, 29442, + 29937, 36075, 150203, 34351, 24506, 34976, 17591, 0x0000, 137275, 159237, + 0x0000, 35454, 140571, 0x0000, 24829, 30311, 39639, 40260, 37742, 39823, + 34805, 0x0000, 34831, 36087, 29484, 38689, 39856, 13782, 29362, 19463, + 31825, 39242, 155993, 24921, 19460, 40598, 24957, 0x0000, 22367, 24943, + 25254, 25145, 25294, 14940, 25058, 21418, 144373, 25444, 26626, 13778, + 23895, 166850, 36826, 167481, 0x0000, 20697, 138566, 30982, 21298, 38456, + 134971, 16485, 0x0000, 30718, 0x0000, 31938, 155418, 31962, 31277, 32870, + 32867, 32077, 29957, 29938, 35220, 33306, 26380, 32866, 160902, 32859, + 29936, 33027, 30500, 35209, 157644, 30035, 159441, 34729, 34766, 33224, + 34700, 35401, 36013, 35651, 30507, 29944, 34010, 13877, 27058, 36262, + 0x0000, 35241, 29800, 28089, 34753, 147473, 29927, 15835, 29046, 24740, + 24988, 15569, 29026, 24695, 0x0000, 32625, 166701, 29264, 24809, 19326, + 21024, 15384, 146631, 155351, 161366, 152881, 137540, 135934, 170243, 159196, + 159917, 23745, 156077, 166415, 145015, 131310, 157766, 151310, 17762, 23327, + 156492, 40784, 40614, 156267, 12288, 65292, 12289, 12290, 65294, 8231, + 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65105, 65106, + 183, 65108, 65109, 65110, 65111, 65372, 8211, 65073, 8212, 65075, + 9588, 65076, 65103, 65288, 65289, 65077, 65078, 65371, 65373, 65079, + 65080, 12308, 12309, 65081, 65082, 12304, 12305, 65083, 65084, 12298, + 12299, 65085, 65086, 12296, 12297, 65087, 65088, 12300, 12301, 65089, + 65090, 12302, 12303, 65091, 65092, 65113, 65114, 65115, 65116, 65117, + 65118, 8216, 8217, 8220, 8221, 12317, 12318, 8245, 8242, 65283, + 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, + 9734, 9733, 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, + 175, 65507, 65343, 717, 65097, 65098, 65101, 65102, 65099, 65100, + 65119, 65120, 65121, 65291, 65293, 215, 247, 177, 8730, 65308, + 65310, 65309, 8806, 8807, 8800, 8734, 8786, 8801, 65122, 65123, + 65124, 65125, 65126, 65374, 8745, 8746, 8869, 8736, 8735, 8895, + 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 8853, 8857, + 8593, 8595, 8592, 8594, 8598, 8599, 8601, 8600, 8741, 8739, + 65295, 65340, 8725, 65128, 65284, 65509, 12306, 65504, 65505, 65285, + 65312, 8451, 8457, 65129, 65130, 65131, 13269, 13212, 13213, 13214, + 13262, 13217, 13198, 13199, 13252, 176, 20825, 20827, 20830, 20829, + 20833, 20835, 21991, 29929, 31950, 9601, 9602, 9603, 9604, 9605, + 9606, 9607, 9608, 9615, 9614, 9613, 9612, 9611, 9610, 9609, + 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, + 9488, 9492, 9496, 9581, 9582, 9584, 9583, 9552, 9566, 9578, + 9569, 9698, 9699, 9701, 9700, 9585, 9586, 9587, 65296, 65297, + 65298, 65299, 65300, 65301, 65302, 65303, 65304, 65305, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 12321, 12322, + 12323, 12324, 12325, 12326, 12327, 12328, 12329, 21313, 21316, 21317, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 65345, 65346, 65347, 65348, + 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, + 65359, 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, + 65369, 65370, 913, 914, 915, 916, 917, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, + 932, 933, 934, 935, 936, 937, 945, 946, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, + 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, + 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, + 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, + 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, + 12579, 12580, 12581, 12582, 12583, 12584, 12585, 729, 713, 714, + 711, 715, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, + 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, + 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, + 9244, 9245, 9246, 9247, 9249, 8364, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 19968, 20057, 19969, 19971, 20035, + 20061, 20102, 20108, 20154, 20799, 20837, 20843, 20960, 20992, 20993, + 21147, 21269, 21313, 21340, 21448, 19977, 19979, 19976, 19978, 20011, + 20024, 20961, 20037, 20040, 20063, 20062, 20110, 20129, 20800, 20995, + 21242, 21315, 21449, 21475, 22303, 22763, 22805, 22823, 22899, 23376, + 23377, 23379, 23544, 23567, 23586, 23608, 23665, 24029, 24037, 24049, + 24050, 24051, 24062, 24178, 24318, 24331, 24339, 25165, 19985, 19984, + 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, 20117, 20114, + 20116, 20130, 20161, 20160, 20163, 20166, 20167, 20173, 20170, 20171, + 20164, 20803, 20801, 20839, 20845, 20846, 20844, 20887, 20982, 20998, + 20999, 21000, 21243, 21246, 21247, 21270, 21305, 21320, 21319, 21317, + 21342, 21380, 21451, 21450, 21453, 22764, 22825, 22827, 22826, 22829, + 23380, 23569, 23588, 23610, 23663, 24052, 24187, 24319, 24340, 24341, + 24515, 25096, 25142, 25163, 25166, 25903, 25991, 26007, 26020, 26041, + 26085, 26352, 26376, 26408, 27424, 27490, 27513, 27595, 27604, 27611, + 27663, 27700, 28779, 29226, 29238, 29243, 29255, 29273, 29275, 29356, + 29579, 19993, 19990, 19989, 19988, 19992, 20027, 20045, 20047, 20046, + 20197, 20184, 20180, 20181, 20182, 20183, 20195, 20196, 20185, 20190, + 20805, 20804, 20873, 20874, 20908, 20985, 20986, 20984, 21002, 21152, + 21151, 21253, 21254, 21271, 21277, 20191, 21322, 21321, 21345, 21344, + 21359, 21358, 21435, 21487, 21476, 21491, 21484, 21486, 21481, 21480, + 21500, 21496, 21493, 21483, 21478, 21482, 21490, 21489, 21488, 21477, + 21485, 21499, 22235, 22234, 22806, 22830, 22833, 22900, 22902, 23381, + 23427, 23612, 24040, 24039, 24038, 24066, 24067, 24179, 24188, 24321, + 24344, 24343, 24517, 25098, 25171, 25172, 25170, 25169, 26021, 26086, + 26414, 26412, 26410, 26411, 26413, 27491, 27597, 27665, 27664, 27704, + 27713, 27712, 27710, 29359, 29572, 29577, 29916, 29926, 29976, 29983, + 29992, 29993, 30000, 30001, 30002, 30003, 30091, 30333, 30382, 30399, + 30446, 30683, 30690, 30707, 31034, 31166, 31348, 31435, 19998, 19999, + 20050, 20051, 20073, 20121, 20132, 20134, 20133, 20223, 20233, 20249, + 20234, 20245, 20237, 20240, 20241, 20239, 20210, 20214, 20219, 20208, + 20211, 20221, 20225, 20235, 20809, 20807, 20806, 20808, 20840, 20849, + 20877, 20912, 21015, 21009, 21010, 21006, 21014, 21155, 21256, 21281, + 21280, 21360, 21361, 21513, 21519, 21516, 21514, 21520, 21505, 21515, + 21508, 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, + 22237, 22323, 22320, 22312, 22317, 22316, 22319, 22313, 22809, 22810, + 22839, 22840, 22916, 22904, 22915, 22909, 22905, 22914, 22913, 23383, + 23384, 23431, 23432, 23429, 23433, 23546, 23574, 23673, 24030, 24070, + 24182, 24180, 24335, 24347, 24537, 24534, 25102, 25100, 25101, 25104, + 25187, 25179, 25176, 25910, 26089, 26088, 26092, 26093, 26354, 26355, + 26377, 26429, 26420, 26417, 26421, 27425, 27492, 27515, 27670, 27741, + 27735, 27737, 27743, 27744, 27728, 27733, 27745, 27739, 27725, 27726, + 28784, 29279, 29277, 30334, 31481, 31859, 31992, 32566, 32650, 32701, + 32769, 32771, 32780, 32786, 32819, 32895, 32905, 32907, 32908, 33251, + 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, 33406, 34411, + 34880, 34892, 34915, 35199, 38433, 20018, 20136, 20301, 20303, 20295, + 20311, 20318, 20276, 20315, 20309, 20272, 20304, 20305, 20285, 20282, + 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, 20302, + 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, 20918, + 20919, 21029, 21028, 21033, 21034, 21032, 21163, 21161, 21162, 21164, + 21283, 21363, 21365, 21533, 21549, 21534, 21566, 21542, 21582, 21543, + 21574, 21571, 21555, 21576, 21570, 21531, 21545, 21578, 21561, 21563, + 21560, 21550, 21557, 21558, 21536, 21564, 21568, 21553, 21547, 21535, + 21548, 22250, 22256, 22244, 22251, 22346, 22353, 22336, 22349, 22343, + 22350, 22334, 22352, 22351, 22331, 22767, 22846, 22941, 22930, 22952, + 22942, 22947, 22937, 22934, 22925, 22948, 22931, 22922, 22949, 23389, + 23388, 23386, 23387, 23436, 23435, 23439, 23596, 23616, 23617, 23615, + 23614, 23696, 23697, 23700, 23692, 24043, 24076, 24207, 24199, 24202, + 24311, 24324, 24351, 24420, 24418, 24439, 24441, 24536, 24524, 24535, + 24525, 24561, 24555, 24568, 24554, 25106, 25105, 25220, 25239, 25238, + 25216, 25206, 25225, 25197, 25226, 25212, 25214, 25209, 25203, 25234, + 25199, 25240, 25198, 25237, 25235, 25233, 25222, 25913, 25915, 25912, + 26097, 26356, 26463, 26446, 26447, 26448, 26449, 26460, 26454, 26462, + 26441, 26438, 26464, 26451, 26455, 27493, 27599, 27714, 27742, 27801, + 27777, 27784, 27785, 27781, 27803, 27754, 27770, 27792, 27760, 27788, + 27752, 27798, 27794, 27773, 27779, 27762, 27774, 27764, 27782, 27766, + 27789, 27796, 27800, 27778, 28790, 28796, 28797, 28792, 29282, 29281, + 29280, 29380, 29378, 29590, 29996, 29995, 30007, 30008, 30338, 30447, + 30691, 31169, 31168, 31167, 31350, 31995, 32597, 32918, 32915, 32925, + 32920, 32923, 32922, 32946, 33391, 33426, 33419, 33421, 35211, 35282, + 35328, 35895, 35910, 35925, 35997, 36196, 36208, 36275, 36523, 36554, + 36763, 36784, 36802, 36806, 36805, 36804, 24033, 37009, 37026, 37034, + 37030, 37027, 37193, 37318, 37324, 38450, 38446, 38449, 38442, 38444, + 20006, 20054, 20083, 20107, 20123, 20126, 20139, 20140, 20335, 20381, + 20365, 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, + 20360, 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, + 20821, 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, + 21050, 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, + 21329, 21350, 21367, 21368, 21369, 21462, 21460, 21463, 21619, 21621, + 21654, 21624, 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, + 21648, 21617, 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, + 22266, 22403, 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, + 22857, 22855, 22856, 22852, 22868, 22974, 22971, 22996, 22969, 22958, + 22993, 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, + 22981, 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, + 23578, 23624, 23621, 23622, 23735, 23713, 23736, 23721, 23723, 23729, + 23731, 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, + 24220, 24213, 24214, 24310, 24358, 24359, 24361, 24448, 24449, 24447, + 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, + 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, + 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, + 25298, 25307, 25259, 25299, 25300, 25291, 25288, 25256, 25277, 25276, + 25296, 25305, 25287, 25293, 25269, 25306, 25265, 25304, 25302, 25303, + 25286, 25260, 25294, 25918, 26023, 26044, 26106, 26132, 26131, 26124, + 26118, 26114, 26126, 26112, 26127, 26133, 26122, 26119, 26381, 26379, + 26477, 26507, 26517, 26481, 26524, 26483, 26487, 26503, 26525, 26519, + 26479, 26480, 26495, 26505, 26494, 26512, 26485, 26522, 26515, 26492, + 26474, 26482, 27427, 27494, 27495, 27519, 27667, 27675, 27875, 27880, + 27891, 27825, 27852, 27877, 27827, 27837, 27838, 27836, 27874, 27819, + 27861, 27859, 27832, 27844, 27833, 27841, 27822, 27863, 27845, 27889, + 27839, 27835, 27873, 27867, 27850, 27820, 27887, 27868, 27862, 27872, + 28821, 28814, 28818, 28810, 28825, 29228, 29229, 29240, 29256, 29287, + 29289, 29376, 29390, 29401, 29399, 29392, 29609, 29608, 29599, 29611, + 29605, 30013, 30109, 30105, 30106, 30340, 30402, 30450, 30452, 30693, + 30717, 31038, 31040, 31041, 31177, 31176, 31354, 31353, 31482, 31998, + 32596, 32652, 32651, 32773, 32954, 32933, 32930, 32945, 32929, 32939, + 32937, 32948, 32938, 32943, 33253, 33278, 33293, 33459, 33437, 33433, + 33453, 33469, 33439, 33465, 33457, 33452, 33445, 33455, 33464, 33443, + 33456, 33470, 33463, 34382, 34417, 21021, 34920, 36555, 36814, 36820, + 36817, 37045, 37048, 37041, 37046, 37319, 37329, 38263, 38272, 38428, + 38464, 38463, 38459, 38468, 38466, 38585, 38632, 38738, 38750, 20127, + 20141, 20142, 20449, 20405, 20399, 20415, 20448, 20433, 20431, 20445, + 20419, 20406, 20440, 20447, 20426, 20439, 20398, 20432, 20420, 20418, + 20442, 20430, 20446, 20407, 20823, 20882, 20881, 20896, 21070, 21059, + 21066, 21069, 21068, 21067, 21063, 21191, 21193, 21187, 21185, 21261, + 21335, 21371, 21402, 21467, 21676, 21696, 21672, 21710, 21705, 21688, + 21670, 21683, 21703, 21698, 21693, 21674, 21697, 21700, 21704, 21679, + 21675, 21681, 21691, 21673, 21671, 21695, 22271, 22402, 22411, 22432, + 22435, 22434, 22478, 22446, 22419, 22869, 22865, 22863, 22862, 22864, + 23004, 23000, 23039, 23011, 23016, 23043, 23013, 23018, 23002, 23014, + 23041, 23035, 23401, 23459, 23462, 23460, 23458, 23461, 23553, 23630, + 23631, 23629, 23627, 23769, 23762, 24055, 24093, 24101, 24095, 24189, + 24224, 24230, 24314, 24328, 24365, 24421, 24456, 24453, 24458, 24459, + 24455, 24460, 24457, 24594, 24605, 24608, 24613, 24590, 24616, 24653, + 24688, 24680, 24674, 24646, 24643, 24684, 24683, 24682, 24676, 25153, + 25308, 25366, 25353, 25340, 25325, 25345, 25326, 25341, 25351, 25329, + 25335, 25327, 25324, 25342, 25332, 25361, 25346, 25919, 25925, 26027, + 26045, 26082, 26149, 26157, 26144, 26151, 26159, 26143, 26152, 26161, + 26148, 26359, 26623, 26579, 26609, 26580, 26576, 26604, 26550, 26543, + 26613, 26601, 26607, 26564, 26577, 26548, 26586, 26597, 26552, 26575, + 26590, 26611, 26544, 26585, 26594, 26589, 26578, 27498, 27523, 27526, + 27573, 27602, 27607, 27679, 27849, 27915, 27954, 27946, 27969, 27941, + 27916, 27953, 27934, 27927, 27963, 27965, 27966, 27958, 27931, 27893, + 27961, 27943, 27960, 27945, 27950, 27957, 27918, 27947, 28843, 28858, + 28851, 28844, 28847, 28845, 28856, 28846, 28836, 29232, 29298, 29295, + 29300, 29417, 29408, 29409, 29623, 29642, 29627, 29618, 29645, 29632, + 29619, 29978, 29997, 30031, 30028, 30030, 30027, 30123, 30116, 30117, + 30114, 30115, 30328, 30342, 30343, 30344, 30408, 30406, 30403, 30405, + 30465, 30457, 30456, 30473, 30475, 30462, 30460, 30471, 30684, 30722, + 30740, 30732, 30733, 31046, 31049, 31048, 31047, 31161, 31162, 31185, + 31186, 31179, 31359, 31361, 31487, 31485, 31869, 32002, 32005, 32000, + 32009, 32007, 32004, 32006, 32568, 32654, 32703, 32772, 32784, 32781, + 32785, 32822, 32982, 32997, 32986, 32963, 32964, 32972, 32993, 32987, + 32974, 32990, 32996, 32989, 33268, 33314, 33511, 33539, 33541, 33507, + 33499, 33510, 33540, 33509, 33538, 33545, 33490, 33495, 33521, 33537, + 33500, 33492, 33489, 33502, 33491, 33503, 33519, 33542, 34384, 34425, + 34427, 34426, 34893, 34923, 35201, 35284, 35336, 35330, 35331, 35998, + 36000, 36212, 36211, 36276, 36557, 36556, 36848, 36838, 36834, 36842, + 36837, 36845, 36843, 36836, 36840, 37066, 37070, 37057, 37059, 37195, + 37194, 37325, 38274, 38480, 38475, 38476, 38477, 38754, 38761, 38859, + 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 20056, 20147, + 20492, 20493, 20515, 20463, 20518, 20517, 20472, 20521, 20502, 20486, + 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, 20520, 20465, + 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, 20478, 20523, + 20489, 20860, 20900, 20901, 20898, 20941, 20940, 20934, 20939, 21078, + 21084, 21076, 21083, 21085, 21290, 21375, 21407, 21405, 21471, 21736, + 21776, 21761, 21815, 21756, 21733, 21746, 21766, 21754, 21780, 21737, + 21741, 21729, 21769, 21742, 21738, 21734, 21799, 21767, 21757, 21775, + 22275, 22276, 22466, 22484, 22475, 22467, 22537, 22799, 22871, 22872, + 22874, 23057, 23064, 23068, 23071, 23067, 23059, 23020, 23072, 23075, + 23081, 23077, 23052, 23049, 23403, 23640, 23472, 23475, 23478, 23476, + 23470, 23477, 23481, 23480, 23556, 23633, 23637, 23632, 23789, 23805, + 23803, 23786, 23784, 23792, 23798, 23809, 23796, 24046, 24109, 24107, + 24235, 24237, 24231, 24369, 24466, 24465, 24464, 24665, 24675, 24677, + 24656, 24661, 24685, 24681, 24687, 24708, 24735, 24730, 24717, 24724, + 24716, 24709, 24726, 25159, 25331, 25352, 25343, 25422, 25406, 25391, + 25429, 25410, 25414, 25423, 25417, 25402, 25424, 25405, 25386, 25387, + 25384, 25421, 25420, 25928, 25929, 26009, 26049, 26053, 26178, 26185, + 26191, 26179, 26194, 26188, 26181, 26177, 26360, 26388, 26389, 26391, + 26657, 26680, 26696, 26694, 26707, 26681, 26690, 26708, 26665, 26803, + 26647, 26700, 26705, 26685, 26612, 26704, 26688, 26684, 26691, 26666, + 26693, 26643, 26648, 26689, 27530, 27529, 27575, 27683, 27687, 27688, + 27686, 27684, 27888, 28010, 28053, 28040, 28039, 28006, 28024, 28023, + 27993, 28051, 28012, 28041, 28014, 27994, 28020, 28009, 28044, 28042, + 28025, 28037, 28005, 28052, 28874, 28888, 28900, 28889, 28872, 28879, + 29241, 29305, 29436, 29433, 29437, 29432, 29431, 29574, 29677, 29705, + 29678, 29664, 29674, 29662, 30036, 30045, 30044, 30042, 30041, 30142, + 30149, 30151, 30130, 30131, 30141, 30140, 30137, 30146, 30136, 30347, + 30384, 30410, 30413, 30414, 30505, 30495, 30496, 30504, 30697, 30768, + 30759, 30776, 30749, 30772, 30775, 30757, 30765, 30752, 30751, 30770, + 31061, 31056, 31072, 31071, 31062, 31070, 31069, 31063, 31066, 31204, + 31203, 31207, 31199, 31206, 31209, 31192, 31364, 31368, 31449, 31494, + 31505, 31881, 32033, 32023, 32011, 32010, 32032, 32034, 32020, 32016, + 32021, 32026, 32028, 32013, 32025, 32027, 32570, 32607, 32660, 32709, + 32705, 32774, 32792, 32789, 32793, 32791, 32829, 32831, 33009, 33026, + 33008, 33029, 33005, 33012, 33030, 33016, 33011, 33032, 33021, 33034, + 33020, 33007, 33261, 33260, 33280, 33296, 33322, 33323, 33320, 33324, + 33467, 33579, 33618, 33620, 33610, 33592, 33616, 33609, 33589, 33588, + 33615, 33586, 33593, 33590, 33559, 33600, 33585, 33576, 33603, 34388, + 34442, 34474, 34451, 34468, 34473, 34444, 34467, 34460, 34928, 34935, + 34945, 34946, 34941, 34937, 35352, 35344, 35342, 35340, 35349, 35338, + 35351, 35347, 35350, 35343, 35345, 35912, 35962, 35961, 36001, 36002, + 36215, 36524, 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, + 36858, 36852, 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, + 37202, 37197, 37196, 37336, 37341, 37335, 37340, 37337, 38275, 38498, + 38499, 38497, 38491, 38493, 38500, 38488, 38494, 38587, 39138, 39340, + 39592, 39640, 39717, 39730, 39740, 20094, 20602, 20605, 20572, 20551, + 20547, 20556, 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, + 20599, 20559, 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, + 21202, 21209, 21208, 21205, 21264, 21263, 21273, 21311, 21312, 21310, + 21443, 26364, 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, + 21809, 21846, 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, + 21859, 21811, 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, + 22534, 22496, 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, + 23094, 23105, 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, + 23114, 23408, 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, + 23559, 23648, 23644, 23645, 23815, 23814, 23822, 23835, 23830, 23842, + 23825, 23849, 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, + 24115, 24119, 24247, 24248, 24246, 24245, 24254, 24373, 24375, 24407, + 24428, 24425, 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, + 24703, 24739, 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, + 24763, 24757, 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, + 24775, 25114, 25115, 25160, 25504, 25511, 25458, 25494, 25506, 25509, + 25463, 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, + 25512, 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, + 25449, 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, + 25944, 25941, 25940, 26012, 26011, 26028, 26063, 26059, 26060, 26062, + 26205, 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, + 26799, 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, + 26755, 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, + 26754, 27442, 27578, 27627, 27628, 27691, 28046, 28092, 28147, 28121, + 28082, 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, + 28113, 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, + 28085, 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, + 28074, 28140, 28095, 28134, 28921, 28937, 28938, 28925, 28911, 29245, + 29309, 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, + 29699, 29702, 29694, 29709, 29920, 29942, 29943, 29980, 29986, 30053, + 30054, 30050, 30064, 30095, 30164, 30165, 30133, 30154, 30157, 30350, + 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, 30522, 30827, + 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, 31520, 31528, + 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, 31893, 32070, + 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, 32068, 32047, + 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, 32722, 32796, + 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, 33060, 33282, + 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, 33698, 33686, + 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, 33659, 33660, + 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, 34485, 34502, + 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, 34962, 34966, + 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, 35377, 35373, + 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, 36008, 36010, + 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, 36877, 36890, + 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, 36879, 36898, + 36886, 36891, 36884, 37096, 37101, 37117, 37207, 37326, 37365, 37350, + 37347, 37351, 37357, 37353, 38281, 38506, 38517, 38515, 38520, 38512, + 38516, 38518, 38519, 38508, 38592, 38634, 38633, 31456, 31455, 38914, + 38915, 39770, 40165, 40565, 40575, 40613, 40635, 20642, 20621, 20613, + 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, 21106, 21108, + 21109, 21097, 21214, 21213, 21211, 21338, 21413, 21883, 21888, 21927, + 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, 21895, 21899, + 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, 21932, 21937, + 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, 22564, 22576, + 22577, 22561, 22557, 22560, 22777, 22778, 22880, 23159, 23194, 23167, + 23186, 23195, 23207, 23411, 23409, 23506, 23500, 23507, 23504, 23562, + 23563, 23601, 23884, 23888, 23860, 23879, 24061, 24133, 24125, 24128, + 24131, 24190, 24266, 24257, 24258, 24260, 24380, 24429, 24489, 24490, + 24488, 24785, 24801, 24754, 24758, 24800, 24860, 24867, 24826, 24853, + 24816, 24827, 24820, 24936, 24817, 24846, 24822, 24841, 24832, 24850, + 25119, 25161, 25507, 25484, 25551, 25536, 25577, 25545, 25542, 25549, + 25554, 25571, 25552, 25569, 25558, 25581, 25582, 25462, 25588, 25578, + 25563, 25682, 25562, 25593, 25950, 25958, 25954, 25955, 26001, 26000, + 26031, 26222, 26224, 26228, 26230, 26223, 26257, 26234, 26238, 26231, + 26366, 26367, 26399, 26397, 26874, 26837, 26848, 26840, 26839, 26885, + 26847, 26869, 26862, 26855, 26873, 26834, 26866, 26851, 26827, 26829, + 26893, 26898, 26894, 26825, 26842, 26990, 26875, 27454, 27450, 27453, + 27544, 27542, 27580, 27631, 27694, 27695, 27692, 28207, 28216, 28244, + 28193, 28210, 28263, 28234, 28192, 28197, 28195, 28187, 28251, 28248, + 28196, 28246, 28270, 28205, 28198, 28271, 28212, 28237, 28218, 28204, + 28227, 28189, 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, + 28265, 28255, 28953, 28954, 28966, 28976, 28961, 28982, 29038, 28956, + 29260, 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, + 29730, 29733, 29749, 29750, 29748, 29743, 29723, 29734, 29736, 29989, + 29990, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, 30176, + 30331, 30332, 30358, 30355, 30388, 30428, 30543, 30701, 30813, 30828, + 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, 31461, + 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, 31567, + 31569, 31903, 31909, 32094, 32080, 32104, 32085, 32043, 32110, 32114, + 32097, 32102, 32098, 32112, 32115, 21892, 32724, 32725, 32779, 32850, + 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, 33086, 33100, + 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, 33760, 33733, + 33803, 33729, 33775, 33777, 33780, 33879, 33802, 33776, 33804, 33740, + 33789, 33778, 33738, 33848, 33806, 33796, 33756, 33799, 33748, 33759, + 34395, 34527, 34521, 34541, 34516, 34523, 34532, 34512, 34526, 34903, + 35009, 35010, 34993, 35203, 35222, 35387, 35424, 35413, 35422, 35388, + 35393, 35412, 35419, 35408, 35398, 35380, 35386, 35382, 35414, 35937, + 35970, 36015, 36028, 36019, 36029, 36033, 36027, 36032, 36020, 36023, + 36022, 36031, 36024, 36234, 36229, 36225, 36302, 36317, 36299, 36314, + 36305, 36300, 36315, 36294, 36603, 36600, 36604, 36764, 36910, 36917, + 36913, 36920, 36914, 36918, 37122, 37109, 37129, 37118, 37219, 37221, + 37327, 37396, 37397, 37411, 37385, 37406, 37389, 37392, 37383, 37393, + 38292, 38287, 38283, 38289, 38291, 38290, 38286, 38538, 38542, 38539, + 38525, 38533, 38534, 38541, 38514, 38532, 38593, 38597, 38596, 38598, + 38599, 38639, 38642, 38860, 38917, 38918, 38920, 39143, 39146, 39151, + 39145, 39154, 39149, 39342, 39341, 40643, 40653, 40657, 20098, 20653, + 20661, 20658, 20659, 20677, 20670, 20652, 20663, 20667, 20655, 20679, + 21119, 21111, 21117, 21215, 21222, 21220, 21218, 21219, 21295, 21983, + 21992, 21971, 21990, 21966, 21980, 21959, 21969, 21987, 21988, 21999, + 21978, 21985, 21957, 21958, 21989, 21961, 22290, 22291, 22622, 22609, + 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, + 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, + 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, + 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, + 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, + 25121, 25122, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, + 25628, 25620, 25613, 25654, 25622, 25623, 25606, 25964, 26015, 26032, + 26263, 26249, 26247, 26248, 26262, 26244, 26264, 26253, 26371, 27028, + 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, + 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, + 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, + 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, + 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, + 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, + 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, + 29791, 29790, 29761, 29759, 29785, 29787, 29788, 30070, 30072, 30208, + 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, 30430, 30431, + 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, 30556, 30565, + 30568, 30562, 30702, 30862, 30896, 30871, 30872, 30860, 30857, 30844, + 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, 31260, 31258, + 31264, 31252, 31263, 31262, 31391, 31392, 31607, 31680, 31584, 31598, + 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, 32143, 32091, + 32622, 32617, 32618, 32626, 32681, 32680, 32676, 32854, 32856, 32902, + 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, 33145, 33146, + 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, 33894, 33899, + 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, 33901, 33862, + 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, 34558, 34555, + 34562, 34563, 34566, 34570, 34905, 35039, 35028, 35033, 35036, 35032, + 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, 35442, 35443, + 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, 35461, 35437, + 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, 35978, 35977, + 36042, 36039, 36040, 36036, 36018, 36035, 36034, 36037, 36321, 36319, + 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, 36611, 36617, + 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, 36948, 36924, + 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, 36929, 37138, + 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, 37437, 37440, + 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, 37445, 37433, + 37439, 37466, 38296, 38552, 38548, 38549, 38605, 38603, 38601, 38602, + 38647, 38651, 38649, 38646, 38742, 38772, 38774, 38928, 38929, 38931, + 38922, 38930, 38924, 39164, 39156, 39165, 39166, 39347, 39345, 39348, + 39649, 40169, 40578, 40718, 40723, 40736, 20711, 20718, 20709, 20694, + 20717, 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, + 21123, 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, + 22022, 22025, 22029, 22030, 22007, 22038, 22047, 22024, 22032, 22006, + 22296, 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, + 22781, 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, + 23254, 23256, 23267, 23413, 23518, 23527, 23521, 23525, 23526, 23528, + 23522, 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, + 24151, 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, + 24907, 24951, 24930, 24931, 24927, 24922, 24920, 24949, 25130, 25735, + 25688, 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, + 25723, 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, + 27029, 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, + 27088, 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, + 28467, 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, + 28418, 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, + 28459, 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, + 29081, 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, + 29796, 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, + 30217, 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, + 30887, 30899, 30889, 30883, 31118, 31119, 31117, 31278, 31281, 31402, + 31401, 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, + 31631, 31672, 31623, 31620, 31929, 31933, 31934, 32187, 32176, 32156, + 32189, 32190, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, + 32181, 32184, 32173, 32210, 32199, 32172, 32624, 32736, 32737, 32735, + 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, 33154, + 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, 33988, + 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, 33980, + 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, 34645, + 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, 35098, + 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, 35498, + 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, 36051, + 36049, 36050, 36203, 36249, 36245, 36348, 36628, 36626, 36629, 36627, + 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, 36955, + 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37504, 37509, + 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, 38305, 38312, + 38313, 38307, 38309, 38308, 38553, 38556, 38555, 38604, 38610, 38656, + 38780, 38789, 38902, 38935, 38936, 39087, 39089, 39171, 39173, 39180, + 39177, 39361, 39599, 39600, 39654, 39745, 39746, 40180, 40182, 40179, + 40636, 40763, 40778, 20740, 20736, 20731, 20725, 20729, 20738, 20744, + 20745, 20741, 20956, 21127, 21128, 21129, 21133, 21130, 21232, 21426, + 22062, 22075, 22073, 22066, 22079, 22068, 22057, 22099, 22094, 22103, + 22132, 22070, 22063, 22064, 22656, 22687, 22686, 22707, 22684, 22702, + 22697, 22694, 22893, 23305, 23291, 23307, 23285, 23308, 23304, 23534, + 23532, 23529, 23531, 23652, 23653, 23965, 23956, 24162, 24159, 24161, + 24290, 24282, 24287, 24285, 24291, 24288, 24392, 24433, 24503, 24501, + 24950, 24935, 24942, 24925, 24917, 24962, 24956, 24944, 24939, 24958, + 24999, 24976, 25003, 24974, 25004, 24986, 24996, 24980, 25006, 25134, + 25705, 25711, 25721, 25758, 25778, 25736, 25744, 25776, 25765, 25747, + 25749, 25769, 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, + 25779, 25973, 25975, 25976, 26286, 26283, 26292, 26289, 27171, 27167, + 27112, 27137, 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, + 27141, 27117, 27153, 27472, 27470, 27556, 27589, 27590, 28479, 28540, + 28548, 28497, 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, + 28538, 28528, 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, + 29100, 29105, 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, + 29822, 29824, 30079, 30240, 30249, 30239, 30244, 30246, 30241, 30242, + 30362, 30394, 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, + 30906, 30922, 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, + 31287, 31291, 31407, 31406, 31661, 31665, 31684, 31668, 31686, 31687, + 31681, 31648, 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, + 32221, 32232, 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, + 32629, 32631, 32687, 32745, 32806, 33179, 33180, 33181, 33184, 33178, + 33176, 34071, 34109, 34074, 34030, 34092, 34093, 34067, 34065, 34083, + 34081, 34068, 34028, 34085, 34047, 34054, 34690, 34676, 34678, 34656, + 34662, 34680, 34664, 34649, 34647, 34636, 34643, 34907, 34909, 35088, + 35079, 35090, 35091, 35093, 35082, 35516, 35538, 35527, 35524, 35477, + 35531, 35576, 35506, 35529, 35522, 35519, 35504, 35542, 35533, 35510, + 35513, 35547, 35916, 35918, 35948, 36064, 36062, 36070, 36068, 36076, + 36077, 36066, 36067, 36060, 36074, 36065, 36205, 36255, 36259, 36395, + 36368, 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, + 36635, 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, + 36968, 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, + 37251, 37573, 37563, 37559, 37610, 37548, 37604, 37569, 37555, 37564, + 37586, 37575, 37616, 37554, 38317, 38321, 38660, 38662, 38663, 38665, + 38752, 38797, 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, + 39186, 39192, 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, + 39607, 39662, 39663, 39719, 39749, 39748, 39799, 39791, 40198, 40201, + 40195, 40617, 40638, 40654, 22696, 40786, 20754, 20760, 20756, 20752, + 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, + 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, + 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, + 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, + 25032, 25136, 25797, 25793, 25803, 25787, 25788, 25818, 25796, 25799, + 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, + 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, + 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, + 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, + 28601, 28598, 28582, 28576, 28596, 29118, 29129, 29136, 29138, 29128, + 29141, 29113, 29134, 29145, 29148, 29123, 29124, 29544, 29852, 29859, + 29848, 29855, 29854, 29922, 29964, 29965, 30260, 30264, 30266, 30439, + 30437, 30624, 30622, 30623, 30629, 30952, 30938, 30956, 30951, 31142, + 31309, 31310, 31302, 31308, 31307, 31418, 31705, 31761, 31689, 31716, + 31707, 31713, 31721, 31718, 31957, 31958, 32266, 32273, 32264, 32283, + 32291, 32286, 32285, 32265, 32272, 32633, 32690, 32752, 32753, 32750, + 32808, 33203, 33193, 33192, 33275, 33288, 33368, 33369, 34122, 34137, + 34120, 34152, 34153, 34115, 34121, 34157, 34154, 34142, 34691, 34719, + 34718, 34722, 34701, 34913, 35114, 35122, 35109, 35115, 35105, 35242, + 35238, 35558, 35578, 35563, 35569, 35584, 35548, 35559, 35566, 35582, + 35585, 35586, 35575, 35565, 35571, 35574, 35580, 35947, 35949, 35987, + 36084, 36420, 36401, 36404, 36418, 36409, 36405, 36667, 36655, 36664, + 36659, 36776, 36774, 36981, 36980, 36984, 36978, 36988, 36986, 37172, + 37266, 37664, 37686, 37624, 37683, 37679, 37666, 37628, 37675, 37636, + 37658, 37648, 37670, 37665, 37653, 37678, 37657, 38331, 38567, 38568, + 38570, 38613, 38670, 38673, 38678, 38669, 38675, 38671, 38747, 38748, + 38758, 38808, 38960, 38968, 38971, 38967, 38957, 38969, 38948, 39184, + 39208, 39198, 39195, 39201, 39194, 39405, 39394, 39409, 39608, 39612, + 39675, 39661, 39720, 39825, 40213, 40227, 40230, 40232, 40210, 40219, + 40664, 40660, 40845, 40860, 20778, 20767, 20769, 20786, 21237, 22158, + 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, + 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, + 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, + 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, 25986, + 25987, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, 27299, + 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, 28657, + 28639, 28640, 28635, 28644, 28651, 28655, 28544, 28652, 28641, 28649, + 28629, 28654, 28656, 29159, 29151, 29166, 29158, 29157, 29165, 29164, + 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, 29862, 29864, + 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, 30631, 30637, + 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, 31319, 31423, + 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, 31966, 31970, + 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, 32323, 32299, + 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, 32319, 32303, + 32580, 32755, 32764, 32881, 32882, 32880, 32879, 32883, 33222, 33219, + 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, 33289, 33393, + 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, 34183, 34216, + 34186, 34407, 34752, 34769, 34739, 34770, 34758, 34731, 34747, 34746, + 34760, 34763, 35131, 35126, 35140, 35128, 35133, 35244, 35598, 35607, + 35609, 35611, 35594, 35616, 35613, 35588, 35600, 35905, 35903, 35955, + 36090, 36093, 36092, 36088, 36091, 36264, 36425, 36427, 36424, 36426, + 36676, 36670, 36674, 36677, 36671, 36991, 36989, 36996, 36993, 36994, + 36992, 37177, 37283, 37278, 37276, 37709, 37762, 37672, 37749, 37706, + 37733, 37707, 37656, 37758, 37740, 37723, 37744, 37722, 37716, 38346, + 38347, 38348, 38344, 38342, 38577, 38584, 38614, 38684, 38686, 38816, + 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, 39850, 39853, + 40251, 40255, 40587, 40655, 40670, 40668, 40669, 40667, 40766, 40779, + 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, 25139, 25844, + 25842, 25854, 25862, 25850, 25851, 25847, 26039, 26332, 26406, 27315, + 27308, 27331, 27323, 27320, 27330, 27310, 27311, 27487, 27512, 27567, + 28681, 28683, 28670, 28678, 28666, 28689, 28687, 29179, 29180, 29182, + 29176, 29559, 29557, 29863, 29887, 29973, 30294, 30296, 30290, 30653, + 30655, 30651, 30652, 30990, 31150, 31329, 31330, 31328, 31428, 31429, + 31787, 31783, 31786, 31774, 31779, 31777, 31975, 32340, 32341, 32350, + 32346, 32353, 32338, 32345, 32584, 32761, 32763, 32887, 32886, 33229, + 33231, 33290, 34255, 34217, 34253, 34256, 34249, 34224, 34234, 34233, + 34214, 34799, 34796, 34802, 34784, 35206, 35250, 35316, 35624, 35641, + 35628, 35627, 35920, 36101, 36441, 36451, 36454, 36452, 36447, 36437, + 36544, 36681, 36685, 36999, 36995, 37000, 37291, 37292, 37328, 37780, + 37770, 37782, 37794, 37811, 37806, 37804, 37808, 37784, 37786, 37783, + 38356, 38358, 38352, 38357, 38626, 38620, 38617, 38619, 38622, 38692, + 38819, 38822, 38829, 38905, 38989, 38991, 38988, 38990, 38995, 39098, + 39230, 39231, 39229, 39214, 39333, 39438, 39617, 39683, 39686, 39759, + 39758, 39757, 39882, 39881, 39933, 39880, 39872, 40273, 40285, 40288, + 40672, 40725, 40748, 20787, 22181, 22750, 22751, 22754, 23541, 40848, + 24300, 25074, 25079, 25078, 25077, 25856, 25871, 26336, 26333, 27365, + 27357, 27354, 27347, 28699, 28703, 28712, 28698, 28701, 28693, 28696, + 29190, 29197, 29272, 29346, 29560, 29562, 29885, 29898, 29923, 30087, + 30086, 30303, 30305, 30663, 31001, 31153, 31339, 31337, 31806, 31807, + 31800, 31805, 31799, 31808, 32363, 32365, 32377, 32361, 32362, 32645, + 32371, 32694, 32697, 32696, 33240, 34281, 34269, 34282, 34261, 34276, + 34277, 34295, 34811, 34821, 34829, 34809, 34814, 35168, 35167, 35158, + 35166, 35649, 35676, 35672, 35657, 35674, 35662, 35663, 35654, 35673, + 36104, 36106, 36476, 36466, 36487, 36470, 36460, 36474, 36468, 36692, + 36686, 36781, 37002, 37003, 37297, 37294, 37857, 37841, 37855, 37827, + 37832, 37852, 37853, 37846, 37858, 37837, 37848, 37860, 37847, 37864, + 38364, 38580, 38627, 38698, 38695, 38753, 38876, 38907, 39006, 39000, + 39003, 39100, 39237, 39241, 39446, 39449, 39693, 39912, 39911, 39894, + 39899, 40329, 40289, 40306, 40298, 40300, 40594, 40599, 40595, 40628, + 21240, 22184, 22199, 22198, 22196, 22204, 22756, 23360, 23363, 23421, + 23542, 24009, 25080, 25082, 25880, 25876, 25881, 26342, 26407, 27372, + 28734, 28720, 28722, 29200, 29563, 29903, 30306, 30309, 31014, 31018, + 31020, 31019, 31431, 31478, 31820, 31811, 31821, 31983, 31984, 36782, + 32381, 32380, 32386, 32588, 32768, 33242, 33382, 34299, 34297, 34321, + 34298, 34310, 34315, 34311, 34314, 34836, 34837, 35172, 35258, 35320, + 35696, 35692, 35686, 35695, 35679, 35691, 36111, 36109, 36489, 36481, + 36485, 36482, 37300, 37323, 37912, 37891, 37885, 38369, 38704, 39108, + 39250, 39249, 39336, 39467, 39472, 39479, 39477, 39955, 39949, 40569, + 40629, 40680, 40751, 40799, 40803, 40801, 20791, 20792, 22209, 22208, + 22210, 22804, 23660, 24013, 25084, 25086, 25885, 25884, 26005, 26345, + 27387, 27396, 27386, 27570, 28748, 29211, 29351, 29910, 29908, 30313, + 30675, 31824, 32399, 32396, 32700, 34327, 34349, 34330, 34851, 34850, + 34849, 34847, 35178, 35180, 35261, 35700, 35703, 35709, 36115, 36490, + 36493, 36491, 36703, 36783, 37306, 37934, 37939, 37941, 37946, 37944, + 37938, 37931, 38370, 38712, 38713, 38706, 38911, 39015, 39013, 39255, + 39493, 39491, 39488, 39486, 39631, 39764, 39761, 39981, 39973, 40367, + 40372, 40386, 40376, 40605, 40687, 40729, 40796, 40806, 40807, 20796, + 20795, 22216, 22218, 22217, 23423, 24020, 24018, 24398, 25087, 25892, + 27402, 27489, 28753, 28760, 29568, 29924, 30090, 30318, 30316, 31155, + 31840, 31839, 32894, 32893, 33247, 35186, 35183, 35324, 35712, 36118, + 36119, 36497, 36499, 36705, 37192, 37956, 37969, 37970, 38717, 38718, + 38851, 38849, 39019, 39253, 39509, 39501, 39634, 39706, 40009, 39985, + 39998, 39995, 40403, 40407, 40756, 40812, 40810, 40852, 22220, 24022, + 25088, 25891, 25899, 25898, 26348, 27408, 29914, 31434, 31844, 31843, + 31845, 32403, 32406, 32404, 33250, 34360, 34367, 34865, 35722, 37008, + 37007, 37987, 37984, 37988, 38760, 39023, 39260, 39514, 39515, 39511, + 39635, 39636, 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, + 22761, 25900, 28766, 30321, 30322, 30679, 32592, 32648, 34870, 34873, + 34914, 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, + 38724, 38854, 39024, 39519, 39714, 39768, 40031, 40441, 40442, 40572, + 40573, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, 34875, + 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, 40652, + 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, 36522, + 37317, 38013, 38014, 38012, 40055, 40056, 40695, 35924, 38015, 40474, + 29224, 39530, 39729, 40475, 40478, 31858, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 20022, 20031, 20101, 20128, + 20866, 20886, 20907, 21241, 21304, 21353, 21430, 22794, 23424, 24027, + 12083, 24191, 24308, 24400, 24417, 25908, 26080, 30098, 30326, 36789, + 38582, 168, 710, 12541, 12542, 12445, 12446, 12291, 20189, 12293, + 12294, 12295, 12540, 65339, 65341, 10045, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 12449, + 12450, 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, + 12460, 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, + 12470, 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, + 12480, 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, + 12490, 12491, 12492, 12493, 12494, 12495, 12496, 12497, 12498, 12499, + 12500, 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, + 12510, 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12519, + 12520, 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, + 12530, 12531, 12532, 12533, 12534, 1040, 1041, 1042, 1043, 1044, + 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, + 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, + 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, + 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, + 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 1103, 8679, 8632, 8633, 12751, 131276, 20058, 131210, 20994, 17553, + 40880, 20872, 40881, 161287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 65506, 65508, 65287, 65282, 12849, 8470, + 8481, 12443, 12444, 11904, 11908, 11910, 11911, 11912, 11914, 11916, + 11917, 11925, 11932, 11933, 11941, 11943, 11946, 11948, 11950, 11958, + 11964, 11966, 11974, 11978, 11980, 11981, 11983, 11990, 11991, 11998, + 12003, 0x0000, 0x0000, 0x0000, 643, 592, 603, 596, 629, 339, + 248, 331, 650, 618, 20034, 20060, 20981, 21274, 21378, 19975, + 19980, 20039, 20109, 22231, 64012, 23662, 24435, 19983, 20871, 19982, + 20014, 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, + 22787, 22828, 23568, 24063, 26081, 27571, 27596, 27668, 29247, 20017, + 20028, 20200, 20188, 20201, 20193, 20189, 20186, 21004, 21276, 21324, + 22306, 22307, 22807, 22831, 23425, 23428, 23570, 23611, 23668, 23667, + 24068, 24192, 24194, 24521, 25097, 25168, 27669, 27702, 27715, 27711, + 27707, 29358, 29360, 29578, 31160, 32906, 38430, 20238, 20248, 20268, + 20213, 20244, 20209, 20224, 20215, 20232, 20253, 20226, 20229, 20258, + 20243, 20228, 20212, 20242, 20913, 21011, 21001, 21008, 21158, 21282, + 21279, 21325, 21386, 21511, 22241, 22239, 22318, 22314, 22324, 22844, + 22912, 22908, 22917, 22907, 22910, 22903, 22911, 23382, 23573, 23589, + 23676, 23674, 23675, 23678, 24031, 24181, 24196, 24322, 24346, 24436, + 24533, 24532, 24527, 25180, 25182, 25188, 25185, 25190, 25186, 25177, + 25184, 25178, 25189, 26095, 26094, 26430, 26425, 26424, 26427, 26426, + 26431, 26428, 26419, 27672, 27718, 27730, 27740, 27727, 27722, 27732, + 27723, 27724, 28785, 29278, 29364, 29365, 29582, 29994, 30335, 31349, + 32593, 33400, 33404, 33408, 33405, 33407, 34381, 35198, 37017, 37015, + 37016, 37019, 37012, 38434, 38436, 38432, 38435, 20310, 20283, 20322, + 20297, 20307, 20324, 20286, 20327, 20306, 20319, 20289, 20312, 20269, + 20275, 20287, 20321, 20879, 20921, 21020, 21022, 21025, 21165, 21166, + 21257, 21347, 21362, 21390, 21391, 21552, 21559, 21546, 21588, 21573, + 21529, 21532, 21541, 21528, 21565, 21583, 21569, 21544, 21540, 21575, + 22254, 22247, 22245, 22337, 22341, 22348, 22345, 22347, 22354, 22790, + 22848, 22950, 22936, 22944, 22935, 22926, 22946, 22928, 22927, 22951, + 22945, 23438, 23442, 23592, 23594, 23693, 23695, 23688, 23691, 23689, + 23698, 23690, 23686, 23699, 23701, 24032, 24074, 24078, 24203, 24201, + 24204, 24200, 24205, 24325, 24349, 24440, 24438, 24530, 24529, 24528, + 24557, 24552, 24558, 24563, 24545, 24548, 24547, 24570, 24559, 24567, + 24571, 24576, 24564, 25146, 25219, 25228, 25230, 25231, 25236, 25223, + 25201, 25211, 25210, 25200, 25217, 25224, 25207, 25213, 25202, 25204, + 25911, 26096, 26100, 26099, 26098, 26101, 26437, 26439, 26457, 26453, + 26444, 26440, 26461, 26445, 26458, 26443, 27600, 27673, 27674, 27768, + 27751, 27755, 27780, 27787, 27791, 27761, 27759, 27753, 27802, 27757, + 27783, 27797, 27804, 27750, 27763, 27749, 27771, 27790, 28788, 28794, + 29283, 29375, 29373, 29379, 29382, 29377, 29370, 29381, 29589, 29591, + 29587, 29588, 29586, 30010, 30009, 30100, 30101, 30337, 31037, 32820, + 32917, 32921, 32912, 32914, 32924, 33424, 33423, 33413, 33422, 33425, + 33427, 33418, 33411, 33412, 35960, 36809, 36799, 37023, 37025, 37029, + 37022, 37031, 37024, 38448, 38440, 38447, 38445, 20019, 20376, 20348, + 20357, 20349, 20352, 20359, 20342, 20340, 20361, 20356, 20343, 20300, + 20375, 20330, 20378, 20345, 20353, 20344, 20368, 20380, 20372, 20382, + 20370, 20354, 20373, 20331, 20334, 20894, 20924, 20926, 21045, 21042, + 21043, 21062, 21041, 21180, 21258, 21259, 21308, 21394, 21396, 21639, + 21631, 21633, 21649, 21634, 21640, 21611, 21626, 21630, 21605, 21612, + 21620, 21606, 21645, 21615, 21601, 21600, 21656, 21603, 21607, 21604, + 22263, 22265, 22383, 22386, 22381, 22379, 22385, 22384, 22390, 22400, + 22389, 22395, 22387, 22388, 22370, 22376, 22397, 22796, 22853, 22965, + 22970, 22991, 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, + 22961, 22973, 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, + 23620, 23623, 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, + 23715, 23725, 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, + 24087, 24084, 24089, 24360, 24354, 24355, 24356, 24404, 24450, 24446, + 24445, 24542, 24549, 24621, 24614, 24601, 24626, 24587, 24628, 24586, + 24599, 24627, 24602, 24606, 24620, 24610, 24589, 24592, 24622, 24595, + 24593, 24588, 24585, 24604, 25108, 25149, 25261, 25268, 25297, 25278, + 25258, 25270, 25290, 25262, 25267, 25263, 25275, 25257, 25264, 25272, + 25917, 26024, 26043, 26121, 26108, 26116, 26130, 26120, 26107, 26115, + 26123, 26125, 26117, 26109, 26129, 26128, 26358, 26378, 26501, 26476, + 26510, 26514, 26486, 26491, 26520, 26502, 26500, 26484, 26509, 26508, + 26490, 26527, 26513, 26521, 26499, 26493, 26497, 26488, 26489, 26516, + 27429, 27520, 27518, 27614, 27677, 27795, 27884, 27883, 27886, 27865, + 27830, 27860, 27821, 27879, 27831, 27856, 27842, 27834, 27843, 27846, + 27885, 27890, 27858, 27869, 27828, 27786, 27805, 27776, 27870, 27840, + 27952, 27853, 27847, 27824, 27897, 27855, 27881, 27857, 28820, 28824, + 28805, 28819, 28806, 28804, 28817, 28822, 28802, 28826, 28803, 29290, + 29398, 29387, 29400, 29385, 29404, 29394, 29396, 29402, 29388, 29393, + 29604, 29601, 29613, 29606, 29602, 29600, 29612, 29597, 29917, 29928, + 30015, 30016, 30014, 30092, 30104, 30383, 30451, 30449, 30448, 30453, + 30712, 30716, 30713, 30715, 30714, 30711, 31042, 31039, 31173, 31352, + 31355, 31483, 31861, 31997, 32821, 32911, 32942, 32931, 32952, 32949, + 32941, 33312, 33440, 33472, 33451, 33434, 33432, 33435, 33461, 33447, + 33454, 33468, 33438, 33466, 33460, 33448, 33441, 33449, 33474, 33444, + 33475, 33462, 33442, 34416, 34415, 34413, 34414, 35926, 36818, 36811, + 36819, 36813, 36822, 36821, 36823, 37042, 37044, 37039, 37043, 37040, + 38457, 38461, 38460, 38458, 38467, 20429, 20421, 20435, 20402, 20425, + 20427, 20417, 20436, 20444, 20441, 20411, 20403, 20443, 20423, 20438, + 20410, 20416, 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, + 21399, 21398, 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, + 33549, 21687, 21678, 21718, 21686, 21701, 21702, 21664, 21616, 21692, + 21666, 21694, 21618, 21726, 21680, 22453, 22430, 22431, 22436, 22412, + 22423, 22429, 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, + 22772, 22797, 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, + 23037, 23036, 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, + 23008, 23038, 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, + 23755, 23771, 23774, 23770, 23753, 23751, 23754, 23766, 23763, 23764, + 23759, 23752, 23750, 23758, 23775, 23800, 24057, 24097, 24098, 24099, + 24096, 24100, 24240, 24228, 24226, 24219, 24227, 24229, 24327, 24366, + 24406, 24454, 24631, 24633, 24660, 24690, 24670, 24645, 24659, 24647, + 24649, 24667, 24652, 24640, 24642, 24671, 24612, 24644, 24664, 24678, + 24686, 25154, 25155, 25295, 25357, 25355, 25333, 25358, 25347, 25323, + 25337, 25359, 25356, 25336, 25334, 25344, 25363, 25364, 25338, 25365, + 25339, 25328, 25921, 25923, 26026, 26047, 26166, 26145, 26162, 26165, + 26140, 26150, 26146, 26163, 26155, 26170, 26141, 26164, 26169, 26158, + 26383, 26384, 26561, 26610, 26568, 26554, 26588, 26555, 26616, 26584, + 26560, 26551, 26565, 26603, 26596, 26591, 26549, 26573, 26547, 26615, + 26614, 26606, 26595, 26562, 26553, 26574, 26599, 26608, 26546, 26620, + 26566, 26605, 26572, 26542, 26598, 26587, 26618, 26569, 26570, 26563, + 26602, 26571, 27432, 27522, 27524, 27574, 27606, 27608, 27616, 27680, + 27681, 27944, 27956, 27949, 27935, 27964, 27967, 27922, 27914, 27866, + 27955, 27908, 27929, 27962, 27930, 27921, 27904, 27933, 27970, 27905, + 27928, 27959, 27907, 27919, 27968, 27911, 27936, 27948, 27912, 27938, + 27913, 27920, 28855, 28831, 28862, 28849, 28848, 28833, 28852, 28853, + 28841, 29249, 29257, 29258, 29292, 29296, 29299, 29294, 29386, 29412, + 29416, 29419, 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, + 29637, 29625, 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, + 29638, 29624, 29643, 29932, 29934, 29998, 30023, 30024, 30119, 30122, + 30329, 30404, 30472, 30467, 30468, 30469, 30474, 30455, 30459, 30458, + 30695, 30696, 30726, 30737, 30738, 30725, 30736, 30735, 30734, 30729, + 30723, 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, + 31190, 31182, 31360, 31358, 31441, 31488, 31489, 31866, 31864, 31865, + 31871, 31872, 31873, 32003, 32008, 32001, 32600, 32657, 32653, 32702, + 32775, 32782, 32783, 32788, 32823, 32984, 32967, 32992, 32977, 32968, + 32962, 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, + 32983, 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, + 33512, 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, + 33525, 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, + 33517, 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, + 35283, 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, + 37055, 37077, 37061, 37054, 37063, 37067, 37064, 37332, 37331, 38484, + 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, + 20528, 20507, 20469, 20468, 20531, 20535, 20524, 20470, 20471, 20503, + 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, + 20938, 20932, 20933, 20936, 20942, 21089, 21082, 21074, 21086, 21087, + 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, 21778, 21735, + 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, 21765, 21745, + 21770, 21755, 21751, 21752, 21728, 21774, 21763, 21771, 22273, 22274, + 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, 22456, 22454, + 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, 23062, 23085, + 23086, 23061, 23055, 23063, 23050, 23070, 23091, 23404, 23463, 23469, + 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, 23799, 23808, + 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, 24368, 24423, + 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, 24705, 24733, + 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, 25158, 25330, + 25360, 25430, 25388, 25412, 25413, 25398, 25411, 25572, 25401, 25419, + 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, 25389, 25415, + 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, 25926, 26054, + 26051, 26052, 26050, 26186, 26207, 26183, 26193, 26386, 26387, 26655, + 26650, 26697, 26674, 26675, 26683, 26699, 26703, 26646, 26673, 26652, + 26677, 26667, 26669, 26671, 26702, 26692, 26676, 26653, 26642, 26644, + 26662, 26664, 26670, 26701, 26682, 26661, 26656, 27436, 27439, 27437, + 27441, 27444, 27501, 32898, 27528, 27622, 27620, 27624, 27619, 27618, + 27623, 27685, 28026, 28003, 28004, 28022, 27917, 28001, 28050, 27992, + 28002, 28013, 28015, 28049, 28045, 28143, 28031, 28038, 27998, 28007, + 28000, 28055, 28016, 28028, 27999, 28034, 28056, 27951, 28008, 28043, + 28030, 28032, 28036, 27926, 28035, 28027, 28029, 28021, 28048, 28892, + 28883, 28881, 28893, 28875, 32569, 28898, 28887, 28882, 28894, 28896, + 28884, 28877, 28869, 28870, 28871, 28890, 28878, 28897, 29250, 29304, + 29303, 29302, 29440, 29434, 29428, 29438, 29430, 29427, 29435, 29441, + 29651, 29657, 29669, 29654, 29628, 29671, 29667, 29673, 29660, 29650, + 29659, 29652, 29661, 29658, 29655, 29656, 29672, 29918, 29919, 29940, + 29941, 29985, 30043, 30047, 30128, 30145, 30139, 30148, 30144, 30143, + 30134, 30138, 30346, 30409, 30493, 30491, 30480, 30483, 30482, 30499, + 30481, 30485, 30489, 30490, 30498, 30503, 30755, 30764, 30754, 30773, + 30767, 30760, 30766, 30763, 30753, 30761, 30771, 30762, 30769, 31060, + 31067, 31055, 31068, 31059, 31058, 31057, 31211, 31212, 31200, 31214, + 31213, 31210, 31196, 31198, 31197, 31366, 31369, 31365, 31371, 31372, + 31370, 31367, 31448, 31504, 31492, 31507, 31493, 31503, 31496, 31498, + 31502, 31497, 31506, 31876, 31889, 31882, 31884, 31880, 31885, 31877, + 32030, 32029, 32017, 32014, 32024, 32022, 32019, 32031, 32018, 32015, + 32012, 32604, 32609, 32606, 32608, 32605, 32603, 32662, 32658, 32707, + 32706, 32704, 32790, 32830, 32825, 33018, 33010, 33017, 33013, 33025, + 33019, 33024, 33281, 33327, 33317, 33587, 33581, 33604, 33561, 33617, + 33573, 33622, 33599, 33601, 33574, 33564, 33570, 33602, 33614, 33563, + 33578, 33544, 33596, 33613, 33558, 33572, 33568, 33591, 33583, 33577, + 33607, 33605, 33612, 33619, 33566, 33580, 33611, 33575, 33608, 34387, + 34386, 34466, 34472, 34454, 34445, 34449, 34462, 34439, 34455, 34438, + 34443, 34458, 34437, 34469, 34457, 34465, 34471, 34453, 34456, 34446, + 34461, 34448, 34452, 34883, 34884, 34925, 34933, 34934, 34930, 34944, + 34929, 34943, 34927, 34947, 34942, 34932, 34940, 35346, 35911, 35927, + 35963, 36004, 36003, 36214, 36216, 36277, 36279, 36278, 36561, 36563, + 36862, 36853, 36866, 36863, 36859, 36868, 36860, 36854, 37078, 37088, + 37081, 37082, 37091, 37087, 37093, 37080, 37083, 37079, 37084, 37092, + 37200, 37198, 37199, 37333, 37346, 37338, 38492, 38495, 38588, 39139, + 39647, 39727, 20095, 20592, 20586, 20577, 20574, 20576, 20563, 20555, + 20573, 20594, 20552, 20557, 20545, 20571, 20554, 20578, 20501, 20549, + 20575, 20585, 20587, 20579, 20580, 20550, 20544, 20590, 20595, 20567, + 20561, 20944, 21099, 21101, 21100, 21102, 21206, 21203, 21293, 21404, + 21877, 21878, 21820, 21837, 21840, 21812, 21802, 21841, 21858, 21814, + 21813, 21808, 21842, 21829, 21772, 21810, 21861, 21838, 21817, 21832, + 21805, 21819, 21824, 21835, 22282, 22279, 22523, 22548, 22498, 22518, + 22492, 22516, 22528, 22509, 22525, 22536, 22520, 22539, 22515, 22479, + 22535, 22510, 22499, 22514, 22501, 22508, 22497, 22542, 22524, 22544, + 22503, 22529, 22540, 22513, 22505, 22512, 22541, 22532, 22876, 23136, + 23128, 23125, 23143, 23134, 23096, 23093, 23149, 23120, 23135, 23141, + 23148, 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, + 23182, 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, + 23106, 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, + 23834, 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, + 23843, 23839, 23854, 24126, 24116, 24241, 24244, 24249, 24242, 24243, + 24374, 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, + 24762, 24787, 24788, 24783, 24804, 24793, 24797, 24776, 24753, 24795, + 24759, 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, + 25469, 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, + 25488, 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, + 25503, 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, + 26209, 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, + 26733, 26734, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, + 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, + 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, + 26769, 26764, 26762, 26749, 27446, 27443, 27447, 27448, 27537, 27535, + 27533, 27534, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, + 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, + 28094, 28133, 28124, 28125, 28123, 28148, 28106, 28093, 28141, 28144, + 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, + 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, + 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, + 28939, 28930, 28942, 29310, 29307, 29308, 29311, 29469, 29463, 29447, + 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, + 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, + 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, 30155, 30156, + 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, 30513, 30514, + 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, + 30794, 30796, 30758, 30789, 30800, 31076, 31079, 31081, 31082, 31075, + 31083, 31073, 31163, 31226, 31224, 31222, 31223, 31375, 31380, 31376, + 31541, 31559, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, + 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, + 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, + 32041, 32065, 32071, 32062, 32063, 32074, 32059, 32040, 32611, 32661, + 32668, 32669, 32667, 32714, 32715, 32717, 32720, 32721, 32711, 32719, + 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, 33049, + 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, 33058, + 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, 33704, + 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, 33653, + 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, 33662, + 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, 33654, + 33690, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, + 34504, 34489, 34483, 34488, 34508, 34484, 34491, 34492, 34499, 34493, + 34494, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, 34977, + 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, 34963, + 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, 35897, + 35899, 35932, 35933, 35965, 36005, 36221, 36219, 36217, 36284, 36290, + 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, 36576, 36577, + 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, 37104, 37108, + 37106, 37107, 37076, 37099, 37100, 37097, 37206, 37208, 37210, 37203, + 37205, 37356, 37364, 37361, 37363, 37368, 37348, 37369, 37354, 37355, + 37367, 37352, 37358, 38266, 38278, 38280, 38524, 38509, 38507, 38513, + 38511, 38591, 38762, 38916, 39141, 39319, 20635, 20629, 20628, 20638, + 20619, 20643, 20611, 20620, 20622, 20637, 20584, 20636, 20626, 20610, + 20615, 20831, 20948, 21266, 21265, 21412, 21415, 21905, 21928, 21925, + 21933, 21879, 22085, 21922, 21907, 21896, 21903, 21941, 21889, 21923, + 21906, 21924, 21885, 21900, 21926, 21887, 21909, 21921, 21902, 22284, + 22569, 22583, 22553, 22558, 22567, 22563, 22568, 22517, 22600, 22565, + 22556, 22555, 22579, 22591, 22582, 22574, 22585, 22584, 22573, 22572, + 22587, 22881, 23215, 23188, 23199, 23162, 23202, 23198, 23160, 23206, + 23164, 23205, 23212, 23189, 23214, 23095, 23172, 23178, 23191, 23171, + 23179, 23209, 23163, 23165, 23180, 23196, 23183, 23187, 23197, 23530, + 23501, 23499, 23508, 23505, 23498, 23502, 23564, 23600, 23863, 23875, + 23915, 23873, 23883, 23871, 23861, 23889, 23886, 23893, 23859, 23866, + 23890, 23869, 23857, 23897, 23874, 23865, 23881, 23864, 23868, 23858, + 23862, 23872, 23877, 24132, 24129, 24408, 24486, 24485, 24491, 24777, + 24761, 24780, 24802, 24782, 24772, 24852, 24818, 24842, 24854, 24837, + 24821, 24851, 24824, 24828, 24830, 24769, 24835, 24856, 24861, 24848, + 24831, 24836, 24843, 25162, 25492, 25521, 25520, 25550, 25573, 25576, + 25583, 25539, 25757, 25587, 25546, 25568, 25590, 25557, 25586, 25589, + 25697, 25567, 25534, 25565, 25564, 25540, 25560, 25555, 25538, 25543, + 25548, 25547, 25544, 25584, 25559, 25561, 25906, 25959, 25962, 25956, + 25948, 25960, 25957, 25996, 26013, 26014, 26030, 26064, 26066, 26236, + 26220, 26235, 26240, 26225, 26233, 26218, 26226, 26369, 26892, 26835, + 26884, 26844, 26922, 26860, 26858, 26865, 26895, 26838, 26871, 26859, + 26852, 26870, 26899, 26896, 26867, 26849, 26887, 26828, 26888, 26992, + 26804, 26897, 26863, 26822, 26900, 26872, 26832, 26877, 26876, 26856, + 26891, 26890, 26903, 26830, 26824, 26845, 26846, 26854, 26868, 26833, + 26886, 26836, 26857, 26901, 26917, 26823, 27449, 27451, 27455, 27452, + 27540, 27543, 27545, 27541, 27581, 27632, 27634, 27635, 27696, 28156, + 28230, 28231, 28191, 28233, 28296, 28220, 28221, 28229, 28258, 28203, + 28223, 28225, 28253, 28275, 28188, 28211, 28235, 28224, 28241, 28219, + 28163, 28206, 28254, 28264, 28252, 28257, 28209, 28200, 28256, 28273, + 28267, 28217, 28194, 28208, 28243, 28261, 28199, 28280, 28260, 28279, + 28245, 28281, 28242, 28262, 28213, 28214, 28250, 28960, 28958, 28975, + 28923, 28974, 28977, 28963, 28965, 28962, 28978, 28959, 28968, 28986, + 28955, 29259, 29274, 29320, 29321, 29318, 29317, 29323, 29458, 29451, + 29488, 29474, 29489, 29491, 29479, 29490, 29485, 29478, 29475, 29493, + 29452, 29742, 29740, 29744, 29739, 29718, 29722, 29729, 29741, 29745, + 29732, 29731, 29725, 29737, 29728, 29746, 29947, 29999, 30063, 30060, + 30183, 30170, 30177, 30182, 30173, 30175, 30180, 30167, 30357, 30354, + 30426, 30534, 30535, 30532, 30541, 30533, 30538, 30542, 30539, 30540, + 30686, 30700, 30816, 30820, 30821, 30812, 30829, 30833, 30826, 30830, + 30832, 30825, 30824, 30814, 30818, 31092, 31091, 31090, 31088, 31234, + 31242, 31235, 31244, 31236, 31385, 31462, 31460, 31562, 31547, 31556, + 31560, 31564, 31566, 31552, 31576, 31557, 31906, 31902, 31912, 31905, + 32088, 32111, 32099, 32083, 32086, 32103, 32106, 32079, 32109, 32092, + 32107, 32082, 32084, 32105, 32081, 32095, 32078, 32574, 32575, 32613, + 32614, 32674, 32672, 32673, 32727, 32849, 32847, 32848, 33022, 32980, + 33091, 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, + 33271, 33272, 33273, 33284, 33340, 33341, 33343, 33397, 33595, 33743, + 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, 33782, 33808, + 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, 33752, 33791, + 33761, 33739, 33742, 33750, 33781, 33737, 33801, 33807, 33758, 33809, + 33798, 33730, 33779, 33749, 33786, 33735, 33745, 33770, 33811, 33731, + 33772, 33774, 33732, 33787, 33751, 33762, 33819, 33755, 33790, 34520, + 34530, 34534, 34515, 34531, 34522, 34538, 34525, 34539, 34524, 34540, + 34537, 34519, 34536, 34513, 34888, 34902, 34901, 35002, 35031, 35001, + 35000, 35008, 35006, 34998, 35004, 34999, 35005, 34994, 35073, 35017, + 35221, 35224, 35223, 35293, 35290, 35291, 35406, 35405, 35385, 35417, + 35392, 35415, 35416, 35396, 35397, 35410, 35400, 35409, 35402, 35404, + 35407, 35935, 35969, 35968, 36026, 36030, 36016, 36025, 36021, 36228, + 36224, 36233, 36312, 36307, 36301, 36295, 36310, 36316, 36303, 36309, + 36313, 36296, 36311, 36293, 36591, 36599, 36602, 36601, 36582, 36590, + 36581, 36597, 36583, 36584, 36598, 36587, 36593, 36588, 36596, 36585, + 36909, 36916, 36911, 37126, 37164, 37124, 37119, 37116, 37128, 37113, + 37115, 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, + 37216, 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, + 37394, 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, + 37399, 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, 38536, + 38537, 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, + 38766, 38919, 39081, 39147, 40166, 40697, 20099, 20100, 20150, 20669, + 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, + 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, 21115, + 21116, 21955, 21979, 21964, 21968, 21963, 21962, 21981, 21952, 21972, + 21956, 21993, 21951, 21970, 21901, 21967, 21973, 21986, 21974, 21960, + 22002, 21965, 21977, 21954, 22292, 22611, 22632, 22628, 22607, 22605, + 22601, 22639, 22613, 22606, 22621, 22617, 22629, 22619, 22589, 22627, + 22641, 22780, 23239, 23236, 23243, 23226, 23224, 23217, 23221, 23216, + 23231, 23240, 23227, 23238, 23223, 23232, 23242, 23220, 23222, 23245, + 23225, 23184, 23510, 23512, 23513, 23583, 23603, 23921, 23907, 23882, + 23909, 23922, 23916, 23902, 23912, 23911, 23906, 24048, 24143, 24142, + 24138, 24141, 24139, 24261, 24268, 24262, 24267, 24263, 24384, 24495, + 24493, 24823, 24905, 24906, 24875, 24901, 24886, 24882, 24878, 24902, + 24879, 24911, 24873, 24896, 25120, 37224, 25123, 25125, 25124, 25541, + 25585, 25579, 25616, 25618, 25609, 25632, 25636, 25651, 25667, 25631, + 25621, 25624, 25657, 25655, 25634, 25635, 25612, 25638, 25648, 25640, + 25665, 25653, 25647, 25610, 25626, 25664, 25637, 25639, 25611, 25575, + 25627, 25646, 25633, 25614, 25967, 26002, 26067, 26246, 26252, 26261, + 26256, 26251, 26250, 26265, 26260, 26232, 26400, 26982, 26975, 26936, + 26958, 26978, 26993, 26943, 26949, 26986, 26937, 26946, 26967, 26969, + 27002, 26952, 26953, 26933, 26988, 26931, 26941, 26981, 26864, 27000, + 26932, 26985, 26944, 26991, 26948, 26998, 26968, 26945, 26996, 26956, + 26939, 26955, 26935, 26972, 26959, 26961, 26930, 26962, 26927, 27003, + 26940, 27462, 27461, 27459, 27458, 27464, 27457, 27547, 64013, 27643, + 27644, 27641, 27639, 27640, 28315, 28374, 28360, 28303, 28352, 28319, + 28307, 28308, 28320, 28337, 28345, 28358, 28370, 28349, 28353, 28318, + 28361, 28343, 28336, 28365, 28326, 28367, 28338, 28350, 28355, 28380, + 28376, 28313, 28306, 28302, 28301, 28324, 28321, 28351, 28339, 28368, + 28362, 28311, 28334, 28323, 28999, 29012, 29010, 29027, 29024, 28993, + 29021, 29026, 29042, 29048, 29034, 29025, 28994, 29016, 28995, 29003, + 29040, 29023, 29008, 29011, 28996, 29005, 29018, 29263, 29325, 29324, + 29329, 29328, 29326, 29500, 29506, 29499, 29498, 29504, 29514, 29513, + 29764, 29770, 29771, 29778, 29777, 29783, 29760, 29775, 29776, 29774, + 29762, 29766, 29773, 29780, 29921, 29951, 29950, 29949, 29981, 30073, + 30071, 27011, 30191, 30223, 30211, 30199, 30206, 30204, 30201, 30200, + 30224, 30203, 30198, 30189, 30197, 30205, 30361, 30389, 30429, 30549, + 30559, 30560, 30546, 30550, 30554, 30569, 30567, 30548, 30553, 30573, + 30688, 30855, 30874, 30868, 30863, 30852, 30869, 30853, 30854, 30881, + 30851, 30841, 30873, 30848, 30870, 30843, 31100, 31106, 31101, 31097, + 31249, 31256, 31257, 31250, 31255, 31253, 31266, 31251, 31259, 31248, + 31395, 31394, 31390, 31467, 31590, 31588, 31597, 31604, 31593, 31602, + 31589, 31603, 31601, 31600, 31585, 31608, 31606, 31587, 31922, 31924, + 31919, 32136, 32134, 32128, 32141, 32127, 32133, 32122, 32142, 32123, + 32131, 32124, 32140, 32148, 32132, 32125, 32146, 32621, 32619, 32615, + 32616, 32620, 32678, 32677, 32679, 32731, 32732, 32801, 33124, 33120, + 33143, 33116, 33129, 33115, 33122, 33138, 26401, 33118, 33142, 33127, + 33135, 33092, 33121, 33309, 33353, 33348, 33344, 33346, 33349, 34033, + 33855, 33878, 33910, 33913, 33935, 33933, 33893, 33873, 33856, 33926, + 33895, 33840, 33869, 33917, 33882, 33881, 33908, 33907, 33885, 34055, + 33886, 33847, 33850, 33844, 33914, 33859, 33912, 33842, 33861, 33833, + 33753, 33867, 33839, 33858, 33837, 33887, 33904, 33849, 33870, 33868, + 33874, 33903, 33989, 33934, 33851, 33863, 33846, 33843, 33896, 33918, + 33860, 33835, 33888, 33876, 33902, 33872, 34571, 34564, 34551, 34572, + 34554, 34518, 34549, 34637, 34552, 34574, 34569, 34561, 34550, 34573, + 34565, 35030, 35019, 35021, 35022, 35038, 35035, 35034, 35020, 35024, + 35205, 35227, 35295, 35301, 35300, 35297, 35296, 35298, 35292, 35302, + 35446, 35462, 35455, 35425, 35391, 35447, 35458, 35460, 35445, 35459, + 35457, 35444, 35450, 35900, 35915, 35914, 35941, 35940, 35942, 35974, + 35972, 35973, 36044, 36200, 36201, 36241, 36236, 36238, 36239, 36237, + 36243, 36244, 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, + 36329, 36323, 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, + 36608, 36613, 36615, 36616, 36610, 36619, 36946, 36927, 36932, 36937, + 36925, 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, 37230, + 37231, 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, + 37422, 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, + 37473, 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, + 37462, 37426, 38303, 38300, 38302, 38299, 38546, 38547, 38545, 38551, + 38606, 38650, 38653, 38648, 38645, 38771, 38775, 38776, 38770, 38927, + 38925, 38926, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, + 39595, 39771, 40170, 40173, 40167, 40576, 40701, 20710, 20692, 20695, + 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, 20719, + 20707, 20704, 20952, 21120, 21121, 21225, 21227, 21296, 21420, 22055, + 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, 22010, + 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, 22657, + 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, 22664, + 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, 23274, + 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, 23261, + 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, 23933, + 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, 23949, + 23929, 23935, 24152, 24153, 24147, 24280, 24273, 24279, 24270, 24284, + 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, 24872, + 24897, 24926, 24945, 24947, 24914, 24915, 24946, 24940, 24960, 24948, + 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, 25127, + 25131, 25643, 25677, 25691, 25693, 25716, 25718, 25714, 25715, 25725, + 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, 25696, + 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, 26016, + 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, 27040, + 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, 27021, + 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, 27082, + 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, 27024, + 27074, 27061, 27045, 27078, 27466, 27469, 27467, 27550, 27551, 27552, + 27587, 27588, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, + 28411, 28462, 28425, 28494, 28441, 28442, 28455, 28440, 28475, 28434, + 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, + 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, + 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, + 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, + 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, + 29813, 29810, 29799, 29806, 29952, 29954, 29955, 30077, 30096, 30230, + 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, + 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, + 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, + 31114, 31115, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, + 31275, 31306, 31280, 31279, 31272, 31270, 31400, 31403, 31404, 31470, + 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, + 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, + 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, + 32196, 32198, 32203, 32204, 32175, 32185, 32150, 32188, 32159, 32166, + 32174, 32169, 32161, 32201, 32627, 32738, 32739, 32741, 32734, 32804, + 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, + 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, + 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, + 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, 33960, 34006, + 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, 33937, + 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, 34585, + 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, 34605, + 34620, 34578, 34618, 34609, 34613, 34626, 34598, 34599, 34616, 34596, + 34586, 34608, 34577, 35063, 35047, 35057, 35058, 35066, 35070, 35054, + 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, 35230, + 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, 35901, + 35944, 35945, 36053, 36047, 36055, 36246, 36361, 36354, 36351, 36365, + 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, 36624, + 36625, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, 37146, + 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, 37494, + 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, 37497, + 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, 37512, + 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, 37533, + 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, 38787, + 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, 39085, + 39086, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, 39354, + 39362, 39357, 39367, 39601, 39651, 39655, 39742, 39743, 39776, 39777, + 39775, 40177, 40178, 40181, 40615, 20735, 20739, 20784, 20728, 20742, + 20743, 20726, 20734, 20747, 20748, 20733, 20746, 21131, 21132, 21233, + 21231, 22088, 22082, 22092, 22069, 22081, 22090, 22089, 22086, 22104, + 22106, 22080, 22067, 22077, 22060, 22078, 22072, 22058, 22074, 22298, + 22699, 22685, 22705, 22688, 22691, 22703, 22700, 22693, 22689, 22783, + 23295, 23284, 23293, 23287, 23286, 23299, 23288, 23298, 23289, 23297, + 23303, 23301, 23311, 23655, 23961, 23959, 23967, 23954, 23970, 23955, + 23957, 23968, 23964, 23969, 23962, 23966, 24169, 24157, 24160, 24156, + 32243, 24283, 24286, 24289, 24393, 24498, 24971, 24963, 24953, 25009, + 25008, 24994, 24969, 24987, 24979, 25007, 25005, 24991, 24978, 25002, + 24993, 24973, 24934, 25011, 25133, 25710, 25712, 25750, 25760, 25733, + 25751, 25756, 25743, 25739, 25738, 25740, 25763, 25759, 25704, 25777, + 25752, 25974, 25978, 25977, 25979, 26034, 26035, 26293, 26288, 26281, + 26290, 26295, 26282, 26287, 27136, 27142, 27159, 27109, 27128, 27157, + 27121, 27108, 27168, 27135, 27116, 27106, 27163, 27165, 27134, 27175, + 27122, 27118, 27156, 27127, 27111, 27200, 27144, 27110, 27131, 27149, + 27132, 27115, 27145, 27140, 27160, 27173, 27151, 27126, 27174, 27143, + 27124, 27158, 27473, 27557, 27555, 27554, 27558, 27649, 27648, 27647, + 27650, 28481, 28454, 28542, 28551, 28614, 28562, 28557, 28553, 28556, + 28514, 28495, 28549, 28506, 28566, 28534, 28524, 28546, 28501, 28530, + 28498, 28496, 28503, 28564, 28563, 28509, 28416, 28513, 28523, 28541, + 28519, 28560, 28499, 28555, 28521, 28543, 28565, 28515, 28535, 28522, + 28539, 29106, 29103, 29083, 29104, 29088, 29082, 29097, 29109, 29085, + 29093, 29086, 29092, 29089, 29098, 29084, 29095, 29107, 29336, 29338, + 29528, 29522, 29534, 29535, 29536, 29533, 29531, 29537, 29530, 29529, + 29538, 29831, 29833, 29834, 29830, 29825, 29821, 29829, 29832, 29820, + 29817, 29960, 29959, 30078, 30245, 30238, 30233, 30237, 30236, 30243, + 30234, 30248, 30235, 30364, 30365, 30366, 30363, 30605, 30607, 30601, + 30600, 30925, 30907, 30927, 30924, 30929, 30926, 30932, 30920, 30915, + 30916, 30921, 31130, 31137, 31136, 31132, 31138, 31131, 27510, 31289, + 31410, 31412, 31411, 31671, 31691, 31678, 31660, 31694, 31663, 31673, + 31690, 31669, 31941, 31944, 31948, 31947, 32247, 32219, 32234, 32231, + 32215, 32225, 32259, 32250, 32230, 32246, 32241, 32240, 32238, 32223, + 32630, 32684, 32688, 32685, 32749, 32747, 32746, 32748, 32742, 32744, + 32868, 32871, 33187, 33183, 33182, 33173, 33186, 33177, 33175, 33302, + 33359, 33363, 33362, 33360, 33358, 33361, 34084, 34107, 34063, 34048, + 34089, 34062, 34057, 34061, 34079, 34058, 34087, 34076, 34043, 34091, + 34042, 34056, 34060, 34036, 34090, 34034, 34069, 34039, 34027, 34035, + 34044, 34066, 34026, 34025, 34070, 34046, 34088, 34077, 34094, 34050, + 34045, 34078, 34038, 34097, 34086, 34023, 34024, 34032, 34031, 34041, + 34072, 34080, 34096, 34059, 34073, 34095, 34402, 34646, 34659, 34660, + 34679, 34785, 34675, 34648, 34644, 34651, 34642, 34657, 34650, 34641, + 34654, 34669, 34666, 34640, 34638, 34655, 34653, 34671, 34668, 34682, + 34670, 34652, 34661, 34639, 34683, 34677, 34658, 34663, 34665, 34906, + 35077, 35084, 35092, 35083, 35095, 35096, 35097, 35078, 35094, 35089, + 35086, 35081, 35234, 35236, 35235, 35309, 35312, 35308, 35535, 35526, + 35512, 35539, 35537, 35540, 35541, 35515, 35543, 35518, 35520, 35525, + 35544, 35523, 35514, 35517, 35545, 35902, 35917, 35983, 36069, 36063, + 36057, 36072, 36058, 36061, 36071, 36256, 36252, 36257, 36251, 36384, + 36387, 36389, 36388, 36398, 36373, 36379, 36374, 36369, 36377, 36390, + 36391, 36372, 36370, 36376, 36371, 36380, 36375, 36378, 36652, 36644, + 36632, 36634, 36640, 36643, 36630, 36631, 36979, 36976, 36975, 36967, + 36971, 37167, 37163, 37161, 37162, 37170, 37158, 37166, 37253, 37254, + 37258, 37249, 37250, 37252, 37248, 37584, 37571, 37572, 37568, 37593, + 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, + 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, + 37598, 37607, 37585, 37587, 37557, 37601, 37574, 37556, 38268, 38316, + 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, 38746, + 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, 38952, + 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, 39190, 39191, + 39189, 39388, 39373, 39375, 39379, 39380, 39374, 39369, 39382, 39384, + 39371, 39383, 39372, 39603, 39660, 39659, 39667, 39666, 39665, 39750, + 39747, 39783, 39796, 39793, 39782, 39798, 39797, 39792, 39784, 39780, + 39788, 40188, 40186, 40189, 40191, 40183, 40199, 40192, 40185, 40187, + 40200, 40197, 40196, 40579, 40659, 40719, 40720, 20764, 20755, 20759, + 20762, 20753, 20958, 21300, 21473, 22128, 22112, 22126, 22131, 22118, + 22115, 22125, 22130, 22110, 22135, 22300, 22299, 22728, 22717, 22729, + 22719, 22714, 22722, 22716, 22726, 23319, 23321, 23323, 23329, 23316, + 23315, 23312, 23318, 23336, 23322, 23328, 23326, 23535, 23980, 23985, + 23977, 23975, 23989, 23984, 23982, 23978, 23976, 23986, 23981, 23983, + 23988, 24167, 24168, 24166, 24175, 24297, 24295, 24294, 24296, 24293, + 24395, 24508, 24989, 25000, 24982, 25029, 25012, 25030, 25025, 25036, + 25018, 25023, 25016, 24972, 25815, 25814, 25808, 25807, 25801, 25789, + 25737, 25795, 25819, 25843, 25817, 25907, 25983, 25980, 26018, 26312, + 26302, 26304, 26314, 26315, 26319, 26301, 26299, 26298, 26316, 26403, + 27188, 27238, 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, + 27227, 27217, 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, + 27215, 27220, 27247, 27241, 27232, 27196, 27230, 27222, 27221, 27213, + 27214, 27206, 27477, 27476, 27478, 27559, 27562, 27563, 27592, 27591, + 27652, 27651, 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, + 28510, 28612, 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, + 28588, 28586, 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, + 28594, 28592, 29125, 29122, 29119, 29112, 29142, 29120, 29121, 29131, + 29140, 29130, 29127, 29135, 29117, 29144, 29116, 29126, 29146, 29147, + 29341, 29342, 29545, 29542, 29543, 29548, 29541, 29547, 29546, 29823, + 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, 30253, + 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, 30618, + 30621, 30625, 30620, 30619, 30626, 30627, 30613, 30617, 30615, 30941, + 30953, 30949, 30954, 30942, 30947, 30939, 30945, 30946, 30957, 30943, + 30944, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, 31415, + 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, 31700, + 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, 31952, + 31953, 32274, 32289, 32279, 32268, 32287, 32288, 32275, 32270, 32284, + 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, 32293, 32292, + 32579, 32635, 32636, 32634, 32689, 32751, 32810, 32809, 32876, 33201, + 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, 33202, 33207, + 33191, 33266, 33365, 33366, 33367, 34134, 34117, 34155, 34125, 34131, + 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, 34119, + 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, 34144, + 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, 34715, + 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, 34681, 34695, + 34723, 34693, 34704, 34705, 34717, 34692, 34708, 34716, 34714, 34697, + 35102, 35110, 35120, 35117, 35118, 35111, 35121, 35106, 35113, 35107, + 35119, 35116, 35103, 35313, 35552, 35554, 35570, 35572, 35573, 35549, + 35604, 35556, 35551, 35568, 35528, 35550, 35553, 35560, 35583, 35567, + 35579, 35985, 35986, 35984, 36085, 36078, 36081, 36080, 36083, 36204, + 36206, 36261, 36263, 36403, 36414, 36408, 36416, 36421, 36406, 36412, + 36413, 36417, 36400, 36415, 36541, 36662, 36654, 36661, 36658, 36665, + 36663, 36660, 36982, 36985, 36987, 36998, 37114, 37171, 37173, 37174, + 37267, 37264, 37265, 37261, 37263, 37671, 37662, 37640, 37663, 37638, + 37647, 37754, 37688, 37692, 37659, 37667, 37650, 37633, 37702, 37677, + 37646, 37645, 37579, 37661, 37626, 37669, 37651, 37625, 37623, 37684, + 37634, 37668, 37631, 37673, 37689, 37685, 37674, 37652, 37644, 37643, + 37630, 37641, 37632, 37627, 37654, 38332, 38349, 38334, 38329, 38330, + 38326, 38335, 38325, 38333, 38569, 38612, 38667, 38674, 38672, 38809, + 38807, 38804, 38896, 38904, 38965, 38959, 38962, 39204, 39199, 39207, + 39209, 39326, 39406, 39404, 39397, 39396, 39408, 39395, 39402, 39401, + 39399, 39609, 39615, 39604, 39611, 39670, 39674, 39673, 39671, 39731, + 39808, 39813, 39815, 39804, 39806, 39803, 39810, 39827, 39826, 39824, + 39802, 39829, 39805, 39816, 40229, 40215, 40224, 40222, 40212, 40233, + 40221, 40216, 40226, 40208, 40217, 40223, 40584, 40582, 40583, 40622, + 40621, 40661, 40662, 40698, 40722, 40765, 20774, 20773, 20770, 20772, + 20768, 20777, 21236, 22163, 22156, 22157, 22150, 22148, 22147, 22142, + 22146, 22143, 22145, 22742, 22740, 22735, 22738, 23341, 23333, 23346, + 23331, 23340, 23335, 23334, 23343, 23342, 23419, 23537, 23538, 23991, + 24172, 24170, 24510, 24507, 25027, 25013, 25020, 25063, 25056, 25061, + 25060, 25064, 25054, 25839, 25833, 25827, 25835, 25828, 25832, 25985, + 25984, 26038, 26074, 26322, 27277, 27286, 27265, 27301, 27273, 27295, + 27291, 27297, 27294, 27271, 27283, 27278, 27285, 27267, 27304, 27300, + 27281, 27263, 27302, 27290, 27269, 27276, 27282, 27483, 27565, 27657, + 28620, 28585, 28660, 28628, 28643, 28636, 28653, 28647, 28646, 28638, + 28658, 28637, 28642, 28648, 29153, 29169, 29160, 29170, 29156, 29168, + 29154, 29555, 29550, 29551, 29847, 29874, 29867, 29840, 29866, 29869, + 29873, 29861, 29871, 29968, 29969, 29970, 29967, 30084, 30275, 30280, + 30281, 30279, 30372, 30441, 30645, 30635, 30642, 30647, 30646, 30644, + 30641, 30632, 30704, 30963, 30973, 30978, 30971, 30972, 30962, 30981, + 30969, 30974, 30980, 31147, 31144, 31324, 31323, 31318, 31320, 31316, + 31322, 31422, 31424, 31425, 31749, 31759, 31730, 31744, 31743, 31739, + 31758, 31732, 31755, 31731, 31746, 31753, 31747, 31745, 31736, 31741, + 31750, 31728, 31729, 31760, 31754, 31976, 32301, 32316, 32322, 32307, + 38984, 32312, 32298, 32329, 32320, 32327, 32297, 32332, 32304, 32315, + 32310, 32324, 32314, 32581, 32639, 32638, 32637, 32756, 32754, 32812, + 33211, 33220, 33228, 33226, 33221, 33223, 33212, 33257, 33371, 33370, + 33372, 34179, 34176, 34191, 34215, 34197, 34208, 34187, 34211, 34171, + 34212, 34202, 34206, 34167, 34172, 34185, 34209, 34170, 34168, 34135, + 34190, 34198, 34182, 34189, 34201, 34205, 34177, 34210, 34178, 34184, + 34181, 34169, 34166, 34200, 34192, 34207, 34408, 34750, 34730, 34733, + 34757, 34736, 34732, 34745, 34741, 34748, 34734, 34761, 34755, 34754, + 34764, 34743, 34735, 34756, 34762, 34740, 34742, 34751, 34744, 34749, + 34782, 34738, 35125, 35123, 35132, 35134, 35137, 35154, 35127, 35138, + 35245, 35247, 35246, 35314, 35315, 35614, 35608, 35606, 35601, 35589, + 35595, 35618, 35599, 35602, 35605, 35591, 35597, 35592, 35590, 35612, + 35603, 35610, 35919, 35952, 35954, 35953, 35951, 35989, 35988, 36089, + 36207, 36430, 36429, 36435, 36432, 36428, 36423, 36675, 36672, 36997, + 36990, 37176, 37274, 37282, 37275, 37273, 37279, 37281, 37277, 37280, + 37793, 37763, 37807, 37732, 37718, 37703, 37756, 37720, 37724, 37750, + 37705, 37712, 37713, 37728, 37741, 37775, 37708, 37738, 37753, 37719, + 37717, 37714, 37711, 37745, 37751, 37755, 37729, 37726, 37731, 37735, + 37760, 37710, 37721, 38343, 38336, 38345, 38339, 38341, 38327, 38574, + 38576, 38572, 38688, 38687, 38680, 38685, 38681, 38810, 38817, 38812, + 38814, 38813, 38869, 38868, 38897, 38977, 38980, 38986, 38985, 38981, + 38979, 39205, 39211, 39212, 39210, 39219, 39218, 39215, 39213, 39217, + 39216, 39320, 39331, 39329, 39426, 39418, 39412, 39415, 39417, 39416, + 39414, 39419, 39421, 39422, 39420, 39427, 39614, 39678, 39677, 39681, + 39676, 39752, 39834, 39848, 39838, 39835, 39846, 39841, 39845, 39844, + 39814, 39842, 39840, 39855, 40243, 40257, 40295, 40246, 40238, 40239, + 40241, 40248, 40240, 40261, 40258, 40259, 40254, 40247, 40256, 40253, + 32757, 40237, 40586, 40585, 40589, 40624, 40648, 40666, 40699, 40703, + 40740, 40739, 40738, 40788, 40864, 20785, 20781, 20782, 22168, 22172, + 22167, 22170, 22173, 22169, 22896, 23356, 23657, 23658, 24000, 24173, + 24174, 25048, 25055, 25069, 25070, 25073, 25066, 25072, 25067, 25046, + 25065, 25855, 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, + 26330, 26331, 26328, 27333, 27321, 27325, 27361, 27334, 27322, 27318, + 27319, 27335, 27316, 27309, 27486, 27593, 27659, 28679, 28684, 28685, + 28673, 28677, 28692, 28686, 28671, 28672, 28667, 28710, 28668, 28663, + 28682, 29185, 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, + 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, + 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30975, + 30988, 30995, 30996, 30985, 30992, 30994, 30993, 31149, 31148, 31327, + 31772, 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, + 31781, 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, + 32352, 32343, 32339, 32693, 32691, 32759, 32760, 32885, 33233, 33234, + 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, + 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, + 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, + 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, + 34776, 34787, 34724, 34775, 34777, 34817, 34804, 34792, 34781, 35155, + 35147, 35151, 35148, 35142, 35152, 35153, 35145, 35626, 35623, 35619, + 35635, 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, + 35622, 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, + 35992, 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, + 36438, 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, + 36678, 36679, 36680, 36683, 37160, 37178, 37179, 37182, 37288, 37285, + 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, + 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37773, + 37809, 37777, 37810, 37796, 37800, 37812, 37795, 37797, 38354, 38355, + 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, + 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, + 38873, 38870, 38872, 38906, 38992, 38993, 38994, 39096, 39233, 39228, + 39226, 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, + 39430, 39616, 39644, 39688, 39684, 39685, 39721, 39733, 39754, 39756, + 39755, 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, + 39876, 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, + 40278, 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, + 40671, 40705, 40704, 40726, 40741, 40747, 40746, 40745, 40744, 40780, + 40789, 20788, 20789, 21142, 21239, 21428, 22187, 22189, 22182, 22183, + 22186, 22188, 22746, 22749, 22747, 22802, 23357, 23358, 23359, 24003, + 24176, 24511, 25083, 25863, 25872, 25869, 25865, 25868, 25870, 25988, + 26078, 26077, 26334, 27367, 27360, 27340, 27345, 27353, 27339, 27359, + 27356, 27344, 27371, 27343, 27341, 27358, 27488, 27568, 27660, 28697, + 28711, 28704, 28694, 28715, 28705, 28706, 28707, 28713, 28695, 28708, + 28700, 28714, 29196, 29194, 29191, 29186, 29189, 29349, 29350, 29348, + 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, 30665, 30666, + 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, 31152, 31335, + 31336, 31795, 31804, 31801, 31788, 31803, 31980, 31978, 32374, 32373, + 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, 32587, 32586, + 32643, 32646, 32695, 32765, 32766, 32888, 33239, 33237, 33380, 33377, + 33379, 34283, 34289, 34285, 34265, 34273, 34280, 34266, 34263, 34284, + 34290, 34296, 34264, 34271, 34275, 34268, 34257, 34288, 34278, 34287, + 34270, 34274, 34816, 34810, 34819, 34806, 34807, 34825, 34828, 34827, + 34822, 34812, 34824, 34815, 34826, 34818, 35170, 35162, 35163, 35159, + 35169, 35164, 35160, 35165, 35161, 35208, 35255, 35254, 35318, 35664, + 35656, 35658, 35648, 35667, 35670, 35668, 35659, 35669, 35665, 35650, + 35666, 35671, 35907, 35959, 35958, 35994, 36102, 36103, 36105, 36268, + 36266, 36269, 36267, 36461, 36472, 36467, 36458, 36463, 36475, 36546, + 36690, 36689, 36687, 36688, 36691, 36788, 37184, 37183, 37296, 37293, + 37854, 37831, 37839, 37826, 37850, 37840, 37881, 37868, 37836, 37849, + 37801, 37862, 37834, 37844, 37870, 37859, 37845, 37828, 37838, 37824, + 37842, 37863, 38269, 38362, 38363, 38625, 38697, 38699, 38700, 38696, + 38694, 38835, 38839, 38838, 38877, 38878, 38879, 39004, 39001, 39005, + 38999, 39103, 39101, 39099, 39102, 39240, 39239, 39235, 39334, 39335, + 39450, 39445, 39461, 39453, 39460, 39451, 39458, 39456, 39463, 39459, + 39454, 39452, 39444, 39618, 39691, 39690, 39694, 39692, 39735, 39914, + 39915, 39904, 39902, 39908, 39910, 39906, 39920, 39892, 39895, 39916, + 39900, 39897, 39909, 39893, 39905, 39898, 40311, 40321, 40330, 40324, + 40328, 40305, 40320, 40312, 40326, 40331, 40332, 40317, 40299, 40308, + 40309, 40304, 40297, 40325, 40307, 40315, 40322, 40303, 40313, 40319, + 40327, 40296, 40596, 40593, 40640, 40700, 40749, 40768, 40769, 40781, + 40790, 40791, 40792, 21303, 22194, 22197, 22195, 22755, 23365, 24006, + 24007, 24302, 24303, 24512, 24513, 25081, 25879, 25878, 25877, 25875, + 26079, 26344, 26339, 26340, 27379, 27376, 27370, 27368, 27385, 27377, + 27374, 27375, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, + 28735, 28730, 28729, 28736, 28731, 28723, 28737, 29203, 29204, 29352, + 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, 30670, 30671, + 30669, 30706, 31013, 31011, 31015, 31016, 31012, 31017, 31154, 31342, + 31340, 31341, 31479, 31817, 31816, 31818, 31815, 31813, 31982, 32379, + 32382, 32385, 32384, 32698, 32767, 32889, 33243, 33241, 33291, 33384, + 33385, 34338, 34303, 34305, 34302, 34331, 34304, 34294, 34308, 34313, + 34309, 34316, 34301, 34841, 34832, 34833, 34839, 34835, 34838, 35171, + 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, 35685, 35687, + 35693, 36270, 36486, 36488, 36484, 36697, 36694, 36695, 36693, 36696, + 36698, 37005, 37187, 37185, 37303, 37301, 37298, 37299, 37899, 37907, + 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, 37913, 37901, + 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, 37897, 37880, + 37898, 37887, 37884, 37900, 37878, 37905, 37894, 38366, 38368, 38367, + 38702, 38703, 38841, 38843, 38909, 38910, 39008, 39010, 39011, 39007, + 39105, 39106, 39248, 39246, 39257, 39244, 39243, 39251, 39474, 39476, + 39473, 39468, 39466, 39478, 39465, 39470, 39480, 39469, 39623, 39626, + 39622, 39696, 39698, 39697, 39947, 39944, 39927, 39941, 39954, 39928, + 40000, 39943, 39950, 39942, 39959, 39956, 39945, 40351, 40345, 40356, + 40349, 40338, 40344, 40336, 40347, 40352, 40340, 40348, 40362, 40343, + 40353, 40346, 40354, 40360, 40350, 40355, 40383, 40361, 40342, 40358, + 40359, 40601, 40603, 40602, 40677, 40676, 40679, 40678, 40752, 40750, + 40795, 40800, 40798, 40797, 40793, 40849, 20794, 20793, 21144, 21143, + 22211, 22205, 22206, 23368, 23367, 24011, 24015, 24305, 25085, 25883, + 27394, 27388, 27395, 27384, 27392, 28739, 28740, 28746, 28744, 28745, + 28741, 28742, 29213, 29210, 29209, 29566, 29975, 30314, 30672, 31021, + 31025, 31023, 31828, 31827, 31986, 32394, 32391, 32392, 32395, 32390, + 32397, 32589, 32699, 32816, 33245, 34328, 34346, 34342, 34335, 34339, + 34332, 34329, 34343, 34350, 34337, 34336, 34345, 34334, 34341, 34857, + 34845, 34843, 34848, 34852, 34844, 34859, 34890, 35181, 35177, 35182, + 35179, 35322, 35705, 35704, 35653, 35706, 35707, 36112, 36116, 36271, + 36494, 36492, 36702, 36699, 36701, 37190, 37188, 37189, 37305, 37951, + 37947, 37942, 37929, 37949, 37948, 37936, 37945, 37930, 37943, 37932, + 37952, 37937, 38373, 38372, 38371, 38709, 38714, 38847, 38881, 39012, + 39113, 39110, 39104, 39256, 39254, 39481, 39485, 39494, 39492, 39490, + 39489, 39482, 39487, 39629, 39701, 39703, 39704, 39702, 39738, 39762, + 39979, 39965, 39964, 39980, 39971, 39976, 39977, 39972, 39969, 40375, + 40374, 40380, 40385, 40391, 40394, 40399, 40382, 40389, 40387, 40379, + 40373, 40398, 40377, 40378, 40364, 40392, 40369, 40365, 40396, 40371, + 40397, 40370, 40570, 40604, 40683, 40686, 40685, 40731, 40728, 40730, + 40753, 40782, 40805, 40804, 40850, 20153, 22214, 22213, 22219, 22897, + 23371, 23372, 24021, 24017, 24306, 25889, 25888, 25894, 25890, 27403, + 27400, 27401, 27661, 28757, 28758, 28759, 28754, 29214, 29215, 29353, + 29567, 29912, 29909, 29913, 29911, 30317, 30381, 31029, 31156, 31344, + 31345, 31831, 31836, 31833, 31835, 31834, 31988, 31985, 32401, 32591, + 32647, 33246, 33387, 34356, 34357, 34355, 34348, 34354, 34358, 34860, + 34856, 34854, 34858, 34853, 35185, 35263, 35262, 35323, 35710, 35716, + 35714, 35718, 35717, 35711, 36117, 36501, 36500, 36506, 36498, 36496, + 36502, 36503, 36704, 36706, 37191, 37964, 37968, 37962, 37963, 37967, + 37959, 37957, 37960, 37961, 37958, 38719, 38883, 39018, 39017, 39115, + 39252, 39259, 39502, 39507, 39508, 39500, 39503, 39496, 39498, 39497, + 39506, 39504, 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, + 39999, 40004, 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, + 39990, 40411, 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, + 40425, 40409, 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, + 40755, 40754, 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, + 22898, 23373, 24024, 34863, 24399, 25089, 25091, 25092, 25897, 25893, + 26006, 26347, 27409, 27410, 27407, 27594, 28763, 28762, 29218, 29570, + 29569, 29571, 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, + 34361, 34364, 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, + 35188, 35187, 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, + 36708, 36707, 37308, 37986, 37973, 37981, 37975, 37982, 38852, 38853, + 38912, 39510, 39513, 39710, 39711, 39712, 40018, 40024, 40016, 40010, + 40013, 40011, 40021, 40025, 40012, 40014, 40443, 40439, 40431, 40419, + 40427, 40440, 40420, 40438, 40417, 40430, 40422, 40434, 40432, 40418, + 40428, 40436, 40435, 40424, 40429, 40642, 40656, 40690, 40691, 40710, + 40732, 40760, 40759, 40758, 40771, 40783, 40817, 40816, 40814, 40815, + 22227, 22221, 23374, 23661, 25901, 26349, 26350, 27411, 28767, 28769, + 28765, 28768, 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, + 32407, 32649, 33389, 34371, 34872, 34871, 34869, 34891, 35732, 35733, + 36510, 36511, 36512, 36509, 37310, 37309, 37314, 37995, 37992, 37993, + 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, + 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, + 40453, 40448, 40449, 40457, 40447, 40445, 40452, 40608, 40734, 40774, + 40820, 40821, 40822, 22228, 25902, 26040, 27416, 27417, 27415, 27418, + 28770, 29222, 29354, 30680, 30681, 31033, 31849, 31851, 31990, 32410, + 32408, 32411, 32409, 33248, 33249, 34374, 34375, 34376, 35193, 35194, + 35196, 35195, 35327, 35736, 35737, 36517, 36516, 36515, 37998, 37997, + 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, + 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, + 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, + 38004, 38008, 38006, 38005, 39520, 40052, 40051, 40049, 40053, 40468, + 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, 34878, 34877, + 34879, 35742, 35996, 36521, 36553, 38731, 39027, 39028, 39116, 39265, + 39339, 39524, 39526, 39527, 39716, 40469, 40471, 40776, 25095, 27422, + 29223, 34380, 36520, 38018, 38016, 38017, 39529, 39528, 39726, 40473, + 29225, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, + 28777, 28778, 40612, 40830, 40777, 40856, 30849, 37561, 35023, 22715, + 24658, 31911, 23290, 9556, 9574, 9559, 9568, 9580, 9571, 9562, + 9577, 9565, 9554, 9572, 9557, 9566, 9578, 9569, 9560, 9575, + 9563, 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, + 9553, 9552, 9581, 9582, 9584, 9583, 65517, 132423, 37595, 132575, + 147397, 34124, 17077, 29679, 20917, 13897, 149826, 166372, 37700, 137691, + 33518, 146632, 30780, 26436, 25311, 149811, 166314, 131744, 158643, 135941, + 20395, 140525, 20488, 159017, 162436, 144896, 150193, 140563, 20521, 131966, + 24484, 131968, 131911, 28379, 132127, 20605, 20737, 13434, 20750, 39020, + 14147, 33814, 149924, 132231, 20832, 144308, 20842, 134143, 139516, 131813, + 140592, 132494, 143923, 137603, 23426, 34685, 132531, 146585, 20914, 20920, + 40244, 20937, 20943, 20945, 15580, 20947, 150182, 20915, 20962, 21314, + 20973, 33741, 26942, 145197, 24443, 21003, 21030, 21052, 21173, 21079, + 21140, 21177, 21189, 31765, 34114, 21216, 34317, 158483, 21253, 166622, + 21833, 28377, 147328, 133460, 147436, 21299, 21316, 134114, 27851, 136998, + 26651, 29653, 24650, 16042, 14540, 136936, 29149, 17570, 21357, 21364, + 165547, 21374, 21375, 136598, 136723, 30694, 21395, 166555, 21408, 21419, + 21422, 29607, 153458, 16217, 29596, 21441, 21445, 27721, 20041, 22526, + 21465, 15019, 134031, 21472, 147435, 142755, 21494, 134263, 21523, 28793, + 21803, 26199, 27995, 21613, 158547, 134516, 21853, 21647, 21668, 18342, + 136973, 134877, 15796, 134477, 166332, 140952, 21831, 19693, 21551, 29719, + 21894, 21929, 22021, 137431, 147514, 17746, 148533, 26291, 135348, 22071, + 26317, 144010, 26276, 26285, 22093, 22095, 30961, 22257, 38791, 21502, + 22272, 22255, 22253, 166758, 13859, 135759, 22342, 147877, 27758, 28811, + 22338, 14001, 158846, 22502, 136214, 22531, 136276, 148323, 22566, 150517, + 22620, 22698, 13665, 22752, 22748, 135740, 22779, 23551, 22339, 172368, + 148088, 37843, 13729, 22815, 26790, 14019, 28249, 136766, 23076, 21843, + 136850, 34053, 22985, 134478, 158849, 159018, 137180, 23001, 137211, 137138, + 159142, 28017, 137256, 136917, 23033, 159301, 23211, 23139, 14054, 149929, + 23159, 14088, 23190, 29797, 23251, 159649, 140628, 15749, 137489, 14130, + 136888, 24195, 21200, 23414, 25992, 23420, 162318, 16388, 18525, 131588, + 23509, 24928, 137780, 154060, 132517, 23539, 23453, 19728, 23557, 138052, + 23571, 29646, 23572, 138405, 158504, 23625, 18653, 23685, 23785, 23791, + 23947, 138745, 138807, 23824, 23832, 23878, 138916, 23738, 24023, 33532, + 14381, 149761, 139337, 139635, 33415, 14390, 15298, 24110, 27274, 24181, + 24186, 148668, 134355, 21414, 20151, 24272, 21416, 137073, 24073, 24308, + 164994, 24313, 24315, 14496, 24316, 26686, 37915, 24333, 131521, 194708, + 15070, 18606, 135994, 24378, 157832, 140240, 24408, 140401, 24419, 38845, + 159342, 24434, 37696, 166454, 24487, 23990, 15711, 152144, 139114, 159992, + 140904, 37334, 131742, 166441, 24625, 26245, 137335, 14691, 15815, 13881, + 22416, 141236, 31089, 15936, 24734, 24740, 24755, 149890, 149903, 162387, + 29860, 20705, 23200, 24932, 33828, 24898, 194726, 159442, 24961, 20980, + 132694, 24967, 23466, 147383, 141407, 25043, 166813, 170333, 25040, 14642, + 141696, 141505, 24611, 24924, 25886, 25483, 131352, 25285, 137072, 25301, + 142861, 25452, 149983, 14871, 25656, 25592, 136078, 137212, 25744, 28554, + 142902, 38932, 147596, 153373, 25825, 25829, 38011, 14950, 25658, 14935, + 25933, 28438, 150056, 150051, 25989, 25965, 25951, 143486, 26037, 149824, + 19255, 26065, 16600, 137257, 26080, 26083, 24543, 144384, 26136, 143863, + 143864, 26180, 143780, 143781, 26187, 134773, 26215, 152038, 26227, 26228, + 138813, 143921, 165364, 143816, 152339, 30661, 141559, 39332, 26370, 148380, + 150049, 15147, 27130, 145346, 26462, 26471, 26466, 147917, 168173, 26583, + 17641, 26658, 28240, 37436, 26625, 144358, 159136, 26717, 144495, 27105, + 27147, 166623, 26995, 26819, 144845, 26881, 26880, 15666, 14849, 144956, + 15232, 26540, 26977, 166474, 17148, 26934, 27032, 15265, 132041, 33635, + 20624, 27129, 144985, 139562, 27205, 145155, 27293, 15347, 26545, 27336, + 168348, 15373, 27421, 133411, 24798, 27445, 27508, 141261, 28341, 146139, + 132021, 137560, 14144, 21537, 146266, 27617, 147196, 27612, 27703, 140427, + 149745, 158545, 27738, 33318, 27769, 146876, 17605, 146877, 147876, 149772, + 149760, 146633, 14053, 15595, 134450, 39811, 143865, 140433, 32655, 26679, + 159013, 159137, 159211, 28054, 27996, 28284, 28420, 149887, 147589, 159346, + 34099, 159604, 20935, 27804, 28189, 33838, 166689, 28207, 146991, 29779, + 147330, 31180, 28239, 23185, 143435, 28664, 14093, 28573, 146992, 28410, + 136343, 147517, 17749, 37872, 28484, 28508, 15694, 28532, 168304, 15675, + 28575, 147780, 28627, 147601, 147797, 147513, 147440, 147380, 147775, 20959, + 147798, 147799, 147776, 156125, 28747, 28798, 28839, 28801, 28876, 28885, + 28886, 28895, 16644, 15848, 29108, 29078, 148087, 28971, 28997, 23176, + 29002, 29038, 23708, 148325, 29007, 37730, 148161, 28972, 148570, 150055, + 150050, 29114, 166888, 28861, 29198, 37954, 29205, 22801, 37955, 29220, + 37697, 153093, 29230, 29248, 149876, 26813, 29269, 29271, 15957, 143428, + 26637, 28477, 29314, 29482, 29483, 149539, 165931, 18669, 165892, 29480, + 29486, 29647, 29610, 134202, 158254, 29641, 29769, 147938, 136935, 150052, + 26147, 14021, 149943, 149901, 150011, 29687, 29717, 26883, 150054, 29753, + 132547, 16087, 29788, 141485, 29792, 167602, 29767, 29668, 29814, 33721, + 29804, 14128, 29812, 37873, 27180, 29826, 18771, 150156, 147807, 150137, + 166799, 23366, 166915, 137374, 29896, 137608, 29966, 29929, 29982, 167641, + 137803, 23511, 167596, 37765, 30029, 30026, 30055, 30062, 151426, 16132, + 150803, 30094, 29789, 30110, 30132, 30210, 30252, 30289, 30287, 30319, + 30326, 156661, 30352, 33263, 14328, 157969, 157966, 30369, 30373, 30391, + 30412, 159647, 33890, 151709, 151933, 138780, 30494, 30502, 30528, 25775, + 152096, 30552, 144044, 30639, 166244, 166248, 136897, 30708, 30729, 136054, + 150034, 26826, 30895, 30919, 30931, 38565, 31022, 153056, 30935, 31028, + 30897, 161292, 36792, 34948, 166699, 155779, 140828, 31110, 35072, 26882, + 31104, 153687, 31133, 162617, 31036, 31145, 28202, 160038, 16040, 31174, + 168205, 31188, +}; + +static const unsigned long myhtml_encoding_map_euc_kr[] = { + 44034, 44035, 44037, 44038, 44043, 44044, 44045, 44046, 44047, 44056, + 44062, 44063, 44065, 44066, 44067, 44069, 44070, 44071, 44072, 44073, + 44074, 44075, 44078, 44082, 44083, 44084, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44085, 44086, 44087, 44090, 44091, 44093, 44094, 44095, + 44097, 44098, 44099, 44100, 44101, 44102, 44103, 44104, 44105, 44106, + 44108, 44110, 44111, 44112, 44113, 44114, 44115, 44117, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44118, 44119, 44121, 44122, 44123, 44125, + 44126, 44127, 44128, 44129, 44130, 44131, 44132, 44133, 44134, 44135, + 44136, 44137, 44138, 44139, 44140, 44141, 44142, 44143, 44146, 44147, + 44149, 44150, 44153, 44155, 44156, 44157, 44158, 44159, 44162, 44167, + 44168, 44173, 44174, 44175, 44177, 44178, 44179, 44181, 44182, 44183, + 44184, 44185, 44186, 44187, 44190, 44194, 44195, 44196, 44197, 44198, + 44199, 44203, 44205, 44206, 44209, 44210, 44211, 44212, 44213, 44214, + 44215, 44218, 44222, 44223, 44224, 44226, 44227, 44229, 44230, 44231, + 44233, 44234, 44235, 44237, 44238, 44239, 44240, 44241, 44242, 44243, + 44244, 44246, 44248, 44249, 44250, 44251, 44252, 44253, 44254, 44255, + 44258, 44259, 44261, 44262, 44265, 44267, 44269, 44270, 44274, 44276, + 44279, 44280, 44281, 44282, 44283, 44286, 44287, 44289, 44290, 44291, + 44293, 44295, 44296, 44297, 44298, 44299, 44302, 44304, 44306, 44307, + 44308, 44309, 44310, 44311, 44313, 44314, 44315, 44317, 44318, 44319, + 44321, 44322, 44323, 44324, 44325, 44326, 44327, 44328, 44330, 44331, + 44334, 44335, 44336, 44337, 44338, 44339, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44342, 44343, 44345, 44346, 44347, 44349, 44350, 44351, + 44352, 44353, 44354, 44355, 44358, 44360, 44362, 44363, 44364, 44365, + 44366, 44367, 44369, 44370, 44371, 44373, 44374, 44375, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44377, 44378, 44379, 44380, 44381, 44382, + 44383, 44384, 44386, 44388, 44389, 44390, 44391, 44392, 44393, 44394, + 44395, 44398, 44399, 44401, 44402, 44407, 44408, 44409, 44410, 44414, + 44416, 44419, 44420, 44421, 44422, 44423, 44426, 44427, 44429, 44430, + 44431, 44433, 44434, 44435, 44436, 44437, 44438, 44439, 44440, 44441, + 44442, 44443, 44446, 44447, 44448, 44449, 44450, 44451, 44453, 44454, + 44455, 44456, 44457, 44458, 44459, 44460, 44461, 44462, 44463, 44464, + 44465, 44466, 44467, 44468, 44469, 44470, 44472, 44473, 44474, 44475, + 44476, 44477, 44478, 44479, 44482, 44483, 44485, 44486, 44487, 44489, + 44490, 44491, 44492, 44493, 44494, 44495, 44498, 44500, 44501, 44502, + 44503, 44504, 44505, 44506, 44507, 44509, 44510, 44511, 44513, 44514, + 44515, 44517, 44518, 44519, 44520, 44521, 44522, 44523, 44524, 44525, + 44526, 44527, 44528, 44529, 44530, 44531, 44532, 44533, 44534, 44535, + 44538, 44539, 44541, 44542, 44546, 44547, 44548, 44549, 44550, 44551, + 44554, 44556, 44558, 44559, 44560, 44561, 44562, 44563, 44565, 44566, + 44567, 44568, 44569, 44570, 44571, 44572, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44573, 44574, 44575, 44576, 44577, 44578, 44579, 44580, + 44581, 44582, 44583, 44584, 44585, 44586, 44587, 44588, 44589, 44590, + 44591, 44594, 44595, 44597, 44598, 44601, 44603, 44604, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44605, 44606, 44607, 44610, 44612, 44615, + 44616, 44617, 44619, 44623, 44625, 44626, 44627, 44629, 44631, 44632, + 44633, 44634, 44635, 44638, 44642, 44643, 44644, 44646, 44647, 44650, + 44651, 44653, 44654, 44655, 44657, 44658, 44659, 44660, 44661, 44662, + 44663, 44666, 44670, 44671, 44672, 44673, 44674, 44675, 44678, 44679, + 44680, 44681, 44682, 44683, 44685, 44686, 44687, 44688, 44689, 44690, + 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, + 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, + 44711, 44712, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, + 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, + 44731, 44735, 44737, 44738, 44739, 44741, 44742, 44743, 44744, 44745, + 44746, 44747, 44750, 44754, 44755, 44756, 44757, 44758, 44759, 44762, + 44763, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, + 44774, 44775, 44777, 44778, 44780, 44782, 44783, 44784, 44785, 44786, + 44787, 44789, 44790, 44791, 44793, 44794, 44795, 44797, 44798, 44799, + 44800, 44801, 44802, 44803, 44804, 44805, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44806, 44809, 44810, 44811, 44812, 44814, 44815, 44817, + 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, + 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44836, 44837, 44838, 44839, 44840, 44841, + 44842, 44843, 44846, 44847, 44849, 44851, 44853, 44854, 44855, 44856, + 44857, 44858, 44859, 44862, 44864, 44868, 44869, 44870, 44871, 44874, + 44875, 44876, 44877, 44878, 44879, 44881, 44882, 44883, 44884, 44885, + 44886, 44887, 44888, 44889, 44890, 44891, 44894, 44895, 44896, 44897, + 44898, 44899, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, + 44910, 44911, 44912, 44913, 44914, 44915, 44916, 44917, 44918, 44919, + 44920, 44922, 44923, 44924, 44925, 44926, 44927, 44929, 44930, 44931, + 44933, 44934, 44935, 44937, 44938, 44939, 44940, 44941, 44942, 44943, + 44946, 44947, 44948, 44950, 44951, 44952, 44953, 44954, 44955, 44957, + 44958, 44959, 44960, 44961, 44962, 44963, 44964, 44965, 44966, 44967, + 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, + 44978, 44979, 44980, 44981, 44982, 44983, 44986, 44987, 44989, 44990, + 44991, 44993, 44994, 44995, 44996, 44997, 44998, 45002, 45004, 45007, + 45008, 45009, 45010, 45011, 45013, 45014, 45015, 45016, 45017, 45018, + 45019, 45021, 45022, 45023, 45024, 45025, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45026, 45027, 45028, 45029, 45030, 45031, 45034, 45035, + 45036, 45037, 45038, 45039, 45042, 45043, 45045, 45046, 45047, 45049, + 45050, 45051, 45052, 45053, 45054, 45055, 45058, 45059, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45061, 45062, 45063, 45064, 45065, 45066, + 45067, 45069, 45070, 45071, 45073, 45074, 45075, 45077, 45078, 45079, + 45080, 45081, 45082, 45083, 45086, 45087, 45088, 45089, 45090, 45091, + 45092, 45093, 45094, 45095, 45097, 45098, 45099, 45100, 45101, 45102, + 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45112, + 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, + 45123, 45126, 45127, 45129, 45131, 45133, 45135, 45136, 45137, 45138, + 45142, 45144, 45146, 45147, 45148, 45150, 45151, 45152, 45153, 45154, + 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, + 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, + 45175, 45176, 45177, 45178, 45179, 45182, 45183, 45185, 45186, 45187, + 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45198, 45200, 45202, + 45203, 45204, 45205, 45206, 45207, 45211, 45213, 45214, 45219, 45220, + 45221, 45222, 45223, 45226, 45232, 45234, 45238, 45239, 45241, 45242, + 45243, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45254, 45258, + 45259, 45260, 45261, 45262, 45263, 45266, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45267, 45269, 45270, 45271, 45273, 45274, 45275, 45276, + 45277, 45278, 45279, 45281, 45282, 45283, 45284, 45286, 45287, 45288, + 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45297, 45298, 45299, 45300, 45301, 45302, + 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312, + 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45322, 45325, 45326, + 45327, 45329, 45332, 45333, 45334, 45335, 45338, 45342, 45343, 45344, + 45345, 45346, 45350, 45351, 45353, 45354, 45355, 45357, 45358, 45359, + 45360, 45361, 45362, 45363, 45366, 45370, 45371, 45372, 45373, 45374, + 45375, 45378, 45379, 45381, 45382, 45383, 45385, 45386, 45387, 45388, + 45389, 45390, 45391, 45394, 45395, 45398, 45399, 45401, 45402, 45403, + 45405, 45406, 45407, 45409, 45410, 45411, 45412, 45413, 45414, 45415, + 45416, 45417, 45418, 45419, 45420, 45421, 45422, 45423, 45424, 45425, + 45426, 45427, 45428, 45429, 45430, 45431, 45434, 45435, 45437, 45438, + 45439, 45441, 45443, 45444, 45445, 45446, 45447, 45450, 45452, 45454, + 45455, 45456, 45457, 45461, 45462, 45463, 45465, 45466, 45467, 45469, + 45470, 45471, 45472, 45473, 45474, 45475, 45476, 45477, 45478, 45479, + 45481, 45482, 45483, 45484, 45485, 45486, 45487, 45488, 45489, 45490, + 45491, 45492, 45493, 45494, 45495, 45496, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45497, 45498, 45499, 45500, 45501, 45502, 45503, 45504, + 45505, 45506, 45507, 45508, 45509, 45510, 45511, 45512, 45513, 45514, + 45515, 45517, 45518, 45519, 45521, 45522, 45523, 45525, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45526, 45527, 45528, 45529, 45530, 45531, + 45534, 45536, 45537, 45538, 45539, 45540, 45541, 45542, 45543, 45546, + 45547, 45549, 45550, 45551, 45553, 45554, 45555, 45556, 45557, 45558, + 45559, 45560, 45562, 45564, 45566, 45567, 45568, 45569, 45570, 45571, + 45574, 45575, 45577, 45578, 45581, 45582, 45583, 45584, 45585, 45586, + 45587, 45590, 45592, 45594, 45595, 45596, 45597, 45598, 45599, 45601, + 45602, 45603, 45604, 45605, 45606, 45607, 45608, 45609, 45610, 45611, + 45612, 45613, 45614, 45615, 45616, 45617, 45618, 45619, 45621, 45622, + 45623, 45624, 45625, 45626, 45627, 45629, 45630, 45631, 45632, 45633, + 45634, 45635, 45636, 45637, 45638, 45639, 45640, 45641, 45642, 45643, + 45644, 45645, 45646, 45647, 45648, 45649, 45650, 45651, 45652, 45653, + 45654, 45655, 45657, 45658, 45659, 45661, 45662, 45663, 45665, 45666, + 45667, 45668, 45669, 45670, 45671, 45674, 45675, 45676, 45677, 45678, + 45679, 45680, 45681, 45682, 45683, 45686, 45687, 45688, 45689, 45690, + 45691, 45693, 45694, 45695, 45696, 45697, 45698, 45699, 45702, 45703, + 45704, 45706, 45707, 45708, 45709, 45710, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45711, 45714, 45715, 45717, 45718, 45719, 45723, 45724, + 45725, 45726, 45727, 45730, 45732, 45735, 45736, 45737, 45739, 45741, + 45742, 45743, 45745, 45746, 45747, 45749, 45750, 45751, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45752, 45753, 45754, 45755, 45756, 45757, + 45758, 45759, 45760, 45761, 45762, 45763, 45764, 45765, 45766, 45767, + 45770, 45771, 45773, 45774, 45775, 45777, 45779, 45780, 45781, 45782, + 45783, 45786, 45788, 45790, 45791, 45792, 45793, 45795, 45799, 45801, + 45802, 45808, 45809, 45810, 45814, 45820, 45821, 45822, 45826, 45827, + 45829, 45830, 45831, 45833, 45834, 45835, 45836, 45837, 45838, 45839, + 45842, 45846, 45847, 45848, 45849, 45850, 45851, 45853, 45854, 45855, + 45856, 45857, 45858, 45859, 45860, 45861, 45862, 45863, 45864, 45865, + 45866, 45867, 45868, 45869, 45870, 45871, 45872, 45873, 45874, 45875, + 45876, 45877, 45878, 45879, 45880, 45881, 45882, 45883, 45884, 45885, + 45886, 45887, 45888, 45889, 45890, 45891, 45892, 45893, 45894, 45895, + 45896, 45897, 45898, 45899, 45900, 45901, 45902, 45903, 45904, 45905, + 45906, 45907, 45911, 45913, 45914, 45917, 45920, 45921, 45922, 45923, + 45926, 45928, 45930, 45932, 45933, 45935, 45938, 45939, 45941, 45942, + 45943, 45945, 45946, 45947, 45948, 45949, 45950, 45951, 45954, 45958, + 45959, 45960, 45961, 45962, 45963, 45965, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45966, 45967, 45969, 45970, 45971, 45973, 45974, 45975, + 45976, 45977, 45978, 45979, 45980, 45981, 45982, 45983, 45986, 45987, + 45988, 45989, 45990, 45991, 45993, 45994, 45995, 45997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45998, 45999, 46000, 46001, 46002, 46003, + 46004, 46005, 46006, 46007, 46008, 46009, 46010, 46011, 46012, 46013, + 46014, 46015, 46016, 46017, 46018, 46019, 46022, 46023, 46025, 46026, + 46029, 46031, 46033, 46034, 46035, 46038, 46040, 46042, 46044, 46046, + 46047, 46049, 46050, 46051, 46053, 46054, 46055, 46057, 46058, 46059, + 46060, 46061, 46062, 46063, 46064, 46065, 46066, 46067, 46068, 46069, + 46070, 46071, 46072, 46073, 46074, 46075, 46077, 46078, 46079, 46080, + 46081, 46082, 46083, 46084, 46085, 46086, 46087, 46088, 46089, 46090, + 46091, 46092, 46093, 46094, 46095, 46097, 46098, 46099, 46100, 46101, + 46102, 46103, 46105, 46106, 46107, 46109, 46110, 46111, 46113, 46114, + 46115, 46116, 46117, 46118, 46119, 46122, 46124, 46125, 46126, 46127, + 46128, 46129, 46130, 46131, 46133, 46134, 46135, 46136, 46137, 46138, + 46139, 46140, 46141, 46142, 46143, 46144, 46145, 46146, 46147, 46148, + 46149, 46150, 46151, 46152, 46153, 46154, 46155, 46156, 46157, 46158, + 46159, 46162, 46163, 46165, 46166, 46167, 46169, 46170, 46171, 46172, + 46173, 46174, 46175, 46178, 46180, 46182, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46183, 46184, 46185, 46186, 46187, 46189, 46190, 46191, + 46192, 46193, 46194, 46195, 46196, 46197, 46198, 46199, 46200, 46201, + 46202, 46203, 46204, 46205, 46206, 46207, 46209, 46210, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46211, 46212, 46213, 46214, 46215, 46217, + 46218, 46219, 46220, 46221, 46222, 46223, 46224, 46225, 46226, 46227, + 46228, 46229, 46230, 46231, 46232, 46233, 46234, 46235, 46236, 46238, + 46239, 46240, 46241, 46242, 46243, 46245, 46246, 46247, 46249, 46250, + 46251, 46253, 46254, 46255, 46256, 46257, 46258, 46259, 46260, 46262, + 46264, 46266, 46267, 46268, 46269, 46270, 46271, 46273, 46274, 46275, + 46277, 46278, 46279, 46281, 46282, 46283, 46284, 46285, 46286, 46287, + 46289, 46290, 46291, 46292, 46294, 46295, 46296, 46297, 46298, 46299, + 46302, 46303, 46305, 46306, 46309, 46311, 46312, 46313, 46314, 46315, + 46318, 46320, 46322, 46323, 46324, 46325, 46326, 46327, 46329, 46330, + 46331, 46332, 46333, 46334, 46335, 46336, 46337, 46338, 46339, 46340, + 46341, 46342, 46343, 46344, 46345, 46346, 46347, 46348, 46349, 46350, + 46351, 46352, 46353, 46354, 46355, 46358, 46359, 46361, 46362, 46365, + 46366, 46367, 46368, 46369, 46370, 46371, 46374, 46379, 46380, 46381, + 46382, 46383, 46386, 46387, 46389, 46390, 46391, 46393, 46394, 46395, + 46396, 46397, 46398, 46399, 46402, 46406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46407, 46408, 46409, 46410, 46414, 46415, 46417, 46418, + 46419, 46421, 46422, 46423, 46424, 46425, 46426, 46427, 46430, 46434, + 46435, 46436, 46437, 46438, 46439, 46440, 46441, 46442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46443, 46444, 46445, 46446, 46447, 46448, + 46449, 46450, 46451, 46452, 46453, 46454, 46455, 46456, 46457, 46458, + 46459, 46460, 46461, 46462, 46463, 46464, 46465, 46466, 46467, 46468, + 46469, 46470, 46471, 46472, 46473, 46474, 46475, 46476, 46477, 46478, + 46479, 46480, 46481, 46482, 46483, 46484, 46485, 46486, 46487, 46488, + 46489, 46490, 46491, 46492, 46493, 46494, 46495, 46498, 46499, 46501, + 46502, 46503, 46505, 46508, 46509, 46510, 46511, 46514, 46518, 46519, + 46520, 46521, 46522, 46526, 46527, 46529, 46530, 46531, 46533, 46534, + 46535, 46536, 46537, 46538, 46539, 46542, 46546, 46547, 46548, 46549, + 46550, 46551, 46553, 46554, 46555, 46556, 46557, 46558, 46559, 46560, + 46561, 46562, 46563, 46564, 46565, 46566, 46567, 46568, 46569, 46570, + 46571, 46573, 46574, 46575, 46576, 46577, 46578, 46579, 46580, 46581, + 46582, 46583, 46584, 46585, 46586, 46587, 46588, 46589, 46590, 46591, + 46592, 46593, 46594, 46595, 46596, 46597, 46598, 46599, 46600, 46601, + 46602, 46603, 46604, 46605, 46606, 46607, 46610, 46611, 46613, 46614, + 46615, 46617, 46618, 46619, 46620, 46621, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46622, 46623, 46624, 46625, 46626, 46627, 46628, 46630, + 46631, 46632, 46633, 46634, 46635, 46637, 46638, 46639, 46640, 46641, + 46642, 46643, 46645, 46646, 46647, 46648, 46649, 46650, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46651, 46652, 46653, 46654, 46655, 46656, + 46657, 46658, 46659, 46660, 46661, 46662, 46663, 46665, 46666, 46667, + 46668, 46669, 46670, 46671, 46672, 46673, 46674, 46675, 46676, 46677, + 46678, 46679, 46680, 46681, 46682, 46683, 46684, 46685, 46686, 46687, + 46688, 46689, 46690, 46691, 46693, 46694, 46695, 46697, 46698, 46699, + 46700, 46701, 46702, 46703, 46704, 46705, 46706, 46707, 46708, 46709, + 46710, 46711, 46712, 46713, 46714, 46715, 46716, 46717, 46718, 46719, + 46720, 46721, 46722, 46723, 46724, 46725, 46726, 46727, 46728, 46729, + 46730, 46731, 46732, 46733, 46734, 46735, 46736, 46737, 46738, 46739, + 46740, 46741, 46742, 46743, 46744, 46745, 46746, 46747, 46750, 46751, + 46753, 46754, 46755, 46757, 46758, 46759, 46760, 46761, 46762, 46765, + 46766, 46767, 46768, 46770, 46771, 46772, 46773, 46774, 46775, 46776, + 46777, 46778, 46779, 46780, 46781, 46782, 46783, 46784, 46785, 46786, + 46787, 46788, 46789, 46790, 46791, 46792, 46793, 46794, 46795, 46796, + 46797, 46798, 46799, 46800, 46801, 46802, 46803, 46805, 46806, 46807, + 46808, 46809, 46810, 46811, 46812, 46813, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46814, 46815, 46816, 46817, 46818, 46819, 46820, 46821, + 46822, 46823, 46824, 46825, 46826, 46827, 46828, 46829, 46830, 46831, + 46833, 46834, 46835, 46837, 46838, 46839, 46841, 46842, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46843, 46844, 46845, 46846, 46847, 46850, + 46851, 46852, 46854, 46855, 46856, 46857, 46858, 46859, 46860, 46861, + 46862, 46863, 46864, 46865, 46866, 46867, 46868, 46869, 46870, 46871, + 46872, 46873, 46874, 46875, 46876, 46877, 46878, 46879, 46880, 46881, + 46882, 46883, 46884, 46885, 46886, 46887, 46890, 46891, 46893, 46894, + 46897, 46898, 46899, 46900, 46901, 46902, 46903, 46906, 46908, 46909, + 46910, 46911, 46912, 46913, 46914, 46915, 46917, 46918, 46919, 46921, + 46922, 46923, 46925, 46926, 46927, 46928, 46929, 46930, 46931, 46934, + 46935, 46936, 46937, 46938, 46939, 46940, 46941, 46942, 46943, 46945, + 46946, 46947, 46949, 46950, 46951, 46953, 46954, 46955, 46956, 46957, + 46958, 46959, 46962, 46964, 46966, 46967, 46968, 46969, 46970, 46971, + 46974, 46975, 46977, 46978, 46979, 46981, 46982, 46983, 46984, 46985, + 46986, 46987, 46990, 46995, 46996, 46997, 47002, 47003, 47005, 47006, + 47007, 47009, 47010, 47011, 47012, 47013, 47014, 47015, 47018, 47022, + 47023, 47024, 47025, 47026, 47027, 47030, 47031, 47033, 47034, 47035, + 47036, 47037, 47038, 47039, 47040, 47041, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47042, 47043, 47044, 47045, 47046, 47048, 47050, 47051, + 47052, 47053, 47054, 47055, 47056, 47057, 47058, 47059, 47060, 47061, + 47062, 47063, 47064, 47065, 47066, 47067, 47068, 47069, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47070, 47071, 47072, 47073, 47074, 47075, + 47076, 47077, 47078, 47079, 47080, 47081, 47082, 47083, 47086, 47087, + 47089, 47090, 47091, 47093, 47094, 47095, 47096, 47097, 47098, 47099, + 47102, 47106, 47107, 47108, 47109, 47110, 47114, 47115, 47117, 47118, + 47119, 47121, 47122, 47123, 47124, 47125, 47126, 47127, 47130, 47132, + 47134, 47135, 47136, 47137, 47138, 47139, 47142, 47143, 47145, 47146, + 47147, 47149, 47150, 47151, 47152, 47153, 47154, 47155, 47158, 47162, + 47163, 47164, 47165, 47166, 47167, 47169, 47170, 47171, 47173, 47174, + 47175, 47176, 47177, 47178, 47179, 47180, 47181, 47182, 47183, 47184, + 47186, 47188, 47189, 47190, 47191, 47192, 47193, 47194, 47195, 47198, + 47199, 47201, 47202, 47203, 47205, 47206, 47207, 47208, 47209, 47210, + 47211, 47214, 47216, 47218, 47219, 47220, 47221, 47222, 47223, 47225, + 47226, 47227, 47229, 47230, 47231, 47232, 47233, 47234, 47235, 47236, + 47237, 47238, 47239, 47240, 47241, 47242, 47243, 47244, 47246, 47247, + 47248, 47249, 47250, 47251, 47252, 47253, 47254, 47255, 47256, 47257, + 47258, 47259, 47260, 47261, 47262, 47263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47264, 47265, 47266, 47267, 47268, 47269, 47270, 47271, + 47273, 47274, 47275, 47276, 47277, 47278, 47279, 47281, 47282, 47283, + 47285, 47286, 47287, 47289, 47290, 47291, 47292, 47293, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47294, 47295, 47298, 47300, 47302, 47303, + 47304, 47305, 47306, 47307, 47309, 47310, 47311, 47313, 47314, 47315, + 47317, 47318, 47319, 47320, 47321, 47322, 47323, 47324, 47326, 47328, + 47330, 47331, 47332, 47333, 47334, 47335, 47338, 47339, 47341, 47342, + 47343, 47345, 47346, 47347, 47348, 47349, 47350, 47351, 47354, 47356, + 47358, 47359, 47360, 47361, 47362, 47363, 47365, 47366, 47367, 47368, + 47369, 47370, 47371, 47372, 47373, 47374, 47375, 47376, 47377, 47378, + 47379, 47380, 47381, 47382, 47383, 47385, 47386, 47387, 47388, 47389, + 47390, 47391, 47393, 47394, 47395, 47396, 47397, 47398, 47399, 47400, + 47401, 47402, 47403, 47404, 47405, 47406, 47407, 47408, 47409, 47410, + 47411, 47412, 47413, 47414, 47415, 47416, 47417, 47418, 47419, 47422, + 47423, 47425, 47426, 47427, 47429, 47430, 47431, 47432, 47433, 47434, + 47435, 47437, 47438, 47440, 47442, 47443, 47444, 47445, 47446, 47447, + 47450, 47451, 47453, 47454, 47455, 47457, 47458, 47459, 47460, 47461, + 47462, 47463, 47466, 47468, 47470, 47471, 47472, 47473, 47474, 47475, + 47478, 47479, 47481, 47482, 47483, 47485, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47486, 47487, 47488, 47489, 47490, 47491, 47494, 47496, + 47499, 47500, 47503, 47504, 47505, 47506, 47507, 47508, 47509, 47510, + 47511, 47512, 47513, 47514, 47515, 47516, 47517, 47518, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47519, 47520, 47521, 47522, 47523, 47524, + 47525, 47526, 47527, 47528, 47529, 47530, 47531, 47534, 47535, 47537, + 47538, 47539, 47541, 47542, 47543, 47544, 47545, 47546, 47547, 47550, + 47552, 47554, 47555, 47556, 47557, 47558, 47559, 47562, 47563, 47565, + 47571, 47572, 47573, 47574, 47575, 47578, 47580, 47583, 47584, 47586, + 47590, 47591, 47593, 47594, 47595, 47597, 47598, 47599, 47600, 47601, + 47602, 47603, 47606, 47611, 47612, 47613, 47614, 47615, 47618, 47619, + 47620, 47621, 47622, 47623, 47625, 47626, 47627, 47628, 47629, 47630, + 47631, 47632, 47633, 47634, 47635, 47636, 47638, 47639, 47640, 47641, + 47642, 47643, 47644, 47645, 47646, 47647, 47648, 47649, 47650, 47651, + 47652, 47653, 47654, 47655, 47656, 47657, 47658, 47659, 47660, 47661, + 47662, 47663, 47664, 47665, 47666, 47667, 47668, 47669, 47670, 47671, + 47674, 47675, 47677, 47678, 47679, 47681, 47683, 47684, 47685, 47686, + 47687, 47690, 47692, 47695, 47696, 47697, 47698, 47702, 47703, 47705, + 47706, 47707, 47709, 47710, 47711, 47712, 47713, 47714, 47715, 47718, + 47722, 47723, 47724, 47725, 47726, 47727, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47730, 47731, 47733, 47734, 47735, 47737, 47738, 47739, + 47740, 47741, 47742, 47743, 47744, 47745, 47746, 47750, 47752, 47753, + 47754, 47755, 47757, 47758, 47759, 47760, 47761, 47762, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47763, 47764, 47765, 47766, 47767, 47768, + 47769, 47770, 47771, 47772, 47773, 47774, 47775, 47776, 47777, 47778, + 47779, 47780, 47781, 47782, 47783, 47786, 47789, 47790, 47791, 47793, + 47795, 47796, 47797, 47798, 47799, 47802, 47804, 47806, 47807, 47808, + 47809, 47810, 47811, 47813, 47814, 47815, 47817, 47818, 47819, 47820, + 47821, 47822, 47823, 47824, 47825, 47826, 47827, 47828, 47829, 47830, + 47831, 47834, 47835, 47836, 47837, 47838, 47839, 47840, 47841, 47842, + 47843, 47844, 47845, 47846, 47847, 47848, 47849, 47850, 47851, 47852, + 47853, 47854, 47855, 47856, 47857, 47858, 47859, 47860, 47861, 47862, + 47863, 47864, 47865, 47866, 47867, 47869, 47870, 47871, 47873, 47874, + 47875, 47877, 47878, 47879, 47880, 47881, 47882, 47883, 47884, 47886, + 47888, 47890, 47891, 47892, 47893, 47894, 47895, 47897, 47898, 47899, + 47901, 47902, 47903, 47905, 47906, 47907, 47908, 47909, 47910, 47911, + 47912, 47914, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, + 47927, 47929, 47930, 47935, 47936, 47937, 47938, 47939, 47942, 47944, + 47946, 47947, 47948, 47950, 47953, 47954, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47955, 47957, 47958, 47959, 47961, 47962, 47963, 47964, + 47965, 47966, 47967, 47968, 47970, 47972, 47973, 47974, 47975, 47976, + 47977, 47978, 47979, 47981, 47982, 47983, 47984, 47985, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47986, 47987, 47988, 47989, 47990, 47991, + 47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, + 48002, 48003, 48004, 48005, 48006, 48007, 48009, 48010, 48011, 48013, + 48014, 48015, 48017, 48018, 48019, 48020, 48021, 48022, 48023, 48024, + 48025, 48026, 48027, 48028, 48029, 48030, 48031, 48032, 48033, 48034, + 48035, 48037, 48038, 48039, 48041, 48042, 48043, 48045, 48046, 48047, + 48048, 48049, 48050, 48051, 48053, 48054, 48056, 48057, 48058, 48059, + 48060, 48061, 48062, 48063, 48065, 48066, 48067, 48069, 48070, 48071, + 48073, 48074, 48075, 48076, 48077, 48078, 48079, 48081, 48082, 48084, + 48085, 48086, 48087, 48088, 48089, 48090, 48091, 48092, 48093, 48094, + 48095, 48096, 48097, 48098, 48099, 48100, 48101, 48102, 48103, 48104, + 48105, 48106, 48107, 48108, 48109, 48110, 48111, 48112, 48113, 48114, + 48115, 48116, 48117, 48118, 48119, 48122, 48123, 48125, 48126, 48129, + 48131, 48132, 48133, 48134, 48135, 48138, 48142, 48144, 48146, 48147, + 48153, 48154, 48160, 48161, 48162, 48163, 48166, 48168, 48170, 48171, + 48172, 48174, 48175, 48178, 48179, 48181, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48182, 48183, 48185, 48186, 48187, 48188, 48189, 48190, + 48191, 48194, 48198, 48199, 48200, 48202, 48203, 48206, 48207, 48209, + 48210, 48211, 48212, 48213, 48214, 48215, 48216, 48217, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48218, 48219, 48220, 48222, 48223, 48224, + 48225, 48226, 48227, 48228, 48229, 48230, 48231, 48232, 48233, 48234, + 48235, 48236, 48237, 48238, 48239, 48240, 48241, 48242, 48243, 48244, + 48245, 48246, 48247, 48248, 48249, 48250, 48251, 48252, 48253, 48254, + 48255, 48256, 48257, 48258, 48259, 48262, 48263, 48265, 48266, 48269, + 48271, 48272, 48273, 48274, 48275, 48278, 48280, 48283, 48284, 48285, + 48286, 48287, 48290, 48291, 48293, 48294, 48297, 48298, 48299, 48300, + 48301, 48302, 48303, 48306, 48310, 48311, 48312, 48313, 48314, 48315, + 48318, 48319, 48321, 48322, 48323, 48325, 48326, 48327, 48328, 48329, + 48330, 48331, 48332, 48334, 48338, 48339, 48340, 48342, 48343, 48345, + 48346, 48347, 48349, 48350, 48351, 48352, 48353, 48354, 48355, 48356, + 48357, 48358, 48359, 48360, 48361, 48362, 48363, 48364, 48365, 48366, + 48367, 48368, 48369, 48370, 48371, 48375, 48377, 48378, 48379, 48381, + 48382, 48383, 48384, 48385, 48386, 48387, 48390, 48392, 48394, 48395, + 48396, 48397, 48398, 48399, 48401, 48402, 48403, 48405, 48406, 48407, + 48408, 48409, 48410, 48411, 48412, 48413, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48414, 48415, 48416, 48417, 48418, 48419, 48421, 48422, + 48423, 48424, 48425, 48426, 48427, 48429, 48430, 48431, 48432, 48433, + 48434, 48435, 48436, 48437, 48438, 48439, 48440, 48441, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48442, 48443, 48444, 48445, 48446, 48447, + 48449, 48450, 48451, 48452, 48453, 48454, 48455, 48458, 48459, 48461, + 48462, 48463, 48465, 48466, 48467, 48468, 48469, 48470, 48471, 48474, + 48475, 48476, 48477, 48478, 48479, 48480, 48481, 48482, 48483, 48485, + 48486, 48487, 48489, 48490, 48491, 48492, 48493, 48494, 48495, 48496, + 48497, 48498, 48499, 48500, 48501, 48502, 48503, 48504, 48505, 48506, + 48507, 48508, 48509, 48510, 48511, 48514, 48515, 48517, 48518, 48523, + 48524, 48525, 48526, 48527, 48530, 48532, 48534, 48535, 48536, 48539, + 48541, 48542, 48543, 48544, 48545, 48546, 48547, 48549, 48550, 48551, + 48552, 48553, 48554, 48555, 48556, 48557, 48558, 48559, 48561, 48562, + 48563, 48564, 48565, 48566, 48567, 48569, 48570, 48571, 48572, 48573, + 48574, 48575, 48576, 48577, 48578, 48579, 48580, 48581, 48582, 48583, + 48584, 48585, 48586, 48587, 48588, 48589, 48590, 48591, 48592, 48593, + 48594, 48595, 48598, 48599, 48601, 48602, 48603, 48605, 48606, 48607, + 48608, 48609, 48610, 48611, 48612, 48613, 48614, 48615, 48616, 48618, + 48619, 48620, 48621, 48622, 48623, 48625, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48626, 48627, 48629, 48630, 48631, 48633, 48634, 48635, + 48636, 48637, 48638, 48639, 48641, 48642, 48644, 48646, 48647, 48648, + 48649, 48650, 48651, 48654, 48655, 48657, 48658, 48659, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48661, 48662, 48663, 48664, 48665, 48666, + 48667, 48670, 48672, 48673, 48674, 48675, 48676, 48677, 48678, 48679, + 48680, 48681, 48682, 48683, 48684, 48685, 48686, 48687, 48688, 48689, + 48690, 48691, 48692, 48693, 48694, 48695, 48696, 48697, 48698, 48699, + 48700, 48701, 48702, 48703, 48704, 48705, 48706, 48707, 48710, 48711, + 48713, 48714, 48715, 48717, 48719, 48720, 48721, 48722, 48723, 48726, + 48728, 48732, 48733, 48734, 48735, 48738, 48739, 48741, 48742, 48743, + 48745, 48747, 48748, 48749, 48750, 48751, 48754, 48758, 48759, 48760, + 48761, 48762, 48766, 48767, 48769, 48770, 48771, 48773, 48774, 48775, + 48776, 48777, 48778, 48779, 48782, 48786, 48787, 48788, 48789, 48790, + 48791, 48794, 48795, 48796, 48797, 48798, 48799, 48800, 48801, 48802, + 48803, 48804, 48805, 48806, 48807, 48809, 48810, 48811, 48812, 48813, + 48814, 48815, 48816, 48817, 48818, 48819, 48820, 48821, 48822, 48823, + 48824, 48825, 48826, 48827, 48828, 48829, 48830, 48831, 48832, 48833, + 48834, 48835, 48836, 48837, 48838, 48839, 48840, 48841, 48842, 48843, + 48844, 48845, 48846, 48847, 48850, 48851, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48853, 48854, 48857, 48858, 48859, 48860, 48861, 48862, + 48863, 48865, 48866, 48870, 48871, 48872, 48873, 48874, 48875, 48877, + 48878, 48879, 48880, 48881, 48882, 48883, 48884, 48885, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48886, 48887, 48888, 48889, 48890, 48891, + 48892, 48893, 48894, 48895, 48896, 48898, 48899, 48900, 48901, 48902, + 48903, 48906, 48907, 48908, 48909, 48910, 48911, 48912, 48913, 48914, + 48915, 48916, 48917, 48918, 48919, 48922, 48926, 48927, 48928, 48929, + 48930, 48931, 48932, 48933, 48934, 48935, 48936, 48937, 48938, 48939, + 48940, 48941, 48942, 48943, 48944, 48945, 48946, 48947, 48948, 48949, + 48950, 48951, 48952, 48953, 48954, 48955, 48956, 48957, 48958, 48959, + 48962, 48963, 48965, 48966, 48967, 48969, 48970, 48971, 48972, 48973, + 48974, 48975, 48978, 48979, 48980, 48982, 48983, 48984, 48985, 48986, + 48987, 48988, 48989, 48990, 48991, 48992, 48993, 48994, 48995, 48996, + 48997, 48998, 48999, 49000, 49001, 49002, 49003, 49004, 49005, 49006, + 49007, 49008, 49009, 49010, 49011, 49012, 49013, 49014, 49015, 49016, + 49017, 49018, 49019, 49020, 49021, 49022, 49023, 49024, 49025, 49026, + 49027, 49028, 49029, 49030, 49031, 49032, 49033, 49034, 49035, 49036, + 49037, 49038, 49039, 49040, 49041, 49042, 49043, 49045, 49046, 49047, + 49048, 49049, 49050, 49051, 49052, 49053, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49054, 49055, 49056, 49057, 49058, 49059, 49060, 49061, + 49062, 49063, 49064, 49065, 49066, 49067, 49068, 49069, 49070, 49071, + 49073, 49074, 49075, 49076, 49077, 49078, 49079, 49080, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49081, 49082, 49083, 49084, 49085, 49086, + 49087, 49088, 49089, 49090, 49091, 49092, 49094, 49095, 49096, 49097, + 49098, 49099, 49102, 49103, 49105, 49106, 49107, 49109, 49110, 49111, + 49112, 49113, 49114, 49115, 49117, 49118, 49120, 49122, 49123, 49124, + 49125, 49126, 49127, 49128, 49129, 49130, 49131, 49132, 49133, 49134, + 49135, 49136, 49137, 49138, 49139, 49140, 49141, 49142, 49143, 49144, + 49145, 49146, 49147, 49148, 49149, 49150, 49151, 49152, 49153, 49154, + 49155, 49156, 49157, 49158, 49159, 49160, 49161, 49162, 49163, 49164, + 49165, 49166, 49167, 49168, 49169, 49170, 49171, 49172, 49173, 49174, + 49175, 49176, 49177, 49178, 49179, 49180, 49181, 49182, 49183, 49184, + 49185, 49186, 49187, 49188, 49189, 49190, 49191, 49192, 49193, 49194, + 49195, 49196, 49197, 49198, 49199, 49200, 49201, 49202, 49203, 49204, + 49205, 49206, 49207, 49208, 49209, 49210, 49211, 49213, 49214, 49215, + 49216, 49217, 49218, 49219, 49220, 49221, 49222, 49223, 49224, 49225, + 49226, 49227, 49228, 49229, 49230, 49231, 49232, 49234, 49235, 49236, + 49237, 49238, 49239, 49241, 49242, 49243, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49245, 49246, 49247, 49249, 49250, 49251, 49252, 49253, + 49254, 49255, 49258, 49259, 49260, 49261, 49262, 49263, 49264, 49265, + 49266, 49267, 49268, 49269, 49270, 49271, 49272, 49273, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49274, 49275, 49276, 49277, 49278, 49279, + 49280, 49281, 49282, 49283, 49284, 49285, 49286, 49287, 49288, 49289, + 49290, 49291, 49292, 49293, 49294, 49295, 49298, 49299, 49301, 49302, + 49303, 49305, 49306, 49307, 49308, 49309, 49310, 49311, 49314, 49316, + 49318, 49319, 49320, 49321, 49322, 49323, 49326, 49329, 49330, 49335, + 49336, 49337, 49338, 49339, 49342, 49346, 49347, 49348, 49350, 49351, + 49354, 49355, 49357, 49358, 49359, 49361, 49362, 49363, 49364, 49365, + 49366, 49367, 49370, 49374, 49375, 49376, 49377, 49378, 49379, 49382, + 49383, 49385, 49386, 49387, 49389, 49390, 49391, 49392, 49393, 49394, + 49395, 49398, 49400, 49402, 49403, 49404, 49405, 49406, 49407, 49409, + 49410, 49411, 49413, 49414, 49415, 49417, 49418, 49419, 49420, 49421, + 49422, 49423, 49425, 49426, 49427, 49428, 49430, 49431, 49432, 49433, + 49434, 49435, 49441, 49442, 49445, 49448, 49449, 49450, 49451, 49454, + 49458, 49459, 49460, 49461, 49463, 49466, 49467, 49469, 49470, 49471, + 49473, 49474, 49475, 49476, 49477, 49478, 49479, 49482, 49486, 49487, + 49488, 49489, 49490, 49491, 49494, 49495, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49497, 49498, 49499, 49501, 49502, 49503, 49504, 49505, + 49506, 49507, 49510, 49514, 49515, 49516, 49517, 49518, 49519, 49521, + 49522, 49523, 49525, 49526, 49527, 49529, 49530, 49531, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49532, 49533, 49534, 49535, 49536, 49537, + 49538, 49539, 49540, 49542, 49543, 49544, 49545, 49546, 49547, 49551, + 49553, 49554, 49555, 49557, 49559, 49560, 49561, 49562, 49563, 49566, + 49568, 49570, 49571, 49572, 49574, 49575, 49578, 49579, 49581, 49582, + 49583, 49585, 49586, 49587, 49588, 49589, 49590, 49591, 49592, 49593, + 49594, 49595, 49596, 49598, 49599, 49600, 49601, 49602, 49603, 49605, + 49606, 49607, 49609, 49610, 49611, 49613, 49614, 49615, 49616, 49617, + 49618, 49619, 49621, 49622, 49625, 49626, 49627, 49628, 49629, 49630, + 49631, 49633, 49634, 49635, 49637, 49638, 49639, 49641, 49642, 49643, + 49644, 49645, 49646, 49647, 49650, 49652, 49653, 49654, 49655, 49656, + 49657, 49658, 49659, 49662, 49663, 49665, 49666, 49667, 49669, 49670, + 49671, 49672, 49673, 49674, 49675, 49678, 49680, 49682, 49683, 49684, + 49685, 49686, 49687, 49690, 49691, 49693, 49694, 49697, 49698, 49699, + 49700, 49701, 49702, 49703, 49706, 49708, 49710, 49712, 49715, 49717, + 49718, 49719, 49720, 49721, 49722, 49723, 49724, 49725, 49726, 49727, + 49728, 49729, 49730, 49731, 49732, 49733, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49734, 49735, 49737, 49738, 49739, 49740, 49741, 49742, + 49743, 49746, 49747, 49749, 49750, 49751, 49753, 49754, 49755, 49756, + 49757, 49758, 49759, 49761, 49762, 49763, 49764, 49766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49767, 49768, 49769, 49770, 49771, 49774, + 49775, 49777, 49778, 49779, 49781, 49782, 49783, 49784, 49785, 49786, + 49787, 49790, 49792, 49794, 49795, 49796, 49797, 49798, 49799, 49802, + 49803, 49804, 49805, 49806, 49807, 49809, 49810, 49811, 49812, 49813, + 49814, 49815, 49817, 49818, 49820, 49822, 49823, 49824, 49825, 49826, + 49827, 49830, 49831, 49833, 49834, 49835, 49838, 49839, 49840, 49841, + 49842, 49843, 49846, 49848, 49850, 49851, 49852, 49853, 49854, 49855, + 49856, 49857, 49858, 49859, 49860, 49861, 49862, 49863, 49864, 49865, + 49866, 49867, 49868, 49869, 49870, 49871, 49872, 49873, 49874, 49875, + 49876, 49877, 49878, 49879, 49880, 49881, 49882, 49883, 49886, 49887, + 49889, 49890, 49893, 49894, 49895, 49896, 49897, 49898, 49902, 49904, + 49906, 49907, 49908, 49909, 49911, 49914, 49917, 49918, 49919, 49921, + 49922, 49923, 49924, 49925, 49926, 49927, 49930, 49931, 49934, 49935, + 49936, 49937, 49938, 49942, 49943, 49945, 49946, 49947, 49949, 49950, + 49951, 49952, 49953, 49954, 49955, 49958, 49959, 49962, 49963, 49964, + 49965, 49966, 49967, 49968, 49969, 49970, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49971, 49972, 49973, 49974, 49975, 49976, 49977, 49978, + 49979, 49980, 49981, 49982, 49983, 49984, 49985, 49986, 49987, 49988, + 49990, 49991, 49992, 49993, 49994, 49995, 49996, 49997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49998, 49999, 50000, 50001, 50002, 50003, + 50004, 50005, 50006, 50007, 50008, 50009, 50010, 50011, 50012, 50013, + 50014, 50015, 50016, 50017, 50018, 50019, 50020, 50021, 50022, 50023, + 50026, 50027, 50029, 50030, 50031, 50033, 50035, 50036, 50037, 50038, + 50039, 50042, 50043, 50046, 50047, 50048, 50049, 50050, 50051, 50053, + 50054, 50055, 50057, 50058, 50059, 50061, 50062, 50063, 50064, 50065, + 50066, 50067, 50068, 50069, 50070, 50071, 50072, 50073, 50074, 50075, + 50076, 50077, 50078, 50079, 50080, 50081, 50082, 50083, 50084, 50085, + 50086, 50087, 50088, 50089, 50090, 50091, 50092, 50093, 50094, 50095, + 50096, 50097, 50098, 50099, 50100, 50101, 50102, 50103, 50104, 50105, + 50106, 50107, 50108, 50109, 50110, 50111, 50113, 50114, 50115, 50116, + 50117, 50118, 50119, 50120, 50121, 50122, 50123, 50124, 50125, 50126, + 50127, 50128, 50129, 50130, 50131, 50132, 50133, 50134, 50135, 50138, + 50139, 50141, 50142, 50145, 50147, 50148, 50149, 50150, 50151, 50154, + 50155, 50156, 50158, 50159, 50160, 50161, 50162, 50163, 50166, 50167, + 50169, 50170, 50171, 50172, 50173, 50174, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50175, 50176, 50177, 50178, 50179, 50180, 50181, 50182, + 50183, 50185, 50186, 50187, 50188, 50189, 50190, 50191, 50193, 50194, + 50195, 50196, 50197, 50198, 50199, 50200, 50201, 50202, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50203, 50204, 50205, 50206, 50207, 50208, + 50209, 50210, 50211, 50213, 50214, 50215, 50216, 50217, 50218, 50219, + 50221, 50222, 50223, 50225, 50226, 50227, 50229, 50230, 50231, 50232, + 50233, 50234, 50235, 50238, 50239, 50240, 50241, 50242, 50243, 50244, + 50245, 50246, 50247, 50249, 50250, 50251, 50252, 50253, 50254, 50255, + 50256, 50257, 50258, 50259, 50260, 50261, 50262, 50263, 50264, 50265, + 50266, 50267, 50268, 50269, 50270, 50271, 50272, 50273, 50274, 50275, + 50278, 50279, 50281, 50282, 50283, 50285, 50286, 50287, 50288, 50289, + 50290, 50291, 50294, 50295, 50296, 50298, 50299, 50300, 50301, 50302, + 50303, 50305, 50306, 50307, 50308, 50309, 50310, 50311, 50312, 50313, + 50314, 50315, 50316, 50317, 50318, 50319, 50320, 50321, 50322, 50323, + 50325, 50326, 50327, 50328, 50329, 50330, 50331, 50333, 50334, 50335, + 50336, 50337, 50338, 50339, 50340, 50341, 50342, 50343, 50344, 50345, + 50346, 50347, 50348, 50349, 50350, 50351, 50352, 50353, 50354, 50355, + 50356, 50357, 50358, 50359, 50361, 50362, 50363, 50365, 50366, 50367, + 50368, 50369, 50370, 50371, 50372, 50373, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50374, 50375, 50376, 50377, 50378, 50379, 50380, 50381, + 50382, 50383, 50384, 50385, 50386, 50387, 50388, 50389, 50390, 50391, + 50392, 50393, 50394, 50395, 50396, 50397, 50398, 50399, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50400, 50401, 50402, 50403, 50404, 50405, + 50406, 50407, 50408, 50410, 50411, 50412, 50413, 50414, 50415, 50418, + 50419, 50421, 50422, 50423, 50425, 50427, 50428, 50429, 50430, 50434, + 50435, 50436, 50437, 50438, 50439, 50440, 50441, 50442, 50443, 50445, + 50446, 50447, 50449, 50450, 50451, 50453, 50454, 50455, 50456, 50457, + 50458, 50459, 50461, 50462, 50463, 50464, 50465, 50466, 50467, 50468, + 50469, 50470, 50471, 50474, 50475, 50477, 50478, 50479, 50481, 50482, + 50483, 50484, 50485, 50486, 50487, 50490, 50492, 50494, 50495, 50496, + 50497, 50498, 50499, 50502, 50503, 50507, 50511, 50512, 50513, 50514, + 50518, 50522, 50523, 50524, 50527, 50530, 50531, 50533, 50534, 50535, + 50537, 50538, 50539, 50540, 50541, 50542, 50543, 50546, 50550, 50551, + 50552, 50553, 50554, 50555, 50558, 50559, 50561, 50562, 50563, 50565, + 50566, 50568, 50569, 50570, 50571, 50574, 50576, 50578, 50579, 50580, + 50582, 50585, 50586, 50587, 50589, 50590, 50591, 50593, 50594, 50595, + 50596, 50597, 50598, 50599, 50600, 50602, 50603, 50604, 50605, 50606, + 50607, 50608, 50609, 50610, 50611, 50614, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50615, 50618, 50623, 50624, 50625, 50626, 50627, 50635, + 50637, 50639, 50642, 50643, 50645, 50646, 50647, 50649, 50650, 50651, + 50652, 50653, 50654, 50655, 50658, 50660, 50662, 50663, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50664, 50665, 50666, 50667, 50671, 50673, + 50674, 50675, 50677, 50680, 50681, 50682, 50683, 50690, 50691, 50692, + 50697, 50698, 50699, 50701, 50702, 50703, 50705, 50706, 50707, 50708, + 50709, 50710, 50711, 50714, 50717, 50718, 50719, 50720, 50721, 50722, + 50723, 50726, 50727, 50729, 50730, 50731, 50735, 50737, 50738, 50742, + 50744, 50746, 50748, 50749, 50750, 50751, 50754, 50755, 50757, 50758, + 50759, 50761, 50762, 50763, 50764, 50765, 50766, 50767, 50770, 50774, + 50775, 50776, 50777, 50778, 50779, 50782, 50783, 50785, 50786, 50787, + 50788, 50789, 50790, 50791, 50792, 50793, 50794, 50795, 50797, 50798, + 50800, 50802, 50803, 50804, 50805, 50806, 50807, 50810, 50811, 50813, + 50814, 50815, 50817, 50818, 50819, 50820, 50821, 50822, 50823, 50826, + 50828, 50830, 50831, 50832, 50833, 50834, 50835, 50838, 50839, 50841, + 50842, 50843, 50845, 50846, 50847, 50848, 50849, 50850, 50851, 50854, + 50856, 50858, 50859, 50860, 50861, 50862, 50863, 50866, 50867, 50869, + 50870, 50871, 50875, 50876, 50877, 50878, 50879, 50882, 50884, 50886, + 50887, 50888, 50889, 50890, 50891, 50894, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50895, 50897, 50898, 50899, 50901, 50902, 50903, 50904, + 50905, 50906, 50907, 50910, 50911, 50914, 50915, 50916, 50917, 50918, + 50919, 50922, 50923, 50925, 50926, 50927, 50929, 50930, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50931, 50932, 50933, 50934, 50935, 50938, + 50939, 50940, 50942, 50943, 50944, 50945, 50946, 50947, 50950, 50951, + 50953, 50954, 50955, 50957, 50958, 50959, 50960, 50961, 50962, 50963, + 50966, 50968, 50970, 50971, 50972, 50973, 50974, 50975, 50978, 50979, + 50981, 50982, 50983, 50985, 50986, 50987, 50988, 50989, 50990, 50991, + 50994, 50996, 50998, 51000, 51001, 51002, 51003, 51006, 51007, 51009, + 51010, 51011, 51013, 51014, 51015, 51016, 51017, 51019, 51022, 51024, + 51033, 51034, 51035, 51037, 51038, 51039, 51041, 51042, 51043, 51044, + 51045, 51046, 51047, 51049, 51050, 51052, 51053, 51054, 51055, 51056, + 51057, 51058, 51059, 51062, 51063, 51065, 51066, 51067, 51071, 51072, + 51073, 51074, 51078, 51083, 51084, 51085, 51087, 51090, 51091, 51093, + 51097, 51099, 51100, 51101, 51102, 51103, 51106, 51111, 51112, 51113, + 51114, 51115, 51118, 51119, 51121, 51122, 51123, 51125, 51126, 51127, + 51128, 51129, 51130, 51131, 51134, 51138, 51139, 51140, 51141, 51142, + 51143, 51146, 51147, 51149, 51151, 51153, 51154, 51155, 51156, 51157, + 51158, 51159, 51161, 51162, 51163, 51164, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51166, 51167, 51168, 51169, 51170, 51171, 51173, 51174, + 51175, 51177, 51178, 51179, 51181, 51182, 51183, 51184, 51185, 51186, + 51187, 51188, 51189, 51190, 51191, 51192, 51193, 51194, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51195, 51196, 51197, 51198, 51199, 51202, + 51203, 51205, 51206, 51207, 51209, 51211, 51212, 51213, 51214, 51215, + 51218, 51220, 51223, 51224, 51225, 51226, 51227, 51230, 51231, 51233, + 51234, 51235, 51237, 51238, 51239, 51240, 51241, 51242, 51243, 51246, + 51248, 51250, 51251, 51252, 51253, 51254, 51255, 51257, 51258, 51259, + 51261, 51262, 51263, 51265, 51266, 51267, 51268, 51269, 51270, 51271, + 51274, 51275, 51278, 51279, 51280, 51281, 51282, 51283, 51285, 51286, + 51287, 51288, 51289, 51290, 51291, 51292, 51293, 51294, 51295, 51296, + 51297, 51298, 51299, 51300, 51301, 51302, 51303, 51304, 51305, 51306, + 51307, 51308, 51309, 51310, 51311, 51314, 51315, 51317, 51318, 51319, + 51321, 51323, 51324, 51325, 51326, 51327, 51330, 51332, 51336, 51337, + 51338, 51342, 51343, 51344, 51345, 51346, 51347, 51349, 51350, 51351, + 51352, 51353, 51354, 51355, 51356, 51358, 51360, 51362, 51363, 51364, + 51365, 51366, 51367, 51369, 51370, 51371, 51372, 51373, 51374, 51375, + 51376, 51377, 51378, 51379, 51380, 51381, 51382, 51383, 51384, 51385, + 51386, 51387, 51390, 51391, 51392, 51393, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51394, 51395, 51397, 51398, 51399, 51401, 51402, 51403, + 51405, 51406, 51407, 51408, 51409, 51410, 51411, 51414, 51416, 51418, + 51419, 51420, 51421, 51422, 51423, 51426, 51427, 51429, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51430, 51431, 51432, 51433, 51434, 51435, + 51436, 51437, 51438, 51439, 51440, 51441, 51442, 51443, 51444, 51446, + 51447, 51448, 51449, 51450, 51451, 51454, 51455, 51457, 51458, 51459, + 51463, 51464, 51465, 51466, 51467, 51470, 12288, 12289, 12290, 183, + 8229, 8230, 168, 12291, 173, 8213, 8741, 65340, 8764, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12304, 12305, 177, 215, 247, 8800, 8804, + 8805, 8734, 8756, 176, 8242, 8243, 8451, 8491, 65504, 65505, + 65509, 9794, 9792, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 167, 8251, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, + 9632, 9651, 9650, 9661, 9660, 8594, 8592, 8593, 8595, 8596, + 12307, 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 8743, 8744, 65506, + 51472, 51474, 51475, 51476, 51477, 51478, 51479, 51481, 51482, 51483, + 51484, 51485, 51486, 51487, 51488, 51489, 51490, 51491, 51492, 51493, + 51494, 51495, 51496, 51497, 51498, 51499, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51501, 51502, 51503, 51504, 51505, 51506, 51507, 51509, + 51510, 51511, 51512, 51513, 51514, 51515, 51516, 51517, 51518, 51519, + 51520, 51521, 51522, 51523, 51524, 51525, 51526, 51527, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51528, 51529, 51530, 51531, 51532, 51533, + 51534, 51535, 51538, 51539, 51541, 51542, 51543, 51545, 51546, 51547, + 51548, 51549, 51550, 51551, 51554, 51556, 51557, 51558, 51559, 51560, + 51561, 51562, 51563, 51565, 51566, 51567, 8658, 8660, 8704, 8707, + 180, 65374, 711, 728, 733, 730, 729, 184, 731, 161, + 191, 720, 8750, 8721, 8719, 164, 8457, 8240, 9665, 9664, + 9655, 9654, 9828, 9824, 9825, 9829, 9831, 9827, 8857, 9672, + 9635, 9680, 9681, 9618, 9636, 9637, 9640, 9639, 9638, 9641, + 9832, 9743, 9742, 9756, 9758, 182, 8224, 8225, 8597, 8599, + 8601, 8598, 8600, 9837, 9833, 9834, 9836, 12927, 12828, 8470, + 13255, 8482, 13250, 13272, 8481, 8364, 174, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51569, 51570, 51571, 51573, 51574, 51575, 51576, 51577, 51578, 51579, + 51581, 51582, 51583, 51584, 51585, 51586, 51587, 51588, 51589, 51590, + 51591, 51594, 51595, 51597, 51598, 51599, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51601, 51602, 51603, 51604, 51605, 51606, 51607, 51610, + 51612, 51614, 51615, 51616, 51617, 51618, 51619, 51620, 51621, 51622, + 51623, 51624, 51625, 51626, 51627, 51628, 51629, 51630, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51631, 51632, 51633, 51634, 51635, 51636, + 51637, 51638, 51639, 51640, 51641, 51642, 51643, 51644, 51645, 51646, + 51647, 51650, 51651, 51653, 51654, 51657, 51659, 51660, 51661, 51662, + 51663, 51666, 51668, 51671, 51672, 51675, 65281, 65282, 65283, 65284, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65510, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 51678, 51679, 51681, 51683, 51685, 51686, 51688, 51689, 51690, 51691, + 51694, 51698, 51699, 51700, 51701, 51702, 51703, 51706, 51707, 51709, + 51710, 51711, 51713, 51714, 51715, 51716, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51717, 51718, 51719, 51722, 51726, 51727, 51728, 51729, + 51730, 51731, 51733, 51734, 51735, 51737, 51738, 51739, 51740, 51741, + 51742, 51743, 51744, 51745, 51746, 51747, 51748, 51749, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51750, 51751, 51752, 51754, 51755, 51756, + 51757, 51758, 51759, 51760, 51761, 51762, 51763, 51764, 51765, 51766, + 51767, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, + 51777, 51778, 51779, 51780, 51781, 51782, 12593, 12594, 12595, 12596, + 12597, 12598, 12599, 12600, 12601, 12602, 12603, 12604, 12605, 12606, + 12607, 12608, 12609, 12610, 12611, 12612, 12613, 12614, 12615, 12616, + 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625, 12626, + 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635, 12636, + 12637, 12638, 12639, 12640, 12641, 12642, 12643, 12644, 12645, 12646, + 12647, 12648, 12649, 12650, 12651, 12652, 12653, 12654, 12655, 12656, + 12657, 12658, 12659, 12660, 12661, 12662, 12663, 12664, 12665, 12666, + 12667, 12668, 12669, 12670, 12671, 12672, 12673, 12674, 12675, 12676, + 12677, 12678, 12679, 12680, 12681, 12682, 12683, 12684, 12685, 12686, + 51783, 51784, 51785, 51786, 51787, 51790, 51791, 51793, 51794, 51795, + 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51806, 51810, 51811, + 51812, 51813, 51814, 51815, 51817, 51818, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51826, + 51827, 51828, 51829, 51830, 51831, 51832, 51833, 51834, 51835, 51836, + 51838, 51839, 51840, 51841, 51842, 51843, 51845, 51846, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51847, 51848, 51849, 51850, 51851, 51852, + 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, + 51863, 51865, 51866, 51867, 51868, 51869, 51870, 51871, 51872, 51873, + 51874, 51875, 51876, 51877, 51878, 51879, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, + 8553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, + 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 963, 964, 965, + 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, + 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, + 51902, 51903, 51905, 51906, 51907, 51909, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51910, 51911, 51912, 51913, 51914, 51915, 51918, 51920, + 51922, 51924, 51925, 51926, 51927, 51930, 51931, 51932, 51933, 51934, + 51935, 51937, 51938, 51939, 51940, 51941, 51942, 51943, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51944, 51945, 51946, 51947, 51949, 51950, + 51951, 51952, 51953, 51954, 51955, 51957, 51958, 51959, 51960, 51961, + 51962, 51963, 51964, 51965, 51966, 51967, 51968, 51969, 51970, 51971, + 51972, 51973, 51974, 51975, 51977, 51978, 9472, 9474, 9484, 9488, + 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, 9487, + 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, + 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, + 9498, 9497, 9494, 9493, 9486, 9485, 9502, 9503, 9505, 9506, + 9510, 9511, 9513, 9514, 9517, 9518, 9521, 9522, 9525, 9526, + 9529, 9530, 9533, 9534, 9536, 9537, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51979, 51980, 51981, 51982, 51983, 51985, 51986, 51987, 51989, 51990, + 51991, 51993, 51994, 51995, 51996, 51997, 51998, 51999, 52002, 52003, + 52004, 52005, 52006, 52007, 52008, 52009, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52010, 52011, 52012, 52013, 52014, 52015, 52016, 52017, + 52018, 52019, 52020, 52021, 52022, 52023, 52024, 52025, 52026, 52027, + 52028, 52029, 52030, 52031, 52032, 52034, 52035, 52036, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52037, 52038, 52039, 52042, 52043, 52045, + 52046, 52047, 52049, 52050, 52051, 52052, 52053, 52054, 52055, 52058, + 52059, 52060, 52062, 52063, 52064, 52065, 52066, 52067, 52069, 52070, + 52071, 52072, 52073, 52074, 52075, 52076, 13205, 13206, 13207, 8467, + 13208, 13252, 13219, 13220, 13221, 13222, 13209, 13210, 13211, 13212, + 13213, 13214, 13215, 13216, 13217, 13218, 13258, 13197, 13198, 13199, + 13263, 13192, 13193, 13256, 13223, 13224, 13232, 13233, 13234, 13235, + 13236, 13237, 13238, 13239, 13240, 13241, 13184, 13185, 13186, 13187, + 13188, 13242, 13243, 13244, 13245, 13246, 13247, 13200, 13201, 13202, + 13203, 13204, 8486, 13248, 13249, 13194, 13195, 13196, 13270, 13253, + 13229, 13230, 13231, 13275, 13225, 13226, 13227, 13228, 13277, 13264, + 13267, 13251, 13257, 13276, 13254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52077, 52078, 52079, 52080, 52081, 52082, 52083, 52084, 52085, 52086, + 52087, 52090, 52091, 52092, 52093, 52094, 52095, 52096, 52097, 52098, + 52099, 52100, 52101, 52102, 52103, 52104, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52105, 52106, 52107, 52108, 52109, 52110, 52111, 52112, + 52113, 52114, 52115, 52116, 52117, 52118, 52119, 52120, 52121, 52122, + 52123, 52125, 52126, 52127, 52128, 52129, 52130, 52131, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52132, 52133, 52134, 52135, 52136, 52137, + 52138, 52139, 52140, 52141, 52142, 52143, 52144, 52145, 52146, 52147, + 52148, 52149, 52150, 52151, 52153, 52154, 52155, 52156, 52157, 52158, + 52159, 52160, 52161, 52162, 52163, 52164, 198, 208, 170, 294, + 0x0000, 306, 0x0000, 319, 321, 216, 338, 186, 222, 358, + 330, 0x0000, 12896, 12897, 12898, 12899, 12900, 12901, 12902, 12903, + 12904, 12905, 12906, 12907, 12908, 12909, 12910, 12911, 12912, 12913, + 12914, 12915, 12916, 12917, 12918, 12919, 12920, 12921, 12922, 12923, + 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, + 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, + 9444, 9445, 9446, 9447, 9448, 9449, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, + 9326, 189, 8531, 8532, 188, 190, 8539, 8540, 8541, 8542, + 52165, 52166, 52167, 52168, 52169, 52170, 52171, 52172, 52173, 52174, + 52175, 52176, 52177, 52178, 52179, 52181, 52182, 52183, 52184, 52185, + 52186, 52187, 52188, 52189, 52190, 52191, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52192, 52193, 52194, 52195, 52197, 52198, 52200, 52202, + 52203, 52204, 52205, 52206, 52207, 52208, 52209, 52210, 52211, 52212, + 52213, 52214, 52215, 52216, 52217, 52218, 52219, 52220, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52221, 52222, 52223, 52224, 52225, 52226, + 52227, 52228, 52229, 52230, 52231, 52232, 52233, 52234, 52235, 52238, + 52239, 52241, 52242, 52243, 52245, 52246, 52247, 52248, 52249, 52250, + 52251, 52254, 52255, 52256, 52259, 52260, 230, 273, 240, 295, + 305, 307, 312, 320, 322, 248, 339, 223, 254, 359, + 331, 329, 12800, 12801, 12802, 12803, 12804, 12805, 12806, 12807, + 12808, 12809, 12810, 12811, 12812, 12813, 12814, 12815, 12816, 12817, + 12818, 12819, 12820, 12821, 12822, 12823, 12824, 12825, 12826, 12827, + 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, + 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, + 9392, 9393, 9394, 9395, 9396, 9397, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, + 9346, 185, 178, 179, 8308, 8319, 8321, 8322, 8323, 8324, + 52261, 52262, 52266, 52267, 52269, 52271, 52273, 52274, 52275, 52276, + 52277, 52278, 52279, 52282, 52287, 52288, 52289, 52290, 52291, 52294, + 52295, 52297, 52298, 52299, 52301, 52302, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52303, 52304, 52305, 52306, 52307, 52310, 52314, 52315, + 52316, 52317, 52318, 52319, 52321, 52322, 52323, 52325, 52327, 52329, + 52330, 52331, 52332, 52333, 52334, 52335, 52337, 52338, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52339, 52340, 52342, 52343, 52344, 52345, + 52346, 52347, 52348, 52349, 52350, 52351, 52352, 52353, 52354, 52355, + 52356, 52357, 52358, 52359, 52360, 52361, 52362, 52363, 52364, 52365, + 52366, 52367, 52368, 52369, 52370, 52371, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52372, 52373, 52374, 52375, 52378, 52379, 52381, 52382, 52383, 52385, + 52386, 52387, 52388, 52389, 52390, 52391, 52394, 52398, 52399, 52400, + 52401, 52402, 52403, 52406, 52407, 52409, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52410, 52411, 52413, 52414, 52415, 52416, 52417, 52418, + 52419, 52422, 52424, 52426, 52427, 52428, 52429, 52430, 52431, 52433, + 52434, 52435, 52437, 52438, 52439, 52440, 52441, 52442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52443, 52444, 52445, 52446, 52447, 52448, + 52449, 52450, 52451, 52453, 52454, 52455, 52456, 52457, 52458, 52459, + 52461, 52462, 52463, 52465, 52466, 52467, 52468, 52469, 52470, 52471, + 52472, 52473, 52474, 52475, 52476, 52477, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52478, 52479, 52480, 52482, 52483, 52484, 52485, 52486, 52487, 52490, + 52491, 52493, 52494, 52495, 52497, 52498, 52499, 52500, 52501, 52502, + 52503, 52506, 52508, 52510, 52511, 52512, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52513, 52514, 52515, 52517, 52518, 52519, 52521, 52522, + 52523, 52525, 52526, 52527, 52528, 52529, 52530, 52531, 52532, 52533, + 52534, 52535, 52536, 52538, 52539, 52540, 52541, 52542, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52543, 52544, 52545, 52546, 52547, 52548, + 52549, 52550, 52551, 52552, 52553, 52554, 52555, 52556, 52557, 52558, + 52559, 52560, 52561, 52562, 52563, 52564, 52565, 52566, 52567, 52568, + 52569, 52570, 52571, 52573, 52574, 52575, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52577, 52578, 52579, 52581, 52582, 52583, 52584, 52585, 52586, 52587, + 52590, 52592, 52594, 52595, 52596, 52597, 52598, 52599, 52601, 52602, + 52603, 52604, 52605, 52606, 52607, 52608, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52609, 52610, 52611, 52612, 52613, 52614, 52615, 52617, + 52618, 52619, 52620, 52621, 52622, 52623, 52624, 52625, 52626, 52627, + 52630, 52631, 52633, 52634, 52635, 52637, 52638, 52639, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52640, 52641, 52642, 52643, 52646, 52648, + 52650, 52651, 52652, 52653, 52654, 52655, 52657, 52658, 52659, 52660, + 52661, 52662, 52663, 52664, 52665, 52666, 52667, 52668, 52669, 52670, + 52671, 52672, 52673, 52674, 52675, 52677, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52678, 52679, 52680, 52681, 52682, 52683, 52685, 52686, 52687, 52689, + 52690, 52691, 52692, 52693, 52694, 52695, 52696, 52697, 52698, 52699, + 52700, 52701, 52702, 52703, 52704, 52705, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52706, 52707, 52708, 52709, 52710, 52711, 52713, 52714, + 52715, 52717, 52718, 52719, 52721, 52722, 52723, 52724, 52725, 52726, + 52727, 52730, 52732, 52734, 52735, 52736, 52737, 52738, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52739, 52741, 52742, 52743, 52745, 52746, + 52747, 52749, 52750, 52751, 52752, 52753, 52754, 52755, 52757, 52758, + 52759, 52760, 52762, 52763, 52764, 52765, 52766, 52767, 52770, 52771, + 52773, 52774, 52775, 52777, 52778, 52779, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52780, 52781, 52782, 52783, 52786, 52788, 52790, 52791, 52792, 52793, + 52794, 52795, 52796, 52797, 52798, 52799, 52800, 52801, 52802, 52803, + 52804, 52805, 52806, 52807, 52808, 52809, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52810, 52811, 52812, 52813, 52814, 52815, 52816, 52817, + 52818, 52819, 52820, 52821, 52822, 52823, 52826, 52827, 52829, 52830, + 52834, 52835, 52836, 52837, 52838, 52839, 52842, 52844, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52846, 52847, 52848, 52849, 52850, 52851, + 52854, 52855, 52857, 52858, 52859, 52861, 52862, 52863, 52864, 52865, + 52866, 52867, 52870, 52872, 52874, 52875, 52876, 52877, 52878, 52879, + 52882, 52883, 52885, 52886, 52887, 52889, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52890, 52891, 52892, 52893, 52894, 52895, 52898, 52902, 52903, 52904, + 52905, 52906, 52907, 52910, 52911, 52912, 52913, 52914, 52915, 52916, + 52917, 52918, 52919, 52920, 52921, 52922, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52923, 52924, 52925, 52926, 52927, 52928, 52930, 52931, + 52932, 52933, 52934, 52935, 52936, 52937, 52938, 52939, 52940, 52941, + 52942, 52943, 52944, 52945, 52946, 52947, 52948, 52949, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52950, 52951, 52952, 52953, 52954, 52955, + 52956, 52957, 52958, 52959, 52960, 52961, 52962, 52963, 52966, 52967, + 52969, 52970, 52973, 52974, 52975, 52976, 52977, 52978, 52979, 52982, + 52986, 52987, 52988, 52989, 52990, 52991, 44032, 44033, 44036, 44039, + 44040, 44041, 44042, 44048, 44049, 44050, 44051, 44052, 44053, 44054, + 44055, 44057, 44058, 44059, 44060, 44061, 44064, 44068, 44076, 44077, + 44079, 44080, 44081, 44088, 44089, 44092, 44096, 44107, 44109, 44116, + 44120, 44124, 44144, 44145, 44148, 44151, 44152, 44154, 44160, 44161, + 44163, 44164, 44165, 44166, 44169, 44170, 44171, 44172, 44176, 44180, + 44188, 44189, 44191, 44192, 44193, 44200, 44201, 44202, 44204, 44207, + 44208, 44216, 44217, 44219, 44220, 44221, 44225, 44228, 44232, 44236, + 44245, 44247, 44256, 44257, 44260, 44263, 44264, 44266, 44268, 44271, + 44272, 44273, 44275, 44277, 44278, 44284, 44285, 44288, 44292, 44294, + 52994, 52995, 52997, 52998, 52999, 53001, 53002, 53003, 53004, 53005, + 53006, 53007, 53010, 53012, 53014, 53015, 53016, 53017, 53018, 53019, + 53021, 53022, 53023, 53025, 53026, 53027, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53029, 53030, 53031, 53032, 53033, 53034, 53035, 53038, + 53042, 53043, 53044, 53045, 53046, 53047, 53049, 53050, 53051, 53052, + 53053, 53054, 53055, 53056, 53057, 53058, 53059, 53060, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53061, 53062, 53063, 53064, 53065, 53066, + 53067, 53068, 53069, 53070, 53071, 53072, 53073, 53074, 53075, 53078, + 53079, 53081, 53082, 53083, 53085, 53086, 53087, 53088, 53089, 53090, + 53091, 53094, 53096, 53098, 53099, 53100, 44300, 44301, 44303, 44305, + 44312, 44316, 44320, 44329, 44332, 44333, 44340, 44341, 44344, 44348, + 44356, 44357, 44359, 44361, 44368, 44372, 44376, 44385, 44387, 44396, + 44397, 44400, 44403, 44404, 44405, 44406, 44411, 44412, 44413, 44415, + 44417, 44418, 44424, 44425, 44428, 44432, 44444, 44445, 44452, 44471, + 44480, 44481, 44484, 44488, 44496, 44497, 44499, 44508, 44512, 44516, + 44536, 44537, 44540, 44543, 44544, 44545, 44552, 44553, 44555, 44557, + 44564, 44592, 44593, 44596, 44599, 44600, 44602, 44608, 44609, 44611, + 44613, 44614, 44618, 44620, 44621, 44622, 44624, 44628, 44630, 44636, + 44637, 44639, 44640, 44641, 44645, 44648, 44649, 44652, 44656, 44664, + 53101, 53102, 53103, 53106, 53107, 53109, 53110, 53111, 53113, 53114, + 53115, 53116, 53117, 53118, 53119, 53121, 53122, 53123, 53124, 53126, + 53127, 53128, 53129, 53130, 53131, 53133, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53134, 53135, 53136, 53137, 53138, 53139, 53140, 53141, + 53142, 53143, 53144, 53145, 53146, 53147, 53148, 53149, 53150, 53151, + 53152, 53154, 53155, 53156, 53157, 53158, 53159, 53161, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53162, 53163, 53164, 53165, 53166, 53167, + 53169, 53170, 53171, 53172, 53173, 53174, 53175, 53176, 53177, 53178, + 53179, 53180, 53181, 53182, 53183, 53184, 53185, 53186, 53187, 53189, + 53190, 53191, 53192, 53193, 53194, 53195, 44665, 44667, 44668, 44669, + 44676, 44677, 44684, 44732, 44733, 44734, 44736, 44740, 44748, 44749, + 44751, 44752, 44753, 44760, 44761, 44764, 44776, 44779, 44781, 44788, + 44792, 44796, 44807, 44808, 44813, 44816, 44844, 44845, 44848, 44850, + 44852, 44860, 44861, 44863, 44865, 44866, 44867, 44872, 44873, 44880, + 44892, 44893, 44900, 44901, 44921, 44928, 44932, 44936, 44944, 44945, + 44949, 44956, 44984, 44985, 44988, 44992, 44999, 45000, 45001, 45003, + 45005, 45006, 45012, 45020, 45032, 45033, 45040, 45041, 45044, 45048, + 45056, 45057, 45060, 45068, 45072, 45076, 45084, 45085, 45096, 45124, + 45125, 45128, 45130, 45132, 45134, 45139, 45140, 45141, 45143, 45145, + 53196, 53197, 53198, 53199, 53200, 53201, 53202, 53203, 53204, 53205, + 53206, 53207, 53208, 53209, 53210, 53211, 53212, 53213, 53214, 53215, + 53218, 53219, 53221, 53222, 53223, 53225, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53226, 53227, 53228, 53229, 53230, 53231, 53234, 53236, + 53238, 53239, 53240, 53241, 53242, 53243, 53245, 53246, 53247, 53249, + 53250, 53251, 53253, 53254, 53255, 53256, 53257, 53258, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53259, 53260, 53261, 53262, 53263, 53264, + 53266, 53267, 53268, 53269, 53270, 53271, 53273, 53274, 53275, 53276, + 53277, 53278, 53279, 53280, 53281, 53282, 53283, 53284, 53285, 53286, + 53287, 53288, 53289, 53290, 53291, 53292, 45149, 45180, 45181, 45184, + 45188, 45196, 45197, 45199, 45201, 45208, 45209, 45210, 45212, 45215, + 45216, 45217, 45218, 45224, 45225, 45227, 45228, 45229, 45230, 45231, + 45233, 45235, 45236, 45237, 45240, 45244, 45252, 45253, 45255, 45256, + 45257, 45264, 45265, 45268, 45272, 45280, 45285, 45320, 45321, 45323, + 45324, 45328, 45330, 45331, 45336, 45337, 45339, 45340, 45341, 45347, + 45348, 45349, 45352, 45356, 45364, 45365, 45367, 45368, 45369, 45376, + 45377, 45380, 45384, 45392, 45393, 45396, 45397, 45400, 45404, 45408, + 45432, 45433, 45436, 45440, 45442, 45448, 45449, 45451, 45453, 45458, + 45459, 45460, 45464, 45468, 45480, 45516, 45520, 45524, 45532, 45533, + 53294, 53295, 53296, 53297, 53298, 53299, 53302, 53303, 53305, 53306, + 53307, 53309, 53310, 53311, 53312, 53313, 53314, 53315, 53318, 53320, + 53322, 53323, 53324, 53325, 53326, 53327, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53329, 53330, 53331, 53333, 53334, 53335, 53337, 53338, + 53339, 53340, 53341, 53342, 53343, 53345, 53346, 53347, 53348, 53349, + 53350, 53351, 53352, 53353, 53354, 53355, 53358, 53359, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53361, 53362, 53363, 53365, 53366, 53367, + 53368, 53369, 53370, 53371, 53374, 53375, 53376, 53378, 53379, 53380, + 53381, 53382, 53383, 53384, 53385, 53386, 53387, 53388, 53389, 53390, + 53391, 53392, 53393, 53394, 53395, 53396, 45535, 45544, 45545, 45548, + 45552, 45561, 45563, 45565, 45572, 45573, 45576, 45579, 45580, 45588, + 45589, 45591, 45593, 45600, 45620, 45628, 45656, 45660, 45664, 45672, + 45673, 45684, 45685, 45692, 45700, 45701, 45705, 45712, 45713, 45716, + 45720, 45721, 45722, 45728, 45729, 45731, 45733, 45734, 45738, 45740, + 45744, 45748, 45768, 45769, 45772, 45776, 45778, 45784, 45785, 45787, + 45789, 45794, 45796, 45797, 45798, 45800, 45803, 45804, 45805, 45806, + 45807, 45811, 45812, 45813, 45815, 45816, 45817, 45818, 45819, 45823, + 45824, 45825, 45828, 45832, 45840, 45841, 45843, 45844, 45845, 45852, + 45908, 45909, 45910, 45912, 45915, 45916, 45918, 45919, 45924, 45925, + 53397, 53398, 53399, 53400, 53401, 53402, 53403, 53404, 53405, 53406, + 53407, 53408, 53409, 53410, 53411, 53414, 53415, 53417, 53418, 53419, + 53421, 53422, 53423, 53424, 53425, 53426, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53427, 53430, 53432, 53434, 53435, 53436, 53437, 53438, + 53439, 53442, 53443, 53445, 53446, 53447, 53450, 53451, 53452, 53453, + 53454, 53455, 53458, 53462, 53463, 53464, 53465, 53466, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53467, 53470, 53471, 53473, 53474, 53475, + 53477, 53478, 53479, 53480, 53481, 53482, 53483, 53486, 53490, 53491, + 53492, 53493, 53494, 53495, 53497, 53498, 53499, 53500, 53501, 53502, + 53503, 53504, 53505, 53506, 53507, 53508, 45927, 45929, 45931, 45934, + 45936, 45937, 45940, 45944, 45952, 45953, 45955, 45956, 45957, 45964, + 45968, 45972, 45984, 45985, 45992, 45996, 46020, 46021, 46024, 46027, + 46028, 46030, 46032, 46036, 46037, 46039, 46041, 46043, 46045, 46048, + 46052, 46056, 46076, 46096, 46104, 46108, 46112, 46120, 46121, 46123, + 46132, 46160, 46161, 46164, 46168, 46176, 46177, 46179, 46181, 46188, + 46208, 46216, 46237, 46244, 46248, 46252, 46261, 46263, 46265, 46272, + 46276, 46280, 46288, 46293, 46300, 46301, 46304, 46307, 46308, 46310, + 46316, 46317, 46319, 46321, 46328, 46356, 46357, 46360, 46363, 46364, + 46372, 46373, 46375, 46376, 46377, 46378, 46384, 46385, 46388, 46392, + 53509, 53510, 53511, 53512, 53513, 53514, 53515, 53516, 53518, 53519, + 53520, 53521, 53522, 53523, 53524, 53525, 53526, 53527, 53528, 53529, + 53530, 53531, 53532, 53533, 53534, 53535, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53536, 53537, 53538, 53539, 53540, 53541, 53542, 53543, + 53544, 53545, 53546, 53547, 53548, 53549, 53550, 53551, 53554, 53555, + 53557, 53558, 53559, 53561, 53563, 53564, 53565, 53566, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53567, 53570, 53574, 53575, 53576, 53577, + 53578, 53579, 53582, 53583, 53585, 53586, 53587, 53589, 53590, 53591, + 53592, 53593, 53594, 53595, 53598, 53600, 53602, 53603, 53604, 53605, + 53606, 53607, 53609, 53610, 53611, 53613, 46400, 46401, 46403, 46404, + 46405, 46411, 46412, 46413, 46416, 46420, 46428, 46429, 46431, 46432, + 46433, 46496, 46497, 46500, 46504, 46506, 46507, 46512, 46513, 46515, + 46516, 46517, 46523, 46524, 46525, 46528, 46532, 46540, 46541, 46543, + 46544, 46545, 46552, 46572, 46608, 46609, 46612, 46616, 46629, 46636, + 46644, 46664, 46692, 46696, 46748, 46749, 46752, 46756, 46763, 46764, + 46769, 46804, 46832, 46836, 46840, 46848, 46849, 46853, 46888, 46889, + 46892, 46895, 46896, 46904, 46905, 46907, 46916, 46920, 46924, 46932, + 46933, 46944, 46948, 46952, 46960, 46961, 46963, 46965, 46972, 46973, + 46976, 46980, 46988, 46989, 46991, 46992, 46993, 46994, 46998, 46999, + 53614, 53615, 53616, 53617, 53618, 53619, 53620, 53621, 53622, 53623, + 53624, 53625, 53626, 53627, 53629, 53630, 53631, 53632, 53633, 53634, + 53635, 53637, 53638, 53639, 53641, 53642, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53643, 53644, 53645, 53646, 53647, 53648, 53649, 53650, + 53651, 53652, 53653, 53654, 53655, 53656, 53657, 53658, 53659, 53660, + 53661, 53662, 53663, 53666, 53667, 53669, 53670, 53671, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53673, 53674, 53675, 53676, 53677, 53678, + 53679, 53682, 53684, 53686, 53687, 53688, 53689, 53691, 53693, 53694, + 53695, 53697, 53698, 53699, 53700, 53701, 53702, 53703, 53704, 53705, + 53706, 53707, 53708, 53709, 53710, 53711, 47000, 47001, 47004, 47008, + 47016, 47017, 47019, 47020, 47021, 47028, 47029, 47032, 47047, 47049, + 47084, 47085, 47088, 47092, 47100, 47101, 47103, 47104, 47105, 47111, + 47112, 47113, 47116, 47120, 47128, 47129, 47131, 47133, 47140, 47141, + 47144, 47148, 47156, 47157, 47159, 47160, 47161, 47168, 47172, 47185, + 47187, 47196, 47197, 47200, 47204, 47212, 47213, 47215, 47217, 47224, + 47228, 47245, 47272, 47280, 47284, 47288, 47296, 47297, 47299, 47301, + 47308, 47312, 47316, 47325, 47327, 47329, 47336, 47337, 47340, 47344, + 47352, 47353, 47355, 47357, 47364, 47384, 47392, 47420, 47421, 47424, + 47428, 47436, 47439, 47441, 47448, 47449, 47452, 47456, 47464, 47465, + 53712, 53713, 53714, 53715, 53716, 53717, 53718, 53719, 53721, 53722, + 53723, 53724, 53725, 53726, 53727, 53728, 53729, 53730, 53731, 53732, + 53733, 53734, 53735, 53736, 53737, 53738, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53739, 53740, 53741, 53742, 53743, 53744, 53745, 53746, + 53747, 53749, 53750, 53751, 53753, 53754, 53755, 53756, 53757, 53758, + 53759, 53760, 53761, 53762, 53763, 53764, 53765, 53766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53768, 53770, 53771, 53772, 53773, 53774, + 53775, 53777, 53778, 53779, 53780, 53781, 53782, 53783, 53784, 53785, + 53786, 53787, 53788, 53789, 53790, 53791, 53792, 53793, 53794, 53795, + 53796, 53797, 53798, 53799, 53800, 53801, 47467, 47469, 47476, 47477, + 47480, 47484, 47492, 47493, 47495, 47497, 47498, 47501, 47502, 47532, + 47533, 47536, 47540, 47548, 47549, 47551, 47553, 47560, 47561, 47564, + 47566, 47567, 47568, 47569, 47570, 47576, 47577, 47579, 47581, 47582, + 47585, 47587, 47588, 47589, 47592, 47596, 47604, 47605, 47607, 47608, + 47609, 47610, 47616, 47617, 47624, 47637, 47672, 47673, 47676, 47680, + 47682, 47688, 47689, 47691, 47693, 47694, 47699, 47700, 47701, 47704, + 47708, 47716, 47717, 47719, 47720, 47721, 47728, 47729, 47732, 47736, + 47747, 47748, 47749, 47751, 47756, 47784, 47785, 47787, 47788, 47792, + 47794, 47800, 47801, 47803, 47805, 47812, 47816, 47832, 47833, 47868, + 53802, 53803, 53806, 53807, 53809, 53810, 53811, 53813, 53814, 53815, + 53816, 53817, 53818, 53819, 53822, 53824, 53826, 53827, 53828, 53829, + 53830, 53831, 53833, 53834, 53835, 53836, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53837, 53838, 53839, 53840, 53841, 53842, 53843, 53844, + 53845, 53846, 53847, 53848, 53849, 53850, 53851, 53853, 53854, 53855, + 53856, 53857, 53858, 53859, 53861, 53862, 53863, 53864, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53865, 53866, 53867, 53868, 53869, 53870, + 53871, 53872, 53873, 53874, 53875, 53876, 53877, 53878, 53879, 53880, + 53881, 53882, 53883, 53884, 53885, 53886, 53887, 53890, 53891, 53893, + 53894, 53895, 53897, 53898, 53899, 53900, 47872, 47876, 47885, 47887, + 47889, 47896, 47900, 47904, 47913, 47915, 47924, 47925, 47926, 47928, + 47931, 47932, 47933, 47934, 47940, 47941, 47943, 47945, 47949, 47951, + 47952, 47956, 47960, 47969, 47971, 47980, 48008, 48012, 48016, 48036, + 48040, 48044, 48052, 48055, 48064, 48068, 48072, 48080, 48083, 48120, + 48121, 48124, 48127, 48128, 48130, 48136, 48137, 48139, 48140, 48141, + 48143, 48145, 48148, 48149, 48150, 48151, 48152, 48155, 48156, 48157, + 48158, 48159, 48164, 48165, 48167, 48169, 48173, 48176, 48177, 48180, + 48184, 48192, 48193, 48195, 48196, 48197, 48201, 48204, 48205, 48208, + 48221, 48260, 48261, 48264, 48267, 48268, 48270, 48276, 48277, 48279, + 53901, 53902, 53903, 53906, 53907, 53908, 53910, 53911, 53912, 53913, + 53914, 53915, 53917, 53918, 53919, 53921, 53922, 53923, 53925, 53926, + 53927, 53928, 53929, 53930, 53931, 53933, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53934, 53935, 53936, 53938, 53939, 53940, 53941, 53942, + 53943, 53946, 53947, 53949, 53950, 53953, 53955, 53956, 53957, 53958, + 53959, 53962, 53964, 53965, 53966, 53967, 53968, 53969, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53970, 53971, 53973, 53974, 53975, 53977, + 53978, 53979, 53981, 53982, 53983, 53984, 53985, 53986, 53987, 53990, + 53991, 53992, 53993, 53994, 53995, 53996, 53997, 53998, 53999, 54002, + 54003, 54005, 54006, 54007, 54009, 54010, 48281, 48282, 48288, 48289, + 48292, 48295, 48296, 48304, 48305, 48307, 48308, 48309, 48316, 48317, + 48320, 48324, 48333, 48335, 48336, 48337, 48341, 48344, 48348, 48372, + 48373, 48374, 48376, 48380, 48388, 48389, 48391, 48393, 48400, 48404, + 48420, 48428, 48448, 48456, 48457, 48460, 48464, 48472, 48473, 48484, + 48488, 48512, 48513, 48516, 48519, 48520, 48521, 48522, 48528, 48529, + 48531, 48533, 48537, 48538, 48540, 48548, 48560, 48568, 48596, 48597, + 48600, 48604, 48617, 48624, 48628, 48632, 48640, 48643, 48645, 48652, + 48653, 48656, 48660, 48668, 48669, 48671, 48708, 48709, 48712, 48716, + 48718, 48724, 48725, 48727, 48729, 48730, 48731, 48736, 48737, 48740, + 54011, 54012, 54013, 54014, 54015, 54018, 54020, 54022, 54023, 54024, + 54025, 54026, 54027, 54031, 54033, 54034, 54035, 54037, 54039, 54040, + 54041, 54042, 54043, 54046, 54050, 54051, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54052, 54054, 54055, 54058, 54059, 54061, 54062, 54063, + 54065, 54066, 54067, 54068, 54069, 54070, 54071, 54074, 54078, 54079, + 54080, 54081, 54082, 54083, 54086, 54087, 54088, 54089, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54090, 54091, 54092, 54093, 54094, 54095, + 54096, 54097, 54098, 54099, 54100, 54101, 54102, 54103, 54104, 54105, + 54106, 54107, 54108, 54109, 54110, 54111, 54112, 54113, 54114, 54115, + 54116, 54117, 54118, 54119, 54120, 54121, 48744, 48746, 48752, 48753, + 48755, 48756, 48757, 48763, 48764, 48765, 48768, 48772, 48780, 48781, + 48783, 48784, 48785, 48792, 48793, 48808, 48848, 48849, 48852, 48855, + 48856, 48864, 48867, 48868, 48869, 48876, 48897, 48904, 48905, 48920, + 48921, 48923, 48924, 48925, 48960, 48961, 48964, 48968, 48976, 48977, + 48981, 49044, 49072, 49093, 49100, 49101, 49104, 49108, 49116, 49119, + 49121, 49212, 49233, 49240, 49244, 49248, 49256, 49257, 49296, 49297, + 49300, 49304, 49312, 49313, 49315, 49317, 49324, 49325, 49327, 49328, + 49331, 49332, 49333, 49334, 49340, 49341, 49343, 49344, 49345, 49349, + 49352, 49353, 49356, 49360, 49368, 49369, 49371, 49372, 49373, 49380, + 54122, 54123, 54124, 54125, 54126, 54127, 54128, 54129, 54130, 54131, + 54132, 54133, 54134, 54135, 54136, 54137, 54138, 54139, 54142, 54143, + 54145, 54146, 54147, 54149, 54150, 54151, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54152, 54153, 54154, 54155, 54158, 54162, 54163, 54164, + 54165, 54166, 54167, 54170, 54171, 54173, 54174, 54175, 54177, 54178, + 54179, 54180, 54181, 54182, 54183, 54186, 54188, 54190, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54191, 54192, 54193, 54194, 54195, 54197, + 54198, 54199, 54201, 54202, 54203, 54205, 54206, 54207, 54208, 54209, + 54210, 54211, 54214, 54215, 54218, 54219, 54220, 54221, 54222, 54223, + 54225, 54226, 54227, 54228, 54229, 54230, 49381, 49384, 49388, 49396, + 49397, 49399, 49401, 49408, 49412, 49416, 49424, 49429, 49436, 49437, + 49438, 49439, 49440, 49443, 49444, 49446, 49447, 49452, 49453, 49455, + 49456, 49457, 49462, 49464, 49465, 49468, 49472, 49480, 49481, 49483, + 49484, 49485, 49492, 49493, 49496, 49500, 49508, 49509, 49511, 49512, + 49513, 49520, 49524, 49528, 49541, 49548, 49549, 49550, 49552, 49556, + 49558, 49564, 49565, 49567, 49569, 49573, 49576, 49577, 49580, 49584, + 49597, 49604, 49608, 49612, 49620, 49623, 49624, 49632, 49636, 49640, + 49648, 49649, 49651, 49660, 49661, 49664, 49668, 49676, 49677, 49679, + 49681, 49688, 49689, 49692, 49695, 49696, 49704, 49705, 49707, 49709, + 54231, 54233, 54234, 54235, 54236, 54237, 54238, 54239, 54240, 54242, + 54244, 54245, 54246, 54247, 54248, 54249, 54250, 54251, 54254, 54255, + 54257, 54258, 54259, 54261, 54262, 54263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54264, 54265, 54266, 54267, 54270, 54272, 54274, 54275, + 54276, 54277, 54278, 54279, 54281, 54282, 54283, 54284, 54285, 54286, + 54287, 54288, 54289, 54290, 54291, 54292, 54293, 54294, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54295, 54296, 54297, 54298, 54299, 54300, + 54302, 54303, 54304, 54305, 54306, 54307, 54308, 54309, 54310, 54311, + 54312, 54313, 54314, 54315, 54316, 54317, 54318, 54319, 54320, 54321, + 54322, 54323, 54324, 54325, 54326, 54327, 49711, 49713, 49714, 49716, + 49736, 49744, 49745, 49748, 49752, 49760, 49765, 49772, 49773, 49776, + 49780, 49788, 49789, 49791, 49793, 49800, 49801, 49808, 49816, 49819, + 49821, 49828, 49829, 49832, 49836, 49837, 49844, 49845, 49847, 49849, + 49884, 49885, 49888, 49891, 49892, 49899, 49900, 49901, 49903, 49905, + 49910, 49912, 49913, 49915, 49916, 49920, 49928, 49929, 49932, 49933, + 49939, 49940, 49941, 49944, 49948, 49956, 49957, 49960, 49961, 49989, + 50024, 50025, 50028, 50032, 50034, 50040, 50041, 50044, 50045, 50052, + 50056, 50060, 50112, 50136, 50137, 50140, 50143, 50144, 50146, 50152, + 50153, 50157, 50164, 50165, 50168, 50184, 50192, 50212, 50220, 50224, + 54328, 54329, 54330, 54331, 54332, 54333, 54334, 54335, 54337, 54338, + 54339, 54341, 54342, 54343, 54344, 54345, 54346, 54347, 54348, 54349, + 54350, 54351, 54352, 54353, 54354, 54355, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54356, 54357, 54358, 54359, 54360, 54361, 54362, 54363, + 54365, 54366, 54367, 54369, 54370, 54371, 54373, 54374, 54375, 54376, + 54377, 54378, 54379, 54380, 54382, 54384, 54385, 54386, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54387, 54388, 54389, 54390, 54391, 54394, + 54395, 54397, 54398, 54401, 54403, 54404, 54405, 54406, 54407, 54410, + 54412, 54414, 54415, 54416, 54417, 54418, 54419, 54421, 54422, 54423, + 54424, 54425, 54426, 54427, 54428, 54429, 50228, 50236, 50237, 50248, + 50276, 50277, 50280, 50284, 50292, 50293, 50297, 50304, 50324, 50332, + 50360, 50364, 50409, 50416, 50417, 50420, 50424, 50426, 50431, 50432, + 50433, 50444, 50448, 50452, 50460, 50472, 50473, 50476, 50480, 50488, + 50489, 50491, 50493, 50500, 50501, 50504, 50505, 50506, 50508, 50509, + 50510, 50515, 50516, 50517, 50519, 50520, 50521, 50525, 50526, 50528, + 50529, 50532, 50536, 50544, 50545, 50547, 50548, 50549, 50556, 50557, + 50560, 50564, 50567, 50572, 50573, 50575, 50577, 50581, 50583, 50584, + 50588, 50592, 50601, 50612, 50613, 50616, 50617, 50619, 50620, 50621, + 50622, 50628, 50629, 50630, 50631, 50632, 50633, 50634, 50636, 50638, + 54430, 54431, 54432, 54433, 54434, 54435, 54436, 54437, 54438, 54439, + 54440, 54442, 54443, 54444, 54445, 54446, 54447, 54448, 54449, 54450, + 54451, 54452, 54453, 54454, 54455, 54456, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54457, 54458, 54459, 54460, 54461, 54462, 54463, 54464, + 54465, 54466, 54467, 54468, 54469, 54470, 54471, 54472, 54473, 54474, + 54475, 54477, 54478, 54479, 54481, 54482, 54483, 54485, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54486, 54487, 54488, 54489, 54490, 54491, + 54493, 54494, 54496, 54497, 54498, 54499, 54500, 54501, 54502, 54503, + 54505, 54506, 54507, 54509, 54510, 54511, 54513, 54514, 54515, 54516, + 54517, 54518, 54519, 54521, 54522, 54524, 50640, 50641, 50644, 50648, + 50656, 50657, 50659, 50661, 50668, 50669, 50670, 50672, 50676, 50678, + 50679, 50684, 50685, 50686, 50687, 50688, 50689, 50693, 50694, 50695, + 50696, 50700, 50704, 50712, 50713, 50715, 50716, 50724, 50725, 50728, + 50732, 50733, 50734, 50736, 50739, 50740, 50741, 50743, 50745, 50747, + 50752, 50753, 50756, 50760, 50768, 50769, 50771, 50772, 50773, 50780, + 50781, 50784, 50796, 50799, 50801, 50808, 50809, 50812, 50816, 50824, + 50825, 50827, 50829, 50836, 50837, 50840, 50844, 50852, 50853, 50855, + 50857, 50864, 50865, 50868, 50872, 50873, 50874, 50880, 50881, 50883, + 50885, 50892, 50893, 50896, 50900, 50908, 50909, 50912, 50913, 50920, + 54526, 54527, 54528, 54529, 54530, 54531, 54533, 54534, 54535, 54537, + 54538, 54539, 54541, 54542, 54543, 54544, 54545, 54546, 54547, 54550, + 54552, 54553, 54554, 54555, 54556, 54557, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54558, 54559, 54560, 54561, 54562, 54563, 54564, 54565, + 54566, 54567, 54568, 54569, 54570, 54571, 54572, 54573, 54574, 54575, + 54576, 54577, 54578, 54579, 54580, 54581, 54582, 54583, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54584, 54585, 54586, 54587, 54590, 54591, + 54593, 54594, 54595, 54597, 54598, 54599, 54600, 54601, 54602, 54603, + 54606, 54608, 54610, 54611, 54612, 54613, 54614, 54615, 54618, 54619, + 54621, 54622, 54623, 54625, 54626, 54627, 50921, 50924, 50928, 50936, + 50937, 50941, 50948, 50949, 50952, 50956, 50964, 50965, 50967, 50969, + 50976, 50977, 50980, 50984, 50992, 50993, 50995, 50997, 50999, 51004, + 51005, 51008, 51012, 51018, 51020, 51021, 51023, 51025, 51026, 51027, + 51028, 51029, 51030, 51031, 51032, 51036, 51040, 51048, 51051, 51060, + 51061, 51064, 51068, 51069, 51070, 51075, 51076, 51077, 51079, 51080, + 51081, 51082, 51086, 51088, 51089, 51092, 51094, 51095, 51096, 51098, + 51104, 51105, 51107, 51108, 51109, 51110, 51116, 51117, 51120, 51124, + 51132, 51133, 51135, 51136, 51137, 51144, 51145, 51148, 51150, 51152, + 51160, 51165, 51172, 51176, 51180, 51200, 51201, 51204, 51208, 51210, + 54628, 54630, 54631, 54634, 54636, 54638, 54639, 54640, 54641, 54642, + 54643, 54646, 54647, 54649, 54650, 54651, 54653, 54654, 54655, 54656, + 54657, 54658, 54659, 54662, 54666, 54667, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54668, 54669, 54670, 54671, 54673, 54674, 54675, 54676, + 54677, 54678, 54679, 54680, 54681, 54682, 54683, 54684, 54685, 54686, + 54687, 54688, 54689, 54690, 54691, 54692, 54694, 54695, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54696, 54697, 54698, 54699, 54700, 54701, + 54702, 54703, 54704, 54705, 54706, 54707, 54708, 54709, 54710, 54711, + 54712, 54713, 54714, 54715, 54716, 54717, 54718, 54719, 54720, 54721, + 54722, 54723, 54724, 54725, 54726, 54727, 51216, 51217, 51219, 51221, + 51222, 51228, 51229, 51232, 51236, 51244, 51245, 51247, 51249, 51256, + 51260, 51264, 51272, 51273, 51276, 51277, 51284, 51312, 51313, 51316, + 51320, 51322, 51328, 51329, 51331, 51333, 51334, 51335, 51339, 51340, + 51341, 51348, 51357, 51359, 51361, 51368, 51388, 51389, 51396, 51400, + 51404, 51412, 51413, 51415, 51417, 51424, 51425, 51428, 51445, 51452, + 51453, 51456, 51460, 51461, 51462, 51468, 51469, 51471, 51473, 51480, + 51500, 51508, 51536, 51537, 51540, 51544, 51552, 51553, 51555, 51564, + 51568, 51572, 51580, 51592, 51593, 51596, 51600, 51608, 51609, 51611, + 51613, 51648, 51649, 51652, 51655, 51656, 51658, 51664, 51665, 51667, + 54730, 54731, 54733, 54734, 54735, 54737, 54739, 54740, 54741, 54742, + 54743, 54746, 54748, 54750, 54751, 54752, 54753, 54754, 54755, 54758, + 54759, 54761, 54762, 54763, 54765, 54766, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54767, 54768, 54769, 54770, 54771, 54774, 54776, 54778, + 54779, 54780, 54781, 54782, 54783, 54786, 54787, 54789, 54790, 54791, + 54793, 54794, 54795, 54796, 54797, 54798, 54799, 54802, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54806, 54807, 54808, 54809, 54810, 54811, + 54813, 54814, 54815, 54817, 54818, 54819, 54821, 54822, 54823, 54824, + 54825, 54826, 54827, 54828, 54830, 54831, 54832, 54833, 54834, 54835, + 54836, 54837, 54838, 54839, 54842, 54843, 51669, 51670, 51673, 51674, + 51676, 51677, 51680, 51682, 51684, 51687, 51692, 51693, 51695, 51696, + 51697, 51704, 51705, 51708, 51712, 51720, 51721, 51723, 51724, 51725, + 51732, 51736, 51753, 51788, 51789, 51792, 51796, 51804, 51805, 51807, + 51808, 51809, 51816, 51837, 51844, 51864, 51900, 51901, 51904, 51908, + 51916, 51917, 51919, 51921, 51923, 51928, 51929, 51936, 51948, 51956, + 51976, 51984, 51988, 51992, 52000, 52001, 52033, 52040, 52041, 52044, + 52048, 52056, 52057, 52061, 52068, 52088, 52089, 52124, 52152, 52180, + 52196, 52199, 52201, 52236, 52237, 52240, 52244, 52252, 52253, 52257, + 52258, 52263, 52264, 52265, 52268, 52270, 52272, 52280, 52281, 52283, + 54845, 54846, 54847, 54849, 54850, 54851, 54852, 54854, 54855, 54858, + 54860, 54862, 54863, 54864, 54866, 54867, 54870, 54871, 54873, 54874, + 54875, 54877, 54878, 54879, 54880, 54881, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54882, 54883, 54884, 54885, 54886, 54888, 54890, 54891, + 54892, 54893, 54894, 54895, 54898, 54899, 54901, 54902, 54903, 54904, + 54905, 54906, 54907, 54908, 54909, 54910, 54911, 54912, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54913, 54914, 54916, 54918, 54919, 54920, + 54921, 54922, 54923, 54926, 54927, 54929, 54930, 54931, 54933, 54934, + 54935, 54936, 54937, 54938, 54939, 54940, 54942, 54944, 54946, 54947, + 54948, 54949, 54950, 54951, 54953, 54954, 52284, 52285, 52286, 52292, + 52293, 52296, 52300, 52308, 52309, 52311, 52312, 52313, 52320, 52324, + 52326, 52328, 52336, 52341, 52376, 52377, 52380, 52384, 52392, 52393, + 52395, 52396, 52397, 52404, 52405, 52408, 52412, 52420, 52421, 52423, + 52425, 52432, 52436, 52452, 52460, 52464, 52481, 52488, 52489, 52492, + 52496, 52504, 52505, 52507, 52509, 52516, 52520, 52524, 52537, 52572, + 52576, 52580, 52588, 52589, 52591, 52593, 52600, 52616, 52628, 52629, + 52632, 52636, 52644, 52645, 52647, 52649, 52656, 52676, 52684, 52688, + 52712, 52716, 52720, 52728, 52729, 52731, 52733, 52740, 52744, 52748, + 52756, 52761, 52768, 52769, 52772, 52776, 52784, 52785, 52787, 52789, + 54955, 54957, 54958, 54959, 54961, 54962, 54963, 54964, 54965, 54966, + 54967, 54968, 54970, 54972, 54973, 54974, 54975, 54976, 54977, 54978, + 54979, 54982, 54983, 54985, 54986, 54987, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54989, 54990, 54991, 54992, 54994, 54995, 54997, 54998, + 55000, 55002, 55003, 55004, 55005, 55006, 55007, 55009, 55010, 55011, + 55013, 55014, 55015, 55017, 55018, 55019, 55020, 55021, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55022, 55023, 55025, 55026, 55027, 55028, + 55030, 55031, 55032, 55033, 55034, 55035, 55038, 55039, 55041, 55042, + 55043, 55045, 55046, 55047, 55048, 55049, 55050, 55051, 55052, 55053, + 55054, 55055, 55056, 55058, 55059, 55060, 52824, 52825, 52828, 52831, + 52832, 52833, 52840, 52841, 52843, 52845, 52852, 52853, 52856, 52860, + 52868, 52869, 52871, 52873, 52880, 52881, 52884, 52888, 52896, 52897, + 52899, 52900, 52901, 52908, 52909, 52929, 52964, 52965, 52968, 52971, + 52972, 52980, 52981, 52983, 52984, 52985, 52992, 52993, 52996, 53000, + 53008, 53009, 53011, 53013, 53020, 53024, 53028, 53036, 53037, 53039, + 53040, 53041, 53048, 53076, 53077, 53080, 53084, 53092, 53093, 53095, + 53097, 53104, 53105, 53108, 53112, 53120, 53125, 53132, 53153, 53160, + 53168, 53188, 53216, 53217, 53220, 53224, 53232, 53233, 53235, 53237, + 53244, 53248, 53252, 53265, 53272, 53293, 53300, 53301, 53304, 53308, + 55061, 55062, 55063, 55066, 55067, 55069, 55070, 55071, 55073, 55074, + 55075, 55076, 55077, 55078, 55079, 55082, 55084, 55086, 55087, 55088, + 55089, 55090, 55091, 55094, 55095, 55097, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 55098, 55099, 55101, 55102, 55103, 55104, 55105, 55106, + 55107, 55109, 55110, 55112, 55114, 55115, 55116, 55117, 55118, 55119, + 55122, 55123, 55125, 55130, 55131, 55132, 55133, 55134, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55135, 55138, 55140, 55142, 55143, 55144, + 55146, 55147, 55149, 55150, 55151, 55153, 55154, 55155, 55157, 55158, + 55159, 55160, 55161, 55162, 55163, 55166, 55167, 55168, 55170, 55171, + 55172, 55173, 55174, 55175, 55178, 55179, 53316, 53317, 53319, 53321, + 53328, 53332, 53336, 53344, 53356, 53357, 53360, 53364, 53372, 53373, + 53377, 53412, 53413, 53416, 53420, 53428, 53429, 53431, 53433, 53440, + 53441, 53444, 53448, 53449, 53456, 53457, 53459, 53460, 53461, 53468, + 53469, 53472, 53476, 53484, 53485, 53487, 53488, 53489, 53496, 53517, + 53552, 53553, 53556, 53560, 53562, 53568, 53569, 53571, 53572, 53573, + 53580, 53581, 53584, 53588, 53596, 53597, 53599, 53601, 53608, 53612, + 53628, 53636, 53640, 53664, 53665, 53668, 53672, 53680, 53681, 53683, + 53685, 53690, 53692, 53696, 53720, 53748, 53752, 53767, 53769, 53776, + 53804, 53805, 53808, 53812, 53820, 53821, 53823, 53825, 53832, 53852, + 55181, 55182, 55183, 55185, 55186, 55187, 55188, 55189, 55190, 55191, + 55194, 55196, 55198, 55199, 55200, 55201, 55202, 55203, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 53860, 53888, 53889, 53892, + 53896, 53904, 53905, 53909, 53916, 53920, 53924, 53932, 53937, 53944, + 53945, 53948, 53951, 53952, 53954, 53960, 53961, 53963, 53972, 53976, + 53980, 53988, 53989, 54000, 54001, 54004, 54008, 54016, 54017, 54019, + 54021, 54028, 54029, 54030, 54032, 54036, 54038, 54044, 54045, 54047, + 54048, 54049, 54053, 54056, 54057, 54060, 54064, 54072, 54073, 54075, + 54076, 54077, 54084, 54085, 54140, 54141, 54144, 54148, 54156, 54157, + 54159, 54160, 54161, 54168, 54169, 54172, 54176, 54184, 54185, 54187, + 54189, 54196, 54200, 54204, 54212, 54213, 54216, 54217, 54224, 54232, + 54241, 54243, 54252, 54253, 54256, 54260, 54268, 54269, 54271, 54273, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54280, 54301, 54336, 54340, + 54364, 54368, 54372, 54381, 54383, 54392, 54393, 54396, 54399, 54400, + 54402, 54408, 54409, 54411, 54413, 54420, 54441, 54476, 54480, 54484, + 54492, 54495, 54504, 54508, 54512, 54520, 54523, 54525, 54532, 54536, + 54540, 54548, 54549, 54551, 54588, 54589, 54592, 54596, 54604, 54605, + 54607, 54609, 54616, 54617, 54620, 54624, 54629, 54632, 54633, 54635, + 54637, 54644, 54645, 54648, 54652, 54660, 54661, 54663, 54664, 54665, + 54672, 54693, 54728, 54729, 54732, 54736, 54738, 54744, 54745, 54747, + 54749, 54756, 54757, 54760, 54764, 54772, 54773, 54775, 54777, 54784, + 54785, 54788, 54792, 54800, 54801, 54803, 54804, 54805, 54812, 54816, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54820, 54829, 54840, 54841, + 54844, 54848, 54853, 54856, 54857, 54859, 54861, 54865, 54868, 54869, + 54872, 54876, 54887, 54889, 54896, 54897, 54900, 54915, 54917, 54924, + 54925, 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, + 54971, 54980, 54981, 54984, 54988, 54993, 54996, 54999, 55001, 55008, + 55012, 55016, 55024, 55029, 55036, 55037, 55040, 55044, 55057, 55064, + 55065, 55068, 55072, 55080, 55081, 55083, 55085, 55092, 55093, 55096, + 55100, 55108, 55111, 55113, 55120, 55121, 55124, 55126, 55127, 55128, + 55129, 55136, 55137, 55139, 55141, 55145, 55148, 55152, 55156, 55164, + 55165, 55169, 55176, 55177, 55180, 55184, 55192, 55193, 55195, 55197, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20285, 20339, 20551, 20729, + 21152, 21487, 21621, 21733, 22025, 23233, 23478, 26247, 26550, 26551, + 26607, 27468, 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, + 36040, 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, + 27580, 29647, 33050, 35258, 35282, 38307, 20355, 21002, 22718, 22904, + 23014, 24178, 24185, 25031, 25536, 26438, 26604, 26751, 28567, 30286, + 30475, 30965, 31240, 31487, 31777, 32925, 33390, 33393, 35563, 38291, + 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, 34638, 38824, + 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, 26577, 27204, + 28187, 29976, 30131, 30435, 30640, 32058, 37039, 37969, 37970, 40853, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21283, 23724, 30002, 32987, + 37440, 38296, 21083, 22536, 23004, 23713, 23831, 24247, 24378, 24394, + 24951, 27743, 30074, 30086, 31968, 32115, 32177, 32652, 33108, 33313, + 34193, 35137, 35611, 37628, 38477, 40007, 20171, 20215, 20491, 20977, + 22607, 24887, 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, + 31623, 33445, 33995, 63744, 37799, 38283, 21888, 23458, 22353, 63745, + 31923, 32697, 37301, 20520, 21435, 23621, 24040, 25298, 25454, 25818, + 25831, 28192, 28844, 31067, 36317, 36382, 63746, 36989, 37445, 37624, + 20094, 20214, 20581, 24062, 24314, 24838, 26967, 33137, 34388, 36423, + 37749, 39467, 20062, 20625, 26480, 26688, 20745, 21133, 21138, 27298, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30652, 37392, 40660, 21163, + 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, + 35233, 38548, 22533, 29309, 29356, 29956, 32121, 32365, 32937, 35211, + 35700, 36963, 40273, 25225, 27770, 28500, 32080, 32570, 35363, 20860, + 24906, 31645, 35609, 37463, 37772, 20140, 20435, 20510, 20670, 20742, + 21185, 21197, 21375, 22384, 22659, 24218, 24465, 24950, 25004, 25806, + 25964, 26223, 26299, 26356, 26775, 28039, 28805, 28913, 29855, 29861, + 29898, 30169, 30828, 30956, 31455, 31478, 32069, 32147, 32789, 32831, + 33051, 33686, 35686, 36629, 36885, 37857, 38915, 38968, 39514, 39912, + 20418, 21843, 22586, 22865, 23395, 23622, 24760, 25106, 26690, 26800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26856, 28330, 30028, 30328, + 30926, 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, + 21476, 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, + 25911, 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, + 31295, 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, + 34996, 35493, 63747, 36764, 37678, 38599, 39015, 39640, 40723, 21741, + 26011, 26354, 26767, 31296, 35895, 40288, 22256, 22372, 23825, 26118, + 26801, 26829, 28414, 29736, 34974, 39908, 27752, 63748, 39592, 20379, + 20844, 20849, 21151, 23380, 24037, 24656, 24685, 25329, 25511, 25915, + 29657, 31354, 34467, 36002, 38799, 20018, 23521, 25096, 26524, 29916, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31185, 33747, 35463, 35506, + 36328, 36942, 37707, 38982, 24275, 27112, 34303, 37101, 63749, 20896, + 23448, 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, + 33733, 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, + 20809, 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, + 33009, 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, + 24871, 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, + 21676, 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, + 30350, 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, + 39171, 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21312, 21475, 21477, 21646, + 22036, 22389, 22434, 23495, 23943, 24272, 25084, 25304, 25937, 26552, + 26601, 27083, 27472, 27590, 27628, 27714, 28317, 28792, 29399, 29590, + 29699, 30655, 30697, 31350, 32127, 32777, 33276, 33285, 33290, 33503, + 34914, 35635, 36092, 36544, 36881, 37041, 37476, 37558, 39378, 39493, + 40169, 40407, 40860, 22283, 23616, 33738, 38816, 38827, 40628, 21531, + 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, 23470, + 24339, 31353, 31406, 33422, 36524, 20518, 21048, 21240, 21367, 22280, + 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, 36470, 38357, + 26426, 27331, 28528, 35437, 36556, 39243, 63750, 26231, 27512, 36020, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 39740, 63751, 21483, 22317, + 22862, 25542, 27131, 29674, 30789, 31418, 31429, 31998, 33909, 35215, + 36211, 36917, 38312, 21243, 22343, 30023, 31584, 33740, 37406, 63752, + 27224, 20811, 21067, 21127, 25119, 26840, 26997, 38553, 20677, 21156, + 21220, 25027, 26020, 26681, 27135, 29822, 31563, 33465, 33771, 35250, + 35641, 36817, 39241, 63753, 20170, 22935, 25810, 26129, 27278, 29748, + 31105, 31165, 33449, 34942, 34943, 35167, 63754, 37670, 20235, 21450, + 24613, 25201, 27762, 32026, 32102, 20120, 20834, 30684, 32943, 20225, + 20238, 20854, 20864, 21980, 22120, 22331, 22522, 22524, 22804, 22855, + 22931, 23492, 23696, 23822, 24049, 24190, 24524, 25216, 26071, 26083, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26398, 26399, 26462, 26827, + 26820, 27231, 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, + 29826, 29859, 30072, 30079, 30849, 30959, 31041, 31047, 31048, 31098, + 31637, 32000, 32186, 32648, 32774, 32813, 32908, 35352, 35663, 35912, + 36215, 37665, 37668, 39138, 39249, 39438, 39439, 39525, 40594, 32202, + 20342, 21513, 25326, 26708, 37329, 21931, 20794, 63755, 63756, 23068, + 25062, 63757, 25295, 25343, 63758, 63759, 63760, 63761, 63762, 63763, + 37027, 63764, 63765, 63766, 63767, 63768, 35582, 63769, 63770, 63771, + 63772, 26262, 63773, 29014, 63774, 63775, 38627, 63776, 25423, 25466, + 21335, 63777, 26511, 26976, 28275, 63778, 30007, 63779, 63780, 63781, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32013, 63782, 63783, 34930, + 22218, 23064, 63784, 63785, 63786, 63787, 63788, 20035, 63789, 20839, + 22856, 26608, 32784, 63790, 22899, 24180, 25754, 31178, 24565, 24684, + 25288, 25467, 23527, 23511, 21162, 63791, 22900, 24361, 24594, 63792, + 63793, 63794, 29785, 63795, 63796, 63797, 63798, 63799, 63800, 39377, + 63801, 63802, 63803, 63804, 63805, 63806, 63807, 63808, 63809, 63810, + 63811, 28611, 63812, 63813, 33215, 36786, 24817, 63814, 63815, 33126, + 63816, 63817, 23615, 63818, 63819, 63820, 63821, 63822, 63823, 63824, + 63825, 23273, 35365, 26491, 32016, 63826, 63827, 63828, 63829, 63830, + 63831, 33021, 63832, 63833, 23612, 27877, 21311, 28346, 22810, 33590, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20025, 20150, 20294, 21934, + 22296, 22727, 24406, 26039, 26086, 27264, 27573, 28237, 30701, 31471, + 31774, 32222, 34507, 34962, 37170, 37723, 25787, 28606, 29562, 30136, + 36948, 21846, 22349, 25018, 25812, 26311, 28129, 28251, 28525, 28601, + 30192, 32835, 33213, 34113, 35203, 35527, 35674, 37663, 27795, 30035, + 31572, 36367, 36957, 21776, 22530, 22616, 24162, 25095, 25758, 26848, + 30070, 31958, 34739, 40680, 20195, 22408, 22382, 22823, 23565, 23729, + 24118, 24453, 25140, 25825, 29619, 33274, 34955, 36024, 38538, 40667, + 23429, 24503, 24755, 20498, 20992, 21040, 22294, 22581, 22615, 23566, + 23648, 23798, 23947, 24230, 24466, 24764, 25361, 25481, 25623, 26691, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26873, 27330, 28120, 28193, + 28372, 28644, 29182, 30428, 30585, 31153, 31291, 33796, 35241, 36077, + 36339, 36424, 36867, 36884, 36947, 37117, 37709, 38518, 38876, 27602, + 28678, 29272, 29346, 29544, 30563, 31167, 31716, 32411, 35712, 22697, + 24775, 25958, 26109, 26302, 27788, 28958, 29129, 35930, 38931, 20077, + 31361, 20189, 20908, 20941, 21205, 21516, 24999, 26481, 26704, 26847, + 27934, 28540, 30140, 30643, 31461, 33012, 33891, 37509, 20828, 26007, + 26460, 26515, 30168, 31431, 33651, 63834, 35910, 36887, 38957, 23663, + 33216, 33434, 36929, 36975, 37389, 24471, 23965, 27225, 29128, 30331, + 31561, 34276, 35588, 37159, 39472, 21895, 25078, 63835, 30313, 32645, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34367, 34746, 35064, 37007, + 63836, 27931, 28889, 29662, 32097, 33853, 63837, 37226, 39409, 63838, + 20098, 21365, 27396, 27410, 28734, 29211, 34349, 40478, 21068, 36771, + 23888, 25829, 25900, 27414, 28651, 31811, 32412, 34253, 35172, 35261, + 25289, 33240, 34847, 24266, 26391, 28010, 29436, 29701, 29807, 34690, + 37086, 20358, 23821, 24480, 33802, 20919, 25504, 30053, 20142, 20486, + 20841, 20937, 26753, 27153, 31918, 31921, 31975, 33391, 35538, 36635, + 37327, 20406, 20791, 21237, 21570, 24300, 24942, 25150, 26053, 27354, + 28670, 31018, 34268, 34851, 38317, 39522, 39530, 40599, 40654, 21147, + 26310, 27511, 28701, 31019, 36706, 38722, 24976, 25088, 25891, 28451, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29001, 29833, 32244, 32879, + 34030, 36646, 36899, 37706, 20925, 21015, 21155, 27916, 28872, 35010, + 24265, 25986, 27566, 28610, 31806, 29557, 20196, 20278, 22265, 63839, + 23738, 23994, 24604, 29618, 31533, 32666, 32718, 32838, 36894, 37428, + 38646, 38728, 38936, 40801, 20363, 28583, 31150, 37300, 38583, 21214, + 63840, 25736, 25796, 27347, 28510, 28696, 29200, 30439, 32769, 34310, + 34396, 36335, 36613, 38706, 39791, 40442, 40565, 30860, 31103, 32160, + 33737, 37636, 40575, 40595, 35542, 22751, 24324, 26407, 28711, 29903, + 31840, 32894, 20769, 28712, 29282, 30922, 36034, 36058, 36084, 38647, + 20102, 20698, 23534, 24278, 26009, 29134, 30274, 30637, 32842, 34044, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36988, 39719, 40845, 22744, + 23105, 23650, 27155, 28122, 28431, 30267, 32047, 32311, 34078, 35128, + 37860, 38475, 21129, 26066, 26611, 27060, 27969, 28316, 28687, 29705, + 29792, 30041, 30244, 30827, 35628, 39006, 20845, 25134, 38520, 20374, + 20523, 23833, 28138, 32184, 36650, 24459, 24900, 26647, 63841, 38534, + 21202, 32907, 20956, 20940, 26974, 31260, 32190, 33777, 38517, 20442, + 21033, 21400, 21519, 21774, 23653, 24743, 26446, 26792, 28012, 29313, + 29432, 29702, 29827, 63842, 30178, 31852, 32633, 32696, 33673, 35023, + 35041, 37324, 37328, 38626, 39881, 21533, 28542, 29136, 29848, 34298, + 36522, 38563, 40023, 40607, 26519, 28107, 29747, 33256, 38678, 30764, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31435, 31520, 31890, 25705, + 29802, 30194, 30908, 30952, 39340, 39764, 40635, 23518, 24149, 28448, + 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, 24930, 25405, + 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, 34875, 36627, + 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, 38778, 20129, + 22916, 24536, 24537, 26395, 32178, 32596, 33426, 33579, 33725, 36638, + 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, 27599, 29028, + 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, 39488, 40613, + 23391, 27667, 29467, 30450, 30431, 33804, 20906, 35219, 20813, 20885, + 21193, 26825, 27796, 30468, 30496, 32191, 32236, 38754, 40629, 28357, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34065, 20901, 21517, 21629, + 26126, 26269, 26919, 28319, 30399, 30609, 33559, 33986, 34719, 37225, + 37528, 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, 25720, + 25721, 26286, 26576, 27169, 27597, 27611, 29279, 29281, 29761, 30520, + 30683, 32791, 33468, 33541, 35584, 35624, 35980, 26408, 27792, 29287, + 30446, 30566, 31302, 40361, 27519, 27794, 22818, 26406, 33945, 21359, + 22675, 22937, 24287, 25551, 26164, 26483, 28218, 29483, 31447, 33495, + 37672, 21209, 24043, 25006, 25035, 25098, 25287, 25771, 26080, 26969, + 27494, 27595, 28961, 29687, 30045, 32326, 33310, 33538, 34154, 35491, + 36031, 38695, 40289, 22696, 40664, 20497, 21006, 21563, 21839, 25991, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27766, 32010, 32011, 32862, + 34442, 38272, 38639, 21247, 27797, 29289, 21619, 23194, 23614, 23883, + 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, 31859, 32654, + 34183, 35598, 36855, 38753, 40692, 23735, 24758, 24845, 25003, 25935, + 26107, 26108, 27665, 27887, 29599, 29641, 32225, 38292, 23494, 34588, + 35600, 21085, 21338, 25293, 25615, 25778, 26420, 27192, 27850, 29632, + 29854, 31636, 31893, 32283, 33162, 33334, 34180, 36843, 38649, 39361, + 20276, 21322, 21453, 21467, 25292, 25644, 25856, 26001, 27075, 27886, + 28504, 29677, 30036, 30242, 30436, 30460, 30928, 30971, 31020, 32070, + 33324, 34784, 36820, 38930, 39151, 21187, 25300, 25765, 28196, 28497, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30332, 36299, 37297, 37474, + 39662, 39747, 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, + 25918, 26041, 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, + 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, + 20493, 20467, 63843, 22521, 24472, 25308, 25490, 26479, 28227, 28953, + 30403, 32972, 32986, 35060, 35061, 35097, 36064, 36649, 37197, 38506, + 20271, 20336, 24091, 26575, 26658, 30333, 30334, 39748, 24161, 27146, + 29033, 29140, 30058, 63844, 32321, 34115, 34281, 39132, 20240, 31567, + 32624, 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, + 33539, 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30887, 34327, 38370, 38713, + 63845, 21342, 24321, 35722, 36776, 36783, 37002, 21029, 30629, 40009, + 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, 26564, 26821, + 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, 20445, 22561, + 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, 29995, 33769, + 35036, 35091, 35676, 36628, 20239, 20693, 21264, 21340, 23443, 24489, + 26381, 31119, 33145, 33583, 34068, 35079, 35206, 36665, 36667, 39333, + 39954, 26412, 20086, 20472, 22857, 23553, 23791, 23792, 25447, 26834, + 28925, 29090, 29739, 32299, 34028, 34562, 36898, 37586, 40179, 19981, + 20184, 20463, 20613, 21078, 21103, 21542, 21648, 22496, 22827, 23142, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23386, 23413, 23500, 24220, + 63846, 25206, 25975, 26023, 28014, 28325, 29238, 31526, 31807, 32566, + 33104, 33105, 33178, 33344, 33433, 33705, 35331, 36000, 36070, 36091, + 36212, 36282, 37096, 37340, 38428, 38468, 39385, 40167, 21271, 20998, + 21545, 22132, 22707, 22868, 22894, 24575, 24996, 25198, 26128, 27774, + 28954, 30406, 31881, 31966, 32027, 33452, 36033, 38640, 63847, 20315, + 24343, 24447, 25282, 23849, 26379, 26842, 30844, 32323, 40300, 19989, + 20633, 21269, 21290, 21329, 22915, 23138, 24199, 24754, 24970, 25161, + 25209, 26000, 26503, 27047, 27604, 27606, 27607, 27608, 27832, 63848, + 29749, 30202, 30738, 30865, 31189, 31192, 31875, 32203, 32737, 32933, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 33086, 33218, 33778, 34586, + 35048, 35513, 35692, 36027, 37145, 38750, 39131, 40763, 22188, 23338, + 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, + 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, + 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, + 22763, 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, 24605, + 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, 28195, + 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, 32114, + 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, 36060, + 36198, 36781, 37034, 39164, 39391, 40605, 21066, 63849, 26388, 63850, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20632, 21034, 23665, 25955, + 27733, 29642, 29987, 30109, 31639, 33948, 37240, 38704, 20087, 25746, + 27578, 29022, 34217, 19977, 63851, 26441, 26862, 28183, 33439, 34072, + 34923, 25591, 28545, 37394, 39087, 19978, 20663, 20687, 20767, 21830, + 21930, 22039, 23360, 23577, 23776, 24120, 24202, 24224, 24258, 24819, + 26705, 27233, 28248, 29245, 29248, 29376, 30456, 31077, 31665, 32724, + 35059, 35316, 35443, 35937, 36062, 38684, 22622, 29885, 36093, 21959, + 63852, 31329, 32034, 33394, 29298, 29983, 29989, 63853, 31513, 22661, + 22779, 23996, 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, + 26329, 26360, 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32997, 33298, 34223, 35199, + 35475, 36893, 37604, 40653, 40736, 22805, 22893, 24109, 24796, 26132, + 26227, 26512, 27728, 28101, 28511, 30707, 30889, 33990, 37323, 37675, + 20185, 20682, 20808, 21892, 23307, 23459, 25159, 25982, 26059, 28210, + 29053, 29697, 29764, 29831, 29887, 30316, 31146, 32218, 32341, 32680, + 33146, 33203, 33337, 34330, 34796, 35445, 36323, 36984, 37521, 37925, + 39245, 39854, 21352, 23633, 26964, 27844, 27945, 28203, 33292, 34203, + 35131, 35373, 35498, 38634, 40807, 21089, 26297, 27570, 32406, 34814, + 36109, 38275, 38493, 25885, 28041, 29166, 63854, 22478, 22995, 23468, + 24615, 24826, 25104, 26143, 26207, 29481, 29689, 30427, 30465, 31596, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32854, 32882, 33125, 35488, + 37266, 19990, 21218, 27506, 27927, 31237, 31545, 32048, 63855, 36016, + 21484, 22063, 22609, 23477, 23567, 23569, 24034, 25152, 25475, 25620, + 26157, 26803, 27836, 28040, 28335, 28703, 28836, 29138, 29990, 30095, + 30094, 30233, 31505, 31712, 31787, 32032, 32057, 34092, 34157, 34311, + 35380, 36877, 36961, 37045, 37559, 38902, 39479, 20439, 23660, 26463, + 28049, 31903, 32396, 35606, 36118, 36895, 23403, 24061, 25613, 33984, + 36956, 39137, 29575, 23435, 24730, 26494, 28126, 35359, 35494, 36865, + 38924, 21047, 63856, 28753, 30862, 37782, 34928, 37335, 20462, 21463, + 22013, 22234, 22402, 22781, 23234, 23432, 23723, 23744, 24101, 24833, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 25101, 25163, 25480, 25628, + 25910, 25976, 27193, 27530, 27700, 27929, 28465, 29159, 29417, 29560, + 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, 32143, 32172, + 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, 35504, 35728, + 36664, 36930, 36995, 37228, 37526, 37561, 38539, 38567, 38568, 38614, + 38656, 38920, 39318, 39635, 39706, 21460, 22654, 22809, 23408, 23487, + 28113, 28506, 29087, 29729, 29881, 32901, 33789, 24033, 24455, 24490, + 24642, 26092, 26642, 26991, 27219, 27529, 27957, 28147, 29667, 30462, + 30636, 31565, 32020, 33059, 33308, 33600, 34036, 34147, 35426, 35524, + 37255, 37662, 38918, 39348, 25100, 34899, 36848, 37477, 23815, 23847, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23913, 29791, 33181, 34664, + 28629, 25342, 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, + 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, + 23608, 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, 26558, + 26612, 29468, 30690, 31034, 32709, 33940, 33997, 35222, 35430, 35433, + 35553, 35925, 35962, 22516, 23508, 24335, 24687, 25325, 26893, 27542, + 28252, 29060, 31698, 34645, 35672, 36606, 39135, 39166, 20280, 20353, + 20449, 21627, 23072, 23480, 24892, 26032, 26216, 29180, 30003, 31070, + 32051, 33102, 33251, 33688, 34218, 34254, 34563, 35338, 36523, 36763, + 63857, 36805, 22833, 23460, 23526, 24713, 23529, 23563, 24515, 27777, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63858, 28145, 28683, 29978, + 33455, 35574, 20160, 21313, 63859, 38617, 27663, 20126, 20420, 20818, + 21854, 23077, 23784, 25105, 29273, 33469, 33706, 34558, 34905, 35357, + 38463, 38597, 39187, 40201, 40285, 22538, 23731, 23997, 24132, 24801, + 24853, 25569, 27138, 28197, 37122, 37716, 38990, 39952, 40823, 23433, + 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, 26017, + 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, 33780, + 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, 27523, + 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, 30861, + 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, 38989, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27387, 32588, 40367, 40474, + 20063, 20539, 20918, 22812, 24825, 25590, 26928, 29242, 32822, 63860, + 37326, 24369, 63861, 63862, 32004, 33509, 33903, 33979, 34277, 36493, + 63863, 20335, 63864, 63865, 22756, 23363, 24665, 25562, 25880, 25965, + 26264, 63866, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, + 31344, 63867, 32650, 63868, 35140, 63869, 35731, 37312, 38525, 63870, + 39178, 22276, 24481, 26044, 28417, 30208, 31142, 35486, 39341, 39770, + 40812, 20740, 25014, 25233, 27277, 33222, 20547, 22576, 24422, 28937, + 35328, 35578, 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, + 23978, 26989, 20870, 20104, 20313, 63871, 63872, 63873, 22914, 63874, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63875, 27487, 27741, 63876, + 29877, 30998, 63877, 33287, 33349, 33593, 36671, 36701, 63878, 39192, + 63879, 63880, 63881, 20134, 63882, 22495, 24441, 26131, 63883, 63884, + 30123, 32377, 35695, 63885, 36870, 39515, 22181, 22567, 23032, 23071, + 23476, 63886, 24310, 63887, 63888, 25424, 25403, 63889, 26941, 27783, + 27839, 28046, 28051, 28149, 28436, 63890, 28895, 28982, 29017, 63891, + 29123, 29141, 63892, 30799, 30831, 63893, 31605, 32227, 63894, 32303, + 63895, 34893, 36575, 63896, 63897, 63898, 37467, 63899, 40182, 63900, + 63901, 63902, 24709, 28037, 63903, 29105, 63904, 63905, 38321, 21421, + 63906, 63907, 63908, 26579, 63909, 28814, 28976, 29744, 33398, 33490, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63910, 38331, 39653, 40573, + 26308, 63911, 29121, 33865, 63912, 63913, 22603, 63914, 63915, 23992, + 24433, 63916, 26144, 26254, 27001, 27054, 27704, 27891, 28214, 28481, + 28634, 28699, 28719, 29008, 29151, 29552, 63917, 29787, 63918, 29908, + 30408, 31310, 32403, 63919, 63920, 33521, 35424, 36814, 63921, 37704, + 63922, 38681, 63923, 63924, 20034, 20522, 63925, 21000, 21473, 26355, + 27757, 28618, 29450, 30591, 31330, 33454, 34269, 34306, 63926, 35028, + 35427, 35709, 35947, 63927, 37555, 63928, 38675, 38928, 20116, 20237, + 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, 23067, + 23524, 24735, 63929, 25034, 25942, 26111, 26212, 26791, 27738, 28595, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28879, 29100, 29522, 31613, + 34568, 35492, 39986, 40711, 23627, 27779, 29508, 29577, 37434, 28331, + 29797, 30239, 31337, 32277, 34314, 20800, 22725, 25793, 29934, 29973, + 30320, 32705, 37013, 38605, 39252, 28198, 29926, 31401, 31402, 33253, + 34521, 34680, 35355, 23113, 23436, 23451, 26785, 26880, 28003, 29609, + 29715, 29740, 30871, 32233, 32747, 33048, 33109, 33694, 35916, 38446, + 38929, 26352, 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, + 30702, 22806, 23916, 24013, 29477, 30031, 63930, 63931, 20709, 20985, + 22575, 22829, 22934, 23002, 23525, 63932, 63933, 23970, 25303, 25622, + 25747, 25854, 63934, 26332, 63935, 27208, 63936, 29183, 29796, 63937, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31368, 31407, 32327, 32350, + 32768, 33136, 63938, 34799, 35201, 35616, 36953, 63939, 36992, 39250, + 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, 20887, 21191, + 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, 28342, 29076, + 29794, 29992, 29996, 32883, 33592, 33993, 36362, 37780, 37854, 63940, + 20110, 20305, 20598, 20778, 21448, 21451, 21491, 23431, 23507, 23588, + 24858, 24962, 26100, 29275, 29591, 29760, 30402, 31056, 31121, 31161, + 32006, 32701, 33419, 34261, 34398, 36802, 36935, 37109, 37354, 38533, + 38632, 38633, 21206, 24423, 26093, 26161, 26671, 29020, 31286, 37057, + 38922, 20113, 63941, 27218, 27550, 28560, 29065, 32792, 33464, 34131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36939, 38549, 38642, 38907, + 34074, 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, + 22435, 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, + 28304, 29232, 29503, 29783, 33489, 34945, 36677, 36960, 63942, 38498, + 39000, 40219, 26376, 36234, 37470, 20301, 20553, 20702, 21361, 22285, + 22996, 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, + 33806, 33894, 34111, 34655, 34907, 35096, 35586, 36949, 38859, 39759, + 20083, 20369, 20754, 20842, 63943, 21807, 21929, 23418, 23461, 24188, + 24189, 24254, 24736, 24799, 24840, 24841, 25540, 25912, 26377, 63944, + 26580, 26586, 63945, 26977, 26978, 27833, 27943, 63946, 28216, 63947, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28641, 29494, 29495, 63948, + 29788, 30001, 63949, 30290, 63950, 63951, 32173, 33278, 33848, 35029, + 35480, 35547, 35565, 36400, 36418, 36938, 36926, 36986, 37193, 37321, + 37742, 63952, 63953, 22537, 63954, 27603, 32905, 32946, 63955, 63956, + 20801, 22891, 23609, 63957, 63958, 28516, 29607, 32996, 36103, 63959, + 37399, 38287, 63960, 63961, 63962, 63963, 32895, 25102, 28700, 32104, + 34701, 63964, 22432, 24681, 24903, 27575, 35518, 37504, 38577, 20057, + 21535, 28139, 34093, 38512, 38899, 39150, 25558, 27875, 37009, 20957, + 25033, 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, + 26885, 27589, 30097, 30691, 32681, 33380, 34191, 34811, 34915, 35516, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 35696, 37291, 20108, 20197, + 20234, 63965, 63966, 22839, 23016, 63967, 24050, 24347, 24411, 24609, + 63968, 63969, 63970, 63971, 29246, 29669, 63972, 30064, 30157, 63973, + 31227, 63974, 32780, 32819, 32900, 33505, 33617, 63975, 63976, 36029, + 36019, 36999, 63977, 63978, 39156, 39180, 63979, 63980, 28727, 30410, + 32714, 32716, 32764, 35610, 20154, 20161, 20995, 21360, 63981, 21693, + 22240, 23035, 23493, 24341, 24525, 28270, 63982, 63983, 32106, 33589, + 63984, 34451, 35469, 63985, 38765, 38775, 63986, 63987, 19968, 20314, + 20350, 22777, 26085, 28322, 36920, 37808, 39353, 20219, 22764, 22922, + 23001, 24641, 63988, 63989, 31252, 63990, 33615, 36035, 20837, 21316, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63991, 63992, 63993, 20173, + 21097, 23381, 33471, 20180, 21050, 21672, 22985, 23039, 23376, 23383, + 23388, 24675, 24904, 28363, 28825, 29038, 29574, 29943, 30133, 30913, + 32043, 32773, 33258, 33576, 34071, 34249, 35566, 36039, 38604, 20316, + 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, 33421, 37196, + 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, 26283, 28507, + 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, 22715, 22767, + 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, 27167, 27299, + 27404, 28479, 29254, 63994, 29520, 29835, 31456, 31911, 33144, 33247, + 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, 38263, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38556, 20877, 21705, 22312, + 23472, 25165, 26448, 26685, 26771, 28221, 28371, 28797, 32289, 35009, + 36001, 36617, 40779, 40782, 29229, 31631, 35533, 37658, 20295, 20302, + 20786, 21632, 22992, 24213, 25269, 26485, 26990, 27159, 27822, 28186, + 29401, 29482, 30141, 31672, 32053, 33511, 33785, 33879, 34295, 35419, + 36015, 36487, 36889, 37048, 38606, 40799, 21219, 21514, 23265, 23490, + 25688, 25973, 28404, 29380, 63995, 30340, 31309, 31515, 31821, 32318, + 32735, 33659, 35627, 36042, 36196, 36321, 36447, 36842, 36857, 36969, + 37841, 20291, 20346, 20659, 20840, 20856, 21069, 21098, 22625, 22652, + 22880, 23560, 23637, 24283, 24731, 25136, 26643, 27583, 27656, 28593, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29006, 29728, 30000, 30008, + 30033, 30322, 31564, 31627, 31661, 31686, 32399, 35438, 36670, 36681, + 37439, 37523, 37666, 37931, 38651, 39002, 39019, 39198, 20999, 25130, + 25240, 27993, 30308, 31434, 31680, 32118, 21344, 23742, 24215, 28472, + 28857, 31896, 38673, 39822, 40670, 25509, 25722, 34678, 19969, 20117, + 20141, 20572, 20597, 21576, 22979, 23450, 24128, 24237, 24311, 24449, + 24773, 25402, 25919, 25972, 26060, 26230, 26232, 26622, 26984, 27273, + 27491, 27712, 28096, 28136, 28191, 28254, 28702, 28833, 29582, 29693, + 30010, 30555, 30855, 31118, 31243, 31357, 31934, 32142, 33351, 35330, + 35562, 35998, 37165, 37194, 37336, 37478, 37580, 37664, 38662, 38742, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38748, 38914, 40718, 21046, + 21137, 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, + 31532, 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, + 38988, 40778, 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, + 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, + 28526, 29031, 29157, 29226, 29866, 30522, 31062, 31066, 31199, 31264, + 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, 35519, + 36249, 36481, 36896, 36973, 37347, 38459, 38613, 40165, 26063, 31751, + 36275, 37827, 23384, 23562, 21330, 25305, 29469, 20519, 23447, 24478, + 24752, 24939, 26837, 28121, 29742, 31278, 32066, 32156, 32305, 33131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36394, 36405, 37758, 37912, + 20304, 22352, 24038, 24231, 25387, 32618, 20027, 20303, 20367, 20570, + 23005, 32964, 21610, 21608, 22014, 22863, 23449, 24030, 24282, 26205, + 26417, 26609, 26666, 27880, 27954, 28234, 28557, 28855, 29664, 30087, + 31820, 32002, 32044, 32162, 33311, 34523, 35387, 35461, 36208, 36490, + 36659, 36913, 37198, 37202, 37956, 39376, 31481, 31909, 20426, 20737, + 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, + 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, + 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, + 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21675, 22320, 22336, 24535, + 25345, 25351, 25711, 25903, 26088, 26234, 26525, 26547, 27490, 27744, + 27802, 28460, 30693, 30757, 31049, 31063, 32025, 32930, 33026, 33267, + 33437, 33463, 34584, 35468, 63996, 36100, 36286, 36978, 30452, 31257, + 31287, 32340, 32887, 21767, 21972, 22645, 25391, 25634, 26185, 26187, + 26733, 27035, 27524, 27941, 28337, 29645, 29800, 29857, 30043, 30137, + 30433, 30494, 30603, 31206, 32265, 32285, 33275, 34095, 34967, 35386, + 36049, 36587, 36784, 36914, 37805, 38499, 38515, 38663, 20356, 21489, + 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, + 36074, 36300, 36845, 26015, 26389, 63997, 22519, 28503, 32221, 36655, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37878, 38598, 24501, 25074, + 28548, 19988, 20376, 20511, 21449, 21983, 23919, 24046, 27425, 27492, + 30923, 31642, 63998, 36425, 36554, 36974, 25417, 25662, 30528, 31364, + 37679, 38015, 40810, 25776, 28591, 29158, 29864, 29914, 31428, 31762, + 32386, 31922, 32408, 35738, 36106, 38013, 39184, 39244, 21049, 23519, + 25830, 26413, 32046, 20717, 21443, 22649, 24920, 24921, 25082, 26028, + 31449, 35730, 35734, 20489, 20513, 21109, 21809, 23100, 24288, 24432, + 24884, 25950, 26124, 26166, 26274, 27085, 28356, 28466, 29462, 30241, + 31379, 33081, 33369, 33750, 33980, 20661, 22512, 23488, 23528, 24425, + 25505, 30758, 32181, 33756, 34081, 37319, 37365, 20874, 26613, 31574, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36012, 20932, 22971, 24765, + 34389, 20508, 63999, 21076, 23610, 24957, 25114, 25299, 25842, 26021, + 28364, 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, + 24029, 25797, 27849, 28154, 29588, 31359, 33307, 34214, 36068, 36368, + 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, + 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, + 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, + 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, + 35531, 38737, 39894, 64000, 21059, 26367, 28053, 28399, 32224, 35558, + 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26898, 26970, 27189, 28818, + 28966, 30813, 30977, 30990, 31186, 31245, 32918, 33400, 33493, 33609, + 34121, 35970, 36229, 37218, 37259, 37294, 20419, 22225, 29165, 30679, + 34560, 35320, 23544, 24534, 26449, 37032, 21474, 22618, 23541, 24740, + 24961, 25696, 32317, 32880, 34085, 37507, 25774, 20652, 23828, 26368, + 22684, 25277, 25512, 26894, 27000, 27166, 28267, 30394, 31179, 33467, + 33833, 35535, 36264, 36861, 37138, 37195, 37276, 37648, 37656, 37786, + 38619, 39478, 39949, 19985, 30044, 31069, 31482, 31569, 31689, 32302, + 33988, 36441, 36468, 36600, 36880, 26149, 26943, 29763, 20986, 26414, + 40668, 20805, 24544, 27798, 34802, 34909, 34935, 24756, 33205, 33795, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36101, 21462, 21561, 22068, + 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, + 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, + 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, + 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, + 40786, 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, 23522, + 26517, 27784, 28024, 29723, 30759, 37341, 37756, 34756, 31204, 31281, + 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, 25302, 26422, + 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, 22396, 64001, + 25176, 64002, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37944, 21585, 22022, 22374, + 24392, 24986, 27470, 28760, 28845, 32187, 35477, 22890, 33067, 25506, + 30472, 32829, 36010, 22612, 25645, 27067, 23445, 24081, 28271, 64003, + 34153, 20812, 21488, 22826, 24608, 24907, 27526, 27760, 27888, 31518, + 32974, 33492, 36294, 37040, 39089, 64004, 25799, 28580, 25745, 25860, + 20814, 21520, 22303, 35342, 24927, 26742, 64005, 30171, 31570, 32113, + 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, 22871, 22956, + 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, 24052, 25226, + 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, 32631, 33453, + 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, 36774, 37393, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38442, 20843, 21485, 25420, + 20329, 21764, 24726, 25943, 27803, 28031, 29260, 29437, 31255, 35207, + 35997, 24429, 28558, 28921, 33192, 24846, 20415, 20559, 25153, 29255, + 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, + 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, + 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, + 24598, 25243, 25265, 25429, 64006, 27873, 28006, 30129, 30770, 32990, + 33071, 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, + 24133, 26292, 26333, 28689, 29190, 64007, 20469, 21117, 24426, 24915, + 26451, 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21697, 31263, 26963, 35575, + 35914, 39080, 39342, 24444, 25259, 30130, 30382, 34987, 36991, 38466, + 21305, 24380, 24517, 27852, 29644, 30050, 30091, 31558, 33534, 39325, + 20047, 36924, 19979, 20309, 21414, 22799, 24264, 26160, 27827, 29781, + 33655, 34662, 36032, 36944, 38686, 39957, 22737, 23416, 34384, 35604, + 40372, 23506, 24680, 24717, 26097, 27735, 28450, 28579, 28698, 32597, + 32752, 38289, 38290, 38480, 38867, 21106, 36676, 20989, 21547, 21688, + 21859, 21898, 27323, 28085, 32216, 33382, 37532, 38519, 40569, 21512, + 21704, 30418, 34532, 38308, 38356, 38492, 20130, 20233, 23022, 23270, + 24055, 24658, 25239, 26477, 26689, 27782, 28207, 32568, 32923, 33322, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 64008, 64009, 38917, 20133, + 20565, 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, + 34809, 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, + 24184, 26447, 33607, 34892, 20139, 21521, 22190, 29670, 37141, 38911, + 39177, 39255, 39321, 22099, 22687, 34395, 35377, 25010, 27382, 29563, + 36562, 27463, 38570, 39511, 22869, 29184, 36203, 38761, 20436, 23796, + 24358, 25080, 26203, 27883, 28843, 29572, 29625, 29694, 30505, 30541, + 32067, 32098, 32291, 33335, 34898, 64010, 36066, 37449, 39023, 23377, + 31348, 34880, 38913, 23244, 20448, 21332, 22846, 23805, 25406, 28025, + 29433, 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24418, 27842, 28366, 28677, + 28752, 28847, 29074, 29673, 29801, 33610, 34722, 34913, 36872, 37026, + 37795, 39336, 20846, 24407, 24800, 24935, 26291, 34137, 36426, 37295, + 38795, 20046, 20114, 21628, 22741, 22778, 22909, 23733, 24359, 25142, + 25160, 26122, 26215, 27627, 28009, 28111, 28246, 28408, 28564, 28640, + 28649, 28765, 29392, 29733, 29786, 29920, 30355, 31068, 31946, 32286, + 32993, 33446, 33899, 33983, 34382, 34399, 34676, 35703, 35946, 37804, + 38912, 39013, 24785, 25110, 37239, 23130, 26127, 28151, 28222, 29759, + 39746, 24573, 24794, 31503, 21700, 24344, 27742, 27859, 27946, 28888, + 32005, 34425, 35340, 40251, 21270, 21644, 23301, 27194, 28779, 30069, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31117, 31166, 33457, 33775, + 35441, 35649, 36008, 38772, 64011, 25844, 25899, 30906, 30907, 31339, + 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, + 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, 28369, 29502, + 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, 26179, + 26180, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, 31681, + 31783, 33618, 34647, 36945, 38541, 40643, 21295, 22238, 24315, 24458, + 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, 28784, 29546, + 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, 23446, 27243, + 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, 28045, 28102, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29243, 32948, 37237, 39501, + 20399, 20505, 21402, 21518, 21564, 21897, 21957, 24127, 24460, 26429, + 29030, 29661, 36869, 21211, 21235, 22628, 22734, 28932, 29071, 29179, + 34224, 35347, 26248, 34216, 21927, 26244, 29002, 33841, 21321, 21913, + 27585, 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, + 25658, 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, + 27958, 33016, 40657, 26133, 27427, 28824, 30165, 21507, 23673, 32007, + 35350, 27424, 27453, 27462, 21560, 24688, 27965, 32725, 33288, 20694, + 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, 25137, + 26206, 26342, 29081, 29113, 29114, 29351, 31143, 31232, 32690, 35440, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myhtml_encoding_map_gb18030[] = { + 19970, 19972, 19973, 19974, 19983, 19986, 19991, 19999, 20000, 20001, + 20003, 20006, 20009, 20014, 20015, 20017, 20019, 20021, 20023, 20028, + 20032, 20033, 20034, 20036, 20038, 20042, 20049, 20053, 20055, 20058, + 20059, 20066, 20067, 20068, 20069, 20071, 20072, 20074, 20075, 20076, + 20077, 20078, 20079, 20082, 20084, 20085, 20086, 20087, 20088, 20089, + 20090, 20091, 20092, 20093, 20095, 20096, 20097, 20098, 20099, 20100, + 20101, 20103, 20106, 20112, 20118, 20119, 20121, 20124, 20125, 20126, + 20131, 20138, 20143, 20144, 20145, 20148, 20150, 20151, 20152, 20153, + 20156, 20157, 20158, 20168, 20172, 20175, 20176, 20178, 20186, 20187, + 20188, 20192, 20194, 20198, 20199, 20201, 20205, 20206, 20207, 20209, + 20212, 20216, 20217, 20218, 20220, 20222, 20224, 20226, 20227, 20228, + 20229, 20230, 20231, 20232, 20235, 20236, 20242, 20243, 20244, 20245, + 20246, 20252, 20253, 20257, 20259, 20264, 20265, 20268, 20269, 20270, + 20273, 20275, 20277, 20279, 20281, 20283, 20286, 20287, 20288, 20289, + 20290, 20292, 20293, 20295, 20296, 20297, 20298, 20299, 20300, 20306, + 20308, 20310, 20321, 20322, 20326, 20328, 20330, 20331, 20333, 20334, + 20337, 20338, 20341, 20343, 20344, 20345, 20346, 20349, 20352, 20353, + 20354, 20357, 20358, 20359, 20362, 20364, 20366, 20368, 20370, 20371, + 20373, 20374, 20376, 20377, 20378, 20380, 20382, 20383, 20385, 20386, + 20388, 20395, 20397, 20400, 20401, 20402, 20403, 20404, 20406, 20407, + 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20416, 20417, 20418, + 20422, 20423, 20424, 20425, 20427, 20428, 20429, 20434, 20435, 20436, + 20437, 20438, 20441, 20443, 20448, 20450, 20452, 20453, 20455, 20459, + 20460, 20464, 20466, 20468, 20469, 20470, 20471, 20473, 20475, 20476, + 20477, 20479, 20480, 20481, 20482, 20483, 20484, 20485, 20486, 20487, + 20488, 20489, 20490, 20491, 20494, 20496, 20497, 20499, 20501, 20502, + 20503, 20507, 20509, 20510, 20512, 20514, 20515, 20516, 20519, 20523, + 20527, 20528, 20529, 20530, 20531, 20532, 20533, 20534, 20535, 20536, + 20537, 20539, 20541, 20543, 20544, 20545, 20546, 20548, 20549, 20550, + 20553, 20554, 20555, 20557, 20560, 20561, 20562, 20563, 20564, 20566, + 20567, 20568, 20569, 20571, 20573, 20574, 20575, 20576, 20577, 20578, + 20579, 20580, 20582, 20583, 20584, 20585, 20586, 20587, 20589, 20590, + 20591, 20592, 20593, 20594, 20595, 20596, 20597, 20600, 20601, 20602, + 20604, 20605, 20609, 20610, 20611, 20612, 20614, 20615, 20617, 20618, + 20619, 20620, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, + 20630, 20631, 20632, 20633, 20634, 20635, 20636, 20637, 20638, 20639, + 20640, 20641, 20642, 20644, 20646, 20650, 20651, 20653, 20654, 20655, + 20656, 20657, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20668, + 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, + 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20688, 20689, + 20690, 20691, 20692, 20693, 20695, 20696, 20697, 20699, 20700, 20701, + 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20712, 20713, + 20714, 20715, 20719, 20720, 20721, 20722, 20724, 20726, 20727, 20728, + 20729, 20730, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, + 20740, 20741, 20744, 20745, 20746, 20748, 20749, 20750, 20751, 20752, + 20753, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, + 20764, 20765, 20766, 20767, 20768, 20770, 20771, 20772, 20773, 20774, + 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, + 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, + 20795, 20796, 20797, 20798, 20802, 20807, 20810, 20812, 20814, 20815, + 20816, 20818, 20819, 20823, 20824, 20825, 20827, 20829, 20830, 20831, + 20832, 20833, 20835, 20836, 20838, 20839, 20841, 20842, 20847, 20850, + 20858, 20862, 20863, 20867, 20868, 20870, 20871, 20874, 20875, 20878, + 20879, 20880, 20881, 20883, 20884, 20888, 20890, 20893, 20894, 20895, + 20897, 20899, 20902, 20903, 20904, 20905, 20906, 20909, 20910, 20916, + 20920, 20921, 20922, 20926, 20927, 20929, 20930, 20931, 20933, 20936, + 20938, 20941, 20942, 20944, 20946, 20947, 20948, 20949, 20950, 20951, + 20952, 20953, 20954, 20956, 20958, 20959, 20962, 20963, 20965, 20966, + 20967, 20968, 20969, 20970, 20972, 20974, 20977, 20978, 20980, 20983, + 20990, 20996, 20997, 21001, 21003, 21004, 21007, 21008, 21011, 21012, + 21013, 21020, 21022, 21023, 21025, 21026, 21027, 21029, 21030, 21031, + 21034, 21036, 21039, 21041, 21042, 21044, 21045, 21052, 21054, 21060, + 21061, 21062, 21063, 21064, 21065, 21067, 21070, 21071, 21074, 21075, + 21077, 21079, 21080, 21081, 21082, 21083, 21085, 21087, 21088, 21090, + 21091, 21092, 21094, 21096, 21099, 21100, 21101, 21102, 21104, 21105, + 21107, 21108, 21109, 21110, 21111, 21112, 21113, 21114, 21115, 21116, + 21118, 21120, 21123, 21124, 21125, 21126, 21127, 21129, 21130, 21131, + 21132, 21133, 21134, 21135, 21137, 21138, 21140, 21141, 21142, 21143, + 21144, 21145, 21146, 21148, 21156, 21157, 21158, 21159, 21166, 21167, + 21168, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, + 21181, 21184, 21185, 21186, 21188, 21189, 21190, 21192, 21194, 21196, + 21197, 21198, 21199, 21201, 21203, 21204, 21205, 21207, 21209, 21210, + 21211, 21212, 21213, 21214, 21216, 21217, 21218, 21219, 21221, 21222, + 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, + 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21243, 21244, 21245, + 21249, 21250, 21251, 21252, 21255, 21257, 21258, 21259, 21260, 21262, + 21265, 21266, 21267, 21268, 21272, 21275, 21276, 21278, 21279, 21282, + 21284, 21285, 21287, 21288, 21289, 21291, 21292, 21293, 21295, 21296, + 21297, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21308, 21309, + 21312, 21314, 21316, 21318, 21323, 21324, 21325, 21328, 21332, 21336, + 21337, 21339, 21341, 21349, 21352, 21354, 21356, 21357, 21362, 21366, + 21369, 21371, 21372, 21373, 21374, 21376, 21377, 21379, 21383, 21384, + 21386, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21398, 21399, + 21401, 21403, 21404, 21406, 21408, 21409, 21412, 21415, 21418, 21419, + 21420, 21421, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21431, + 21432, 21433, 21434, 21436, 21437, 21438, 21440, 21443, 21444, 21445, + 21446, 21447, 21454, 21455, 21456, 21458, 21459, 21461, 21466, 21468, + 21469, 21470, 21473, 21474, 21479, 21492, 21498, 21502, 21503, 21504, + 21506, 21509, 21511, 21515, 21524, 21528, 21529, 21530, 21532, 21538, + 21540, 21541, 21546, 21552, 21555, 21558, 21559, 21562, 21565, 21567, + 21569, 21570, 21572, 21573, 21575, 21577, 21580, 21581, 21582, 21583, + 21585, 21594, 21597, 21598, 21599, 21600, 21601, 21603, 21605, 21607, + 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21620, 21625, + 21626, 21630, 21631, 21633, 21635, 21637, 21639, 21640, 21641, 21642, + 21645, 21649, 21651, 21655, 21656, 21660, 21662, 21663, 21664, 21665, + 21666, 21669, 21678, 21680, 21682, 21685, 21686, 21687, 21689, 21690, + 21692, 21694, 21699, 21701, 21706, 21707, 21718, 21720, 21723, 21728, + 21729, 21730, 21731, 21732, 21739, 21740, 21743, 21744, 21745, 21748, + 21749, 21750, 21751, 21752, 21753, 21755, 21758, 21760, 21762, 21763, + 21764, 21765, 21768, 21770, 21771, 21772, 21773, 21774, 21778, 21779, + 21781, 21782, 21783, 21784, 21785, 21786, 21788, 21789, 21790, 21791, + 21793, 21797, 21798, 21800, 21801, 21803, 21805, 21810, 21812, 21813, + 21814, 21816, 21817, 21818, 21819, 21821, 21824, 21826, 21829, 21831, + 21832, 21835, 21836, 21837, 21838, 21839, 21841, 21842, 21843, 21844, + 21847, 21848, 21849, 21850, 21851, 21853, 21854, 21855, 21856, 21858, + 21859, 21864, 21865, 21867, 21871, 21872, 21873, 21874, 21875, 21876, + 21881, 21882, 21885, 21887, 21893, 21894, 21900, 21901, 21902, 21904, + 21906, 21907, 21909, 21910, 21911, 21914, 21915, 21918, 21920, 21921, + 21922, 21923, 21924, 21925, 21926, 21928, 21929, 21930, 21931, 21932, + 21933, 21934, 21935, 21936, 21938, 21940, 21942, 21944, 21946, 21948, + 21951, 21952, 21953, 21954, 21955, 21958, 21959, 21960, 21962, 21963, + 21966, 21967, 21968, 21973, 21975, 21976, 21977, 21978, 21979, 21982, + 21984, 21986, 21991, 21993, 21997, 21998, 22000, 22001, 22004, 22006, + 22008, 22009, 22010, 22011, 22012, 22015, 22018, 22019, 22020, 22021, + 22022, 22023, 22026, 22027, 22029, 22032, 22033, 22034, 22035, 22036, + 22037, 22038, 22039, 22041, 22042, 22044, 22045, 22048, 22049, 22050, + 22053, 22054, 22056, 22057, 22058, 22059, 22062, 22063, 22064, 22067, + 22069, 22071, 22072, 22074, 22076, 22077, 22078, 22080, 22081, 22082, + 22083, 22084, 22085, 22086, 22087, 22088, 22089, 22090, 22091, 22095, + 22096, 22097, 22098, 22099, 22101, 22102, 22106, 22107, 22109, 22110, + 22111, 22112, 22113, 22115, 22117, 22118, 22119, 22125, 22126, 22127, + 22128, 22130, 22131, 22132, 22133, 22135, 22136, 22137, 22138, 22141, + 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22151, 22152, 22153, + 22154, 22155, 22156, 22157, 22160, 22161, 22162, 22164, 22165, 22166, + 22167, 22168, 22169, 22170, 22171, 22172, 22173, 22174, 22175, 22176, + 22177, 22178, 22180, 22181, 22182, 22183, 22184, 22185, 22186, 22187, + 22188, 22189, 22190, 22192, 22193, 22194, 22195, 22196, 22197, 22198, + 22200, 22201, 22202, 22203, 22205, 22206, 22207, 22208, 22209, 22210, + 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22219, 22220, 22221, + 22222, 22223, 22224, 22225, 22226, 22227, 22229, 22230, 22232, 22233, + 22236, 22243, 22245, 22246, 22247, 22248, 22249, 22250, 22252, 22254, + 22255, 22258, 22259, 22262, 22263, 22264, 22267, 22268, 22272, 22273, + 22274, 22277, 22279, 22283, 22284, 22285, 22286, 22287, 22288, 22289, + 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, + 22301, 22302, 22304, 22305, 22306, 22308, 22309, 22310, 22311, 22315, + 22321, 22322, 22324, 22325, 22326, 22327, 22328, 22332, 22333, 22335, + 22337, 22339, 22340, 22341, 22342, 22344, 22345, 22347, 22354, 22355, + 22356, 22357, 22358, 22360, 22361, 22370, 22371, 22373, 22375, 22380, + 22382, 22384, 22385, 22386, 22388, 22389, 22392, 22393, 22394, 22397, + 22398, 22399, 22400, 22401, 22407, 22408, 22409, 22410, 22413, 22414, + 22415, 22416, 22417, 22420, 22421, 22422, 22423, 22424, 22425, 22426, + 22428, 22429, 22430, 22431, 22437, 22440, 22442, 22444, 22447, 22448, + 22449, 22451, 22453, 22454, 22455, 22457, 22458, 22459, 22460, 22461, + 22462, 22463, 22464, 22465, 22468, 22469, 22470, 22471, 22472, 22473, + 22474, 22476, 22477, 22480, 22481, 22483, 22486, 22487, 22491, 22492, + 22494, 22497, 22498, 22499, 22501, 22502, 22503, 22504, 22505, 22506, + 22507, 22508, 22510, 22512, 22513, 22514, 22515, 22517, 22518, 22519, + 22523, 22524, 22526, 22527, 22529, 22531, 22532, 22533, 22536, 22537, + 22538, 22540, 22542, 22543, 22544, 22546, 22547, 22548, 22550, 22551, + 22552, 22554, 22555, 22556, 22557, 22559, 22562, 22563, 22565, 22566, + 22567, 22568, 22569, 22571, 22572, 22573, 22574, 22575, 22577, 22578, + 22579, 22580, 22582, 22583, 22584, 22585, 22586, 22587, 22588, 22589, + 22590, 22591, 22592, 22593, 22594, 22595, 22597, 22598, 22599, 22600, + 22601, 22602, 22603, 22606, 22607, 22608, 22610, 22611, 22613, 22614, + 22615, 22617, 22618, 22619, 22620, 22621, 22623, 22624, 22625, 22626, + 22627, 22628, 22630, 22631, 22632, 22633, 22634, 22637, 22638, 22639, + 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, + 22650, 22651, 22652, 22653, 22655, 22658, 22660, 22662, 22663, 22664, + 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22676, 22677, + 22678, 22679, 22680, 22683, 22684, 22685, 22688, 22689, 22690, 22691, + 22692, 22693, 22694, 22695, 22698, 22699, 22700, 22701, 22702, 22703, + 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, + 22714, 22715, 22717, 22718, 22719, 22720, 22722, 22723, 22724, 22726, + 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, + 22738, 22739, 22740, 22742, 22743, 22744, 22745, 22746, 22747, 22748, + 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22757, 22758, 22759, + 22760, 22761, 22762, 22765, 22767, 22769, 22770, 22772, 22773, 22775, + 22776, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22787, + 22789, 22790, 22792, 22793, 22794, 22795, 22796, 22798, 22800, 22801, + 22802, 22803, 22807, 22808, 22811, 22813, 22814, 22816, 22817, 22818, + 22819, 22822, 22824, 22828, 22832, 22834, 22835, 22837, 22838, 22843, + 22845, 22846, 22847, 22848, 22851, 22853, 22854, 22858, 22860, 22861, + 22864, 22866, 22867, 22873, 22875, 22876, 22877, 22878, 22879, 22881, + 22883, 22884, 22886, 22887, 22888, 22889, 22890, 22891, 22892, 22893, + 22894, 22895, 22896, 22897, 22898, 22901, 22903, 22906, 22907, 22908, + 22910, 22911, 22912, 22917, 22921, 22923, 22924, 22926, 22927, 22928, + 22929, 22932, 22933, 22936, 22938, 22939, 22940, 22941, 22943, 22944, + 22945, 22946, 22950, 22951, 22956, 22957, 22960, 22961, 22963, 22964, + 22965, 22966, 22967, 22968, 22970, 22972, 22973, 22975, 22976, 22977, + 22978, 22979, 22980, 22981, 22983, 22984, 22985, 22988, 22989, 22990, + 22991, 22997, 22998, 23001, 23003, 23006, 23007, 23008, 23009, 23010, + 23012, 23014, 23015, 23017, 23018, 23019, 23021, 23022, 23023, 23024, + 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23034, 23036, + 23037, 23038, 23040, 23042, 23050, 23051, 23053, 23054, 23055, 23056, + 23058, 23060, 23061, 23062, 23063, 23065, 23066, 23067, 23069, 23070, + 23073, 23074, 23076, 23078, 23079, 23080, 23082, 23083, 23084, 23085, + 23086, 23087, 23088, 23091, 23093, 23095, 23096, 23097, 23098, 23099, + 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23111, 23112, + 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, + 23126, 23127, 23128, 23129, 23131, 23132, 23133, 23134, 23135, 23136, + 23137, 23139, 23140, 23141, 23142, 23144, 23145, 23147, 23148, 23149, + 23150, 23151, 23152, 23153, 23154, 23155, 23160, 23161, 23163, 23164, + 23165, 23166, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, + 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, + 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23196, 23197, 23198, + 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, + 23209, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23220, 23222, + 23223, 23225, 23226, 23227, 23228, 23229, 23231, 23232, 23235, 23236, + 23237, 23238, 23239, 23240, 23242, 23243, 23245, 23246, 23247, 23248, + 23249, 23251, 23253, 23255, 23257, 23258, 23259, 23261, 23262, 23263, + 23266, 23268, 23269, 23271, 23272, 23274, 23276, 23277, 23278, 23279, + 23280, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, + 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, + 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23309, 23310, 23311, + 23312, 23313, 23314, 23315, 23316, 23317, 23320, 23321, 23322, 23323, + 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, + 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, + 23344, 23345, 23347, 23349, 23350, 23352, 23353, 23354, 23355, 23356, + 23357, 23358, 23359, 23361, 23362, 23363, 23364, 23365, 23366, 23367, + 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23378, 23382, + 23390, 23392, 23393, 23399, 23400, 23403, 23405, 23406, 23407, 23410, + 23412, 23414, 23415, 23416, 23417, 23419, 23420, 23422, 23423, 23426, + 23430, 23434, 23437, 23438, 23440, 23441, 23442, 23444, 23446, 23455, + 23463, 23464, 23465, 23468, 23469, 23470, 23471, 23473, 23474, 23479, + 23482, 23483, 23484, 23488, 23489, 23491, 23496, 23497, 23498, 23499, + 23501, 23502, 23503, 23505, 23508, 23509, 23510, 23511, 23512, 23513, + 23514, 23515, 23516, 23520, 23522, 23523, 23526, 23527, 23529, 23530, + 23531, 23532, 23533, 23535, 23537, 23538, 23539, 23540, 23541, 23542, + 23543, 23549, 23550, 23552, 23554, 23555, 23557, 23559, 23560, 23563, + 23564, 23565, 23566, 23568, 23570, 23571, 23575, 23577, 23579, 23582, + 23583, 23584, 23585, 23587, 23590, 23592, 23593, 23594, 23595, 23597, + 23598, 23599, 23600, 23602, 23603, 23605, 23606, 23607, 23619, 23620, + 23622, 23623, 23628, 23629, 23634, 23635, 23636, 23638, 23639, 23640, + 23642, 23643, 23644, 23645, 23647, 23650, 23652, 23655, 23656, 23657, + 23658, 23659, 23660, 23661, 23664, 23666, 23667, 23668, 23669, 23670, + 23671, 23672, 23675, 23676, 23677, 23678, 23680, 23683, 23684, 23685, + 23686, 23687, 23689, 23690, 23691, 23694, 23695, 23698, 23699, 23701, + 23709, 23710, 23711, 23712, 23713, 23716, 23717, 23718, 23719, 23720, + 23722, 23726, 23727, 23728, 23730, 23732, 23734, 23737, 23738, 23739, + 23740, 23742, 23744, 23746, 23747, 23749, 23750, 23751, 23752, 23753, + 23754, 23756, 23757, 23758, 23759, 23760, 23761, 23763, 23764, 23765, + 23766, 23767, 23768, 23770, 23771, 23772, 23773, 23774, 23775, 23776, + 23778, 23779, 23783, 23785, 23787, 23788, 23790, 23791, 23793, 23794, + 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23804, 23805, + 23806, 23807, 23808, 23809, 23812, 23813, 23816, 23817, 23818, 23819, + 23820, 23821, 23823, 23824, 23825, 23826, 23827, 23829, 23831, 23832, + 23833, 23834, 23836, 23837, 23839, 23840, 23841, 23842, 23843, 23845, + 23848, 23850, 23851, 23852, 23855, 23856, 23857, 23858, 23859, 23861, + 23862, 23863, 23864, 23865, 23866, 23867, 23868, 23871, 23872, 23873, + 23874, 23875, 23876, 23877, 23878, 23880, 23881, 23885, 23886, 23887, + 23888, 23889, 23890, 23891, 23892, 23893, 23894, 23895, 23897, 23898, + 23900, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, + 23911, 23912, 23914, 23917, 23918, 23920, 23921, 23922, 23923, 23925, + 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, 23935, + 23936, 23937, 23939, 23940, 23941, 23942, 23943, 23944, 23945, 23946, + 23947, 23948, 23949, 23950, 23951, 23952, 23953, 23954, 23955, 23956, + 23957, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, + 23969, 23970, 23971, 23972, 23973, 23974, 23975, 23976, 23977, 23978, + 23979, 23980, 23981, 23982, 23983, 23984, 23985, 23986, 23987, 23988, + 23989, 23990, 23992, 23993, 23994, 23995, 23996, 23997, 23998, 23999, + 24000, 24001, 24002, 24003, 24004, 24006, 24007, 24008, 24009, 24010, + 24011, 24012, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24021, + 24022, 24023, 24024, 24025, 24026, 24028, 24031, 24032, 24035, 24036, + 24042, 24044, 24045, 24048, 24053, 24054, 24056, 24057, 24058, 24059, + 24060, 24063, 24064, 24068, 24071, 24073, 24074, 24075, 24077, 24078, + 24082, 24083, 24087, 24094, 24095, 24096, 24097, 24098, 24099, 24100, + 24101, 24104, 24105, 24106, 24107, 24108, 24111, 24112, 24114, 24115, + 24116, 24117, 24118, 24121, 24122, 24126, 24127, 24128, 24129, 24131, + 24134, 24135, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24144, + 24145, 24146, 24147, 24150, 24151, 24152, 24153, 24154, 24156, 24157, + 24159, 24160, 24163, 24164, 24165, 24166, 24167, 24168, 24169, 24170, + 24171, 24172, 24173, 24174, 24175, 24176, 24177, 24181, 24183, 24185, + 24190, 24193, 24194, 24195, 24197, 24200, 24201, 24204, 24205, 24206, + 24210, 24216, 24219, 24221, 24225, 24226, 24227, 24228, 24232, 24233, + 24234, 24235, 24236, 24238, 24239, 24240, 24241, 24242, 24244, 24250, + 24251, 24252, 24253, 24255, 24256, 24257, 24258, 24259, 24260, 24261, + 24262, 24263, 24264, 24267, 24268, 24269, 24270, 24271, 24272, 24276, + 24277, 24279, 24280, 24281, 24282, 24284, 24285, 24286, 24287, 24288, + 24289, 24290, 24291, 24292, 24293, 24294, 24295, 24297, 24299, 24300, + 24301, 24302, 24303, 24304, 24305, 24306, 24307, 24309, 24312, 24313, + 24315, 24316, 24317, 24325, 24326, 24327, 24329, 24332, 24333, 24334, + 24336, 24338, 24340, 24342, 24345, 24346, 24348, 24349, 24350, 24353, + 24354, 24355, 24356, 24360, 24363, 24364, 24366, 24368, 24370, 24371, + 24372, 24373, 24374, 24375, 24376, 24379, 24381, 24382, 24383, 24385, + 24386, 24387, 24388, 24389, 24390, 24391, 24392, 24393, 24394, 24395, + 24396, 24397, 24398, 24399, 24401, 24404, 24409, 24410, 24411, 24412, + 24414, 24415, 24416, 24419, 24421, 24423, 24424, 24427, 24430, 24431, + 24434, 24436, 24437, 24438, 24440, 24442, 24445, 24446, 24447, 24451, + 24454, 24461, 24462, 24463, 24465, 24467, 24468, 24470, 24474, 24475, + 24477, 24478, 24479, 24480, 24482, 24483, 24484, 24485, 24486, 24487, + 24489, 24491, 24492, 24495, 24496, 24497, 24498, 24499, 24500, 24502, + 24504, 24505, 24506, 24507, 24510, 24511, 24512, 24513, 24514, 24519, + 24520, 24522, 24523, 24526, 24531, 24532, 24533, 24538, 24539, 24540, + 24542, 24543, 24546, 24547, 24549, 24550, 24552, 24553, 24556, 24559, + 24560, 24562, 24563, 24564, 24566, 24567, 24569, 24570, 24572, 24583, + 24584, 24585, 24587, 24588, 24592, 24593, 24595, 24599, 24600, 24602, + 24606, 24607, 24610, 24611, 24612, 24620, 24621, 24622, 24624, 24625, + 24626, 24627, 24628, 24630, 24631, 24632, 24633, 24634, 24637, 24638, + 24640, 24644, 24645, 24646, 24647, 24648, 24649, 24650, 24652, 24654, + 24655, 24657, 24659, 24660, 24662, 24663, 24664, 24667, 24668, 24670, + 24671, 24672, 24673, 24677, 24678, 24686, 24689, 24690, 24692, 24693, + 24695, 24702, 24704, 24705, 24706, 24709, 24710, 24711, 24712, 24714, + 24715, 24718, 24719, 24720, 24721, 24723, 24725, 24727, 24728, 24729, + 24732, 24734, 24737, 24738, 24740, 24741, 24743, 24745, 24746, 24750, + 24752, 24755, 24757, 24758, 24759, 24761, 24762, 24765, 24766, 24767, + 24768, 24769, 24770, 24771, 24772, 24775, 24776, 24777, 24780, 24781, + 24782, 24783, 24784, 24786, 24787, 24788, 24790, 24791, 24793, 24795, + 24798, 24801, 24802, 24803, 24804, 24805, 24810, 24817, 24818, 24821, + 24823, 24824, 24827, 24828, 24829, 24830, 24831, 24834, 24835, 24836, + 24837, 24839, 24842, 24843, 24844, 24848, 24849, 24850, 24851, 24852, + 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24865, 24866, + 24869, 24872, 24873, 24874, 24876, 24877, 24878, 24879, 24880, 24881, + 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24890, 24891, + 24892, 24893, 24894, 24896, 24897, 24898, 24899, 24900, 24901, 24902, + 24903, 24905, 24907, 24909, 24911, 24912, 24914, 24915, 24916, 24918, + 24919, 24920, 24921, 24922, 24923, 24924, 24926, 24927, 24928, 24929, + 24931, 24932, 24933, 24934, 24937, 24938, 24939, 24940, 24941, 24942, + 24943, 24945, 24946, 24947, 24948, 24950, 24952, 24953, 24954, 24955, + 24956, 24957, 24958, 24959, 24960, 24961, 24962, 24963, 24964, 24965, + 24966, 24967, 24968, 24969, 24970, 24972, 24973, 24975, 24976, 24977, + 24978, 24979, 24981, 24982, 24983, 24984, 24985, 24986, 24987, 24988, + 24990, 24991, 24992, 24993, 24994, 24995, 24996, 24997, 24998, 25002, + 25003, 25005, 25006, 25007, 25008, 25009, 25010, 25011, 25012, 25013, + 25014, 25016, 25017, 25018, 25019, 25020, 25021, 25023, 25024, 25025, + 25027, 25028, 25029, 25030, 25031, 25033, 25036, 25037, 25038, 25039, + 25040, 25043, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, + 25053, 25054, 25055, 25056, 25057, 25058, 25059, 25060, 25061, 25063, + 25064, 25065, 25066, 25067, 25068, 25069, 25070, 25071, 25072, 25073, + 25074, 25075, 25076, 25078, 25079, 25080, 25081, 25082, 25083, 25084, + 25085, 25086, 25088, 25089, 25090, 25091, 25092, 25093, 25095, 25097, + 25107, 25108, 25113, 25116, 25117, 25118, 25120, 25123, 25126, 25127, + 25128, 25129, 25131, 25133, 25135, 25136, 25137, 25138, 25141, 25142, + 25144, 25145, 25146, 25147, 25148, 25154, 25156, 25157, 25158, 25162, + 25167, 25168, 25173, 25174, 25175, 25177, 25178, 25180, 25181, 25182, + 25183, 25184, 25185, 25186, 25188, 25189, 25192, 25201, 25202, 25204, + 25205, 25207, 25208, 25210, 25211, 25213, 25217, 25218, 25219, 25221, + 25222, 25223, 25224, 25227, 25228, 25229, 25230, 25231, 25232, 25236, + 25241, 25244, 25245, 25246, 25251, 25254, 25255, 25257, 25258, 25261, + 25262, 25263, 25264, 25266, 25267, 25268, 25270, 25271, 25272, 25274, + 25278, 25280, 25281, 25283, 25291, 25295, 25297, 25301, 25309, 25310, + 25312, 25313, 25316, 25322, 25323, 25328, 25330, 25333, 25336, 25337, + 25338, 25339, 25344, 25347, 25348, 25349, 25350, 25354, 25355, 25356, + 25357, 25359, 25360, 25362, 25363, 25364, 25365, 25367, 25368, 25369, + 25372, 25382, 25383, 25385, 25388, 25389, 25390, 25392, 25393, 25395, + 25396, 25397, 25398, 25399, 25400, 25403, 25404, 25406, 25407, 25408, + 25409, 25412, 25415, 25416, 25418, 25425, 25426, 25427, 25428, 25430, + 25431, 25432, 25433, 25434, 25435, 25436, 25437, 25440, 25444, 25445, + 25446, 25448, 25450, 25451, 25452, 25455, 25456, 25458, 25459, 25460, + 25461, 25464, 25465, 25468, 25469, 25470, 25471, 25473, 25475, 25476, + 25477, 25478, 25483, 25485, 25489, 25491, 25492, 25493, 25495, 25497, + 25498, 25499, 25500, 25501, 25502, 25503, 25505, 25508, 25510, 25515, + 25519, 25521, 25522, 25525, 25526, 25529, 25531, 25533, 25535, 25536, + 25537, 25538, 25539, 25541, 25543, 25544, 25546, 25547, 25548, 25553, + 25555, 25556, 25557, 25559, 25560, 25561, 25562, 25563, 25564, 25565, + 25567, 25570, 25572, 25573, 25574, 25575, 25576, 25579, 25580, 25582, + 25583, 25584, 25585, 25587, 25589, 25591, 25593, 25594, 25595, 25596, + 25598, 25603, 25604, 25606, 25607, 25608, 25609, 25610, 25613, 25614, + 25617, 25618, 25621, 25622, 25623, 25624, 25625, 25626, 25629, 25631, + 25634, 25635, 25636, 25637, 25639, 25640, 25641, 25643, 25646, 25647, + 25648, 25649, 25650, 25651, 25653, 25654, 25655, 25656, 25657, 25659, + 25660, 25662, 25664, 25666, 25667, 25673, 25675, 25676, 25677, 25678, + 25679, 25680, 25681, 25683, 25685, 25686, 25687, 25689, 25690, 25691, + 25692, 25693, 25695, 25696, 25697, 25698, 25699, 25700, 25701, 25702, + 25704, 25706, 25707, 25708, 25710, 25711, 25712, 25713, 25714, 25715, + 25716, 25717, 25718, 25719, 25723, 25724, 25725, 25726, 25727, 25728, + 25729, 25731, 25734, 25736, 25737, 25738, 25739, 25740, 25741, 25742, + 25743, 25744, 25747, 25748, 25751, 25752, 25754, 25755, 25756, 25757, + 25759, 25760, 25761, 25762, 25763, 25765, 25766, 25767, 25768, 25770, + 25771, 25775, 25777, 25778, 25779, 25780, 25782, 25785, 25787, 25789, + 25790, 25791, 25793, 25795, 25796, 25798, 25799, 25800, 25801, 25802, + 25803, 25804, 25807, 25809, 25811, 25812, 25813, 25814, 25817, 25818, + 25819, 25820, 25821, 25823, 25824, 25825, 25827, 25829, 25831, 25832, + 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, + 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25850, 25851, 25852, + 25853, 25854, 25855, 25857, 25858, 25859, 25860, 25861, 25862, 25863, + 25864, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25875, + 25876, 25877, 25878, 25879, 25881, 25882, 25883, 25884, 25885, 25886, + 25887, 25888, 25889, 25890, 25891, 25892, 25894, 25895, 25896, 25897, + 25898, 25900, 25901, 25904, 25905, 25906, 25907, 25911, 25914, 25916, + 25917, 25920, 25921, 25922, 25923, 25924, 25926, 25927, 25930, 25931, + 25933, 25934, 25936, 25938, 25939, 25940, 25943, 25944, 25946, 25948, + 25951, 25952, 25953, 25956, 25957, 25959, 25960, 25961, 25962, 25965, + 25966, 25967, 25969, 25971, 25973, 25974, 25976, 25977, 25978, 25979, + 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, + 25990, 25992, 25993, 25994, 25997, 25998, 25999, 26002, 26004, 26005, + 26006, 26008, 26010, 26013, 26014, 26016, 26018, 26019, 26022, 26024, + 26026, 26028, 26030, 26033, 26034, 26035, 26036, 26037, 26038, 26039, + 26040, 26042, 26043, 26046, 26047, 26048, 26050, 26055, 26056, 26057, + 26058, 26061, 26064, 26065, 26067, 26068, 26069, 26072, 26073, 26074, + 26075, 26076, 26077, 26078, 26079, 26081, 26083, 26084, 26090, 26091, + 26098, 26099, 26100, 26101, 26104, 26105, 26107, 26108, 26109, 26110, + 26111, 26113, 26116, 26117, 26119, 26120, 26121, 26123, 26125, 26128, + 26129, 26130, 26134, 26135, 26136, 26138, 26139, 26140, 26142, 26145, + 26146, 26147, 26148, 26150, 26153, 26154, 26155, 26156, 26158, 26160, + 26162, 26163, 26167, 26168, 26169, 26170, 26171, 26173, 26175, 26176, + 26178, 26180, 26181, 26182, 26183, 26184, 26185, 26186, 26189, 26190, + 26192, 26193, 26200, 26201, 26203, 26204, 26205, 26206, 26208, 26210, + 26211, 26213, 26215, 26217, 26218, 26219, 26220, 26221, 26225, 26226, + 26227, 26229, 26232, 26233, 26235, 26236, 26237, 26239, 26240, 26241, + 26243, 26245, 26246, 26248, 26249, 26250, 26251, 26253, 26254, 26255, + 26256, 26258, 26259, 26260, 26261, 26264, 26265, 26266, 26267, 26268, + 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26281, + 26282, 26283, 26284, 26285, 26287, 26288, 26289, 26290, 26291, 26293, + 26294, 26295, 26296, 26298, 26299, 26300, 26301, 26303, 26304, 26305, + 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, + 26316, 26317, 26318, 26319, 26320, 26321, 26322, 26323, 26324, 26325, + 26326, 26327, 26328, 26330, 26334, 26335, 26336, 26337, 26338, 26339, + 26340, 26341, 26343, 26344, 26346, 26347, 26348, 26349, 26350, 26351, + 26353, 26357, 26358, 26360, 26362, 26363, 26365, 26369, 26370, 26371, + 26372, 26373, 26374, 26375, 26380, 26382, 26383, 26385, 26386, 26387, + 26390, 26392, 26393, 26394, 26396, 26398, 26400, 26401, 26402, 26403, + 26404, 26405, 26407, 26409, 26414, 26416, 26418, 26419, 26422, 26423, + 26424, 26425, 26427, 26428, 26430, 26431, 26433, 26436, 26437, 26439, + 26442, 26443, 26445, 26450, 26452, 26453, 26455, 26456, 26457, 26458, + 26459, 26461, 26466, 26467, 26468, 26470, 26471, 26475, 26476, 26478, + 26481, 26484, 26486, 26488, 26489, 26490, 26491, 26493, 26496, 26498, + 26499, 26501, 26502, 26504, 26506, 26508, 26509, 26510, 26511, 26513, + 26514, 26515, 26516, 26518, 26521, 26523, 26527, 26528, 26529, 26532, + 26534, 26537, 26540, 26542, 26545, 26546, 26548, 26553, 26554, 26555, + 26556, 26557, 26558, 26559, 26560, 26562, 26565, 26566, 26567, 26568, + 26569, 26570, 26571, 26572, 26573, 26574, 26581, 26582, 26583, 26587, + 26591, 26593, 26595, 26596, 26598, 26599, 26600, 26602, 26603, 26605, + 26606, 26610, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, + 26622, 26625, 26626, 26627, 26628, 26630, 26637, 26640, 26642, 26644, + 26645, 26648, 26649, 26650, 26651, 26652, 26654, 26655, 26656, 26658, + 26659, 26660, 26661, 26662, 26663, 26664, 26667, 26668, 26669, 26670, + 26671, 26672, 26673, 26676, 26677, 26678, 26682, 26683, 26687, 26695, + 26699, 26701, 26703, 26706, 26710, 26711, 26712, 26713, 26714, 26715, + 26716, 26717, 26718, 26719, 26730, 26732, 26733, 26734, 26735, 26736, + 26737, 26738, 26739, 26741, 26744, 26745, 26746, 26747, 26748, 26749, + 26750, 26751, 26752, 26754, 26756, 26759, 26760, 26761, 26762, 26763, + 26764, 26765, 26766, 26768, 26769, 26770, 26772, 26773, 26774, 26776, + 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26787, + 26788, 26789, 26793, 26794, 26795, 26796, 26798, 26801, 26802, 26804, + 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, + 26817, 26819, 26820, 26821, 26822, 26823, 26824, 26826, 26828, 26830, + 26831, 26832, 26833, 26835, 26836, 26838, 26839, 26841, 26843, 26844, + 26845, 26846, 26847, 26849, 26850, 26852, 26853, 26854, 26855, 26856, + 26857, 26858, 26859, 26860, 26861, 26863, 26866, 26867, 26868, 26870, + 26871, 26872, 26875, 26877, 26878, 26879, 26880, 26882, 26883, 26884, + 26886, 26887, 26888, 26889, 26890, 26892, 26895, 26897, 26899, 26900, + 26901, 26902, 26903, 26904, 26905, 26906, 26907, 26908, 26909, 26910, + 26913, 26914, 26915, 26917, 26918, 26919, 26920, 26921, 26922, 26923, + 26924, 26926, 26927, 26929, 26930, 26931, 26933, 26934, 26935, 26936, + 26938, 26939, 26940, 26942, 26944, 26945, 26947, 26948, 26949, 26950, + 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, + 26961, 26962, 26963, 26965, 26966, 26968, 26969, 26971, 26972, 26975, + 26977, 26978, 26980, 26981, 26983, 26984, 26985, 26986, 26988, 26989, + 26991, 26992, 26994, 26995, 26996, 26997, 26998, 27002, 27003, 27005, + 27006, 27007, 27009, 27011, 27013, 27018, 27019, 27020, 27022, 27023, + 27024, 27025, 27026, 27027, 27030, 27031, 27033, 27034, 27037, 27038, + 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27049, 27050, + 27052, 27054, 27055, 27056, 27058, 27059, 27061, 27062, 27064, 27065, + 27066, 27068, 27069, 27070, 27071, 27072, 27074, 27075, 27076, 27077, + 27078, 27079, 27080, 27081, 27083, 27085, 27087, 27089, 27090, 27091, + 27093, 27094, 27095, 27096, 27097, 27098, 27100, 27101, 27102, 27105, + 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, + 27116, 27118, 27119, 27120, 27121, 27123, 27124, 27125, 27126, 27127, + 27128, 27129, 27130, 27131, 27132, 27134, 27136, 27137, 27138, 27139, + 27140, 27141, 27142, 27143, 27144, 27145, 27147, 27148, 27149, 27150, + 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27161, 27162, + 27163, 27164, 27165, 27166, 27168, 27170, 27171, 27172, 27173, 27174, + 27175, 27177, 27179, 27180, 27181, 27182, 27184, 27186, 27187, 27188, + 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27199, 27200, 27201, + 27202, 27203, 27205, 27206, 27208, 27209, 27210, 27211, 27212, 27213, + 27214, 27215, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27226, + 27228, 27229, 27230, 27231, 27232, 27234, 27235, 27236, 27238, 27239, + 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27250, + 27251, 27252, 27253, 27254, 27255, 27256, 27258, 27259, 27261, 27262, + 27263, 27265, 27266, 27267, 27269, 27270, 27271, 27272, 27273, 27274, + 27275, 27276, 27277, 27279, 27282, 27283, 27284, 27285, 27286, 27288, + 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27297, 27298, 27299, + 27300, 27301, 27302, 27303, 27304, 27306, 27309, 27310, 27311, 27312, + 27313, 27314, 27315, 27316, 27317, 27318, 27319, 27320, 27321, 27322, + 27323, 27324, 27325, 27326, 27327, 27328, 27329, 27330, 27331, 27332, + 27333, 27334, 27335, 27336, 27337, 27338, 27339, 27340, 27341, 27342, + 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, + 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, + 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, + 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27381, 27382, + 27383, 27384, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, + 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, + 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, + 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, + 27423, 27429, 27430, 27432, 27433, 27434, 27435, 27436, 27437, 27438, + 27439, 27440, 27441, 27443, 27444, 27445, 27446, 27448, 27451, 27452, + 27453, 27455, 27456, 27457, 27458, 27460, 27461, 27464, 27466, 27467, + 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, + 27479, 27480, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, + 27496, 27497, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, + 27507, 27508, 27509, 27510, 27511, 27512, 27514, 27517, 27518, 27519, + 27520, 27525, 27528, 27532, 27534, 27535, 27536, 27537, 27540, 27541, + 27543, 27544, 27545, 27548, 27549, 27550, 27551, 27552, 27554, 27555, + 27556, 27557, 27558, 27559, 27560, 27561, 27563, 27564, 27565, 27566, + 27567, 27568, 27569, 27570, 27574, 27576, 27577, 27578, 27579, 27580, + 27581, 27582, 27584, 27587, 27588, 27590, 27591, 27592, 27593, 27594, + 27596, 27598, 27600, 27601, 27608, 27610, 27612, 27613, 27614, 27615, + 27616, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27628, + 27629, 27630, 27632, 27633, 27634, 27636, 27638, 27639, 27640, 27642, + 27643, 27644, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27656, + 27657, 27658, 27659, 27660, 27662, 27666, 27671, 27676, 27677, 27678, + 27680, 27683, 27685, 27691, 27692, 27693, 27697, 27699, 27702, 27703, + 27705, 27706, 27707, 27708, 27710, 27711, 27715, 27716, 27717, 27720, + 27723, 27724, 27725, 27726, 27727, 27729, 27730, 27731, 27734, 27736, + 27737, 27738, 27746, 27747, 27749, 27750, 27751, 27755, 27756, 27757, + 27758, 27759, 27761, 27763, 27765, 27767, 27768, 27770, 27771, 27772, + 27775, 27776, 27780, 27783, 27786, 27787, 27789, 27790, 27793, 27794, + 27797, 27798, 27799, 27800, 27802, 27804, 27805, 27806, 27808, 27810, + 27816, 27820, 27823, 27824, 27828, 27829, 27830, 27831, 27834, 27840, + 27841, 27842, 27843, 27846, 27847, 27848, 27851, 27853, 27854, 27855, + 27857, 27858, 27864, 27865, 27866, 27868, 27869, 27871, 27876, 27878, + 27879, 27881, 27884, 27885, 27890, 27892, 27897, 27903, 27904, 27906, + 27907, 27909, 27910, 27912, 27913, 27914, 27917, 27919, 27920, 27921, + 27923, 27924, 27925, 27926, 27928, 27932, 27933, 27935, 27936, 27937, + 27938, 27939, 27940, 27942, 27944, 27945, 27948, 27949, 27951, 27952, + 27956, 27958, 27959, 27960, 27962, 27967, 27968, 27970, 27972, 27977, + 27980, 27984, 27989, 27990, 27991, 27992, 27995, 27997, 27999, 28001, + 28002, 28004, 28005, 28007, 28008, 28011, 28012, 28013, 28016, 28017, + 28018, 28019, 28021, 28022, 28025, 28026, 28027, 28029, 28030, 28031, + 28032, 28033, 28035, 28036, 28038, 28039, 28042, 28043, 28045, 28047, + 28048, 28050, 28054, 28055, 28056, 28057, 28058, 28060, 28066, 28069, + 28076, 28077, 28080, 28081, 28083, 28084, 28086, 28087, 28089, 28090, + 28091, 28092, 28093, 28094, 28097, 28098, 28099, 28104, 28105, 28106, + 28109, 28110, 28111, 28112, 28114, 28115, 28116, 28117, 28119, 28122, + 28123, 28124, 28127, 28130, 28131, 28133, 28135, 28136, 28137, 28138, + 28141, 28143, 28144, 28146, 28148, 28149, 28150, 28152, 28154, 28157, + 28158, 28159, 28160, 28161, 28162, 28163, 28164, 28166, 28167, 28168, + 28169, 28171, 28175, 28178, 28179, 28181, 28184, 28185, 28187, 28188, + 28190, 28191, 28194, 28198, 28199, 28200, 28202, 28204, 28206, 28208, + 28209, 28211, 28213, 28214, 28215, 28217, 28219, 28220, 28221, 28222, + 28223, 28224, 28225, 28226, 28229, 28230, 28231, 28232, 28233, 28234, + 28235, 28236, 28239, 28240, 28241, 28242, 28245, 28247, 28249, 28250, + 28252, 28253, 28254, 28256, 28257, 28258, 28259, 28260, 28261, 28262, + 28263, 28264, 28265, 28266, 28268, 28269, 28271, 28272, 28273, 28274, + 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, + 28285, 28288, 28289, 28290, 28292, 28295, 28296, 28298, 28299, 28300, + 28301, 28302, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28313, + 28314, 28315, 28317, 28318, 28320, 28321, 28323, 28324, 28326, 28328, + 28329, 28331, 28332, 28333, 28334, 28336, 28339, 28341, 28344, 28345, + 28348, 28350, 28351, 28352, 28355, 28356, 28357, 28358, 28360, 28361, + 28362, 28364, 28365, 28366, 28368, 28370, 28374, 28376, 28377, 28379, + 28380, 28381, 28387, 28391, 28394, 28395, 28396, 28397, 28398, 28399, + 28400, 28401, 28402, 28403, 28405, 28406, 28407, 28408, 28410, 28411, + 28412, 28413, 28414, 28415, 28416, 28417, 28419, 28420, 28421, 28423, + 28424, 28426, 28427, 28428, 28429, 28430, 28432, 28433, 28434, 28438, + 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28449, + 28450, 28451, 28453, 28454, 28455, 28456, 28460, 28462, 28464, 28466, + 28468, 28469, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28479, + 28480, 28481, 28482, 28483, 28484, 28485, 28488, 28489, 28490, 28492, + 28494, 28495, 28496, 28497, 28498, 28499, 28500, 28501, 28502, 28503, + 28505, 28506, 28507, 28509, 28511, 28512, 28513, 28515, 28516, 28517, + 28519, 28520, 28521, 28522, 28523, 28524, 28527, 28528, 28529, 28531, + 28533, 28534, 28535, 28537, 28539, 28541, 28542, 28543, 28544, 28545, + 28546, 28547, 28549, 28550, 28551, 28554, 28555, 28559, 28560, 28561, + 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, + 28573, 28574, 28575, 28576, 28578, 28579, 28580, 28581, 28582, 28584, + 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, + 28596, 28597, 28599, 28600, 28602, 28603, 28604, 28605, 28606, 28607, + 28609, 28611, 28612, 28613, 28614, 28615, 28616, 28618, 28619, 28620, + 28621, 28622, 28623, 28624, 28627, 28628, 28629, 28630, 28631, 28632, + 28633, 28634, 28635, 28636, 28637, 28639, 28642, 28643, 28644, 28645, + 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28656, 28657, + 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, + 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, + 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28686, 28687, + 28688, 28690, 28691, 28692, 28693, 28694, 28695, 28696, 28697, 28700, + 28701, 28702, 28703, 28704, 28705, 28706, 28708, 28709, 28710, 28711, + 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, + 28722, 28723, 28724, 28726, 28727, 28728, 28730, 28731, 28732, 28733, + 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, + 28744, 28745, 28746, 28747, 28749, 28750, 28752, 28753, 28754, 28755, + 28756, 28757, 28758, 28759, 28760, 28761, 28762, 28763, 28764, 28765, + 28767, 28768, 28769, 28770, 28771, 28772, 28773, 28774, 28775, 28776, + 28777, 28778, 28782, 28785, 28786, 28787, 28788, 28791, 28793, 28794, + 28795, 28797, 28801, 28802, 28803, 28804, 28806, 28807, 28808, 28811, + 28812, 28813, 28815, 28816, 28817, 28819, 28823, 28824, 28826, 28827, + 28830, 28831, 28832, 28833, 28834, 28835, 28836, 28837, 28838, 28839, + 28840, 28841, 28842, 28848, 28850, 28852, 28853, 28854, 28858, 28862, + 28863, 28868, 28869, 28870, 28871, 28873, 28875, 28876, 28877, 28878, + 28879, 28880, 28881, 28882, 28883, 28884, 28885, 28886, 28887, 28890, + 28892, 28893, 28894, 28896, 28897, 28898, 28899, 28901, 28906, 28910, + 28912, 28913, 28914, 28915, 28916, 28917, 28918, 28920, 28922, 28923, + 28924, 28926, 28927, 28928, 28929, 28930, 28931, 28932, 28933, 28934, + 28935, 28936, 28939, 28940, 28941, 28942, 28943, 28945, 28946, 28948, + 28951, 28955, 28956, 28957, 28958, 28959, 28960, 28961, 28962, 28963, + 28964, 28965, 28967, 28968, 28969, 28970, 28971, 28972, 28973, 28974, + 28978, 28979, 28980, 28981, 28983, 28984, 28985, 28986, 28987, 28988, + 28989, 28990, 28991, 28992, 28993, 28994, 28995, 28996, 28998, 28999, + 29000, 29001, 29003, 29005, 29007, 29008, 29009, 29010, 29011, 29012, + 29013, 29014, 29015, 29016, 29017, 29018, 29019, 29021, 29023, 29024, + 29025, 29026, 29027, 29029, 29033, 29034, 29035, 29036, 29037, 29039, + 29040, 29041, 29044, 29045, 29046, 29047, 29049, 29051, 29052, 29054, + 29055, 29056, 29057, 29058, 29059, 29061, 29062, 29063, 29064, 29065, + 29067, 29068, 29069, 29070, 29072, 29073, 29074, 29075, 29077, 29078, + 29079, 29082, 29083, 29084, 29085, 29086, 29089, 29090, 29091, 29092, + 29093, 29094, 29095, 29097, 29098, 29099, 29101, 29102, 29103, 29104, + 29105, 29106, 29108, 29110, 29111, 29112, 29114, 29115, 29116, 29117, + 29118, 29119, 29120, 29121, 29122, 29124, 29125, 29126, 29127, 29128, + 29129, 29130, 29131, 29132, 29133, 29135, 29136, 29137, 29138, 29139, + 29142, 29143, 29144, 29145, 29146, 29147, 29148, 29149, 29150, 29151, + 29153, 29154, 29155, 29156, 29158, 29160, 29161, 29162, 29163, 29164, + 29165, 29167, 29168, 29169, 29170, 29171, 29172, 29173, 29174, 29175, + 29176, 29178, 29179, 29180, 29181, 29182, 29183, 29184, 29185, 29186, + 29187, 29188, 29189, 29191, 29192, 29193, 29194, 29195, 29196, 29197, + 29198, 29199, 29200, 29201, 29202, 29203, 29204, 29205, 29206, 29207, + 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, + 29219, 29220, 29221, 29222, 29223, 29225, 29227, 29229, 29230, 29231, + 29234, 29235, 29236, 29242, 29244, 29246, 29248, 29249, 29250, 29251, + 29252, 29253, 29254, 29257, 29258, 29259, 29262, 29263, 29264, 29265, + 29267, 29268, 29269, 29271, 29272, 29274, 29276, 29278, 29280, 29283, + 29284, 29285, 29288, 29290, 29291, 29292, 29293, 29296, 29297, 29299, + 29300, 29302, 29303, 29304, 29307, 29308, 29309, 29314, 29315, 29317, + 29318, 29319, 29320, 29321, 29324, 29326, 29328, 29329, 29331, 29332, + 29333, 29334, 29335, 29336, 29337, 29338, 29339, 29340, 29341, 29342, + 29344, 29345, 29346, 29347, 29348, 29349, 29350, 29351, 29352, 29353, + 29354, 29355, 29358, 29361, 29362, 29363, 29365, 29370, 29371, 29372, + 29373, 29374, 29375, 29376, 29381, 29382, 29383, 29385, 29386, 29387, + 29388, 29391, 29393, 29395, 29396, 29397, 29398, 29400, 29402, 29403, + 58566, 58567, 58568, 58569, 58570, 58571, 58572, 58573, 58574, 58575, + 58576, 58577, 58578, 58579, 58580, 58581, 58582, 58583, 58584, 58585, + 58586, 58587, 58588, 58589, 58590, 58591, 58592, 58593, 58594, 58595, + 58596, 58597, 58598, 58599, 58600, 58601, 58602, 58603, 58604, 58605, + 58606, 58607, 58608, 58609, 58610, 58611, 58612, 58613, 58614, 58615, + 58616, 58617, 58618, 58619, 58620, 58621, 58622, 58623, 58624, 58625, + 58626, 58627, 58628, 58629, 58630, 58631, 58632, 58633, 58634, 58635, + 58636, 58637, 58638, 58639, 58640, 58641, 58642, 58643, 58644, 58645, + 58646, 58647, 58648, 58649, 58650, 58651, 58652, 58653, 58654, 58655, + 58656, 58657, 58658, 58659, 58660, 58661, 12288, 12289, 12290, 183, + 713, 711, 168, 12291, 12293, 8212, 65374, 8214, 8230, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12310, 12311, 12304, 12305, 177, 215, 247, + 8758, 8743, 8744, 8721, 8719, 8746, 8745, 8712, 8759, 8730, + 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, 8780, 8776, + 8765, 8733, 8800, 8814, 8815, 8804, 8805, 8734, 8757, 8756, + 9794, 9792, 176, 8242, 8243, 8451, 65284, 164, 65504, 65505, + 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, + 9633, 9632, 9651, 9650, 8251, 8594, 8592, 8593, 8595, 12307, + 58662, 58663, 58664, 58665, 58666, 58667, 58668, 58669, 58670, 58671, + 58672, 58673, 58674, 58675, 58676, 58677, 58678, 58679, 58680, 58681, + 58682, 58683, 58684, 58685, 58686, 58687, 58688, 58689, 58690, 58691, + 58692, 58693, 58694, 58695, 58696, 58697, 58698, 58699, 58700, 58701, + 58702, 58703, 58704, 58705, 58706, 58707, 58708, 58709, 58710, 58711, + 58712, 58713, 58714, 58715, 58716, 58717, 58718, 58719, 58720, 58721, + 58722, 58723, 58724, 58725, 58726, 58727, 58728, 58729, 58730, 58731, + 58732, 58733, 58734, 58735, 58736, 58737, 58738, 58739, 58740, 58741, + 58742, 58743, 58744, 58745, 58746, 58747, 58748, 58749, 58750, 58751, + 58752, 58753, 58754, 58755, 58756, 58757, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 59238, 59239, 59240, 59241, + 59242, 59243, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, + 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, + 9370, 9371, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, + 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, + 9350, 9351, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, + 9320, 9321, 8364, 59245, 12832, 12833, 12834, 12835, 12836, 12837, + 12838, 12839, 12840, 12841, 59246, 59247, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 59248, 59249, + 58758, 58759, 58760, 58761, 58762, 58763, 58764, 58765, 58766, 58767, + 58768, 58769, 58770, 58771, 58772, 58773, 58774, 58775, 58776, 58777, + 58778, 58779, 58780, 58781, 58782, 58783, 58784, 58785, 58786, 58787, + 58788, 58789, 58790, 58791, 58792, 58793, 58794, 58795, 58796, 58797, + 58798, 58799, 58800, 58801, 58802, 58803, 58804, 58805, 58806, 58807, + 58808, 58809, 58810, 58811, 58812, 58813, 58814, 58815, 58816, 58817, + 58818, 58819, 58820, 58821, 58822, 58823, 58824, 58825, 58826, 58827, + 58828, 58829, 58830, 58831, 58832, 58833, 58834, 58835, 58836, 58837, + 58838, 58839, 58840, 58841, 58842, 58843, 58844, 58845, 58846, 58847, + 58848, 58849, 58850, 58851, 58852, 12288, 65281, 65282, 65283, 65509, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 58854, 58855, 58856, 58857, 58858, 58859, 58860, 58861, 58862, 58863, + 58864, 58865, 58866, 58867, 58868, 58869, 58870, 58871, 58872, 58873, + 58874, 58875, 58876, 58877, 58878, 58879, 58880, 58881, 58882, 58883, + 58884, 58885, 58886, 58887, 58888, 58889, 58890, 58891, 58892, 58893, + 58894, 58895, 58896, 58897, 58898, 58899, 58900, 58901, 58902, 58903, + 58904, 58905, 58906, 58907, 58908, 58909, 58910, 58911, 58912, 58913, + 58914, 58915, 58916, 58917, 58918, 58919, 58920, 58921, 58922, 58923, + 58924, 58925, 58926, 58927, 58928, 58929, 58930, 58931, 58932, 58933, + 58934, 58935, 58936, 58937, 58938, 58939, 58940, 58941, 58942, 58943, + 58944, 58945, 58946, 58947, 58948, 58949, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 59250, + 59251, 59252, 59253, 59254, 59255, 59256, 59257, 59258, 59259, 59260, + 58950, 58951, 58952, 58953, 58954, 58955, 58956, 58957, 58958, 58959, + 58960, 58961, 58962, 58963, 58964, 58965, 58966, 58967, 58968, 58969, + 58970, 58971, 58972, 58973, 58974, 58975, 58976, 58977, 58978, 58979, + 58980, 58981, 58982, 58983, 58984, 58985, 58986, 58987, 58988, 58989, + 58990, 58991, 58992, 58993, 58994, 58995, 58996, 58997, 58998, 58999, + 59000, 59001, 59002, 59003, 59004, 59005, 59006, 59007, 59008, 59009, + 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59017, 59018, 59019, + 59020, 59021, 59022, 59023, 59024, 59025, 59026, 59027, 59028, 59029, + 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, 59038, 59039, + 59040, 59041, 59042, 59043, 59044, 59045, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 59261, 59262, 59263, 59264, 59265, 59266, 59267, 59268, + 59046, 59047, 59048, 59049, 59050, 59051, 59052, 59053, 59054, 59055, + 59056, 59057, 59058, 59059, 59060, 59061, 59062, 59063, 59064, 59065, + 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, 59074, 59075, + 59076, 59077, 59078, 59079, 59080, 59081, 59082, 59083, 59084, 59085, + 59086, 59087, 59088, 59089, 59090, 59091, 59092, 59093, 59094, 59095, + 59096, 59097, 59098, 59099, 59100, 59101, 59102, 59103, 59104, 59105, + 59106, 59107, 59108, 59109, 59110, 59111, 59112, 59113, 59114, 59115, + 59116, 59117, 59118, 59119, 59120, 59121, 59122, 59123, 59124, 59125, + 59126, 59127, 59128, 59129, 59130, 59131, 59132, 59133, 59134, 59135, + 59136, 59137, 59138, 59139, 59140, 59141, 913, 914, 915, 916, + 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 59269, 59270, 59271, 59272, 59273, 59274, 59275, 59276, 945, 946, + 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, + 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, + 968, 969, 59277, 59278, 59279, 59280, 59281, 59282, 59283, 65077, + 65078, 65081, 65082, 65087, 65088, 65085, 65086, 65089, 65090, 65091, + 65092, 59284, 59285, 65083, 65084, 65079, 65080, 65073, 59286, 65075, + 65076, 59287, 59288, 59289, 59290, 59291, 59292, 59293, 59294, 59295, + 59142, 59143, 59144, 59145, 59146, 59147, 59148, 59149, 59150, 59151, + 59152, 59153, 59154, 59155, 59156, 59157, 59158, 59159, 59160, 59161, + 59162, 59163, 59164, 59165, 59166, 59167, 59168, 59169, 59170, 59171, + 59172, 59173, 59174, 59175, 59176, 59177, 59178, 59179, 59180, 59181, + 59182, 59183, 59184, 59185, 59186, 59187, 59188, 59189, 59190, 59191, + 59192, 59193, 59194, 59195, 59196, 59197, 59198, 59199, 59200, 59201, + 59202, 59203, 59204, 59205, 59206, 59207, 59208, 59209, 59210, 59211, + 59212, 59213, 59214, 59215, 59216, 59217, 59218, 59219, 59220, 59221, + 59222, 59223, 59224, 59225, 59226, 59227, 59228, 59229, 59230, 59231, + 59232, 59233, 59234, 59235, 59236, 59237, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 59296, + 59297, 59298, 59299, 59300, 59301, 59302, 59303, 59304, 59305, 59306, + 59307, 59308, 59309, 59310, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 59311, 59312, 59313, + 59314, 59315, 59316, 59317, 59318, 59319, 59320, 59321, 59322, 59323, + 714, 715, 729, 8211, 8213, 8229, 8245, 8453, 8457, 8598, + 8599, 8600, 8601, 8725, 8735, 8739, 8786, 8806, 8807, 8895, + 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, + 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, + 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, + 9582, 9583, 9584, 9585, 9586, 9587, 9601, 9602, 9603, 9604, + 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, 9614, + 9615, 9619, 9620, 9621, 9660, 9661, 9698, 9699, 9700, 9701, + 9737, 8853, 12306, 12317, 12318, 59324, 59325, 59326, 59327, 59328, + 59329, 59330, 59331, 59332, 59333, 59334, 257, 225, 462, 224, + 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, + 466, 242, 363, 250, 468, 249, 470, 472, 474, 476, + 252, 234, 593, 7743, 324, 328, 505, 609, 59337, 59338, + 59339, 59340, 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, + 12557, 12558, 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, + 12567, 12568, 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, + 12577, 12578, 12579, 12580, 12581, 12582, 12583, 12584, 12585, 59341, + 59342, 59343, 59344, 59345, 59346, 59347, 59348, 59349, 59350, 59351, + 59352, 59353, 59354, 59355, 59356, 59357, 59358, 59359, 59360, 59361, + 12321, 12322, 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12963, + 13198, 13199, 13212, 13213, 13214, 13217, 13252, 13262, 13265, 13266, + 13269, 65072, 65506, 65508, 59362, 8481, 12849, 59363, 8208, 59364, + 59365, 59366, 12540, 12443, 12444, 12541, 12542, 12294, 12445, 12446, + 65097, 65098, 65099, 65100, 65101, 65102, 65103, 65104, 65105, 65106, + 65108, 65109, 65110, 65111, 65113, 65114, 65115, 65116, 65117, 65118, + 65119, 65120, 65121, 65122, 65123, 65124, 65125, 65126, 65128, 65129, + 65130, 65131, 12350, 12272, 12273, 12274, 12275, 12276, 12277, 12278, + 12279, 12280, 12281, 12282, 12283, 12295, 59380, 59381, 59382, 59383, + 59384, 59385, 59386, 59387, 59388, 59389, 59390, 59391, 59392, 9472, + 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, + 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, + 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, + 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, + 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, + 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, + 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 9547, 59393, 59394, 59395, 59396, 59397, + 59398, 59399, 59400, 59401, 59402, 59403, 59404, 59405, 59406, 59407, + 29404, 29405, 29407, 29410, 29411, 29412, 29413, 29414, 29415, 29418, + 29419, 29429, 29430, 29433, 29437, 29438, 29439, 29440, 29442, 29444, + 29445, 29446, 29447, 29448, 29449, 29451, 29452, 29453, 29455, 29456, + 29457, 29458, 29460, 29464, 29465, 29466, 29471, 29472, 29475, 29476, + 29478, 29479, 29480, 29485, 29487, 29488, 29490, 29491, 29493, 29494, + 29498, 29499, 29500, 29501, 29504, 29505, 29506, 29507, 29508, 29509, + 29510, 29511, 29512, 29513, 29514, 29515, 29516, 29518, 29519, 29521, + 29523, 29524, 29525, 29526, 29528, 29529, 29530, 29531, 29532, 29533, + 29534, 29535, 29537, 29538, 29539, 29540, 29541, 29542, 29543, 29544, + 29545, 29546, 29547, 29550, 29552, 29553, 57344, 57345, 57346, 57347, + 57348, 57349, 57350, 57351, 57352, 57353, 57354, 57355, 57356, 57357, + 57358, 57359, 57360, 57361, 57362, 57363, 57364, 57365, 57366, 57367, + 57368, 57369, 57370, 57371, 57372, 57373, 57374, 57375, 57376, 57377, + 57378, 57379, 57380, 57381, 57382, 57383, 57384, 57385, 57386, 57387, + 57388, 57389, 57390, 57391, 57392, 57393, 57394, 57395, 57396, 57397, + 57398, 57399, 57400, 57401, 57402, 57403, 57404, 57405, 57406, 57407, + 57408, 57409, 57410, 57411, 57412, 57413, 57414, 57415, 57416, 57417, + 57418, 57419, 57420, 57421, 57422, 57423, 57424, 57425, 57426, 57427, + 57428, 57429, 57430, 57431, 57432, 57433, 57434, 57435, 57436, 57437, + 29554, 29555, 29556, 29557, 29558, 29559, 29560, 29561, 29562, 29563, + 29564, 29565, 29567, 29568, 29569, 29570, 29571, 29573, 29574, 29576, + 29578, 29580, 29581, 29583, 29584, 29586, 29587, 29588, 29589, 29591, + 29592, 29593, 29594, 29596, 29597, 29598, 29600, 29601, 29603, 29604, + 29605, 29606, 29607, 29608, 29610, 29612, 29613, 29617, 29620, 29621, + 29622, 29624, 29625, 29628, 29629, 29630, 29631, 29633, 29635, 29636, + 29637, 29638, 29639, 29643, 29644, 29646, 29650, 29651, 29652, 29653, + 29654, 29655, 29656, 29658, 29659, 29660, 29661, 29663, 29665, 29666, + 29667, 29668, 29670, 29672, 29674, 29675, 29676, 29678, 29679, 29680, + 29681, 29683, 29684, 29685, 29686, 29687, 57438, 57439, 57440, 57441, + 57442, 57443, 57444, 57445, 57446, 57447, 57448, 57449, 57450, 57451, + 57452, 57453, 57454, 57455, 57456, 57457, 57458, 57459, 57460, 57461, + 57462, 57463, 57464, 57465, 57466, 57467, 57468, 57469, 57470, 57471, + 57472, 57473, 57474, 57475, 57476, 57477, 57478, 57479, 57480, 57481, + 57482, 57483, 57484, 57485, 57486, 57487, 57488, 57489, 57490, 57491, + 57492, 57493, 57494, 57495, 57496, 57497, 57498, 57499, 57500, 57501, + 57502, 57503, 57504, 57505, 57506, 57507, 57508, 57509, 57510, 57511, + 57512, 57513, 57514, 57515, 57516, 57517, 57518, 57519, 57520, 57521, + 57522, 57523, 57524, 57525, 57526, 57527, 57528, 57529, 57530, 57531, + 29688, 29689, 29690, 29691, 29692, 29693, 29694, 29695, 29696, 29697, + 29698, 29700, 29703, 29704, 29707, 29708, 29709, 29710, 29713, 29714, + 29715, 29716, 29717, 29718, 29719, 29720, 29721, 29724, 29725, 29726, + 29727, 29728, 29729, 29731, 29732, 29735, 29737, 29739, 29741, 29743, + 29745, 29746, 29751, 29752, 29753, 29754, 29755, 29757, 29758, 29759, + 29760, 29762, 29763, 29764, 29765, 29766, 29767, 29768, 29769, 29770, + 29771, 29772, 29773, 29774, 29775, 29776, 29777, 29778, 29779, 29780, + 29782, 29784, 29789, 29792, 29793, 29794, 29795, 29796, 29797, 29798, + 29799, 29800, 29801, 29802, 29803, 29804, 29806, 29807, 29809, 29810, + 29811, 29812, 29813, 29816, 29817, 29818, 57532, 57533, 57534, 57535, + 57536, 57537, 57538, 57539, 57540, 57541, 57542, 57543, 57544, 57545, + 57546, 57547, 57548, 57549, 57550, 57551, 57552, 57553, 57554, 57555, + 57556, 57557, 57558, 57559, 57560, 57561, 57562, 57563, 57564, 57565, + 57566, 57567, 57568, 57569, 57570, 57571, 57572, 57573, 57574, 57575, + 57576, 57577, 57578, 57579, 57580, 57581, 57582, 57583, 57584, 57585, + 57586, 57587, 57588, 57589, 57590, 57591, 57592, 57593, 57594, 57595, + 57596, 57597, 57598, 57599, 57600, 57601, 57602, 57603, 57604, 57605, + 57606, 57607, 57608, 57609, 57610, 57611, 57612, 57613, 57614, 57615, + 57616, 57617, 57618, 57619, 57620, 57621, 57622, 57623, 57624, 57625, + 29819, 29820, 29821, 29823, 29826, 29828, 29829, 29830, 29832, 29833, + 29834, 29836, 29837, 29839, 29841, 29842, 29843, 29844, 29845, 29846, + 29847, 29848, 29849, 29850, 29851, 29853, 29855, 29856, 29857, 29858, + 29859, 29860, 29861, 29862, 29866, 29867, 29868, 29869, 29870, 29871, + 29872, 29873, 29874, 29875, 29876, 29877, 29878, 29879, 29880, 29881, + 29883, 29884, 29885, 29886, 29887, 29888, 29889, 29890, 29891, 29892, + 29893, 29894, 29895, 29896, 29897, 29898, 29899, 29900, 29901, 29902, + 29903, 29904, 29905, 29907, 29908, 29909, 29910, 29911, 29912, 29913, + 29914, 29915, 29917, 29919, 29921, 29925, 29927, 29928, 29929, 29930, + 29931, 29932, 29933, 29936, 29937, 29938, 57626, 57627, 57628, 57629, + 57630, 57631, 57632, 57633, 57634, 57635, 57636, 57637, 57638, 57639, + 57640, 57641, 57642, 57643, 57644, 57645, 57646, 57647, 57648, 57649, + 57650, 57651, 57652, 57653, 57654, 57655, 57656, 57657, 57658, 57659, + 57660, 57661, 57662, 57663, 57664, 57665, 57666, 57667, 57668, 57669, + 57670, 57671, 57672, 57673, 57674, 57675, 57676, 57677, 57678, 57679, + 57680, 57681, 57682, 57683, 57684, 57685, 57686, 57687, 57688, 57689, + 57690, 57691, 57692, 57693, 57694, 57695, 57696, 57697, 57698, 57699, + 57700, 57701, 57702, 57703, 57704, 57705, 57706, 57707, 57708, 57709, + 57710, 57711, 57712, 57713, 57714, 57715, 57716, 57717, 57718, 57719, + 29939, 29941, 29944, 29945, 29946, 29947, 29948, 29949, 29950, 29952, + 29953, 29954, 29955, 29957, 29958, 29959, 29960, 29961, 29962, 29963, + 29964, 29966, 29968, 29970, 29972, 29973, 29974, 29975, 29979, 29981, + 29982, 29984, 29985, 29986, 29987, 29988, 29990, 29991, 29994, 29998, + 30004, 30006, 30009, 30012, 30013, 30015, 30017, 30018, 30019, 30020, + 30022, 30023, 30025, 30026, 30029, 30032, 30033, 30034, 30035, 30037, + 30038, 30039, 30040, 30045, 30046, 30047, 30048, 30049, 30050, 30051, + 30052, 30055, 30056, 30057, 30059, 30060, 30061, 30062, 30063, 30064, + 30065, 30067, 30069, 30070, 30071, 30074, 30075, 30076, 30077, 30078, + 30080, 30081, 30082, 30084, 30085, 30087, 57720, 57721, 57722, 57723, + 57724, 57725, 57726, 57727, 57728, 57729, 57730, 57731, 57732, 57733, + 57734, 57735, 57736, 57737, 57738, 57739, 57740, 57741, 57742, 57743, + 57744, 57745, 57746, 57747, 57748, 57749, 57750, 57751, 57752, 57753, + 57754, 57755, 57756, 57757, 57758, 57759, 57760, 57761, 57762, 57763, + 57764, 57765, 57766, 57767, 57768, 57769, 57770, 57771, 57772, 57773, + 57774, 57775, 57776, 57777, 57778, 57779, 57780, 57781, 57782, 57783, + 57784, 57785, 57786, 57787, 57788, 57789, 57790, 57791, 57792, 57793, + 57794, 57795, 57796, 57797, 57798, 57799, 57800, 57801, 57802, 57803, + 57804, 57805, 57806, 57807, 57808, 57809, 57810, 57811, 57812, 57813, + 30088, 30089, 30090, 30092, 30093, 30094, 30096, 30099, 30101, 30104, + 30107, 30108, 30110, 30114, 30118, 30119, 30120, 30121, 30122, 30125, + 30134, 30135, 30138, 30139, 30143, 30144, 30145, 30150, 30155, 30156, + 30158, 30159, 30160, 30161, 30163, 30167, 30169, 30170, 30172, 30173, + 30175, 30176, 30177, 30181, 30185, 30188, 30189, 30190, 30191, 30194, + 30195, 30197, 30198, 30199, 30200, 30202, 30203, 30205, 30206, 30210, + 30212, 30214, 30215, 30216, 30217, 30219, 30221, 30222, 30223, 30225, + 30226, 30227, 30228, 30230, 30234, 30236, 30237, 30238, 30241, 30243, + 30247, 30248, 30252, 30254, 30255, 30257, 30258, 30262, 30263, 30265, + 30266, 30267, 30269, 30273, 30274, 30276, 57814, 57815, 57816, 57817, + 57818, 57819, 57820, 57821, 57822, 57823, 57824, 57825, 57826, 57827, + 57828, 57829, 57830, 57831, 57832, 57833, 57834, 57835, 57836, 57837, + 57838, 57839, 57840, 57841, 57842, 57843, 57844, 57845, 57846, 57847, + 57848, 57849, 57850, 57851, 57852, 57853, 57854, 57855, 57856, 57857, + 57858, 57859, 57860, 57861, 57862, 57863, 57864, 57865, 57866, 57867, + 57868, 57869, 57870, 57871, 57872, 57873, 57874, 57875, 57876, 57877, + 57878, 57879, 57880, 57881, 57882, 57883, 57884, 57885, 57886, 57887, + 57888, 57889, 57890, 57891, 57892, 57893, 57894, 57895, 57896, 57897, + 57898, 57899, 57900, 57901, 57902, 57903, 57904, 57905, 57906, 57907, + 30277, 30278, 30279, 30280, 30281, 30282, 30283, 30286, 30287, 30288, + 30289, 30290, 30291, 30293, 30295, 30296, 30297, 30298, 30299, 30301, + 30303, 30304, 30305, 30306, 30308, 30309, 30310, 30311, 30312, 30313, + 30314, 30316, 30317, 30318, 30320, 30321, 30322, 30323, 30324, 30325, + 30326, 30327, 30329, 30330, 30332, 30335, 30336, 30337, 30339, 30341, + 30345, 30346, 30348, 30349, 30351, 30352, 30354, 30356, 30357, 30359, + 30360, 30362, 30363, 30364, 30365, 30366, 30367, 30368, 30369, 30370, + 30371, 30373, 30374, 30375, 30376, 30377, 30378, 30379, 30380, 30381, + 30383, 30384, 30387, 30389, 30390, 30391, 30392, 30393, 30394, 30395, + 30396, 30397, 30398, 30400, 30401, 30403, 21834, 38463, 22467, 25384, + 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, 29233, + 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, 26696, + 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, 22885, + 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, 20843, 30116, + 24052, 25300, 36299, 38774, 25226, 32793, 22365, 38712, 32610, 29240, + 30333, 26575, 30334, 25670, 20336, 36133, 25308, 31255, 26001, 29677, + 25644, 25203, 33324, 39041, 26495, 29256, 25198, 25292, 20276, 29923, + 21322, 21150, 32458, 37030, 24110, 26758, 27036, 33152, 32465, 26834, + 30917, 34444, 38225, 20621, 35876, 33502, 32990, 21253, 35090, 21093, + 30404, 30407, 30409, 30411, 30412, 30419, 30421, 30425, 30426, 30428, + 30429, 30430, 30432, 30433, 30434, 30435, 30436, 30438, 30439, 30440, + 30441, 30442, 30443, 30444, 30445, 30448, 30451, 30453, 30454, 30455, + 30458, 30459, 30461, 30463, 30464, 30466, 30467, 30469, 30470, 30474, + 30476, 30478, 30479, 30480, 30481, 30482, 30483, 30484, 30485, 30486, + 30487, 30488, 30491, 30492, 30493, 30494, 30497, 30499, 30500, 30501, + 30503, 30506, 30507, 30508, 30510, 30512, 30513, 30514, 30515, 30516, + 30521, 30523, 30525, 30526, 30527, 30530, 30532, 30533, 30534, 30536, + 30537, 30538, 30539, 30540, 30541, 30542, 30543, 30546, 30547, 30548, + 30549, 30550, 30551, 30552, 30553, 30556, 34180, 38649, 20445, 22561, + 39281, 23453, 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, + 24754, 21329, 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, + 24811, 28953, 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, + 27893, 36454, 36856, 36924, 40763, 27604, 37145, 31508, 24444, 30887, + 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, + 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, + 36140, 25153, 20415, 21464, 21342, 36776, 36777, 36779, 36941, 26631, + 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, + 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, + 30557, 30558, 30559, 30560, 30564, 30567, 30569, 30570, 30573, 30574, + 30575, 30576, 30577, 30578, 30579, 30580, 30581, 30582, 30583, 30584, + 30586, 30587, 30588, 30593, 30594, 30595, 30598, 30599, 30600, 30601, + 30602, 30603, 30607, 30608, 30611, 30612, 30613, 30614, 30615, 30616, + 30617, 30618, 30619, 30620, 30621, 30622, 30625, 30627, 30628, 30630, + 30632, 30635, 30637, 30638, 30639, 30641, 30642, 30644, 30646, 30647, + 30648, 30649, 30650, 30652, 30654, 30656, 30657, 30658, 30659, 30660, + 30661, 30662, 30663, 30664, 30665, 30666, 30667, 30668, 30670, 30671, + 30672, 30673, 30674, 30675, 30676, 30677, 30678, 30680, 30681, 30682, + 30685, 30686, 30687, 30688, 30689, 30692, 30149, 24182, 29627, 33760, + 25773, 25320, 38069, 27874, 21338, 21187, 25615, 38082, 31636, 20271, + 24091, 33334, 33046, 33162, 28196, 27850, 39539, 25429, 21340, 21754, + 34917, 22496, 19981, 24067, 27493, 31807, 37096, 24598, 25830, 29468, + 35009, 26448, 25165, 36130, 30572, 36393, 37319, 24425, 33756, 34081, + 39184, 21442, 34453, 27531, 24813, 24808, 28799, 33485, 33329, 20179, + 27815, 34255, 25805, 31961, 27133, 26361, 33609, 21397, 31574, 20391, + 20876, 27979, 23618, 36461, 25554, 21449, 33580, 33590, 26597, 30900, + 25661, 23519, 23700, 24046, 35815, 25286, 26612, 35962, 25600, 25530, + 34633, 39307, 35863, 32544, 38130, 20135, 38416, 39076, 26124, 29462, + 30694, 30696, 30698, 30703, 30704, 30705, 30706, 30708, 30709, 30711, + 30713, 30714, 30715, 30716, 30723, 30724, 30725, 30726, 30727, 30728, + 30730, 30731, 30734, 30735, 30736, 30739, 30741, 30745, 30747, 30750, + 30752, 30753, 30754, 30756, 30760, 30762, 30763, 30766, 30767, 30769, + 30770, 30771, 30773, 30774, 30781, 30783, 30785, 30786, 30787, 30788, + 30790, 30792, 30793, 30794, 30795, 30797, 30799, 30801, 30803, 30804, + 30808, 30809, 30810, 30811, 30812, 30814, 30815, 30816, 30817, 30818, + 30819, 30820, 30821, 30822, 30823, 30824, 30825, 30831, 30832, 30833, + 30834, 30835, 30836, 30837, 30838, 30840, 30841, 30842, 30843, 30845, + 30846, 30847, 30848, 30849, 30850, 30851, 22330, 23581, 24120, 38271, + 20607, 32928, 21378, 25950, 30021, 21809, 20513, 36229, 25220, 38046, + 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, + 24443, 28552, 37108, 33251, 36784, 23576, 26216, 24561, 27785, 38472, + 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, 20056, 31243, + 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, 30196, 25345, + 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, 23610, 36196, + 32709, 26021, 28861, 20805, 20914, 34411, 23815, 23456, 25277, 37228, + 30068, 36364, 31264, 24833, 31609, 20167, 32504, 30597, 19985, 33261, + 21021, 20986, 27249, 21416, 36487, 38148, 38607, 28353, 38500, 26970, + 30852, 30853, 30854, 30856, 30858, 30859, 30863, 30864, 30866, 30868, + 30869, 30870, 30873, 30877, 30878, 30880, 30882, 30884, 30886, 30888, + 30889, 30890, 30891, 30892, 30893, 30894, 30895, 30901, 30902, 30903, + 30904, 30906, 30907, 30908, 30909, 30911, 30912, 30914, 30915, 30916, + 30918, 30919, 30920, 30924, 30925, 30926, 30927, 30929, 30930, 30931, + 30934, 30935, 30936, 30938, 30939, 30940, 30941, 30942, 30943, 30944, + 30945, 30946, 30947, 30948, 30949, 30950, 30951, 30953, 30954, 30955, + 30957, 30958, 30959, 30960, 30961, 30963, 30965, 30966, 30968, 30969, + 30971, 30972, 30973, 30974, 30975, 30976, 30978, 30979, 30980, 30982, + 30983, 30984, 30985, 30986, 30987, 30988, 30784, 20648, 30679, 25616, + 35302, 22788, 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, + 30126, 31383, 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, + 22402, 26149, 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, + 30133, 33576, 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, + 36176, 27425, 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, + 37259, 31751, 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, + 30209, 31929, 28140, 32736, 26449, 23384, 23544, 30923, 25774, 25619, + 25514, 25387, 38169, 25645, 36798, 31572, 30249, 25171, 22823, 21574, + 27513, 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, 36910, + 30989, 30990, 30991, 30992, 30993, 30994, 30996, 30997, 30998, 30999, + 31000, 31001, 31002, 31003, 31004, 31005, 31007, 31008, 31009, 31010, + 31011, 31013, 31014, 31015, 31016, 31017, 31018, 31019, 31020, 31021, + 31022, 31023, 31024, 31025, 31026, 31027, 31029, 31030, 31031, 31032, + 31033, 31037, 31039, 31042, 31043, 31044, 31045, 31047, 31050, 31051, + 31052, 31053, 31054, 31055, 31056, 31057, 31058, 31060, 31061, 31064, + 31065, 31073, 31075, 31076, 31078, 31081, 31082, 31083, 31084, 31086, + 31088, 31089, 31090, 31091, 31092, 31093, 31094, 31097, 31099, 31100, + 31101, 31102, 31103, 31106, 31107, 31110, 31111, 31112, 31113, 31115, + 31116, 31117, 31118, 31120, 31121, 31122, 24608, 32829, 25285, 20025, + 21333, 37112, 25528, 32966, 26086, 27694, 20294, 24814, 28129, 35806, + 24377, 34507, 24403, 25377, 20826, 33633, 26723, 20992, 25443, 36424, + 20498, 23707, 31095, 23548, 21040, 31291, 24764, 36947, 30423, 24503, + 24471, 30340, 36460, 28783, 30331, 31561, 30634, 20979, 37011, 22564, + 20302, 28404, 36842, 25932, 31515, 29380, 28068, 32735, 23265, 25269, + 24213, 22320, 33922, 31532, 24093, 24351, 36882, 32532, 39072, 25474, + 28359, 30872, 28857, 20856, 38747, 22443, 30005, 20291, 30008, 24215, + 24806, 22880, 28096, 27583, 30857, 21500, 38613, 20939, 20993, 25481, + 21514, 38035, 35843, 36300, 29241, 30879, 34678, 36845, 35853, 21472, + 31123, 31124, 31125, 31126, 31127, 31128, 31129, 31131, 31132, 31133, + 31134, 31135, 31136, 31137, 31138, 31139, 31140, 31141, 31142, 31144, + 31145, 31146, 31147, 31148, 31149, 31150, 31151, 31152, 31153, 31154, + 31156, 31157, 31158, 31159, 31160, 31164, 31167, 31170, 31172, 31173, + 31175, 31176, 31178, 31180, 31182, 31183, 31184, 31187, 31188, 31190, + 31191, 31193, 31194, 31195, 31196, 31197, 31198, 31200, 31201, 31202, + 31205, 31208, 31210, 31212, 31214, 31217, 31218, 31219, 31220, 31221, + 31222, 31223, 31225, 31226, 31228, 31230, 31231, 31233, 31236, 31237, + 31239, 31240, 31241, 31242, 31244, 31247, 31248, 31249, 31250, 31251, + 31253, 31254, 31256, 31257, 31259, 31260, 19969, 30447, 21486, 38025, + 39030, 40718, 38189, 23450, 35746, 20002, 19996, 20908, 33891, 25026, + 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, 26007, 38497, + 35910, 36887, 30168, 37117, 30563, 27602, 29322, 29420, 35835, 22581, + 30585, 36172, 26460, 38208, 32922, 24230, 28193, 22930, 31471, 30701, + 38203, 27573, 26029, 32526, 22534, 20817, 38431, 23545, 22697, 21544, + 36466, 25958, 39039, 22244, 38045, 30462, 36929, 25479, 21702, 22810, + 22842, 22427, 36530, 26421, 36346, 33333, 21057, 24816, 22549, 34558, + 23784, 40517, 20420, 39069, 35769, 23077, 24694, 21380, 25212, 36943, + 37122, 39295, 24681, 32780, 20799, 32819, 23572, 39285, 27953, 20108, + 31261, 31263, 31265, 31266, 31268, 31269, 31270, 31271, 31272, 31273, + 31274, 31275, 31276, 31277, 31278, 31279, 31280, 31281, 31282, 31284, + 31285, 31286, 31288, 31290, 31294, 31296, 31297, 31298, 31299, 31300, + 31301, 31303, 31304, 31305, 31306, 31307, 31308, 31309, 31310, 31311, + 31312, 31314, 31315, 31316, 31317, 31318, 31320, 31321, 31322, 31323, + 31324, 31325, 31326, 31327, 31328, 31329, 31330, 31331, 31332, 31333, + 31334, 31335, 31336, 31337, 31338, 31339, 31340, 31341, 31342, 31343, + 31345, 31346, 31347, 31349, 31355, 31356, 31357, 31358, 31362, 31365, + 31367, 31369, 31370, 31371, 31372, 31374, 31375, 31376, 31379, 31380, + 31385, 31386, 31387, 31390, 31393, 31394, 36144, 21457, 32602, 31567, + 20240, 20047, 38400, 27861, 29648, 34281, 24070, 30058, 32763, 27146, + 30718, 38034, 32321, 20961, 28902, 21453, 36820, 33539, 36137, 29359, + 39277, 27867, 22346, 33459, 26041, 32938, 25151, 38450, 22952, 20223, + 35775, 32442, 25918, 33778, 38750, 21857, 39134, 32933, 21290, 35837, + 21536, 32954, 24223, 27832, 36153, 33452, 37210, 21545, 27675, 20998, + 32439, 22367, 28954, 27774, 31881, 22859, 20221, 24575, 24868, 31914, + 20016, 23553, 26539, 34562, 23792, 38155, 39118, 30127, 28925, 36898, + 20911, 32541, 35773, 22857, 20964, 20315, 21542, 22827, 25975, 32932, + 23413, 25206, 25282, 36752, 24133, 27679, 31526, 20239, 20440, 26381, + 31395, 31396, 31399, 31401, 31402, 31403, 31406, 31407, 31408, 31409, + 31410, 31412, 31413, 31414, 31415, 31416, 31417, 31418, 31419, 31420, + 31421, 31422, 31424, 31425, 31426, 31427, 31428, 31429, 31430, 31431, + 31432, 31433, 31434, 31436, 31437, 31438, 31439, 31440, 31441, 31442, + 31443, 31444, 31445, 31447, 31448, 31450, 31451, 31452, 31453, 31457, + 31458, 31460, 31463, 31464, 31465, 31466, 31467, 31468, 31470, 31472, + 31473, 31474, 31475, 31476, 31477, 31478, 31479, 31480, 31483, 31484, + 31486, 31488, 31489, 31490, 31493, 31495, 31497, 31500, 31501, 31502, + 31504, 31506, 31507, 31510, 31511, 31512, 31514, 31516, 31517, 31519, + 31521, 31522, 31523, 31527, 31529, 31533, 28014, 28074, 31119, 34993, + 24343, 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, + 33104, 36212, 21103, 35206, 36171, 22797, 20613, 20184, 38428, 29238, + 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, 22134, 22030, + 35813, 25913, 27010, 38041, 30422, 28297, 24178, 29976, 26438, 26577, + 31487, 32925, 36214, 24863, 31174, 25954, 36195, 20872, 21018, 38050, + 32568, 32923, 32434, 23703, 28207, 26464, 31705, 30347, 39640, 33167, + 32660, 31957, 25630, 38224, 31295, 21578, 21733, 27468, 25601, 25096, + 40509, 33011, 30105, 21106, 38761, 33883, 26684, 34532, 38401, 38548, + 38124, 20010, 21508, 32473, 26681, 36319, 32789, 26356, 24218, 32697, + 31535, 31536, 31538, 31540, 31541, 31542, 31543, 31545, 31547, 31549, + 31551, 31552, 31553, 31554, 31555, 31556, 31558, 31560, 31562, 31565, + 31566, 31571, 31573, 31575, 31577, 31580, 31582, 31583, 31585, 31587, + 31588, 31589, 31590, 31591, 31592, 31593, 31594, 31595, 31596, 31597, + 31599, 31600, 31603, 31604, 31606, 31608, 31610, 31612, 31613, 31615, + 31617, 31618, 31619, 31620, 31622, 31623, 31624, 31625, 31626, 31627, + 31628, 31630, 31631, 31633, 31634, 31635, 31638, 31640, 31641, 31642, + 31643, 31646, 31647, 31648, 31651, 31652, 31653, 31662, 31663, 31664, + 31666, 31667, 31669, 31670, 31671, 31673, 31674, 31675, 31676, 31677, + 31678, 31679, 31680, 31682, 31683, 31684, 22466, 32831, 26775, 24037, + 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, 24339, 24041, + 27742, 25329, 36129, 20849, 38057, 21246, 27807, 33503, 29399, 22434, + 26500, 36141, 22815, 36764, 33735, 21653, 31629, 20272, 27837, 23396, + 22993, 40723, 21476, 34506, 39592, 35895, 32929, 25925, 39038, 22266, + 38599, 21038, 29916, 21072, 23521, 25346, 35074, 20054, 25296, 24618, + 26874, 20851, 23448, 20896, 35266, 31649, 39302, 32592, 24815, 28748, + 36143, 20809, 24191, 36891, 29808, 35268, 22317, 30789, 24402, 40863, + 38394, 36712, 39740, 35809, 30328, 26690, 26588, 36330, 36149, 21053, + 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, + 31685, 31688, 31689, 31690, 31691, 31693, 31694, 31695, 31696, 31698, + 31700, 31701, 31702, 31703, 31704, 31707, 31708, 31710, 31711, 31712, + 31714, 31715, 31716, 31719, 31720, 31721, 31723, 31724, 31725, 31727, + 31728, 31730, 31731, 31732, 31733, 31734, 31736, 31737, 31738, 31739, + 31741, 31743, 31744, 31745, 31746, 31747, 31748, 31749, 31750, 31752, + 31753, 31754, 31757, 31758, 31760, 31761, 31762, 31763, 31764, 31765, + 31767, 31768, 31769, 31770, 31771, 31772, 31773, 31774, 31776, 31777, + 31778, 31779, 31780, 31781, 31784, 31785, 31787, 31788, 31789, 31790, + 31791, 31792, 31793, 31794, 31795, 31796, 31797, 31798, 31799, 31801, + 31802, 31803, 31804, 31805, 31806, 31810, 39608, 23401, 28023, 27686, + 20133, 23475, 39559, 37219, 25000, 37039, 38889, 21547, 28085, 23506, + 20989, 21898, 32597, 32752, 25788, 25421, 26097, 25022, 24717, 28938, + 27735, 27721, 22831, 26477, 33322, 22741, 22158, 35946, 27627, 37085, + 22909, 32791, 21495, 28009, 21621, 21917, 33655, 33743, 26680, 31166, + 21644, 20309, 21512, 30418, 35977, 38402, 27827, 28088, 36203, 35088, + 40548, 36154, 22079, 40657, 30165, 24456, 29408, 24680, 21756, 20136, + 27178, 34913, 24658, 36720, 21700, 28888, 34425, 40511, 27946, 23439, + 24344, 32418, 21897, 20399, 29492, 21564, 21402, 20505, 21518, 21628, + 20046, 24573, 29786, 22774, 33899, 32993, 34676, 29392, 31946, 28246, + 31811, 31812, 31813, 31814, 31815, 31816, 31817, 31818, 31819, 31820, + 31822, 31823, 31824, 31825, 31826, 31827, 31828, 31829, 31830, 31831, + 31832, 31833, 31834, 31835, 31836, 31837, 31838, 31839, 31840, 31841, + 31842, 31843, 31844, 31845, 31846, 31847, 31848, 31849, 31850, 31851, + 31852, 31853, 31854, 31855, 31856, 31857, 31858, 31861, 31862, 31863, + 31864, 31865, 31866, 31870, 31871, 31872, 31873, 31874, 31875, 31876, + 31877, 31878, 31879, 31880, 31882, 31883, 31884, 31885, 31886, 31887, + 31888, 31891, 31892, 31894, 31897, 31898, 31899, 31904, 31905, 31907, + 31910, 31911, 31912, 31913, 31915, 31916, 31917, 31919, 31920, 31924, + 31925, 31926, 31927, 31928, 31930, 31931, 24359, 34382, 21804, 25252, + 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, + 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, + 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, + 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, + 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, + 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, + 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, + 27985, 28151, 35905, 27963, 20249, 28779, 33719, 25110, 24785, 38669, + 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, 31637, + 31935, 31936, 31938, 31939, 31940, 31942, 31945, 31947, 31950, 31951, + 31952, 31953, 31954, 31955, 31956, 31960, 31962, 31963, 31965, 31966, + 31969, 31970, 31971, 31972, 31973, 31974, 31975, 31977, 31978, 31979, + 31980, 31981, 31982, 31984, 31985, 31986, 31987, 31988, 31989, 31990, + 31991, 31993, 31994, 31996, 31997, 31998, 31999, 32000, 32001, 32002, + 32003, 32004, 32005, 32006, 32007, 32008, 32009, 32011, 32012, 32013, + 32014, 32015, 32016, 32017, 32018, 32019, 32020, 32021, 32022, 32023, + 32024, 32025, 32026, 32027, 32028, 32029, 32030, 32031, 32033, 32035, + 32036, 32037, 32038, 32040, 32041, 32042, 32044, 32045, 32046, 32048, + 32049, 32050, 32051, 32052, 32053, 32054, 32908, 39269, 36857, 28608, + 35749, 40481, 23020, 32489, 32521, 21513, 26497, 26840, 36753, 31821, + 38598, 21450, 24613, 30142, 27762, 21363, 23241, 32423, 25380, 20960, + 33034, 24049, 34015, 25216, 20864, 23395, 20238, 31085, 21058, 24760, + 27982, 23492, 23490, 35745, 35760, 26082, 24524, 38469, 22931, 32487, + 32426, 22025, 26551, 22841, 20339, 23478, 21152, 33626, 39050, 36158, + 30002, 38078, 20551, 31292, 20215, 26550, 39550, 23233, 27516, 30417, + 22362, 23574, 31546, 38388, 29006, 20860, 32937, 33392, 22904, 32516, + 33575, 26816, 26604, 30897, 30839, 25315, 25441, 31616, 20461, 21098, + 20943, 33616, 27099, 37492, 36341, 36145, 35265, 38190, 31661, 20214, + 32055, 32056, 32057, 32058, 32059, 32060, 32061, 32062, 32063, 32064, + 32065, 32066, 32067, 32068, 32069, 32070, 32071, 32072, 32073, 32074, + 32075, 32076, 32077, 32078, 32079, 32080, 32081, 32082, 32083, 32084, + 32085, 32086, 32087, 32088, 32089, 32090, 32091, 32092, 32093, 32094, + 32095, 32096, 32097, 32098, 32099, 32100, 32101, 32102, 32103, 32104, + 32105, 32106, 32107, 32108, 32109, 32111, 32112, 32113, 32114, 32115, + 32116, 32117, 32118, 32120, 32121, 32122, 32123, 32124, 32125, 32126, + 32127, 32128, 32129, 32130, 32131, 32132, 32133, 32134, 32135, 32136, + 32137, 32138, 32139, 32140, 32141, 32142, 32143, 32144, 32145, 32146, + 32147, 32148, 32149, 32150, 32151, 32152, 20581, 33328, 21073, 39279, + 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, 30086, + 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, 30977, + 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, 38128, + 30699, 20389, 33050, 29409, 35282, 39290, 32564, 32478, 21119, 25945, + 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, 31224, 34903, + 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, 31469, 27905, + 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, 20171, 30117, + 35819, 23626, 24062, 31563, 26020, 37329, 20170, 27941, 35167, 32039, + 38182, 20165, 35880, 36827, 38771, 26187, 31105, 36817, 28908, 28024, + 32153, 32154, 32155, 32156, 32157, 32158, 32159, 32160, 32161, 32162, + 32163, 32164, 32165, 32167, 32168, 32169, 32170, 32171, 32172, 32173, + 32175, 32176, 32177, 32178, 32179, 32180, 32181, 32182, 32183, 32184, + 32185, 32186, 32187, 32188, 32189, 32190, 32191, 32192, 32193, 32194, + 32195, 32196, 32197, 32198, 32199, 32200, 32201, 32202, 32203, 32204, + 32205, 32206, 32207, 32208, 32209, 32210, 32211, 32212, 32213, 32214, + 32215, 32216, 32217, 32218, 32219, 32220, 32221, 32222, 32223, 32224, + 32225, 32226, 32227, 32228, 32229, 32230, 32231, 32232, 32233, 32234, + 32235, 32236, 32237, 32238, 32239, 32240, 32241, 32242, 32243, 32244, + 32245, 32246, 32247, 32248, 32249, 32250, 23613, 21170, 33606, 20834, + 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, + 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, + 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, 38893, + 20037, 28792, 20061, 37202, 21417, 25937, 26087, 33276, 33285, 21646, + 23601, 30106, 38816, 25304, 29401, 30141, 23621, 39545, 33738, 23616, + 21632, 30697, 20030, 27822, 32858, 25298, 25454, 24040, 20855, 36317, + 36382, 38191, 20465, 21477, 24807, 28844, 21095, 25424, 40515, 23071, + 20518, 30519, 21367, 32482, 25733, 25899, 25225, 25496, 20500, 29237, + 35273, 20915, 35776, 32477, 22343, 33740, 38055, 20891, 21531, 23803, + 32251, 32252, 32253, 32254, 32255, 32256, 32257, 32258, 32259, 32260, + 32261, 32262, 32263, 32264, 32265, 32266, 32267, 32268, 32269, 32270, + 32271, 32272, 32273, 32274, 32275, 32276, 32277, 32278, 32279, 32280, + 32281, 32282, 32283, 32284, 32285, 32286, 32287, 32288, 32289, 32290, + 32291, 32292, 32293, 32294, 32295, 32296, 32297, 32298, 32299, 32300, + 32301, 32302, 32303, 32304, 32305, 32306, 32307, 32308, 32309, 32310, + 32311, 32312, 32313, 32314, 32316, 32317, 32318, 32319, 32320, 32322, + 32323, 32324, 32325, 32326, 32328, 32329, 32330, 32331, 32332, 32333, + 32334, 32335, 32336, 32337, 32338, 32339, 32340, 32341, 32342, 32343, + 32344, 32345, 32346, 32347, 32348, 32349, 20426, 31459, 27994, 37089, + 39567, 21888, 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, + 21002, 22570, 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, + 25239, 20130, 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, + 26869, 30933, 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, + 23458, 35838, 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, + 23380, 25511, 25248, 21475, 25187, 23495, 26543, 21741, 31391, 33510, + 37239, 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, + 20393, 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, + 26103, 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, + 32350, 32351, 32352, 32353, 32354, 32355, 32356, 32357, 32358, 32359, + 32360, 32361, 32362, 32363, 32364, 32365, 32366, 32367, 32368, 32369, + 32370, 32371, 32372, 32373, 32374, 32375, 32376, 32377, 32378, 32379, + 32380, 32381, 32382, 32383, 32384, 32385, 32387, 32388, 32389, 32390, + 32391, 32392, 32393, 32394, 32395, 32396, 32397, 32398, 32399, 32400, + 32401, 32402, 32403, 32404, 32405, 32406, 32407, 32408, 32409, 32410, + 32412, 32413, 32414, 32430, 32436, 32443, 32444, 32470, 32484, 32492, + 32505, 32522, 32528, 32542, 32567, 32569, 32571, 32572, 32573, 32574, + 32575, 32576, 32577, 32579, 32582, 32583, 32584, 32585, 32586, 32587, + 32588, 32589, 32590, 32591, 32594, 32595, 39304, 24871, 28291, 22372, + 26118, 25414, 22256, 25324, 25193, 24275, 38420, 22403, 25289, 21895, + 34593, 33098, 36771, 21862, 33713, 26469, 36182, 34013, 23146, 26639, + 25318, 31726, 38417, 20848, 28572, 35888, 25597, 35272, 25042, 32518, + 28866, 28389, 29701, 27028, 29436, 24266, 37070, 26391, 28010, 25438, + 21171, 29282, 32769, 20332, 23013, 37226, 28889, 28061, 21202, 20048, + 38647, 38253, 34174, 30922, 32047, 20769, 22418, 25794, 32907, 31867, + 27882, 26865, 26974, 20919, 21400, 26792, 29313, 40654, 31729, 29432, + 31163, 28435, 29702, 26446, 37324, 40100, 31036, 33673, 33620, 21519, + 26647, 20029, 21385, 21169, 30782, 21382, 21033, 20616, 20363, 20432, + 32598, 32601, 32603, 32604, 32605, 32606, 32608, 32611, 32612, 32613, + 32614, 32615, 32619, 32620, 32621, 32623, 32624, 32627, 32629, 32630, + 32631, 32632, 32634, 32635, 32636, 32637, 32639, 32640, 32642, 32643, + 32644, 32645, 32646, 32647, 32648, 32649, 32651, 32653, 32655, 32656, + 32657, 32658, 32659, 32661, 32662, 32663, 32664, 32665, 32667, 32668, + 32672, 32674, 32675, 32677, 32678, 32680, 32681, 32682, 32683, 32684, + 32685, 32686, 32689, 32691, 32692, 32693, 32694, 32695, 32698, 32699, + 32702, 32704, 32706, 32707, 32708, 32710, 32711, 32712, 32713, 32715, + 32717, 32719, 32720, 32721, 32722, 32723, 32726, 32727, 32729, 32730, + 32731, 32732, 32733, 32734, 32738, 32739, 30178, 31435, 31890, 27813, + 38582, 21147, 29827, 21737, 20457, 32852, 33714, 36830, 38256, 24265, + 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, 32451, 31918, + 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, 20142, 35845, + 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, 20102, 25730, + 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, 29747, 26519, + 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, 21533, 25294, + 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, 28789, 38517, + 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, 39311, 30041, + 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, 31548, 31423, + 32740, 32743, 32744, 32746, 32747, 32748, 32749, 32751, 32754, 32756, + 32757, 32758, 32759, 32760, 32761, 32762, 32765, 32766, 32767, 32770, + 32775, 32776, 32777, 32778, 32782, 32783, 32785, 32787, 32794, 32795, + 32797, 32798, 32799, 32801, 32803, 32804, 32811, 32812, 32813, 32814, + 32815, 32816, 32818, 32820, 32825, 32826, 32828, 32830, 32832, 32833, + 32836, 32837, 32839, 32840, 32841, 32846, 32847, 32848, 32849, 32851, + 32853, 32854, 32855, 32857, 32859, 32860, 32861, 32862, 32863, 32864, + 32865, 32866, 32867, 32868, 32869, 32870, 32871, 32872, 32875, 32876, + 32877, 32878, 32879, 32880, 32882, 32883, 32884, 32885, 32886, 32887, + 32888, 32889, 32890, 32891, 32892, 32893, 38534, 22404, 25314, 38471, + 27004, 23044, 25602, 31699, 28431, 38475, 33446, 21346, 39045, 24208, + 28809, 25523, 21348, 34383, 40065, 40595, 30860, 38706, 36335, 36162, + 40575, 28510, 31108, 24405, 38470, 25134, 39540, 21525, 38109, 20387, + 26053, 23653, 23649, 32533, 34385, 27695, 24459, 29575, 28388, 32511, + 23782, 25371, 23402, 28390, 21365, 20081, 25504, 30053, 25249, 36718, + 20262, 20177, 27814, 32438, 35770, 33821, 34746, 32599, 36923, 38179, + 31657, 39585, 35064, 33853, 27931, 39558, 32476, 22920, 40635, 29595, + 30721, 34434, 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, + 36808, 33033, 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, + 32894, 32897, 32898, 32901, 32904, 32906, 32909, 32910, 32911, 32912, + 32913, 32914, 32916, 32917, 32919, 32921, 32926, 32931, 32934, 32935, + 32936, 32940, 32944, 32947, 32949, 32950, 32952, 32953, 32955, 32965, + 32967, 32968, 32969, 32970, 32971, 32975, 32976, 32977, 32978, 32979, + 32980, 32981, 32984, 32991, 32992, 32994, 32995, 32998, 33006, 33013, + 33015, 33017, 33019, 33022, 33023, 33024, 33025, 33027, 33028, 33029, + 33031, 33032, 33035, 33036, 33045, 33047, 33049, 33051, 33052, 33053, + 33055, 33056, 33057, 33058, 33059, 33060, 33061, 33062, 33063, 33064, + 33065, 33066, 33067, 33069, 33070, 33072, 33075, 33076, 33077, 33079, + 33081, 33082, 33083, 33084, 33085, 33087, 35881, 33426, 33579, 30450, + 27667, 24537, 33725, 29483, 33541, 38170, 27611, 30683, 38086, 21359, + 33538, 20882, 24125, 35980, 36152, 20040, 29611, 26522, 26757, 37238, + 38665, 29028, 27809, 30473, 23186, 38209, 27599, 32654, 26151, 23504, + 22969, 23194, 38376, 38391, 20204, 33804, 33945, 27308, 30431, 38192, + 29467, 26790, 23391, 30511, 37274, 38753, 31964, 36855, 35868, 24357, + 31859, 31192, 35269, 27852, 34588, 23494, 24130, 26825, 30496, 32501, + 20885, 20813, 21193, 23081, 32517, 38754, 33495, 25551, 30596, 34256, + 31186, 28218, 24217, 22937, 34065, 28781, 27665, 25279, 30399, 25935, + 24751, 38397, 26126, 34719, 40483, 38125, 21517, 21629, 35884, 25720, + 33088, 33089, 33090, 33091, 33092, 33093, 33095, 33097, 33101, 33102, + 33103, 33106, 33110, 33111, 33112, 33115, 33116, 33117, 33118, 33119, + 33121, 33122, 33123, 33124, 33126, 33128, 33130, 33131, 33132, 33135, + 33138, 33139, 33141, 33142, 33143, 33144, 33153, 33155, 33156, 33157, + 33158, 33159, 33161, 33163, 33164, 33165, 33166, 33168, 33170, 33171, + 33172, 33173, 33174, 33175, 33177, 33178, 33182, 33183, 33184, 33185, + 33186, 33188, 33189, 33191, 33193, 33195, 33196, 33197, 33198, 33199, + 33200, 33201, 33202, 33204, 33205, 33206, 33207, 33208, 33209, 33212, + 33213, 33214, 33215, 33220, 33221, 33223, 33224, 33225, 33227, 33229, + 33230, 33231, 33232, 33233, 33234, 33235, 25721, 34321, 27169, 33180, + 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, 28448, + 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, 27597, + 22675, 26286, 24149, 21215, 24917, 26408, 30446, 30566, 29287, 31302, + 25343, 21738, 21584, 38048, 37027, 23068, 32435, 27670, 20035, 22902, + 32784, 22856, 21335, 30007, 38590, 22218, 25376, 33041, 24700, 38393, + 28118, 21602, 39297, 20869, 23273, 33021, 22958, 38675, 20522, 27877, + 23612, 25311, 20320, 21311, 33147, 36870, 28346, 34091, 25288, 24180, + 30910, 25781, 25467, 24565, 23064, 37247, 40479, 23615, 25423, 32834, + 23421, 21870, 38218, 38221, 28037, 24744, 26592, 29406, 20957, 23425, + 33236, 33237, 33238, 33239, 33240, 33241, 33242, 33243, 33244, 33245, + 33246, 33247, 33248, 33249, 33250, 33252, 33253, 33254, 33256, 33257, + 33259, 33262, 33263, 33264, 33265, 33266, 33269, 33270, 33271, 33272, + 33273, 33274, 33277, 33279, 33283, 33287, 33288, 33289, 33290, 33291, + 33294, 33295, 33297, 33299, 33301, 33302, 33303, 33304, 33305, 33306, + 33309, 33312, 33316, 33317, 33318, 33319, 33321, 33326, 33330, 33338, + 33340, 33341, 33343, 33344, 33345, 33346, 33347, 33349, 33350, 33352, + 33354, 33356, 33357, 33358, 33360, 33361, 33362, 33363, 33364, 33365, + 33366, 33367, 33369, 33371, 33372, 33373, 33374, 33376, 33377, 33378, + 33379, 33380, 33381, 33382, 33383, 33385, 25319, 27870, 29275, 25197, + 38062, 32445, 33043, 27987, 20892, 24324, 22900, 21162, 24594, 22899, + 26262, 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, + 27572, 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, + 29750, 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, + 30928, 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, + 25243, 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, + 35060, 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, + 28921, 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, + 25447, 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, + 33386, 33387, 33388, 33389, 33393, 33397, 33398, 33399, 33400, 33403, + 33404, 33408, 33409, 33411, 33413, 33414, 33415, 33417, 33420, 33424, + 33427, 33428, 33429, 33430, 33434, 33435, 33438, 33440, 33442, 33443, + 33447, 33458, 33461, 33462, 33466, 33467, 33468, 33471, 33472, 33474, + 33475, 33477, 33478, 33481, 33488, 33494, 33497, 33498, 33501, 33506, + 33511, 33512, 33513, 33514, 33516, 33517, 33518, 33520, 33522, 33523, + 33525, 33526, 33528, 33530, 33532, 33533, 33534, 33535, 33536, 33546, + 33547, 33549, 33552, 33554, 33555, 33558, 33560, 33561, 33565, 33566, + 33567, 33568, 33569, 33570, 33571, 33572, 33573, 33574, 33577, 33578, + 33582, 33584, 33586, 33591, 33595, 33597, 21860, 33086, 30130, 30382, + 21305, 30174, 20731, 23617, 35692, 31687, 20559, 29255, 39575, 39128, + 28418, 29922, 31080, 25735, 30629, 25340, 39057, 36139, 21697, 32856, + 20050, 22378, 33529, 33805, 24179, 20973, 29942, 35780, 23631, 22369, + 27900, 39047, 23110, 30772, 39748, 36843, 31893, 21078, 25169, 38138, + 20166, 33670, 33889, 33769, 33970, 22484, 26420, 22275, 26222, 28006, + 35889, 26333, 28689, 26399, 27450, 26646, 25114, 22971, 19971, 20932, + 28422, 26578, 27791, 20854, 26827, 22855, 27495, 30054, 23822, 33040, + 40784, 26071, 31048, 31041, 39569, 36215, 23682, 20062, 20225, 21551, + 22865, 30732, 22120, 27668, 36804, 24323, 27773, 27875, 35755, 25488, + 33598, 33599, 33601, 33602, 33604, 33605, 33608, 33610, 33611, 33612, + 33613, 33614, 33619, 33621, 33622, 33623, 33624, 33625, 33629, 33634, + 33648, 33649, 33650, 33651, 33652, 33653, 33654, 33657, 33658, 33662, + 33663, 33664, 33665, 33666, 33667, 33668, 33671, 33672, 33674, 33675, + 33676, 33677, 33679, 33680, 33681, 33684, 33685, 33686, 33687, 33689, + 33690, 33693, 33695, 33697, 33698, 33699, 33700, 33701, 33702, 33703, + 33708, 33709, 33710, 33711, 33717, 33723, 33726, 33727, 33730, 33731, + 33732, 33734, 33736, 33737, 33739, 33741, 33742, 33744, 33745, 33746, + 33747, 33749, 33751, 33753, 33754, 33755, 33758, 33762, 33763, 33764, + 33766, 33767, 33768, 33771, 33772, 33773, 24688, 27965, 29301, 25190, + 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, + 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, 27424, 27465, + 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, 38201, + 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, 32728, + 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, 20405, + 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, 38738, + 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, 39031, + 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, 22234, + 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, 28192, + 33774, 33775, 33779, 33780, 33781, 33782, 33783, 33786, 33787, 33788, + 33790, 33791, 33792, 33794, 33797, 33799, 33800, 33801, 33802, 33808, + 33810, 33811, 33812, 33813, 33814, 33815, 33817, 33818, 33819, 33822, + 33823, 33824, 33825, 33826, 33827, 33833, 33834, 33835, 33836, 33837, + 33838, 33839, 33840, 33842, 33843, 33844, 33845, 33846, 33847, 33849, + 33850, 33851, 33854, 33855, 33856, 33857, 33858, 33859, 33860, 33861, + 33863, 33864, 33865, 33866, 33867, 33868, 33869, 33870, 33871, 33872, + 33874, 33875, 33876, 33877, 33878, 33880, 33885, 33886, 33887, 33888, + 33890, 33892, 33893, 33894, 33895, 33896, 33898, 33902, 33903, 33904, + 33906, 33908, 33911, 33913, 33915, 33916, 21462, 23094, 40843, 36259, + 21435, 22280, 39079, 26435, 37275, 27849, 20840, 30154, 25331, 29356, + 21048, 21149, 32570, 28820, 30264, 21364, 40522, 27063, 30830, 38592, + 35033, 32676, 28982, 29123, 20873, 26579, 29924, 22756, 25880, 22199, + 35753, 39286, 25200, 32469, 24825, 28909, 22764, 20161, 20154, 24525, + 38887, 20219, 35748, 20995, 22922, 32427, 25172, 20173, 26085, 25102, + 33592, 33993, 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, + 26580, 32905, 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, + 20837, 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, 33509, + 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, 21441, + 33917, 33918, 33919, 33920, 33921, 33923, 33924, 33925, 33926, 33930, + 33933, 33935, 33936, 33937, 33938, 33939, 33940, 33941, 33942, 33944, + 33946, 33947, 33949, 33950, 33951, 33952, 33954, 33955, 33956, 33957, + 33958, 33959, 33960, 33961, 33962, 33963, 33964, 33965, 33966, 33968, + 33969, 33971, 33973, 33974, 33975, 33979, 33980, 33982, 33984, 33986, + 33987, 33989, 33990, 33991, 33992, 33995, 33996, 33998, 33999, 34002, + 34004, 34005, 34007, 34008, 34009, 34010, 34011, 34012, 34014, 34017, + 34018, 34020, 34023, 34024, 34025, 34026, 34027, 34029, 34030, 34031, + 34033, 34034, 34035, 34036, 34037, 34038, 34039, 34040, 34041, 34042, + 34043, 34045, 34046, 34048, 34049, 34050, 20254, 25955, 26705, 21971, + 20007, 25620, 39578, 25195, 23234, 29791, 33394, 28073, 26862, 20711, + 33678, 30722, 26432, 21049, 27801, 32433, 20667, 21861, 29022, 31579, + 26194, 29642, 33515, 26441, 23665, 21024, 29053, 34923, 38378, 38485, + 25797, 36193, 33203, 21892, 27733, 25159, 32558, 22674, 20260, 21830, + 36175, 26188, 19978, 23578, 35059, 26786, 25422, 31245, 28903, 33421, + 21242, 38902, 23569, 21736, 37045, 32461, 22882, 36170, 34503, 33292, + 33293, 36198, 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, + 21627, 20280, 36523, 28145, 23072, 32453, 31070, 27784, 23457, 23158, + 29978, 32958, 24910, 28183, 22768, 29983, 29989, 29298, 21319, 32499, + 34051, 34052, 34053, 34054, 34055, 34056, 34057, 34058, 34059, 34061, + 34062, 34063, 34064, 34066, 34068, 34069, 34070, 34072, 34073, 34075, + 34076, 34077, 34078, 34080, 34082, 34083, 34084, 34085, 34086, 34087, + 34088, 34089, 34090, 34093, 34094, 34095, 34096, 34097, 34098, 34099, + 34100, 34101, 34102, 34110, 34111, 34112, 34113, 34114, 34116, 34117, + 34118, 34119, 34123, 34124, 34125, 34126, 34127, 34128, 34129, 34130, + 34131, 34132, 34133, 34135, 34136, 34138, 34139, 34140, 34141, 34143, + 34144, 34145, 34146, 34147, 34149, 34150, 34151, 34153, 34154, 34155, + 34156, 34157, 34158, 34159, 34160, 34161, 34163, 34165, 34166, 34167, + 34168, 34172, 34173, 34175, 34176, 34177, 30465, 30427, 21097, 32988, + 22307, 24072, 22833, 29422, 26045, 28287, 35799, 23608, 34417, 21313, + 30707, 25342, 26102, 20160, 39135, 34432, 23454, 35782, 21490, 30690, + 20351, 23630, 39542, 22987, 24335, 31034, 22763, 19990, 26623, 20107, + 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, 20365, + 37322, 39280, 27663, 24066, 24643, 23460, 35270, 35797, 25910, 25163, + 39318, 23432, 23551, 25480, 21806, 21463, 30246, 20861, 34092, 26530, + 26803, 27530, 25234, 36755, 21460, 33298, 28113, 30095, 20070, 36174, + 23408, 29087, 34223, 26257, 26329, 32626, 34560, 40653, 40736, 23646, + 26415, 36848, 26641, 26463, 25101, 31446, 22661, 24246, 25968, 28465, + 34178, 34179, 34182, 34184, 34185, 34186, 34187, 34188, 34189, 34190, + 34192, 34193, 34194, 34195, 34196, 34197, 34198, 34199, 34200, 34201, + 34202, 34205, 34206, 34207, 34208, 34209, 34210, 34211, 34213, 34214, + 34215, 34217, 34219, 34220, 34221, 34225, 34226, 34227, 34228, 34229, + 34230, 34232, 34234, 34235, 34236, 34237, 34238, 34239, 34240, 34242, + 34243, 34244, 34245, 34246, 34247, 34248, 34250, 34251, 34252, 34253, + 34254, 34257, 34258, 34260, 34262, 34263, 34264, 34265, 34266, 34267, + 34269, 34270, 34271, 34272, 34273, 34274, 34275, 34277, 34278, 34279, + 34280, 34282, 34283, 34284, 34285, 34286, 34287, 34288, 34289, 34290, + 34291, 34292, 34293, 34294, 34295, 34296, 24661, 21047, 32781, 25684, + 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, 27700, + 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, 26388, 28865, + 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, 32902, 23546, + 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, 24578, 39042, + 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, 33487, 37221, + 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, 35785, 32899, + 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, 30862, 23681, + 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, 26797, 21766, + 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, 22905, 22612, + 34297, 34298, 34300, 34301, 34302, 34304, 34305, 34306, 34307, 34308, + 34310, 34311, 34312, 34313, 34314, 34315, 34316, 34317, 34318, 34319, + 34320, 34322, 34323, 34324, 34325, 34327, 34328, 34329, 34330, 34331, + 34332, 34333, 34334, 34335, 34336, 34337, 34338, 34339, 34340, 34341, + 34342, 34344, 34346, 34347, 34348, 34349, 34350, 34351, 34352, 34353, + 34354, 34355, 34356, 34357, 34358, 34359, 34361, 34362, 34363, 34365, + 34366, 34367, 34368, 34369, 34370, 34371, 34372, 34373, 34374, 34375, + 34376, 34377, 34378, 34379, 34380, 34386, 34387, 34389, 34390, 34391, + 34392, 34393, 34395, 34396, 34397, 34399, 34400, 34401, 34403, 34404, + 34405, 34406, 34407, 34408, 34409, 34410, 29549, 25374, 36427, 36367, + 32974, 33492, 25260, 21488, 27888, 37214, 22826, 24577, 27760, 22349, + 25674, 36138, 30251, 28393, 22363, 27264, 30192, 28525, 35885, 35848, + 22374, 27631, 34962, 30899, 25506, 21497, 28845, 27748, 22616, 25642, + 22530, 26848, 33179, 21776, 31958, 20504, 36538, 28108, 36255, 28907, + 25487, 28059, 28372, 32486, 33796, 26691, 36867, 28120, 38518, 35752, + 22871, 29305, 34276, 33150, 30140, 35466, 26799, 21076, 36386, 38161, + 25552, 39064, 36420, 21884, 20307, 26367, 22159, 24789, 28053, 21059, + 23625, 22825, 28155, 22635, 30000, 29980, 24684, 33300, 33094, 25361, + 26465, 36834, 30522, 36339, 36148, 38081, 24086, 21381, 21548, 28867, + 34413, 34415, 34416, 34418, 34419, 34420, 34421, 34422, 34423, 34424, + 34435, 34436, 34437, 34438, 34439, 34440, 34441, 34446, 34447, 34448, + 34449, 34450, 34452, 34454, 34455, 34456, 34457, 34458, 34459, 34462, + 34463, 34464, 34465, 34466, 34469, 34470, 34475, 34477, 34478, 34482, + 34483, 34487, 34488, 34489, 34491, 34492, 34493, 34494, 34495, 34497, + 34498, 34499, 34501, 34504, 34508, 34509, 34514, 34515, 34517, 34518, + 34519, 34522, 34524, 34525, 34528, 34529, 34530, 34531, 34533, 34534, + 34535, 34536, 34538, 34539, 34540, 34543, 34549, 34550, 34551, 34554, + 34555, 34556, 34557, 34559, 34561, 34564, 34565, 34566, 34571, 34572, + 34574, 34575, 34576, 34577, 34580, 34582, 27712, 24311, 20572, 20141, + 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, 24420, + 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, 36879, + 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, 22303, 21520, + 20820, 28237, 22242, 25512, 39059, 33151, 34581, 35114, 36864, 21534, + 23663, 33216, 25302, 25176, 33073, 40501, 38464, 39534, 39548, 26925, + 22949, 25299, 21822, 25366, 21703, 34521, 27964, 23043, 29926, 34972, + 27498, 22806, 35916, 24367, 28286, 29609, 39037, 20024, 28919, 23436, + 30871, 25405, 26202, 30358, 24779, 23451, 23113, 19975, 33109, 27754, + 29579, 20129, 26505, 32593, 24448, 26106, 26395, 24536, 22916, 23041, + 34585, 34587, 34589, 34591, 34592, 34596, 34598, 34599, 34600, 34602, + 34603, 34604, 34605, 34607, 34608, 34610, 34611, 34613, 34614, 34616, + 34617, 34618, 34620, 34621, 34624, 34625, 34626, 34627, 34628, 34629, + 34630, 34634, 34635, 34637, 34639, 34640, 34641, 34642, 34644, 34645, + 34646, 34648, 34650, 34651, 34652, 34653, 34654, 34655, 34657, 34658, + 34662, 34663, 34664, 34665, 34666, 34667, 34668, 34669, 34671, 34673, + 34674, 34675, 34677, 34679, 34680, 34681, 34682, 34687, 34688, 34689, + 34692, 34694, 34695, 34697, 34698, 34700, 34702, 34703, 34704, 34705, + 34706, 34708, 34709, 34710, 34712, 34713, 34714, 34715, 34716, 34717, + 34718, 34720, 34721, 34722, 34723, 34724, 24013, 24494, 21361, 38886, + 36829, 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, + 22996, 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, + 21890, 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, + 34442, 25991, 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, + 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, + 24043, 21596, 38056, 20044, 27745, 35820, 23627, 26080, 33436, 26791, + 21566, 21556, 27595, 27494, 20116, 25410, 21320, 33310, 20237, 20398, + 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, 35823, 26132, + 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, 38177, 29306, + 34725, 34726, 34727, 34729, 34730, 34734, 34736, 34737, 34738, 34740, + 34742, 34743, 34744, 34745, 34747, 34748, 34750, 34751, 34753, 34754, + 34755, 34756, 34757, 34759, 34760, 34761, 34764, 34765, 34766, 34767, + 34768, 34772, 34773, 34774, 34775, 34776, 34777, 34778, 34780, 34781, + 34782, 34783, 34785, 34786, 34787, 34788, 34790, 34791, 34792, 34793, + 34795, 34796, 34797, 34799, 34800, 34801, 34802, 34803, 34804, 34805, + 34806, 34807, 34808, 34810, 34811, 34812, 34813, 34815, 34816, 34817, + 34818, 34820, 34821, 34822, 34823, 34824, 34825, 34827, 34828, 34829, + 34830, 34831, 34832, 34833, 34834, 34836, 34839, 34840, 34841, 34842, + 34844, 34845, 34846, 34847, 34848, 34851, 31232, 24687, 24076, 24713, + 33181, 22805, 24796, 29060, 28911, 28330, 27728, 29312, 27268, 34989, + 24109, 20064, 23219, 21916, 38115, 27927, 31995, 38553, 25103, 32454, + 30606, 34430, 21283, 38686, 36758, 26247, 23777, 20384, 29421, 19979, + 21414, 22799, 21523, 25472, 38184, 20808, 20185, 40092, 32420, 21688, + 36132, 34900, 33335, 38386, 28046, 24358, 23244, 26174, 38505, 29616, + 29486, 21439, 33146, 39301, 32673, 23466, 38519, 38480, 32447, 30456, + 21410, 38262, 39321, 31665, 35140, 28248, 20065, 32724, 31077, 35814, + 24819, 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, + 30813, 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, + 34852, 34853, 34854, 34855, 34856, 34857, 34858, 34859, 34860, 34861, + 34862, 34863, 34864, 34865, 34867, 34868, 34869, 34870, 34871, 34872, + 34874, 34875, 34877, 34878, 34879, 34881, 34882, 34883, 34886, 34887, + 34888, 34889, 34890, 34891, 34894, 34895, 34896, 34897, 34898, 34899, + 34901, 34902, 34904, 34906, 34907, 34908, 34909, 34910, 34911, 34912, + 34918, 34919, 34922, 34925, 34927, 34929, 34931, 34932, 34933, 34934, + 34936, 34937, 34938, 34939, 34940, 34944, 34947, 34950, 34951, 34953, + 34954, 34956, 34958, 34959, 34960, 34961, 34963, 34964, 34965, 34967, + 34968, 34969, 34970, 34971, 34973, 34974, 34975, 34976, 34977, 34979, + 34981, 34982, 34983, 34984, 34985, 34986, 23567, 23389, 26657, 32918, + 21880, 31505, 25928, 26964, 20123, 27463, 34638, 38795, 21327, 25375, + 25658, 37034, 26012, 32961, 35856, 20889, 26800, 21368, 34809, 25032, + 27844, 27899, 35874, 23633, 34218, 33455, 38156, 27427, 36763, 26032, + 24571, 24515, 20449, 34885, 26143, 33125, 29481, 24826, 20852, 21009, + 22411, 24418, 37026, 34892, 37266, 24184, 26447, 24615, 22995, 20804, + 20982, 33016, 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, + 21957, 38152, 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, + 39035, 24464, 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, + 32110, 23167, 32490, 32493, 36713, 21927, 23459, 24748, 26059, 29572, + 34988, 34990, 34991, 34992, 34994, 34995, 34996, 34997, 34998, 35000, + 35001, 35002, 35003, 35005, 35006, 35007, 35008, 35011, 35012, 35015, + 35016, 35018, 35019, 35020, 35021, 35023, 35024, 35025, 35027, 35030, + 35031, 35034, 35035, 35036, 35037, 35038, 35040, 35041, 35046, 35047, + 35049, 35050, 35051, 35052, 35053, 35054, 35055, 35058, 35061, 35062, + 35063, 35066, 35067, 35069, 35071, 35072, 35073, 35075, 35076, 35077, + 35078, 35079, 35080, 35081, 35083, 35084, 35085, 35086, 35087, 35089, + 35092, 35093, 35094, 35095, 35096, 35100, 35101, 35102, 35103, 35104, + 35106, 35107, 35108, 35110, 35111, 35112, 35113, 35116, 35117, 35118, + 35119, 35121, 35122, 35123, 35125, 35127, 36873, 30307, 30505, 32474, + 38772, 34203, 23398, 31348, 38634, 34880, 21195, 29071, 24490, 26092, + 35810, 23547, 39535, 24033, 27529, 27739, 35757, 35759, 36874, 36805, + 21387, 25276, 40486, 40493, 21568, 20011, 33469, 29273, 34460, 23830, + 34905, 28079, 38597, 21713, 20122, 35766, 28937, 21693, 38409, 28895, + 28153, 30416, 20005, 30740, 34578, 23721, 24310, 35328, 39068, 38414, + 28814, 27839, 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, + 21388, 30746, 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, + 22830, 40495, 31207, 26472, 25196, 20335, 30113, 32650, 27915, 38451, + 27687, 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, + 35128, 35129, 35130, 35131, 35132, 35133, 35134, 35135, 35136, 35138, + 35139, 35141, 35142, 35143, 35144, 35145, 35146, 35147, 35148, 35149, + 35150, 35151, 35152, 35153, 35154, 35155, 35156, 35157, 35158, 35159, + 35160, 35161, 35162, 35163, 35164, 35165, 35168, 35169, 35170, 35171, + 35172, 35173, 35175, 35176, 35177, 35178, 35179, 35180, 35181, 35182, + 35183, 35184, 35185, 35186, 35187, 35188, 35189, 35190, 35191, 35192, + 35193, 35194, 35196, 35197, 35198, 35200, 35202, 35204, 35205, 35207, + 35208, 35209, 35210, 35211, 35212, 35213, 35214, 35215, 35216, 35217, + 35218, 35219, 35220, 35221, 35222, 35223, 35224, 35225, 35226, 35227, + 35228, 35229, 35230, 35231, 35232, 35233, 25671, 23591, 36965, 31377, + 35875, 23002, 21676, 33280, 33647, 35201, 32768, 26928, 22094, 32822, + 29239, 37326, 20918, 20063, 39029, 25494, 19994, 21494, 26355, 33099, + 22812, 28082, 19968, 22777, 21307, 25558, 38129, 20381, 20234, 34915, + 39056, 22839, 36951, 31227, 20202, 33008, 30097, 27778, 23452, 23016, + 24413, 26885, 34433, 20506, 24050, 20057, 30691, 20197, 33402, 25233, + 26131, 37009, 23673, 20159, 24441, 33222, 36920, 32900, 30123, 20134, + 35028, 24847, 27589, 24518, 20041, 30410, 28322, 35811, 35758, 35850, + 35793, 24322, 32764, 32716, 32462, 33589, 33643, 22240, 27575, 38899, + 38452, 23035, 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, + 35234, 35235, 35236, 35237, 35238, 35239, 35240, 35241, 35242, 35243, + 35244, 35245, 35246, 35247, 35248, 35249, 35250, 35251, 35252, 35253, + 35254, 35255, 35256, 35257, 35258, 35259, 35260, 35261, 35262, 35263, + 35264, 35267, 35277, 35283, 35284, 35285, 35287, 35288, 35289, 35291, + 35293, 35295, 35296, 35297, 35298, 35300, 35303, 35304, 35305, 35306, + 35308, 35309, 35310, 35312, 35313, 35314, 35316, 35317, 35318, 35319, + 35320, 35321, 35322, 35323, 35324, 35325, 35326, 35327, 35329, 35330, + 35331, 35332, 35333, 35334, 35336, 35337, 35338, 35339, 35340, 35341, + 35342, 35343, 35344, 35345, 35346, 35347, 35348, 35349, 35350, 35351, + 35352, 35353, 35354, 35355, 35356, 35357, 21360, 33521, 27185, 23156, + 40560, 24212, 32552, 33721, 33828, 33829, 33639, 34631, 36814, 36194, + 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, 33219, 30152, + 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, 24703, 21191, + 29992, 24189, 20248, 24736, 24551, 23588, 30001, 37038, 38080, 29369, + 27833, 28216, 37193, 26377, 21451, 21491, 20305, 37321, 35825, 21448, + 24188, 36802, 28132, 20110, 30402, 27014, 34398, 24858, 33286, 20313, + 20446, 36926, 40060, 24841, 28189, 28180, 38533, 20104, 23089, 38632, + 19982, 23679, 31161, 23431, 35821, 32701, 29577, 22495, 33419, 37057, + 21505, 36935, 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, + 35358, 35359, 35360, 35361, 35362, 35363, 35364, 35365, 35366, 35367, + 35368, 35369, 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377, + 35378, 35379, 35380, 35381, 35382, 35383, 35384, 35385, 35386, 35387, + 35388, 35389, 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398, + 35399, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35408, 35409, + 35410, 35411, 35412, 35413, 35414, 35415, 35416, 35417, 35418, 35419, + 35420, 35421, 35422, 35423, 35424, 35425, 35426, 35427, 35428, 35429, + 35430, 35431, 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439, + 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35450, + 35451, 35452, 35453, 35454, 35455, 35456, 28020, 23507, 35029, 39044, + 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, 21407, 25588, + 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, 33489, 24895, + 24616, 38498, 26352, 32422, 36234, 36291, 38053, 23731, 31908, 26376, + 24742, 38405, 32792, 20113, 37095, 21248, 38504, 20801, 36816, 34164, + 37213, 26197, 38901, 23381, 21277, 30776, 26434, 26685, 21705, 28798, + 23472, 36733, 20877, 22312, 21681, 25874, 26242, 36190, 36163, 33039, + 33900, 36973, 31967, 20991, 34299, 26531, 26089, 28577, 34468, 36481, + 22122, 36896, 30338, 28790, 29157, 36131, 25321, 21017, 27901, 36156, + 24590, 22686, 24974, 26366, 36192, 25166, 21939, 28195, 26413, 36711, + 35457, 35458, 35459, 35460, 35461, 35462, 35463, 35464, 35467, 35468, + 35469, 35470, 35471, 35472, 35473, 35474, 35476, 35477, 35478, 35479, + 35480, 35481, 35482, 35483, 35484, 35485, 35486, 35487, 35488, 35489, + 35490, 35491, 35492, 35493, 35494, 35495, 35496, 35497, 35498, 35499, + 35500, 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508, 35509, + 35510, 35511, 35512, 35513, 35514, 35515, 35516, 35517, 35518, 35519, + 35520, 35521, 35522, 35523, 35524, 35525, 35526, 35527, 35528, 35529, + 35530, 35531, 35532, 35533, 35534, 35535, 35536, 35537, 35538, 35539, + 35540, 35541, 35542, 35543, 35544, 35545, 35546, 35547, 35548, 35549, + 35550, 35551, 35552, 35553, 35554, 35555, 38113, 38392, 30504, 26629, + 27048, 21643, 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, + 23528, 30651, 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, + 23637, 34360, 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, + 24432, 28467, 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, + 32960, 30260, 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, + 20806, 32903, 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, + 34071, 36825, 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, + 38024, 20390, 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, + 25379, 30529, 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, + 35556, 35557, 35558, 35559, 35560, 35561, 35562, 35563, 35564, 35565, + 35566, 35567, 35568, 35569, 35570, 35571, 35572, 35573, 35574, 35575, + 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35583, 35584, 35585, + 35586, 35587, 35588, 35589, 35590, 35592, 35593, 35594, 35595, 35596, + 35597, 35598, 35599, 35600, 35601, 35602, 35603, 35604, 35605, 35606, + 35607, 35608, 35609, 35610, 35611, 35612, 35613, 35614, 35615, 35616, + 35617, 35618, 35619, 35620, 35621, 35623, 35624, 35625, 35626, 35627, + 35628, 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636, 35637, + 35638, 35639, 35640, 35641, 35642, 35643, 35644, 35645, 35646, 35647, + 35648, 35649, 35650, 35651, 35652, 35653, 24103, 30151, 37073, 35777, + 33437, 26525, 25903, 21553, 34584, 30693, 32930, 33026, 27713, 20043, + 32455, 32844, 30452, 26893, 27542, 25191, 20540, 20356, 22336, 25351, + 27490, 36286, 21482, 26088, 32440, 24535, 25370, 25527, 33267, 33268, + 32622, 24092, 23769, 21046, 26234, 31209, 31258, 36136, 28825, 30164, + 28382, 27835, 31378, 20013, 30405, 24544, 38047, 34935, 32456, 31181, + 32959, 37325, 20210, 20247, 33311, 21608, 24030, 27954, 35788, 31909, + 36724, 32920, 24090, 21650, 30385, 23449, 26172, 39588, 29664, 26666, + 34523, 26417, 29482, 35832, 35803, 36880, 31481, 28891, 29038, 25284, + 30633, 22065, 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, + 35654, 35655, 35656, 35657, 35658, 35659, 35660, 35661, 35662, 35663, + 35664, 35665, 35666, 35667, 35668, 35669, 35670, 35671, 35672, 35673, + 35674, 35675, 35676, 35677, 35678, 35679, 35680, 35681, 35682, 35683, + 35684, 35685, 35687, 35688, 35689, 35690, 35691, 35693, 35694, 35695, + 35696, 35697, 35698, 35699, 35700, 35701, 35702, 35703, 35704, 35705, + 35706, 35707, 35708, 35709, 35710, 35711, 35712, 35713, 35714, 35715, + 35716, 35717, 35718, 35719, 35720, 35721, 35722, 35723, 35724, 35725, + 35726, 35727, 35728, 35729, 35730, 35731, 35732, 35733, 35734, 35735, + 35736, 35737, 35738, 35739, 35740, 35741, 35742, 35743, 35756, 35761, + 35771, 35783, 35792, 35818, 35849, 35870, 20303, 27880, 31069, 39547, + 25235, 29226, 25341, 19987, 30742, 36716, 25776, 36186, 31686, 26729, + 24196, 35013, 22918, 25758, 22766, 29366, 26894, 38181, 36861, 36184, + 22368, 32512, 35846, 20934, 25417, 25305, 21331, 26700, 29730, 33537, + 37196, 21828, 30528, 28796, 27978, 20857, 21672, 36164, 23039, 28363, + 28100, 23388, 32043, 20180, 31869, 28371, 23376, 33258, 28173, 23383, + 39683, 26837, 36394, 23447, 32508, 24635, 32437, 37049, 36208, 22863, + 25549, 31199, 36275, 21330, 26063, 31062, 35781, 38459, 32452, 38075, + 32386, 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, + 26590, 20570, 20316, 22352, 24231, 59408, 59409, 59410, 59411, 59412, + 35896, 35897, 35898, 35899, 35900, 35901, 35902, 35903, 35904, 35906, + 35907, 35908, 35909, 35912, 35914, 35915, 35917, 35918, 35919, 35920, + 35921, 35922, 35923, 35924, 35926, 35927, 35928, 35929, 35931, 35932, + 35933, 35934, 35935, 35936, 35939, 35940, 35941, 35942, 35943, 35944, + 35945, 35948, 35949, 35950, 35951, 35952, 35953, 35954, 35956, 35957, + 35958, 35959, 35963, 35964, 35965, 35966, 35967, 35968, 35969, 35971, + 35972, 35974, 35975, 35976, 35979, 35981, 35982, 35983, 35984, 35985, + 35986, 35987, 35989, 35990, 35991, 35993, 35994, 35995, 35996, 35997, + 35998, 35999, 36000, 36001, 36002, 36003, 36004, 36005, 36006, 36007, + 36008, 36009, 36010, 36011, 36012, 36013, 20109, 19980, 20800, 19984, + 24319, 21317, 19989, 20120, 19998, 39730, 23404, 22121, 20008, 31162, + 20031, 21269, 20039, 22829, 29243, 21358, 27664, 22239, 32996, 39319, + 27603, 30590, 40727, 20022, 20127, 40720, 20060, 20073, 20115, 33416, + 23387, 21868, 22031, 20164, 21389, 21405, 21411, 21413, 21422, 38757, + 36189, 21274, 21493, 21286, 21294, 21310, 36188, 21350, 21347, 20994, + 21000, 21006, 21037, 21043, 21055, 21056, 21068, 21086, 21089, 21084, + 33967, 21117, 21122, 21121, 21136, 21139, 20866, 32596, 20155, 20163, + 20169, 20162, 20200, 20193, 20203, 20190, 20251, 20211, 20258, 20324, + 20213, 20261, 20263, 20233, 20267, 20318, 20327, 25912, 20314, 20317, + 36014, 36015, 36016, 36017, 36018, 36019, 36020, 36021, 36022, 36023, + 36024, 36025, 36026, 36027, 36028, 36029, 36030, 36031, 36032, 36033, + 36034, 36035, 36036, 36037, 36038, 36039, 36040, 36041, 36042, 36043, + 36044, 36045, 36046, 36047, 36048, 36049, 36050, 36051, 36052, 36053, + 36054, 36055, 36056, 36057, 36058, 36059, 36060, 36061, 36062, 36063, + 36064, 36065, 36066, 36067, 36068, 36069, 36070, 36071, 36072, 36073, + 36074, 36075, 36076, 36077, 36078, 36079, 36080, 36081, 36082, 36083, + 36084, 36085, 36086, 36087, 36088, 36089, 36090, 36091, 36092, 36093, + 36094, 36095, 36096, 36097, 36098, 36099, 36100, 36101, 36102, 36103, + 36104, 36105, 36106, 36107, 36108, 36109, 20319, 20311, 20274, 20285, + 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, 20348, + 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, 20433, + 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, 20478, + 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, 20588, + 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, 20710, + 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, 40864, 27718, + 31860, 20846, 24061, 40649, 39320, 20865, 22804, 21241, 21261, 35335, + 21264, 20971, 22809, 20821, 20128, 20822, 20147, 34926, 34980, 20149, + 33044, 35026, 31104, 23348, 34819, 32696, 20907, 20913, 20925, 20924, + 36110, 36111, 36112, 36113, 36114, 36115, 36116, 36117, 36118, 36119, + 36120, 36121, 36122, 36123, 36124, 36128, 36177, 36178, 36183, 36191, + 36197, 36200, 36201, 36202, 36204, 36206, 36207, 36209, 36210, 36216, + 36217, 36218, 36219, 36220, 36221, 36222, 36223, 36224, 36226, 36227, + 36230, 36231, 36232, 36233, 36236, 36237, 36238, 36239, 36240, 36242, + 36243, 36245, 36246, 36247, 36248, 36249, 36250, 36251, 36252, 36253, + 36254, 36256, 36257, 36258, 36260, 36261, 36262, 36263, 36264, 36265, + 36266, 36267, 36268, 36269, 36270, 36271, 36272, 36274, 36278, 36279, + 36281, 36283, 36285, 36288, 36289, 36290, 36293, 36295, 36296, 36297, + 36298, 36301, 36304, 36306, 36307, 36308, 20935, 20886, 20898, 20901, + 35744, 35750, 35751, 35754, 35764, 35765, 35767, 35778, 35779, 35787, + 35791, 35790, 35794, 35795, 35796, 35798, 35800, 35801, 35804, 35807, + 35808, 35812, 35816, 35817, 35822, 35824, 35827, 35830, 35833, 35836, + 35839, 35840, 35842, 35844, 35847, 35852, 35855, 35857, 35858, 35860, + 35861, 35862, 35865, 35867, 35864, 35869, 35871, 35872, 35873, 35877, + 35879, 35882, 35883, 35886, 35887, 35890, 35891, 35893, 35894, 21353, + 21370, 38429, 38434, 38433, 38449, 38442, 38461, 38460, 38466, 38473, + 38484, 38495, 38503, 38508, 38514, 38516, 38536, 38541, 38551, 38576, + 37015, 37019, 37021, 37017, 37036, 37025, 37044, 37043, 37046, 37050, + 36309, 36312, 36313, 36316, 36320, 36321, 36322, 36325, 36326, 36327, + 36329, 36333, 36334, 36336, 36337, 36338, 36340, 36342, 36348, 36350, + 36351, 36352, 36353, 36354, 36355, 36356, 36358, 36359, 36360, 36363, + 36365, 36366, 36368, 36369, 36370, 36371, 36373, 36374, 36375, 36376, + 36377, 36378, 36379, 36380, 36384, 36385, 36388, 36389, 36390, 36391, + 36392, 36395, 36397, 36400, 36402, 36403, 36404, 36406, 36407, 36408, + 36411, 36412, 36414, 36415, 36419, 36421, 36422, 36428, 36429, 36430, + 36431, 36432, 36435, 36436, 36437, 36438, 36439, 36440, 36442, 36443, + 36444, 36445, 36446, 36447, 36448, 36449, 36450, 36451, 36452, 36453, + 36455, 36456, 36458, 36459, 36462, 36465, 37048, 37040, 37071, 37061, + 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, 37083, + 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, 37177, + 37187, 37190, 21005, 22850, 21154, 21164, 21165, 21182, 21759, 21200, + 21206, 21232, 21471, 29166, 30669, 24308, 20981, 20988, 39727, 21430, + 24321, 30042, 24047, 22348, 22441, 22433, 22654, 22716, 22725, 22737, + 22313, 22316, 22314, 22323, 22329, 22318, 22319, 22364, 22331, 22338, + 22377, 22405, 22379, 22406, 22396, 22395, 22376, 22381, 22390, 22387, + 22445, 22436, 22412, 22450, 22479, 22439, 22452, 22419, 22432, 22485, + 22488, 22490, 22489, 22482, 22456, 22516, 22511, 22520, 22500, 22493, + 36467, 36469, 36471, 36472, 36473, 36474, 36475, 36477, 36478, 36480, + 36482, 36483, 36484, 36486, 36488, 36489, 36490, 36491, 36492, 36493, + 36494, 36497, 36498, 36499, 36501, 36502, 36503, 36504, 36505, 36506, + 36507, 36509, 36511, 36512, 36513, 36514, 36515, 36516, 36517, 36518, + 36519, 36520, 36521, 36522, 36525, 36526, 36528, 36529, 36531, 36532, + 36533, 36534, 36535, 36536, 36537, 36539, 36540, 36541, 36542, 36543, + 36544, 36545, 36546, 36547, 36548, 36549, 36550, 36551, 36552, 36553, + 36554, 36555, 36556, 36557, 36559, 36560, 36561, 36562, 36563, 36564, + 36565, 36566, 36567, 36568, 36569, 36570, 36571, 36572, 36573, 36574, + 36575, 36576, 36577, 36578, 36579, 36580, 22539, 22541, 22525, 22509, + 22528, 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, + 22656, 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, + 33412, 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, + 33482, 33507, 33432, 33463, 33454, 33483, 33484, 33473, 33449, 33460, + 33441, 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, + 33551, 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, + 33562, 33542, 33556, 33557, 33504, 33493, 33564, 33617, 33627, 33628, + 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, + 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, + 36581, 36582, 36583, 36584, 36585, 36586, 36587, 36588, 36589, 36590, + 36591, 36592, 36593, 36594, 36595, 36596, 36597, 36598, 36599, 36600, + 36601, 36602, 36603, 36604, 36605, 36606, 36607, 36608, 36609, 36610, + 36611, 36612, 36613, 36614, 36615, 36616, 36617, 36618, 36619, 36620, + 36621, 36622, 36623, 36624, 36625, 36626, 36627, 36628, 36629, 36630, + 36631, 36632, 36633, 36634, 36635, 36636, 36637, 36638, 36639, 36640, + 36641, 36642, 36643, 36644, 36645, 36646, 36647, 36648, 36649, 36650, + 36651, 36652, 36653, 36654, 36655, 36656, 36657, 36658, 36659, 36660, + 36661, 36662, 36663, 36664, 36665, 36666, 36667, 36668, 36669, 36670, + 36671, 36672, 36673, 36674, 36675, 36676, 33640, 33563, 33641, 33644, + 33642, 33645, 33646, 33712, 33656, 33715, 33716, 33696, 33706, 33683, + 33692, 33669, 33660, 33718, 33705, 33661, 33720, 33659, 33688, 33694, + 33704, 33722, 33724, 33729, 33793, 33765, 33752, 22535, 33816, 33803, + 33757, 33789, 33750, 33820, 33848, 33809, 33798, 33748, 33759, 33807, + 33795, 33784, 33785, 33770, 33733, 33728, 33830, 33776, 33761, 33884, + 33873, 33882, 33881, 33907, 33927, 33928, 33914, 33929, 33912, 33852, + 33862, 33897, 33910, 33932, 33934, 33841, 33901, 33985, 33997, 34000, + 34022, 33981, 34003, 33994, 33983, 33978, 34016, 33953, 33977, 33972, + 33943, 34021, 34019, 34060, 29965, 34104, 34032, 34105, 34079, 34106, + 36677, 36678, 36679, 36680, 36681, 36682, 36683, 36684, 36685, 36686, + 36687, 36688, 36689, 36690, 36691, 36692, 36693, 36694, 36695, 36696, + 36697, 36698, 36699, 36700, 36701, 36702, 36703, 36704, 36705, 36706, + 36707, 36708, 36709, 36714, 36736, 36748, 36754, 36765, 36768, 36769, + 36770, 36772, 36773, 36774, 36775, 36778, 36780, 36781, 36782, 36783, + 36786, 36787, 36788, 36789, 36791, 36792, 36794, 36795, 36796, 36799, + 36800, 36803, 36806, 36809, 36810, 36811, 36812, 36813, 36815, 36818, + 36822, 36823, 36826, 36832, 36833, 36835, 36839, 36844, 36847, 36849, + 36850, 36852, 36853, 36854, 36858, 36859, 36860, 36862, 36863, 36871, + 36872, 36876, 36878, 36883, 36885, 36888, 34134, 34107, 34047, 34044, + 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, + 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, + 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, + 24318, 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, 23586, + 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, 25306, 25303, + 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, 25457, 25466, + 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, 25586, 25592, + 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, 25669, 25665, + 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, 25709, 25750, + 36889, 36892, 36899, 36900, 36901, 36903, 36904, 36905, 36906, 36907, + 36908, 36912, 36913, 36914, 36915, 36916, 36919, 36921, 36922, 36925, + 36927, 36928, 36931, 36933, 36934, 36936, 36937, 36938, 36939, 36940, + 36942, 36948, 36949, 36950, 36953, 36954, 36956, 36957, 36958, 36959, + 36960, 36961, 36964, 36966, 36967, 36969, 36970, 36971, 36972, 36975, + 36976, 36977, 36978, 36979, 36982, 36983, 36984, 36985, 36986, 36987, + 36988, 36990, 36993, 36996, 36997, 36998, 36999, 37001, 37002, 37004, + 37005, 37006, 37007, 37008, 37010, 37012, 37014, 37016, 37018, 37020, + 37022, 37023, 37024, 37028, 37029, 37031, 37032, 37033, 37035, 37037, + 37042, 37047, 37052, 37053, 37055, 37056, 25722, 25783, 25784, 25753, + 25786, 25792, 25808, 25815, 25828, 25826, 25865, 25893, 25902, 24331, + 24530, 29977, 24337, 21343, 21489, 21501, 21481, 21480, 21499, 21522, + 21526, 21510, 21579, 21586, 21587, 21588, 21590, 21571, 21537, 21591, + 21593, 21539, 21554, 21634, 21652, 21623, 21617, 21604, 21658, 21659, + 21636, 21622, 21606, 21661, 21712, 21677, 21698, 21684, 21714, 21671, + 21670, 21715, 21716, 21618, 21667, 21717, 21691, 21695, 21708, 21721, + 21722, 21724, 21673, 21674, 21668, 21725, 21711, 21726, 21787, 21735, + 21792, 21757, 21780, 21747, 21794, 21795, 21775, 21777, 21799, 21802, + 21863, 21903, 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, + 37058, 37059, 37062, 37064, 37065, 37067, 37068, 37069, 37074, 37076, + 37077, 37078, 37080, 37081, 37082, 37086, 37087, 37088, 37091, 37092, + 37093, 37097, 37098, 37100, 37102, 37104, 37105, 37106, 37107, 37109, + 37110, 37111, 37113, 37114, 37115, 37116, 37119, 37120, 37121, 37123, + 37125, 37126, 37127, 37128, 37129, 37130, 37131, 37132, 37133, 37134, + 37135, 37136, 37137, 37138, 37139, 37140, 37141, 37142, 37143, 37144, + 37146, 37147, 37148, 37149, 37151, 37152, 37153, 37156, 37157, 37158, + 37159, 37160, 37161, 37162, 37163, 37164, 37165, 37166, 37168, 37170, + 37171, 37172, 37173, 37174, 37175, 37176, 37178, 37179, 37180, 37181, + 37182, 37183, 37184, 37185, 37186, 37188, 21815, 21846, 21877, 21878, + 21879, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, 21896, + 21889, 21919, 21886, 21974, 21905, 21883, 21983, 21949, 21950, 21908, + 21913, 21994, 22007, 21961, 22047, 21969, 21995, 21996, 21972, 21990, + 21981, 21956, 21999, 21989, 22002, 22003, 21964, 21965, 21992, 22005, + 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, 22014, 22016, + 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, 22105, 22108, + 22092, 22100, 22150, 22116, 22129, 22123, 22139, 22140, 22149, 22163, + 22191, 22228, 22231, 22237, 22241, 22261, 22251, 22265, 22271, 22276, + 22282, 22281, 22300, 24079, 24089, 24084, 24081, 24113, 24123, 24124, + 37189, 37191, 37192, 37201, 37203, 37204, 37205, 37206, 37208, 37209, + 37211, 37212, 37215, 37216, 37222, 37223, 37224, 37227, 37229, 37235, + 37242, 37243, 37244, 37248, 37249, 37250, 37251, 37252, 37254, 37256, + 37258, 37262, 37263, 37267, 37268, 37269, 37270, 37271, 37272, 37273, + 37276, 37277, 37278, 37279, 37280, 37281, 37284, 37285, 37286, 37287, + 37288, 37289, 37291, 37292, 37296, 37297, 37298, 37299, 37302, 37303, + 37304, 37305, 37307, 37308, 37309, 37310, 37311, 37312, 37313, 37314, + 37315, 37316, 37317, 37318, 37320, 37323, 37328, 37330, 37331, 37332, + 37333, 37334, 37335, 37336, 37337, 37338, 37339, 37341, 37342, 37343, + 37344, 37345, 37346, 37347, 37348, 37349, 24119, 24132, 24148, 24155, + 24158, 24161, 23692, 23674, 23693, 23696, 23702, 23688, 23704, 23705, + 23697, 23706, 23708, 23733, 23714, 23741, 23724, 23723, 23729, 23715, + 23745, 23735, 23748, 23762, 23780, 23755, 23781, 23810, 23811, 23847, + 23846, 23854, 23844, 23838, 23814, 23835, 23896, 23870, 23860, 23869, + 23916, 23899, 23919, 23901, 23915, 23883, 23882, 23913, 23924, 23938, + 23961, 23965, 35955, 23991, 24005, 24435, 24439, 24450, 24455, 24457, + 24460, 24469, 24473, 24476, 24488, 24493, 24501, 24508, 34914, 24417, + 29357, 29360, 29364, 29367, 29368, 29379, 29377, 29390, 29389, 29394, + 29416, 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, 29434, + 37350, 37351, 37352, 37353, 37354, 37355, 37356, 37357, 37358, 37359, + 37360, 37361, 37362, 37363, 37364, 37365, 37366, 37367, 37368, 37369, + 37370, 37371, 37372, 37373, 37374, 37375, 37376, 37377, 37378, 37379, + 37380, 37381, 37382, 37383, 37384, 37385, 37386, 37387, 37388, 37389, + 37390, 37391, 37392, 37393, 37394, 37395, 37396, 37397, 37398, 37399, + 37400, 37401, 37402, 37403, 37404, 37405, 37406, 37407, 37408, 37409, + 37410, 37411, 37412, 37413, 37414, 37415, 37416, 37417, 37418, 37419, + 37420, 37421, 37422, 37423, 37424, 37425, 37426, 37427, 37428, 37429, + 37430, 37431, 37432, 37433, 37434, 37435, 37436, 37437, 37438, 37439, + 37440, 37441, 37442, 37443, 37444, 37445, 29435, 29463, 29459, 29473, + 29450, 29470, 29469, 29461, 29474, 29497, 29477, 29484, 29496, 29489, + 29520, 29517, 29527, 29536, 29548, 29551, 29566, 33307, 22821, 39143, + 22820, 22786, 39267, 39271, 39272, 39273, 39274, 39275, 39276, 39284, + 39287, 39293, 39296, 39300, 39303, 39306, 39309, 39312, 39313, 39315, + 39316, 39317, 24192, 24209, 24203, 24214, 24229, 24224, 24249, 24245, + 24254, 24243, 36179, 24274, 24273, 24283, 24296, 24298, 33210, 24516, + 24521, 24534, 24527, 24579, 24558, 24580, 24545, 24548, 24574, 24581, + 24582, 24554, 24557, 24568, 24601, 24629, 24614, 24603, 24591, 24589, + 24617, 24619, 24586, 24639, 24609, 24696, 24697, 24699, 24698, 24642, + 37446, 37447, 37448, 37449, 37450, 37451, 37452, 37453, 37454, 37455, + 37456, 37457, 37458, 37459, 37460, 37461, 37462, 37463, 37464, 37465, + 37466, 37467, 37468, 37469, 37470, 37471, 37472, 37473, 37474, 37475, + 37476, 37477, 37478, 37479, 37480, 37481, 37482, 37483, 37484, 37485, + 37486, 37487, 37488, 37489, 37490, 37491, 37493, 37494, 37495, 37496, + 37497, 37498, 37499, 37500, 37501, 37502, 37503, 37504, 37505, 37506, + 37507, 37508, 37509, 37510, 37511, 37512, 37513, 37514, 37515, 37516, + 37517, 37519, 37520, 37521, 37522, 37523, 37524, 37525, 37526, 37527, + 37528, 37529, 37530, 37531, 37532, 37533, 37534, 37535, 37536, 37537, + 37538, 37539, 37540, 37541, 37542, 37543, 24682, 24701, 24726, 24730, + 24749, 24733, 24707, 24722, 24716, 24731, 24812, 24763, 24753, 24797, + 24792, 24774, 24794, 24756, 24864, 24870, 24853, 24867, 24820, 24832, + 24846, 24875, 24906, 24949, 25004, 24980, 24999, 25015, 25044, 25077, + 24541, 38579, 38377, 38379, 38385, 38387, 38389, 38390, 38396, 38398, + 38403, 38404, 38406, 38408, 38410, 38411, 38412, 38413, 38415, 38418, + 38421, 38422, 38423, 38425, 38426, 20012, 29247, 25109, 27701, 27732, + 27740, 27722, 27811, 27781, 27792, 27796, 27788, 27752, 27753, 27764, + 27766, 27782, 27817, 27856, 27860, 27821, 27895, 27896, 27889, 27863, + 27826, 27872, 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, + 37544, 37545, 37546, 37547, 37548, 37549, 37551, 37552, 37553, 37554, + 37555, 37556, 37557, 37558, 37559, 37560, 37561, 37562, 37563, 37564, + 37565, 37566, 37567, 37568, 37569, 37570, 37571, 37572, 37573, 37574, + 37575, 37577, 37578, 37579, 37580, 37581, 37582, 37583, 37584, 37585, + 37586, 37587, 37588, 37589, 37590, 37591, 37592, 37593, 37594, 37595, + 37596, 37597, 37598, 37599, 37600, 37601, 37602, 37603, 37604, 37605, + 37606, 37607, 37608, 37609, 37610, 37611, 37612, 37613, 37614, 37615, + 37616, 37617, 37618, 37619, 37620, 37621, 37622, 37623, 37624, 37625, + 37626, 37627, 37628, 37629, 37630, 37631, 37632, 37633, 37634, 37635, + 37636, 37637, 37638, 37639, 37640, 37641, 27961, 27943, 27916, 27971, + 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, 27957, 27930, + 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, 27998, 28051, + 28052, 27996, 28000, 28028, 28003, 28186, 28103, 28101, 28126, 28174, + 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, 28172, 28078, + 28203, 28270, 28238, 28267, 28338, 28255, 28294, 28243, 28244, 28210, + 28197, 28228, 28383, 28337, 28312, 28384, 28461, 28386, 28325, 28327, + 28349, 28347, 28343, 28375, 28340, 28367, 28303, 28354, 28319, 28514, + 28486, 28487, 28452, 28437, 28409, 28463, 28470, 28491, 28532, 28458, + 28425, 28457, 28553, 28557, 28556, 28536, 28530, 28540, 28538, 28625, + 37642, 37643, 37644, 37645, 37646, 37647, 37648, 37649, 37650, 37651, + 37652, 37653, 37654, 37655, 37656, 37657, 37658, 37659, 37660, 37661, + 37662, 37663, 37664, 37665, 37666, 37667, 37668, 37669, 37670, 37671, + 37672, 37673, 37674, 37675, 37676, 37677, 37678, 37679, 37680, 37681, + 37682, 37683, 37684, 37685, 37686, 37687, 37688, 37689, 37690, 37691, + 37692, 37693, 37695, 37696, 37697, 37698, 37699, 37700, 37701, 37702, + 37703, 37704, 37705, 37706, 37707, 37708, 37709, 37710, 37711, 37712, + 37713, 37714, 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722, + 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730, 37731, 37732, + 37733, 37734, 37735, 37736, 37737, 37739, 28617, 28583, 28601, 28598, + 28610, 28641, 28654, 28638, 28640, 28655, 28698, 28707, 28699, 28729, + 28725, 28751, 28766, 23424, 23428, 23445, 23443, 23461, 23480, 29999, + 39582, 25652, 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, + 36821, 36837, 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, + 36875, 36902, 36881, 36877, 36886, 36897, 36917, 36918, 36909, 36911, + 36932, 36945, 36946, 36944, 36968, 36952, 36962, 36955, 26297, 36980, + 36989, 36994, 37000, 36995, 37003, 24400, 24407, 24406, 24408, 23611, + 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, + 33396, 24380, 39739, 23662, 22913, 22915, 22925, 22953, 22954, 22947, + 37740, 37741, 37742, 37743, 37744, 37745, 37746, 37747, 37748, 37749, + 37750, 37751, 37752, 37753, 37754, 37755, 37756, 37757, 37758, 37759, + 37760, 37761, 37762, 37763, 37764, 37765, 37766, 37767, 37768, 37769, + 37770, 37771, 37772, 37773, 37774, 37776, 37777, 37778, 37779, 37780, + 37781, 37782, 37783, 37784, 37785, 37786, 37787, 37788, 37789, 37790, + 37791, 37792, 37793, 37794, 37795, 37796, 37797, 37798, 37799, 37800, + 37801, 37802, 37803, 37804, 37805, 37806, 37807, 37808, 37809, 37810, + 37811, 37812, 37813, 37814, 37815, 37816, 37817, 37818, 37819, 37820, + 37821, 37822, 37823, 37824, 37825, 37826, 37827, 37828, 37829, 37830, + 37831, 37832, 37833, 37835, 37836, 37837, 22935, 22986, 22955, 22942, + 22948, 22994, 22962, 22959, 22999, 22974, 23045, 23046, 23005, 23048, + 23011, 23000, 23033, 23052, 23049, 23090, 23092, 23057, 23075, 23059, + 23104, 23143, 23114, 23125, 23100, 23138, 23157, 33004, 23210, 23195, + 23159, 23162, 23230, 23275, 23218, 23250, 23252, 23224, 23264, 23267, + 23281, 23254, 23270, 23256, 23260, 23305, 23319, 23318, 23346, 23351, + 23360, 23573, 23580, 23386, 23397, 23411, 23377, 23379, 23394, 39541, + 39543, 39544, 39546, 39551, 39549, 39552, 39553, 39557, 39560, 39562, + 39568, 39570, 39571, 39574, 39576, 39579, 39580, 39581, 39583, 39584, + 39586, 39587, 39589, 39591, 32415, 32417, 32419, 32421, 32424, 32425, + 37838, 37839, 37840, 37841, 37842, 37843, 37844, 37845, 37847, 37848, + 37849, 37850, 37851, 37852, 37853, 37854, 37855, 37856, 37857, 37858, + 37859, 37860, 37861, 37862, 37863, 37864, 37865, 37866, 37867, 37868, + 37869, 37870, 37871, 37872, 37873, 37874, 37875, 37876, 37877, 37878, + 37879, 37880, 37881, 37882, 37883, 37884, 37885, 37886, 37887, 37888, + 37889, 37890, 37891, 37892, 37893, 37894, 37895, 37896, 37897, 37898, + 37899, 37900, 37901, 37902, 37903, 37904, 37905, 37906, 37907, 37908, + 37909, 37910, 37911, 37912, 37913, 37914, 37915, 37916, 37917, 37918, + 37919, 37920, 37921, 37922, 37923, 37924, 37925, 37926, 37927, 37928, + 37929, 37930, 37931, 37932, 37933, 37934, 32429, 32432, 32446, 32448, + 32449, 32450, 32457, 32459, 32460, 32464, 32468, 32471, 32475, 32480, + 32481, 32488, 32491, 32494, 32495, 32497, 32498, 32525, 32502, 32506, + 32507, 32510, 32513, 32514, 32515, 32519, 32520, 32523, 32524, 32527, + 32529, 32530, 32535, 32537, 32540, 32539, 32543, 32545, 32546, 32547, + 32548, 32549, 32550, 32551, 32554, 32555, 32556, 32557, 32559, 32560, + 32561, 32562, 32563, 32565, 24186, 30079, 24027, 30014, 37013, 29582, + 29585, 29614, 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, + 29641, 29640, 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, + 29682, 29711, 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, + 37935, 37936, 37937, 37938, 37939, 37940, 37941, 37942, 37943, 37944, + 37945, 37946, 37947, 37948, 37949, 37951, 37952, 37953, 37954, 37955, + 37956, 37957, 37958, 37959, 37960, 37961, 37962, 37963, 37964, 37965, + 37966, 37967, 37968, 37969, 37970, 37971, 37972, 37973, 37974, 37975, + 37976, 37977, 37978, 37979, 37980, 37981, 37982, 37983, 37984, 37985, + 37986, 37987, 37988, 37989, 37990, 37991, 37992, 37993, 37994, 37996, + 37997, 37998, 37999, 38000, 38001, 38002, 38003, 38004, 38005, 38006, + 38007, 38008, 38009, 38010, 38011, 38012, 38013, 38014, 38015, 38016, + 38017, 38018, 38019, 38020, 38033, 38038, 38040, 38087, 38095, 38099, + 38100, 38106, 38118, 38139, 38172, 38176, 29723, 29722, 29761, 29788, + 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, 29824, 29825, + 29831, 29835, 29854, 29864, 29865, 29840, 29863, 29906, 29882, 38890, + 38891, 38892, 26444, 26451, 26462, 26440, 26473, 26533, 26503, 26474, + 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, 26487, 26492, + 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, 26549, 26586, + 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, 26621, 26674, + 26675, 26720, 26721, 26702, 26722, 26692, 26724, 26755, 26653, 26709, + 26726, 26689, 26727, 26688, 26686, 26698, 26697, 26665, 26805, 26767, + 26740, 26743, 26771, 26731, 26818, 26990, 26876, 26911, 26912, 26873, + 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, + 38260, 38261, 38263, 38264, 38265, 38266, 38267, 38268, 38269, 38270, + 38272, 38273, 38274, 38275, 38276, 38277, 38278, 38279, 38280, 38281, + 38282, 38283, 38284, 38285, 38286, 38287, 38288, 38289, 38290, 38291, + 38292, 38293, 38294, 38295, 38296, 38297, 38298, 38299, 38300, 38301, + 38302, 38303, 38304, 38305, 38306, 38307, 38308, 38309, 38310, 38311, + 38312, 38313, 38314, 38315, 38316, 38317, 38318, 38319, 38320, 38321, + 38322, 38323, 38324, 38325, 38326, 38327, 38328, 38329, 38330, 38331, + 38332, 38333, 38334, 38335, 38336, 38337, 38338, 38339, 38340, 38341, + 38342, 38343, 38344, 38345, 38346, 38347, 26916, 26864, 26891, 26881, + 26967, 26851, 26896, 26993, 26937, 26976, 26946, 26973, 27012, 26987, + 27008, 27032, 27000, 26932, 27084, 27015, 27016, 27086, 27017, 26982, + 26979, 27001, 27035, 27047, 27067, 27051, 27053, 27092, 27057, 27073, + 27082, 27103, 27029, 27104, 27021, 27135, 27183, 27117, 27159, 27160, + 27237, 27122, 27204, 27198, 27296, 27216, 27227, 27189, 27278, 27257, + 27197, 27176, 27224, 27260, 27281, 27280, 27305, 27287, 27307, 29495, + 29522, 27521, 27522, 27527, 27524, 27538, 27539, 27533, 27546, 27547, + 27553, 27562, 36715, 36717, 36721, 36722, 36723, 36725, 36726, 36728, + 36727, 36729, 36730, 36732, 36734, 36737, 36738, 36740, 36743, 36747, + 38348, 38349, 38350, 38351, 38352, 38353, 38354, 38355, 38356, 38357, + 38358, 38359, 38360, 38361, 38362, 38363, 38364, 38365, 38366, 38367, + 38368, 38369, 38370, 38371, 38372, 38373, 38374, 38375, 38380, 38399, + 38407, 38419, 38424, 38427, 38430, 38432, 38435, 38436, 38437, 38438, + 38439, 38440, 38441, 38443, 38444, 38445, 38447, 38448, 38455, 38456, + 38457, 38458, 38462, 38465, 38467, 38474, 38478, 38479, 38481, 38482, + 38483, 38486, 38487, 38488, 38489, 38490, 38492, 38493, 38494, 38496, + 38499, 38501, 38502, 38507, 38509, 38510, 38511, 38512, 38513, 38515, + 38520, 38521, 38522, 38523, 38524, 38525, 38526, 38527, 38528, 38529, + 38530, 38531, 38532, 38535, 38537, 38538, 36749, 36750, 36751, 36760, + 36762, 36558, 25099, 25111, 25115, 25119, 25122, 25121, 25125, 25124, + 25132, 33255, 29935, 29940, 29951, 29967, 29969, 29971, 25908, 26094, + 26095, 26096, 26122, 26137, 26482, 26115, 26133, 26112, 28805, 26359, + 26141, 26164, 26161, 26166, 26165, 32774, 26207, 26196, 26177, 26191, + 26198, 26209, 26199, 26231, 26244, 26252, 26279, 26269, 26302, 26331, + 26332, 26342, 26345, 36146, 36147, 36150, 36155, 36157, 36160, 36165, + 36166, 36168, 36169, 36167, 36173, 36181, 36185, 35271, 35274, 35275, + 35276, 35278, 35279, 35280, 35281, 29294, 29343, 29277, 29286, 29295, + 29310, 29311, 29316, 29323, 29325, 29327, 29330, 25352, 25394, 25520, + 38540, 38542, 38545, 38546, 38547, 38549, 38550, 38554, 38555, 38557, + 38558, 38559, 38560, 38561, 38562, 38563, 38564, 38565, 38566, 38568, + 38569, 38570, 38571, 38572, 38573, 38574, 38575, 38577, 38578, 38580, + 38581, 38583, 38584, 38586, 38587, 38591, 38594, 38595, 38600, 38602, + 38603, 38608, 38609, 38611, 38612, 38614, 38615, 38616, 38617, 38618, + 38619, 38620, 38621, 38622, 38623, 38625, 38626, 38627, 38628, 38629, + 38630, 38631, 38635, 38636, 38637, 38638, 38640, 38641, 38642, 38644, + 38645, 38648, 38650, 38651, 38652, 38653, 38655, 38658, 38659, 38661, + 38666, 38667, 38668, 38672, 38673, 38674, 38676, 38677, 38679, 38680, + 38681, 38682, 38683, 38685, 38687, 38688, 25663, 25816, 32772, 27626, + 27635, 27645, 27637, 27641, 27653, 27655, 27654, 27661, 27669, 27672, + 27673, 27674, 27681, 27689, 27684, 27690, 27698, 25909, 25941, 25963, + 29261, 29266, 29270, 29232, 34402, 21014, 32927, 32924, 32915, 32956, + 26378, 32957, 32945, 32939, 32941, 32948, 32951, 32999, 33000, 33001, + 33002, 32987, 32962, 32964, 32985, 32973, 32983, 26384, 32989, 33003, + 33009, 33012, 33005, 33037, 33038, 33010, 33020, 26389, 33042, 35930, + 33078, 33054, 33068, 33048, 33074, 33096, 33100, 33107, 33140, 33113, + 33114, 33137, 33120, 33129, 33148, 33149, 33133, 33127, 22605, 23221, + 33160, 33154, 33169, 28373, 33187, 33194, 33228, 26406, 33226, 33211, + 38689, 38690, 38691, 38692, 38693, 38694, 38695, 38696, 38697, 38699, + 38700, 38702, 38703, 38705, 38707, 38708, 38709, 38710, 38711, 38714, + 38715, 38716, 38717, 38719, 38720, 38721, 38722, 38723, 38724, 38725, + 38726, 38727, 38728, 38729, 38730, 38731, 38732, 38733, 38734, 38735, + 38736, 38737, 38740, 38741, 38743, 38744, 38746, 38748, 38749, 38751, + 38755, 38756, 38758, 38759, 38760, 38762, 38763, 38764, 38765, 38766, + 38767, 38768, 38769, 38770, 38773, 38775, 38776, 38777, 38778, 38779, + 38781, 38782, 38783, 38784, 38785, 38786, 38787, 38788, 38790, 38791, + 38792, 38793, 38794, 38796, 38798, 38799, 38800, 38803, 38805, 38806, + 38807, 38809, 38810, 38811, 38812, 38813, 33217, 33190, 27428, 27447, + 27449, 27459, 27462, 27481, 39121, 39122, 39123, 39125, 39129, 39130, + 27571, 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, 26052, + 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, 28859, + 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, 28975, + 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, 29080, + 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, 29224, + 28780, 28952, 29030, 29113, 25150, 25149, 25155, 25160, 25161, 31035, + 31040, 31046, 31049, 31067, 31068, 31059, 31066, 31074, 31063, 31072, + 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, 24528, + 38814, 38815, 38817, 38818, 38820, 38821, 38822, 38823, 38824, 38825, + 38826, 38828, 38830, 38832, 38833, 38835, 38837, 38838, 38839, 38840, + 38841, 38842, 38843, 38844, 38845, 38846, 38847, 38848, 38849, 38850, + 38851, 38852, 38853, 38854, 38855, 38856, 38857, 38858, 38859, 38860, + 38861, 38862, 38863, 38864, 38865, 38866, 38867, 38868, 38869, 38870, + 38871, 38872, 38873, 38874, 38875, 38876, 38877, 38878, 38879, 38880, + 38881, 38882, 38883, 38884, 38885, 38888, 38894, 38895, 38896, 38897, + 38898, 38900, 38903, 38904, 38905, 38906, 38907, 38908, 38909, 38910, + 38911, 38912, 38913, 38914, 38915, 38916, 38917, 38918, 38919, 38920, + 38921, 38922, 38923, 38924, 38925, 38926, 24636, 24669, 24666, 24679, + 24641, 24665, 24675, 24747, 24838, 24845, 24925, 25001, 24989, 25035, + 25041, 25094, 32896, 32895, 27795, 27894, 28156, 30710, 30712, 30720, + 30729, 30743, 30744, 30737, 26027, 30765, 30748, 30749, 30777, 30778, + 30779, 30751, 30780, 30757, 30764, 30755, 30761, 30798, 30829, 30806, + 30807, 30758, 30800, 30791, 30796, 30826, 30875, 30867, 30874, 30855, + 30876, 30881, 30883, 30898, 30905, 30885, 30932, 30937, 30921, 30956, + 30962, 30981, 30964, 30995, 31012, 31006, 31028, 40859, 40697, 40699, + 40700, 30449, 30468, 30477, 30457, 30471, 30472, 30490, 30498, 30489, + 30509, 30502, 30517, 30520, 30544, 30545, 30535, 30531, 30554, 30568, + 38927, 38928, 38929, 38930, 38931, 38932, 38933, 38934, 38935, 38936, + 38937, 38938, 38939, 38940, 38941, 38942, 38943, 38944, 38945, 38946, + 38947, 38948, 38949, 38950, 38951, 38952, 38953, 38954, 38955, 38956, + 38957, 38958, 38959, 38960, 38961, 38962, 38963, 38964, 38965, 38966, + 38967, 38968, 38969, 38970, 38971, 38972, 38973, 38974, 38975, 38976, + 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38986, + 38987, 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995, 38996, + 38997, 38998, 38999, 39000, 39001, 39002, 39003, 39004, 39005, 39006, + 39007, 39008, 39009, 39010, 39011, 39012, 39013, 39014, 39015, 39016, + 39017, 39018, 39019, 39020, 39021, 39022, 30562, 30565, 30591, 30605, + 30589, 30592, 30604, 30609, 30623, 30624, 30640, 30645, 30653, 30010, + 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, 32609, + 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, 30437, + 34866, 38021, 38022, 38023, 38027, 38026, 38028, 38029, 38031, 38032, + 38036, 38039, 38037, 38042, 38043, 38044, 38051, 38052, 38059, 38058, + 38061, 38060, 38063, 38064, 38066, 38068, 38070, 38071, 38072, 38073, + 38074, 38076, 38077, 38079, 38084, 38088, 38089, 38090, 38091, 38092, + 38093, 38094, 38096, 38097, 38098, 38101, 38102, 38103, 38105, 38104, + 38107, 38110, 38111, 38112, 38114, 38116, 38117, 38119, 38120, 38122, + 39023, 39024, 39025, 39026, 39027, 39028, 39051, 39054, 39058, 39061, + 39065, 39075, 39080, 39081, 39082, 39083, 39084, 39085, 39086, 39087, + 39088, 39089, 39090, 39091, 39092, 39093, 39094, 39095, 39096, 39097, + 39098, 39099, 39100, 39101, 39102, 39103, 39104, 39105, 39106, 39107, + 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115, 39116, 39117, + 39119, 39120, 39124, 39126, 39127, 39131, 39132, 39133, 39136, 39137, + 39138, 39139, 39140, 39141, 39142, 39145, 39146, 39147, 39148, 39149, + 39150, 39151, 39152, 39153, 39154, 39155, 39156, 39157, 39158, 39159, + 39160, 39161, 39162, 39163, 39164, 39165, 39166, 39167, 39168, 39169, + 39170, 39171, 39172, 39173, 39174, 39175, 38121, 38123, 38126, 38127, + 38131, 38132, 38133, 38135, 38137, 38140, 38141, 38143, 38147, 38146, + 38150, 38151, 38153, 38154, 38157, 38158, 38159, 38162, 38163, 38164, + 38165, 38166, 38168, 38171, 38173, 38174, 38175, 38178, 38186, 38187, + 38185, 38188, 38193, 38194, 38196, 38198, 38199, 38200, 38204, 38206, + 38207, 38210, 38197, 38212, 38213, 38214, 38217, 38220, 38222, 38223, + 38226, 38227, 38228, 38230, 38231, 38232, 38233, 38235, 38238, 38239, + 38237, 38241, 38242, 38244, 38245, 38246, 38247, 38248, 38249, 38250, + 38251, 38252, 38255, 38257, 38258, 38259, 38202, 30695, 30700, 38601, + 31189, 31213, 31203, 31211, 31238, 23879, 31235, 31234, 31262, 31252, + 39176, 39177, 39178, 39179, 39180, 39182, 39183, 39185, 39186, 39187, + 39188, 39189, 39190, 39191, 39192, 39193, 39194, 39195, 39196, 39197, + 39198, 39199, 39200, 39201, 39202, 39203, 39204, 39205, 39206, 39207, + 39208, 39209, 39210, 39211, 39212, 39213, 39215, 39216, 39217, 39218, + 39219, 39220, 39221, 39222, 39223, 39224, 39225, 39226, 39227, 39228, + 39229, 39230, 39231, 39232, 39233, 39234, 39235, 39236, 39237, 39238, + 39239, 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247, 39248, + 39249, 39250, 39251, 39254, 39255, 39256, 39257, 39258, 39259, 39260, + 39261, 39262, 39263, 39264, 39265, 39266, 39268, 39270, 39283, 39288, + 39289, 39291, 39294, 39298, 39299, 39305, 31289, 31287, 31313, 40655, + 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, + 40480, 40482, 40488, 40489, 40490, 40491, 40492, 40498, 40497, 40502, + 40504, 40503, 40505, 40506, 40510, 40513, 40514, 40516, 40518, 40519, + 40520, 40521, 40523, 40524, 40526, 40529, 40533, 40535, 40538, 40539, + 40540, 40542, 40547, 40550, 40551, 40552, 40553, 40554, 40555, 40556, + 40561, 40557, 40563, 30098, 30100, 30102, 30112, 30109, 30124, 30115, + 30131, 30132, 30136, 30148, 30129, 30128, 30147, 30146, 30166, 30157, + 30179, 30184, 30182, 30180, 30187, 30183, 30211, 30193, 30204, 30207, + 30224, 30208, 30213, 30220, 30231, 30218, 30245, 30232, 30229, 30233, + 39308, 39310, 39322, 39323, 39324, 39325, 39326, 39327, 39328, 39329, + 39330, 39331, 39332, 39334, 39335, 39337, 39338, 39339, 39340, 39341, + 39342, 39343, 39344, 39345, 39346, 39347, 39348, 39349, 39350, 39351, + 39352, 39353, 39354, 39355, 39356, 39357, 39358, 39359, 39360, 39361, + 39362, 39363, 39364, 39365, 39366, 39367, 39368, 39369, 39370, 39371, + 39372, 39373, 39374, 39375, 39376, 39377, 39378, 39379, 39380, 39381, + 39382, 39383, 39384, 39385, 39386, 39387, 39388, 39389, 39390, 39391, + 39392, 39393, 39394, 39395, 39396, 39397, 39398, 39399, 39400, 39401, + 39402, 39403, 39404, 39405, 39406, 39407, 39408, 39409, 39410, 39411, + 39412, 39413, 39414, 39415, 39416, 39417, 30235, 30268, 30242, 30240, + 30272, 30253, 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, + 30292, 30300, 30294, 30315, 30319, 32714, 31462, 31352, 31353, 31360, + 31366, 31368, 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, + 34921, 34930, 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, + 35042, 35022, 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, + 35105, 35097, 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, + 35195, 30091, 32997, 30386, 30388, 30684, 32786, 32788, 32790, 32796, + 32800, 32802, 32805, 32806, 32807, 32809, 32808, 32817, 32779, 32821, + 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, + 39418, 39419, 39420, 39421, 39422, 39423, 39424, 39425, 39426, 39427, + 39428, 39429, 39430, 39431, 39432, 39433, 39434, 39435, 39436, 39437, + 39438, 39439, 39440, 39441, 39442, 39443, 39444, 39445, 39446, 39447, + 39448, 39449, 39450, 39451, 39452, 39453, 39454, 39455, 39456, 39457, + 39458, 39459, 39460, 39461, 39462, 39463, 39464, 39465, 39466, 39467, + 39468, 39469, 39470, 39471, 39472, 39473, 39474, 39475, 39476, 39477, + 39478, 39479, 39480, 39481, 39482, 39483, 39484, 39485, 39486, 39487, + 39488, 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, 39497, + 39498, 39499, 39500, 39501, 39502, 39503, 39504, 39505, 39506, 39507, + 39508, 39509, 39510, 39511, 39512, 39513, 39049, 39052, 39053, 39055, + 39060, 39066, 39067, 39070, 39071, 39073, 39074, 39077, 39078, 34381, + 34388, 34412, 34414, 34431, 34426, 34428, 34427, 34472, 34445, 34443, + 34476, 34461, 34471, 34467, 34474, 34451, 34473, 34486, 34500, 34485, + 34510, 34480, 34490, 34481, 34479, 34505, 34511, 34484, 34537, 34545, + 34546, 34541, 34547, 34512, 34579, 34526, 34548, 34527, 34520, 34513, + 34563, 34567, 34552, 34568, 34570, 34573, 34569, 34595, 34619, 34590, + 34597, 34606, 34586, 34622, 34632, 34612, 34609, 34601, 34615, 34623, + 34690, 34594, 34685, 34686, 34683, 34656, 34672, 34636, 34670, 34699, + 34643, 34659, 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, + 39514, 39515, 39516, 39517, 39518, 39519, 39520, 39521, 39522, 39523, + 39524, 39525, 39526, 39527, 39528, 39529, 39530, 39531, 39538, 39555, + 39561, 39565, 39566, 39572, 39573, 39577, 39590, 39593, 39594, 39595, + 39596, 39597, 39598, 39599, 39602, 39603, 39604, 39605, 39609, 39611, + 39613, 39614, 39615, 39619, 39620, 39622, 39623, 39624, 39625, 39626, + 39629, 39630, 39631, 39632, 39634, 39636, 39637, 39638, 39639, 39641, + 39642, 39643, 39644, 39645, 39646, 39648, 39650, 39651, 39652, 39653, + 39655, 39656, 39657, 39658, 39660, 39662, 39664, 39665, 39666, 39667, + 39668, 39669, 39670, 39671, 39672, 39674, 39676, 39677, 39678, 39679, + 39680, 39681, 39682, 39684, 39685, 39686, 34758, 34696, 34693, 34733, + 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, 34771, 34749, + 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, 34835, 34814, + 34826, 34843, 34849, 34873, 34876, 32566, 32578, 32580, 32581, 33296, + 31482, 31485, 31496, 31491, 31492, 31509, 31498, 31531, 31503, 31559, + 31544, 31530, 31513, 31534, 31537, 31520, 31525, 31524, 31539, 31550, + 31518, 31576, 31578, 31557, 31605, 31564, 31581, 31584, 31598, 31611, + 31586, 31602, 31601, 31632, 31654, 31655, 31672, 31660, 31645, 31656, + 31621, 31658, 31644, 31650, 31659, 31668, 31697, 31681, 31692, 31709, + 31706, 31717, 31718, 31722, 31756, 31742, 31740, 31759, 31766, 31755, + 39687, 39689, 39690, 39691, 39692, 39693, 39694, 39696, 39697, 39698, + 39700, 39701, 39702, 39703, 39704, 39705, 39706, 39707, 39708, 39709, + 39710, 39712, 39713, 39714, 39716, 39717, 39718, 39719, 39720, 39721, + 39722, 39723, 39724, 39725, 39726, 39728, 39729, 39731, 39732, 39733, + 39734, 39735, 39736, 39737, 39738, 39741, 39742, 39743, 39744, 39750, + 39754, 39755, 39756, 39758, 39760, 39762, 39763, 39765, 39766, 39767, + 39768, 39769, 39770, 39771, 39772, 39773, 39774, 39775, 39776, 39777, + 39778, 39779, 39780, 39781, 39782, 39783, 39784, 39785, 39786, 39787, + 39788, 39789, 39790, 39791, 39792, 39793, 39794, 39795, 39796, 39797, + 39798, 39799, 39800, 39801, 39802, 39803, 31775, 31786, 31782, 31800, + 31809, 31808, 33278, 33281, 33282, 33284, 33260, 34884, 33313, 33314, + 33315, 33325, 33327, 33320, 33323, 33336, 33339, 33331, 33332, 33342, + 33348, 33353, 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, + 35032, 35039, 35166, 32669, 32671, 32679, 32687, 32688, 32690, 31868, + 25929, 31889, 31901, 31900, 31902, 31906, 31922, 31932, 31933, 31937, + 31943, 31948, 31949, 31944, 31941, 31959, 31976, 33390, 26280, 32703, + 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, 31992, 32119, + 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, 36241, + 36273, 36199, 36205, 35911, 35913, 37194, 37200, 37198, 37199, 37220, + 39804, 39805, 39806, 39807, 39808, 39809, 39810, 39811, 39812, 39813, + 39814, 39815, 39816, 39817, 39818, 39819, 39820, 39821, 39822, 39823, + 39824, 39825, 39826, 39827, 39828, 39829, 39830, 39831, 39832, 39833, + 39834, 39835, 39836, 39837, 39838, 39839, 39840, 39841, 39842, 39843, + 39844, 39845, 39846, 39847, 39848, 39849, 39850, 39851, 39852, 39853, + 39854, 39855, 39856, 39857, 39858, 39859, 39860, 39861, 39862, 39863, + 39864, 39865, 39866, 39867, 39868, 39869, 39870, 39871, 39872, 39873, + 39874, 39875, 39876, 39877, 39878, 39879, 39880, 39881, 39882, 39883, + 39884, 39885, 39886, 39887, 39888, 39889, 39890, 39891, 39892, 39893, + 39894, 39895, 39896, 39897, 39898, 39899, 37218, 37217, 37232, 37225, + 37231, 37245, 37246, 37234, 37236, 37241, 37260, 37253, 37264, 37261, + 37265, 37282, 37283, 37290, 37293, 37294, 37295, 37301, 37300, 37306, + 35925, 40574, 36280, 36331, 36357, 36441, 36457, 36277, 36287, 36284, + 36282, 36292, 36310, 36311, 36314, 36318, 36302, 36303, 36315, 36294, + 36332, 36343, 36344, 36323, 36345, 36347, 36324, 36361, 36349, 36372, + 36381, 36383, 36396, 36398, 36387, 36399, 36410, 36416, 36409, 36405, + 36413, 36401, 36425, 36417, 36418, 36433, 36434, 36426, 36464, 36470, + 36476, 36463, 36468, 36485, 36495, 36500, 36496, 36508, 36510, 35960, + 35970, 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, + 39900, 39901, 39902, 39903, 39904, 39905, 39906, 39907, 39908, 39909, + 39910, 39911, 39912, 39913, 39914, 39915, 39916, 39917, 39918, 39919, + 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39927, 39928, 39929, + 39930, 39931, 39932, 39933, 39934, 39935, 39936, 39937, 39938, 39939, + 39940, 39941, 39942, 39943, 39944, 39945, 39946, 39947, 39948, 39949, + 39950, 39951, 39952, 39953, 39954, 39955, 39956, 39957, 39958, 39959, + 39960, 39961, 39962, 39963, 39964, 39965, 39966, 39967, 39968, 39969, + 39970, 39971, 39972, 39973, 39974, 39975, 39976, 39977, 39978, 39979, + 39980, 39981, 39982, 39983, 39984, 39985, 39986, 39987, 39988, 39989, + 39990, 39991, 39992, 39993, 39994, 39995, 35301, 35307, 35311, 35390, + 35622, 38739, 38633, 38643, 38639, 38662, 38657, 38664, 38671, 38670, + 38698, 38701, 38704, 38718, 40832, 40835, 40837, 40838, 40839, 40840, + 40841, 40842, 40844, 40702, 40715, 40717, 38585, 38588, 38589, 38606, + 38610, 30655, 38624, 37518, 37550, 37576, 37694, 37738, 37834, 37775, + 37950, 37995, 40063, 40066, 40069, 40070, 40071, 40072, 31267, 40075, + 40078, 40080, 40081, 40082, 40084, 40085, 40090, 40091, 40094, 40095, + 40096, 40097, 40098, 40099, 40101, 40102, 40103, 40104, 40105, 40107, + 40109, 40110, 40112, 40113, 40114, 40115, 40116, 40117, 40118, 40119, + 40122, 40123, 40124, 40125, 40132, 40133, 40134, 40135, 40138, 40139, + 39996, 39997, 39998, 39999, 40000, 40001, 40002, 40003, 40004, 40005, + 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40015, + 40016, 40017, 40018, 40019, 40020, 40021, 40022, 40023, 40024, 40025, + 40026, 40027, 40028, 40029, 40030, 40031, 40032, 40033, 40034, 40035, + 40036, 40037, 40038, 40039, 40040, 40041, 40042, 40043, 40044, 40045, + 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40053, 40054, 40055, + 40056, 40057, 40058, 40059, 40061, 40062, 40064, 40067, 40068, 40073, + 40074, 40076, 40079, 40083, 40086, 40087, 40088, 40089, 40093, 40106, + 40108, 40111, 40121, 40126, 40127, 40128, 40129, 40130, 40136, 40137, + 40145, 40146, 40154, 40155, 40160, 40161, 40140, 40141, 40142, 40143, + 40144, 40147, 40148, 40149, 40151, 40152, 40153, 40156, 40157, 40159, + 40162, 38780, 38789, 38801, 38802, 38804, 38831, 38827, 38819, 38834, + 38836, 39601, 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, + 39621, 39618, 39627, 39628, 39633, 39749, 39747, 39751, 39753, 39752, + 39757, 39761, 39144, 39181, 39214, 39253, 39252, 39647, 39649, 39654, + 39663, 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, + 40637, 40638, 32315, 40578, 40583, 40584, 40587, 40594, 37846, 40605, + 40607, 40667, 40668, 40669, 40672, 40671, 40674, 40681, 40679, 40677, + 40682, 40687, 40738, 40748, 40751, 40761, 40759, 40765, 40766, 40772, + 40163, 40164, 40165, 40166, 40167, 40168, 40169, 40170, 40171, 40172, + 40173, 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181, 40182, + 40183, 40184, 40185, 40186, 40187, 40188, 40189, 40190, 40191, 40192, + 40193, 40194, 40195, 40196, 40197, 40198, 40199, 40200, 40201, 40202, + 40203, 40204, 40205, 40206, 40207, 40208, 40209, 40210, 40211, 40212, + 40213, 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, + 40223, 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231, 40232, + 40233, 40234, 40235, 40236, 40237, 40238, 40239, 40240, 40241, 40242, + 40243, 40244, 40245, 40246, 40247, 40248, 40249, 40250, 40251, 40252, + 40253, 40254, 40255, 40256, 40257, 40258, 57908, 57909, 57910, 57911, + 57912, 57913, 57914, 57915, 57916, 57917, 57918, 57919, 57920, 57921, + 57922, 57923, 57924, 57925, 57926, 57927, 57928, 57929, 57930, 57931, + 57932, 57933, 57934, 57935, 57936, 57937, 57938, 57939, 57940, 57941, + 57942, 57943, 57944, 57945, 57946, 57947, 57948, 57949, 57950, 57951, + 57952, 57953, 57954, 57955, 57956, 57957, 57958, 57959, 57960, 57961, + 57962, 57963, 57964, 57965, 57966, 57967, 57968, 57969, 57970, 57971, + 57972, 57973, 57974, 57975, 57976, 57977, 57978, 57979, 57980, 57981, + 57982, 57983, 57984, 57985, 57986, 57987, 57988, 57989, 57990, 57991, + 57992, 57993, 57994, 57995, 57996, 57997, 57998, 57999, 58000, 58001, + 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, + 40269, 40270, 40271, 40272, 40273, 40274, 40275, 40276, 40277, 40278, + 40279, 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287, 40288, + 40289, 40290, 40291, 40292, 40293, 40294, 40295, 40296, 40297, 40298, + 40299, 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307, 40308, + 40309, 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317, 40318, + 40319, 40320, 40321, 40322, 40323, 40324, 40325, 40326, 40327, 40328, + 40329, 40330, 40331, 40332, 40333, 40334, 40335, 40336, 40337, 40338, + 40339, 40340, 40341, 40342, 40343, 40344, 40345, 40346, 40347, 40348, + 40349, 40350, 40351, 40352, 40353, 40354, 58002, 58003, 58004, 58005, + 58006, 58007, 58008, 58009, 58010, 58011, 58012, 58013, 58014, 58015, + 58016, 58017, 58018, 58019, 58020, 58021, 58022, 58023, 58024, 58025, + 58026, 58027, 58028, 58029, 58030, 58031, 58032, 58033, 58034, 58035, + 58036, 58037, 58038, 58039, 58040, 58041, 58042, 58043, 58044, 58045, + 58046, 58047, 58048, 58049, 58050, 58051, 58052, 58053, 58054, 58055, + 58056, 58057, 58058, 58059, 58060, 58061, 58062, 58063, 58064, 58065, + 58066, 58067, 58068, 58069, 58070, 58071, 58072, 58073, 58074, 58075, + 58076, 58077, 58078, 58079, 58080, 58081, 58082, 58083, 58084, 58085, + 58086, 58087, 58088, 58089, 58090, 58091, 58092, 58093, 58094, 58095, + 40355, 40356, 40357, 40358, 40359, 40360, 40361, 40362, 40363, 40364, + 40365, 40366, 40367, 40368, 40369, 40370, 40371, 40372, 40373, 40374, + 40375, 40376, 40377, 40378, 40379, 40380, 40381, 40382, 40383, 40384, + 40385, 40386, 40387, 40388, 40389, 40390, 40391, 40392, 40393, 40394, + 40395, 40396, 40397, 40398, 40399, 40400, 40401, 40402, 40403, 40404, + 40405, 40406, 40407, 40408, 40409, 40410, 40411, 40412, 40413, 40414, + 40415, 40416, 40417, 40418, 40419, 40420, 40421, 40422, 40423, 40424, + 40425, 40426, 40427, 40428, 40429, 40430, 40431, 40432, 40433, 40434, + 40435, 40436, 40437, 40438, 40439, 40440, 40441, 40442, 40443, 40444, + 40445, 40446, 40447, 40448, 40449, 40450, 58096, 58097, 58098, 58099, + 58100, 58101, 58102, 58103, 58104, 58105, 58106, 58107, 58108, 58109, + 58110, 58111, 58112, 58113, 58114, 58115, 58116, 58117, 58118, 58119, + 58120, 58121, 58122, 58123, 58124, 58125, 58126, 58127, 58128, 58129, + 58130, 58131, 58132, 58133, 58134, 58135, 58136, 58137, 58138, 58139, + 58140, 58141, 58142, 58143, 58144, 58145, 58146, 58147, 58148, 58149, + 58150, 58151, 58152, 58153, 58154, 58155, 58156, 58157, 58158, 58159, + 58160, 58161, 58162, 58163, 58164, 58165, 58166, 58167, 58168, 58169, + 58170, 58171, 58172, 58173, 58174, 58175, 58176, 58177, 58178, 58179, + 58180, 58181, 58182, 58183, 58184, 58185, 58186, 58187, 58188, 58189, + 40451, 40452, 40453, 40454, 40455, 40456, 40457, 40458, 40459, 40460, + 40461, 40462, 40463, 40464, 40465, 40466, 40467, 40468, 40469, 40470, + 40471, 40472, 40473, 40474, 40475, 40476, 40477, 40478, 40484, 40487, + 40494, 40496, 40500, 40507, 40508, 40512, 40525, 40528, 40530, 40531, + 40532, 40534, 40537, 40541, 40543, 40544, 40545, 40546, 40549, 40558, + 40559, 40562, 40564, 40565, 40566, 40567, 40568, 40569, 40570, 40571, + 40572, 40573, 40576, 40577, 40579, 40580, 40581, 40582, 40585, 40586, + 40588, 40589, 40590, 40591, 40592, 40593, 40596, 40597, 40598, 40599, + 40600, 40601, 40602, 40603, 40604, 40606, 40608, 40609, 40610, 40611, + 40612, 40613, 40615, 40616, 40617, 40618, 58190, 58191, 58192, 58193, + 58194, 58195, 58196, 58197, 58198, 58199, 58200, 58201, 58202, 58203, + 58204, 58205, 58206, 58207, 58208, 58209, 58210, 58211, 58212, 58213, + 58214, 58215, 58216, 58217, 58218, 58219, 58220, 58221, 58222, 58223, + 58224, 58225, 58226, 58227, 58228, 58229, 58230, 58231, 58232, 58233, + 58234, 58235, 58236, 58237, 58238, 58239, 58240, 58241, 58242, 58243, + 58244, 58245, 58246, 58247, 58248, 58249, 58250, 58251, 58252, 58253, + 58254, 58255, 58256, 58257, 58258, 58259, 58260, 58261, 58262, 58263, + 58264, 58265, 58266, 58267, 58268, 58269, 58270, 58271, 58272, 58273, + 58274, 58275, 58276, 58277, 58278, 58279, 58280, 58281, 58282, 58283, + 40619, 40620, 40621, 40622, 40623, 40624, 40625, 40626, 40627, 40629, + 40630, 40631, 40633, 40634, 40636, 40639, 40640, 40641, 40642, 40643, + 40645, 40646, 40647, 40648, 40650, 40651, 40652, 40656, 40658, 40659, + 40661, 40662, 40663, 40665, 40666, 40670, 40673, 40675, 40676, 40678, + 40680, 40683, 40684, 40685, 40686, 40688, 40689, 40690, 40691, 40692, + 40693, 40694, 40695, 40696, 40698, 40701, 40703, 40704, 40705, 40706, + 40707, 40708, 40709, 40710, 40711, 40712, 40713, 40714, 40716, 40719, + 40721, 40722, 40724, 40725, 40726, 40728, 40730, 40731, 40732, 40733, + 40734, 40735, 40737, 40739, 40740, 40741, 40742, 40743, 40744, 40745, + 40746, 40747, 40749, 40750, 40752, 40753, 58284, 58285, 58286, 58287, + 58288, 58289, 58290, 58291, 58292, 58293, 58294, 58295, 58296, 58297, + 58298, 58299, 58300, 58301, 58302, 58303, 58304, 58305, 58306, 58307, + 58308, 58309, 58310, 58311, 58312, 58313, 58314, 58315, 58316, 58317, + 58318, 58319, 58320, 58321, 58322, 58323, 58324, 58325, 58326, 58327, + 58328, 58329, 58330, 58331, 58332, 58333, 58334, 58335, 58336, 58337, + 58338, 58339, 58340, 58341, 58342, 58343, 58344, 58345, 58346, 58347, + 58348, 58349, 58350, 58351, 58352, 58353, 58354, 58355, 58356, 58357, + 58358, 58359, 58360, 58361, 58362, 58363, 58364, 58365, 58366, 58367, + 58368, 58369, 58370, 58371, 58372, 58373, 58374, 58375, 58376, 58377, + 40754, 40755, 40756, 40757, 40758, 40760, 40762, 40764, 40767, 40768, + 40769, 40770, 40771, 40773, 40774, 40775, 40776, 40777, 40778, 40779, + 40780, 40781, 40782, 40783, 40786, 40787, 40788, 40789, 40790, 40791, + 40792, 40793, 40794, 40795, 40796, 40797, 40798, 40799, 40800, 40801, + 40802, 40803, 40804, 40805, 40806, 40807, 40808, 40809, 40810, 40811, + 40812, 40813, 40814, 40815, 40816, 40817, 40818, 40819, 40820, 40821, + 40822, 40823, 40824, 40825, 40826, 40827, 40828, 40829, 40830, 40833, + 40834, 40845, 40846, 40847, 40848, 40849, 40850, 40851, 40852, 40853, + 40854, 40855, 40856, 40860, 40861, 40862, 40865, 40866, 40867, 40868, + 40869, 63788, 63865, 63893, 63975, 63985, 58378, 58379, 58380, 58381, + 58382, 58383, 58384, 58385, 58386, 58387, 58388, 58389, 58390, 58391, + 58392, 58393, 58394, 58395, 58396, 58397, 58398, 58399, 58400, 58401, + 58402, 58403, 58404, 58405, 58406, 58407, 58408, 58409, 58410, 58411, + 58412, 58413, 58414, 58415, 58416, 58417, 58418, 58419, 58420, 58421, + 58422, 58423, 58424, 58425, 58426, 58427, 58428, 58429, 58430, 58431, + 58432, 58433, 58434, 58435, 58436, 58437, 58438, 58439, 58440, 58441, + 58442, 58443, 58444, 58445, 58446, 58447, 58448, 58449, 58450, 58451, + 58452, 58453, 58454, 58455, 58456, 58457, 58458, 58459, 58460, 58461, + 58462, 58463, 58464, 58465, 58466, 58467, 58468, 58469, 58470, 58471, + 64012, 64013, 64014, 64015, 64017, 64019, 64020, 64024, 64031, 64032, + 64033, 64035, 64036, 64039, 64040, 64041, 11905, 59414, 59415, 59416, + 11908, 13427, 13383, 11912, 11915, 59422, 13726, 13850, 13838, 11916, + 11927, 14702, 14616, 59430, 14799, 14815, 14963, 14800, 59435, 59436, + 15182, 15470, 15584, 11943, 59441, 59442, 11946, 16470, 16735, 11950, + 17207, 11955, 11958, 11959, 59451, 17329, 17324, 11963, 17373, 17622, + 18017, 17996, 59459, 18211, 18217, 18300, 18317, 11978, 18759, 18810, + 18813, 18818, 18819, 18821, 18822, 18847, 18843, 18871, 18870, 59476, + 59477, 19619, 19615, 19616, 19617, 19575, 19618, 19731, 19732, 19733, + 19734, 19735, 19736, 19737, 19886, 59492, 58472, 58473, 58474, 58475, + 58476, 58477, 58478, 58479, 58480, 58481, 58482, 58483, 58484, 58485, + 58486, 58487, 58488, 58489, 58490, 58491, 58492, 58493, 58494, 58495, + 58496, 58497, 58498, 58499, 58500, 58501, 58502, 58503, 58504, 58505, + 58506, 58507, 58508, 58509, 58510, 58511, 58512, 58513, 58514, 58515, + 58516, 58517, 58518, 58519, 58520, 58521, 58522, 58523, 58524, 58525, + 58526, 58527, 58528, 58529, 58530, 58531, 58532, 58533, 58534, 58535, + 58536, 58537, 58538, 58539, 58540, 58541, 58542, 58543, 58544, 58545, + 58546, 58547, 58548, 58549, 58550, 58551, 58552, 58553, 58554, 58555, + 58556, 58557, 58558, 58559, 58560, 58561, 58562, 58563, 58564, 58565, + +}; + +static const unsigned long myhtml_encoding_map_gb18030_ranges[][2] = { + {0, 128}, {36, 165}, {38, 169}, {45, 178}, {50, 184}, + {81, 216}, {89, 226}, {95, 235}, {96, 238}, {100, 244}, + {103, 248}, {104, 251}, {105, 253}, {109, 258}, {126, 276}, + {133, 284}, {148, 300}, {172, 325}, {175, 329}, {179, 334}, + {208, 364}, {306, 463}, {307, 465}, {308, 467}, {309, 469}, + {310, 471}, {311, 473}, {312, 475}, {313, 477}, {341, 506}, + {428, 594}, {443, 610}, {544, 712}, {545, 716}, {558, 730}, + {741, 930}, {742, 938}, {749, 962}, {750, 970}, {805, 1026}, + {819, 1104}, {820, 1106}, {7922, 8209}, {7924, 8215}, {7925, 8218}, + {7927, 8222}, {7934, 8231}, {7943, 8241}, {7944, 8244}, {7945, 8246}, + {7950, 8252}, {8062, 8365}, {8148, 8452}, {8149, 8454}, {8152, 8458}, + {8164, 8471}, {8174, 8482}, {8236, 8556}, {8240, 8570}, {8262, 8596}, + {8264, 8602}, {8374, 8713}, {8380, 8720}, {8381, 8722}, {8384, 8726}, + {8388, 8731}, {8390, 8737}, {8392, 8740}, {8393, 8742}, {8394, 8748}, + {8396, 8751}, {8401, 8760}, {8406, 8766}, {8416, 8777}, {8419, 8781}, + {8424, 8787}, {8437, 8802}, {8439, 8808}, {8445, 8816}, {8482, 8854}, + {8485, 8858}, {8496, 8870}, {8521, 8896}, {8603, 8979}, {8936, 9322}, + {8946, 9372}, {9046, 9548}, {9050, 9588}, {9063, 9616}, {9066, 9622}, + {9076, 9634}, {9092, 9652}, {9100, 9662}, {9108, 9672}, {9111, 9676}, + {9113, 9680}, {9131, 9702}, {9162, 9735}, {9164, 9738}, {9218, 9793}, + {9219, 9795}, {11329, 11906}, {11331, 11909}, {11334, 11913}, {11336, 11917}, + {11346, 11928}, {11361, 11944}, {11363, 11947}, {11366, 11951}, {11370, 11956}, + {11372, 11960}, {11375, 11964}, {11389, 11979}, {11682, 12284}, {11686, 12292}, + {11687, 12312}, {11692, 12319}, {11694, 12330}, {11714, 12351}, {11716, 12436}, + {11723, 12447}, {11725, 12535}, {11730, 12543}, {11736, 12586}, {11982, 12842}, + {11989, 12850}, {12102, 12964}, {12336, 13200}, {12348, 13215}, {12350, 13218}, + {12384, 13253}, {12393, 13263}, {12395, 13267}, {12397, 13270}, {12510, 13384}, + {12553, 13428}, {12851, 13727}, {12962, 13839}, {12973, 13851}, {13738, 14617}, + {13823, 14703}, {13919, 14801}, {13933, 14816}, {14080, 14964}, {14298, 15183}, + {14585, 15471}, {14698, 15585}, {15583, 16471}, {15847, 16736}, {16318, 17208}, + {16434, 17325}, {16438, 17330}, {16481, 17374}, {16729, 17623}, {17102, 17997}, + {17122, 18018}, {17315, 18212}, {17320, 18218}, {17402, 18301}, {17418, 18318}, + {17859, 18760}, {17909, 18811}, {17911, 18814}, {17915, 18820}, {17916, 18823}, + {17936, 18844}, {17939, 18848}, {17961, 18872}, {18664, 19576}, {18703, 19620}, + {18814, 19738}, {18962, 19887}, {19043, 40870}, {33469, 59244}, {33470, 59336}, + {33471, 59367}, {33484, 59413}, {33485, 59417}, {33490, 59423}, {33497, 59431}, + {33501, 59437}, {33505, 59443}, {33513, 59452}, {33520, 59460}, {33536, 59478}, + {33550, 59493}, {37845, 63789}, {37921, 63866}, {37948, 63894}, {38029, 63976}, + {38038, 63986}, {38064, 64016}, {38065, 64018}, {38066, 64021}, {38069, 64025}, + {38075, 64034}, {38076, 64037}, {38078, 64042}, {39108, 65074}, {39109, 65093}, + {39113, 65107}, {39114, 65112}, {39115, 65127}, {39116, 65132}, {39265, 65375}, + {39394, 65510}, {189000, 65536}, +}; + +static const unsigned long myhtml_encoding_map_ibm866[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, + 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 9617, 9618, + 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, + 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, + 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, + 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, + 9484, 9608, 9604, 9612, 9616, 9600, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 1025, 1105, 1028, 1108, 1031, 1111, 1038, 1118, + 176, 8729, 183, 8730, 8470, 164, 9632, 160, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_10[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 274, 290, 298, 296, 310, 167, + 315, 272, 352, 358, 381, 173, 362, 330, 176, 261, + 275, 291, 299, 297, 311, 183, 316, 273, 353, 359, + 382, 8213, 363, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 207, + 208, 325, 332, 211, 212, 213, 214, 360, 216, 370, + 218, 219, 220, 221, 222, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 239, 240, 326, 333, 243, 244, 245, 246, 361, + 248, 371, 250, 251, 252, 253, 254, 312, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_13[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8221, 162, 163, 164, 8222, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 8220, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 8217, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_14[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 7682, 7683, 163, 266, 267, 7690, 167, + 7808, 169, 7810, 7691, 7922, 173, 174, 376, 7710, 7711, + 288, 289, 7744, 7745, 182, 7766, 7809, 7767, 7811, 7776, + 7923, 7812, 7813, 7777, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 372, 209, 210, 211, 212, 213, 214, 7786, 216, 217, + 218, 219, 220, 221, 374, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 373, 241, 242, 243, 244, 245, 246, 7787, + 248, 249, 250, 251, 252, 253, 375, 255, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_15[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 8364, 165, 352, 167, + 353, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 381, 181, 182, 183, 382, 185, 186, 187, + 338, 339, 376, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_16[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 261, 321, 8364, 8222, 352, 167, + 353, 169, 536, 171, 377, 173, 378, 379, 176, 177, + 268, 322, 381, 8221, 182, 183, 382, 269, 537, 187, + 338, 339, 376, 380, 192, 193, 194, 258, 196, 262, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 272, 323, 210, 211, 212, 336, 214, 346, 368, 217, + 218, 219, 220, 280, 538, 223, 224, 225, 226, 259, + 228, 263, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 273, 324, 242, 243, 244, 337, 246, 347, + 369, 249, 250, 251, 252, 281, 539, 255, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_2[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 728, 321, 164, 317, 346, 167, + 168, 352, 350, 356, 377, 173, 381, 379, 176, 261, + 731, 322, 180, 318, 347, 711, 184, 353, 351, 357, + 378, 733, 382, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_3[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 294, 728, 163, 164, 0x0000, 292, 167, + 168, 304, 350, 286, 308, 173, 0x0000, 379, 176, 295, + 178, 179, 180, 181, 293, 183, 184, 305, 351, 287, + 309, 189, 0x0000, 380, 192, 193, 194, 0x0000, 196, 266, + 264, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 0x0000, 209, 210, 211, 212, 288, 214, 215, 284, 217, + 218, 219, 220, 364, 348, 223, 224, 225, 226, 0x0000, + 228, 267, 265, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 0x0000, 241, 242, 243, 244, 289, 246, 247, + 285, 249, 250, 251, 252, 365, 349, 729, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_4[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 312, 342, 164, 296, 315, 167, + 168, 352, 274, 290, 358, 173, 381, 175, 176, 261, + 731, 343, 180, 297, 316, 711, 184, 353, 275, 291, + 359, 330, 382, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 298, + 272, 325, 332, 310, 212, 213, 214, 215, 216, 370, + 218, 219, 220, 360, 362, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 299, 273, 326, 333, 311, 244, 245, 246, 247, + 248, 371, 250, 251, 252, 361, 363, 729, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_5[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 1032, 1033, 1034, 1035, 1036, 173, 1038, 1039, 1040, 1041, + 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, + 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, + 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 8470, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 167, 1118, 1119, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_6[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 0x0000, 0x0000, 164, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1548, 173, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1563, + 0x0000, 0x0000, 0x0000, 1567, 0x0000, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1600, 1601, 1602, 1603, + 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_7[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8216, 8217, 163, 8364, 8367, 166, 167, + 168, 169, 890, 171, 172, 173, 0x0000, 8213, 176, 177, + 178, 179, 900, 901, 902, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_8[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 162, 163, 164, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8215, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_jis0208[] = { + 12288, 12289, 12290, 65292, 65294, 12539, 65306, 65307, 65311, 65281, + 12443, 12444, 180, 65344, 168, 65342, 65507, 65343, 12541, 12542, + 12445, 12446, 12291, 20189, 12293, 12294, 12295, 12540, 8213, 8208, + 65295, 65340, 65374, 8741, 65372, 8230, 8229, 8216, 8217, 8220, + 8221, 65288, 65289, 12308, 12309, 65339, 65341, 65371, 65373, 12296, + 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 65291, + 65293, 177, 215, 247, 65309, 8800, 65308, 65310, 8806, 8807, + 8734, 8756, 9794, 9792, 176, 8242, 8243, 8451, 65509, 65284, + 65504, 65505, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, + 9675, 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, + 9660, 8251, 12306, 8594, 8592, 8593, 8595, 12307, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8743, 8744, 65506, 8658, 8660, + 8704, 8707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8491, 8240, 9839, 9837, 9834, + 8224, 8225, 182, 0x0000, 0x0000, 0x0000, 0x0000, 9711, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 65296, 65297, 65298, 65299, 65300, 65301, 65302, + 65303, 65304, 65305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, + 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, + 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 0x0000, 0x0000, + 0x0000, 0x0000, 12353, 12354, 12355, 12356, 12357, 12358, 12359, 12360, + 12361, 12362, 12363, 12364, 12365, 12366, 12367, 12368, 12369, 12370, + 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 12380, + 12381, 12382, 12383, 12384, 12385, 12386, 12387, 12388, 12389, 12390, + 12391, 12392, 12393, 12394, 12395, 12396, 12397, 12398, 12399, 12400, + 12401, 12402, 12403, 12404, 12405, 12406, 12407, 12408, 12409, 12410, + 12411, 12412, 12413, 12414, 12415, 12416, 12417, 12418, 12419, 12420, + 12421, 12422, 12423, 12424, 12425, 12426, 12427, 12428, 12429, 12430, + 12431, 12432, 12433, 12434, 12435, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, + 934, 935, 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 963, + 964, 965, 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1040, 1041, 1042, 1043, 1044, 1045, + 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, + 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, + 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, + 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, + 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, + 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9472, 9474, + 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, + 9475, 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, + 9504, 9519, 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9312, 9313, + 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, + 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 0x0000, 13129, + 13076, 13090, 13133, 13080, 13095, 13059, 13110, 13137, 13143, 13069, + 13094, 13091, 13099, 13130, 13115, 13212, 13213, 13214, 13198, 13199, + 13252, 13217, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 13179, 12317, 12319, 8470, 13261, 8481, 12964, 12965, 12966, 12967, + 12968, 12849, 12850, 12857, 13182, 13181, 13180, 8786, 8801, 8747, + 8750, 8721, 8730, 8869, 8736, 8735, 8895, 8757, 8745, 8746, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 20124, 21782, 23043, 38463, 21696, 24859, 25384, 23030, 36898, 33909, + 33564, 31312, 24746, 25569, 28197, 26093, 33894, 33446, 39925, 26771, + 22311, 26017, 25201, 23451, 22992, 34427, 39156, 32098, 32190, 39822, + 25110, 31903, 34999, 23433, 24245, 25353, 26263, 26696, 38343, 38797, + 26447, 20197, 20234, 20301, 20381, 20553, 22258, 22839, 22996, 23041, + 23561, 24799, 24847, 24944, 26131, 26885, 28858, 30031, 30064, 31227, + 32173, 32239, 32963, 33806, 34915, 35586, 36949, 36986, 21307, 20117, + 20133, 22495, 32946, 37057, 30959, 19968, 22769, 28322, 36920, 31282, + 33576, 33419, 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, + 39154, 28139, 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, + 23431, 28879, 32701, 36802, 38632, 21359, 40284, 31418, 19985, 30867, + 33276, 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, 28006, + 29916, 38287, 22082, 20113, 36939, 38642, 33615, 39180, 21473, 21942, + 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, 29787, 30408, + 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, 30410, 39365, + 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, 22576, 22852, + 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, 28948, 29017, + 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, 40219, 22633, + 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, 25276, 26106, + 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, 40644, 23713, + 27798, 33659, 20740, 23627, 25014, 33222, 26742, 29281, 20057, 20474, + 21368, 24681, 28201, 31311, 38899, 19979, 21270, 20206, 20309, 20285, + 20385, 20339, 21152, 21487, 22025, 22799, 23233, 23478, 23521, 31185, + 26247, 26524, 26550, 27468, 27827, 28779, 29634, 31117, 31166, 31292, + 31623, 33457, 33499, 33540, 33655, 33775, 33747, 34662, 35506, 22057, + 36008, 36838, 36942, 38686, 34442, 20420, 23784, 25105, 29273, 30011, + 33253, 33469, 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, + 22238, 22602, 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, + 25296, 25913, 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, + 33445, 34809, 38283, 38542, 35997, 20977, 21182, 22806, 21683, 23475, + 23830, 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, + 28012, 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, + 24275, 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, + 35282, 36203, 36611, 37101, 38307, 38548, 38761, 23398, 23731, 27005, + 38989, 38990, 25499, 31520, 27179, 27263, 26806, 39949, 28511, 21106, + 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, 36676, 19988, + 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, 33970, 37340, + 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, 33477, 29926, + 20094, 20355, 20896, 23506, 21002, 21208, 21223, 24059, 21914, 22570, + 23014, 23436, 23448, 23515, 24178, 24185, 24739, 24863, 24931, 25022, + 25563, 25954, 26577, 26707, 26874, 27454, 27475, 27735, 28450, 28567, + 28485, 29872, 29976, 30435, 30475, 31487, 31649, 31777, 32233, 32566, + 32752, 32925, 33382, 33694, 35251, 35532, 36011, 36996, 37969, 38291, + 38289, 38306, 38501, 38867, 39208, 33304, 20024, 21547, 23736, 24012, + 29609, 30284, 30524, 23721, 32747, 36107, 38593, 38929, 38996, 39000, + 20225, 20238, 21361, 21916, 22120, 22522, 22855, 23305, 23492, 23696, + 24076, 24190, 24524, 25582, 26426, 26071, 26082, 26399, 26827, 26820, + 27231, 24112, 27589, 27671, 27773, 30079, 31048, 23395, 31232, 32000, + 24509, 35215, 35352, 36020, 36215, 36556, 36637, 39138, 39438, 39740, + 20096, 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, + 30097, 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, + 21507, 21931, 26708, 27224, 35440, 30759, 26485, 40653, 21364, 23458, + 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, + 24339, 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, 31350, + 31406, 31496, 32026, 31998, 32102, 26087, 29275, 21435, 23621, 24040, + 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, 28417, 31142, + 39770, 20136, 20139, 20140, 20379, 20384, 20689, 20807, 31478, 20849, + 20982, 21332, 21281, 21375, 21483, 21932, 22659, 23777, 24375, 24394, + 24623, 24656, 24685, 25375, 25945, 27211, 27841, 29378, 29421, 30703, + 33016, 33029, 33288, 34126, 37111, 37857, 38911, 39255, 39514, 20208, + 20957, 23597, 26241, 26989, 23616, 26354, 26997, 29577, 26704, 31873, + 20677, 21220, 22343, 24062, 37670, 26020, 27427, 27453, 29748, 31105, + 31165, 31563, 32202, 33465, 33740, 34943, 35167, 35641, 36817, 37329, + 21535, 37504, 20061, 20534, 21477, 21306, 29399, 29590, 30697, 33510, + 36527, 39366, 39368, 39378, 20855, 24858, 34398, 21936, 31354, 20598, + 23507, 36935, 38533, 20018, 27355, 37351, 23633, 23624, 25496, 31391, + 27795, 38772, 36705, 31402, 29066, 38536, 31874, 26647, 32368, 26705, + 37740, 21234, 21531, 34219, 35347, 32676, 36557, 37089, 21350, 34952, + 31041, 20418, 20670, 21009, 20804, 21843, 22317, 29674, 22411, 22865, + 24418, 24452, 24693, 24950, 24935, 25001, 25522, 25658, 25964, 26223, + 26690, 28179, 30054, 31293, 31995, 32076, 32153, 32331, 32619, 33550, + 33610, 34509, 35336, 35427, 35686, 36605, 38938, 40335, 33464, 36814, + 39912, 21127, 25119, 25731, 28608, 38553, 26689, 20625, 27424, 27770, + 28500, 31348, 32080, 34880, 35363, 26376, 20214, 20537, 20518, 20581, + 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, 25010, 25080, + 25331, 25458, 26908, 27177, 29309, 29356, 29486, 30740, 30831, 32121, + 30476, 32937, 35211, 35609, 36066, 36562, 36963, 37749, 38522, 38997, + 39443, 40568, 20803, 21407, 21427, 24187, 24358, 28187, 28304, 29572, + 29694, 32067, 33335, 35328, 35578, 38480, 20046, 20491, 21476, 21628, + 22266, 22993, 23396, 24049, 24235, 24359, 25144, 25925, 26543, 28246, + 29392, 31946, 34996, 32929, 32993, 33776, 34382, 35463, 36328, 37431, + 38599, 39015, 40723, 20116, 20114, 20237, 21320, 21577, 21566, 23087, + 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, 35703, + 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, 20844, + 21151, 21177, 21246, 21402, 21475, 21521, 21518, 21897, 22353, 22434, + 22909, 23380, 23389, 23439, 24037, 24039, 24055, 24184, 24195, 24218, + 24247, 24344, 24658, 24908, 25239, 25304, 25511, 25915, 26114, 26179, + 26356, 26477, 26657, 26775, 27083, 27743, 27946, 28009, 28207, 28317, + 30002, 30343, 30828, 31295, 31968, 32005, 32024, 32094, 32177, 32789, + 32771, 32943, 32945, 33108, 33167, 33322, 33618, 34892, 34913, 35611, + 36002, 36092, 37066, 37237, 37489, 30783, 37628, 38308, 38477, 38917, + 39321, 39640, 40251, 21083, 21163, 21495, 21512, 22741, 25335, 28640, + 35946, 36703, 40633, 20811, 21051, 21578, 22269, 31296, 37239, 40288, + 40658, 29508, 28425, 33136, 29969, 24573, 24794, 39592, 29403, 36796, + 27492, 38915, 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, + 26118, 26681, 26801, 28151, 30165, 32058, 33390, 39746, 20123, 20304, + 21449, 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, + 37782, 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, + 22622, 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, + 37319, 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, + 38555, 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, + 27018, 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, + 25662, 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, + 31545, 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, + 34217, 38609, 30352, 39894, 25420, 37638, 39851, 30399, 26194, 19977, + 20632, 21442, 23665, 24808, 25746, 25955, 26719, 29158, 29642, 29987, + 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, 27531, + 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, 22763, + 22987, 22985, 23039, 23376, 23629, 24066, 24107, 24535, 24605, 25351, + 25903, 23388, 26031, 26045, 26088, 26525, 27490, 27515, 27663, 29509, + 31049, 31169, 31992, 32025, 32043, 32930, 33026, 33267, 35222, 35422, + 35433, 35430, 35468, 35566, 36039, 36060, 38604, 39164, 27503, 20107, + 20284, 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, + 27835, 29246, 29885, 30164, 30913, 31034, 32780, 32819, 33258, 33940, + 36766, 27728, 40575, 24335, 35672, 40235, 31482, 36600, 23437, 38635, + 19971, 21489, 22519, 22833, 23241, 23460, 24713, 28287, 28422, 30142, + 36074, 23455, 34048, 31712, 20594, 26612, 33437, 23649, 34122, 32286, + 33294, 20889, 23556, 25448, 36198, 26012, 29038, 31038, 32023, 32773, + 35613, 36554, 36974, 34503, 37034, 20511, 21242, 23610, 26451, 28796, + 29237, 37196, 37320, 37675, 33509, 23490, 24369, 24825, 20027, 21462, + 23432, 25163, 26417, 27530, 29417, 29664, 31278, 33131, 36259, 37202, + 39318, 20754, 21463, 21610, 23551, 25480, 27193, 32172, 38656, 22234, + 21454, 21608, 23447, 23601, 24030, 20462, 24833, 25342, 27954, 31168, + 31179, 32066, 32333, 32722, 33261, 33311, 33936, 34886, 35186, 35728, + 36468, 36655, 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, + 21313, 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, + 21460, 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, + 34899, 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, + 24490, 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, + 36981, 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, + 32210, 32626, 26360, 34223, 34295, 35576, 21161, 21465, 22899, 24207, + 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, + 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, 23567, + 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, 25307, 25484, + 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, 27189, 27836, + 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, 30813, 30977, + 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, 33931, 34121, + 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, 37284, 37478, + 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, 20887, 21104, + 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, 26454, 27972, + 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, 22516, 39166, + 25325, 26893, 27542, 29165, 32340, 32887, 33394, 35302, 39135, 34645, + 36785, 23611, 20280, 20449, 20405, 21767, 23072, 23517, 23529, 24515, + 24910, 25391, 26032, 26187, 26862, 27035, 28024, 28145, 30003, 30137, + 30495, 31070, 31206, 32051, 33251, 33455, 34218, 35242, 35386, 36523, + 36763, 36914, 37341, 38663, 20154, 20161, 20995, 22645, 22764, 23563, + 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, + 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, 27700, 28810, + 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, 29790, + 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, 26905, + 33733, 38935, 38592, 35070, 28548, 25722, 23544, 19990, 28716, 30045, + 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, 25919, 25972, + 26143, 26228, 26866, 26646, 27491, 28165, 29298, 29983, 30427, 31934, + 32854, 22768, 35069, 35199, 35488, 35475, 35531, 36893, 37266, 38738, + 38745, 25993, 31246, 33030, 38587, 24109, 24796, 25114, 26021, 26132, + 26512, 30707, 31309, 31821, 32318, 33034, 36012, 36196, 36321, 36447, + 30889, 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, + 38634, 32118, 33292, 34633, 20185, 20808, 21315, 21344, 23459, 23554, + 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, + 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, + 33146, 33307, 33337, 34214, 35438, 36046, 36341, 36984, 36983, 37549, + 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, 32341, + 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, 29401, + 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, 35380, + 38459, 36961, 40736, 20711, 21109, 21452, 21474, 20489, 21930, 22766, + 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, 25475, 25407, + 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, 29157, 20105, + 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, 33624, 33900, + 33980, 34299, 35013, 36208, 36865, 36973, 37783, 38684, 39442, 20687, + 22679, 24974, 33235, 34101, 36104, 36896, 20419, 20596, 21063, 21363, + 24687, 25417, 26463, 28204, 36275, 36895, 20439, 23646, 36042, 26063, + 32154, 21330, 34966, 20854, 25539, 23384, 23403, 23562, 25613, 26449, + 36956, 20182, 22810, 22826, 27760, 35409, 21822, 22549, 22949, 24816, + 25171, 26561, 33333, 26965, 38464, 39364, 39464, 20307, 22534, 23550, + 32784, 23729, 24111, 24453, 24608, 24907, 25140, 26367, 27888, 28382, + 32974, 33151, 33492, 34955, 36024, 36864, 36910, 38538, 40667, 39899, + 20195, 21488, 22823, 31532, 37261, 38988, 40441, 28381, 28711, 21331, + 21828, 23429, 25176, 25246, 25299, 27810, 28655, 29730, 35351, 37944, + 28609, 35582, 33592, 20967, 34552, 21482, 21481, 20294, 36948, 36784, + 22890, 33073, 24061, 31466, 36799, 26842, 35895, 29432, 40008, 27197, + 35504, 20025, 21336, 22022, 22374, 25285, 25506, 26086, 27470, 28129, + 28251, 28845, 30701, 31471, 31658, 32187, 32829, 32966, 34507, 35477, + 37723, 22243, 22727, 24382, 26029, 26262, 27264, 27573, 30007, 35527, + 20516, 30693, 22320, 24347, 24677, 26234, 27744, 30196, 31258, 32622, + 33268, 34584, 36933, 39347, 31689, 30044, 31481, 31569, 33988, 36880, + 31209, 31378, 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, + 26172, 26609, 27880, 34411, 34935, 35387, 37198, 37619, 39376, 27159, + 28710, 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, + 24086, 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, + 26397, 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, + 35548, 36229, 36339, 37530, 38263, 38914, 40165, 21189, 25431, 30452, + 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, 26894, 27084, + 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, 20291, 28460, + 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, 22775, 23340, + 32044, 29226, 21514, 37347, 40372, 20141, 20302, 20572, 20597, 21059, + 35998, 21576, 22564, 23450, 24093, 24213, 24237, 24311, 24351, 24716, + 25269, 25402, 25552, 26799, 27712, 30855, 31118, 31243, 32224, 33351, + 35330, 35558, 36420, 36883, 37048, 37165, 37336, 40718, 27877, 25688, + 25826, 25973, 28404, 30340, 31515, 36969, 37841, 28346, 21746, 24505, + 25764, 36685, 36845, 37444, 20856, 22635, 22825, 23637, 24215, 28155, + 32399, 29980, 36028, 36578, 39003, 28857, 20253, 27583, 28593, 30000, + 38651, 20814, 21520, 22581, 22615, 22956, 23648, 24466, 26007, 26460, + 28193, 30331, 33759, 36077, 36884, 37117, 37709, 30757, 30778, 21162, + 24230, 22303, 22900, 24594, 20498, 20826, 20908, 20941, 20992, 21776, + 22612, 22616, 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, + 26691, 26812, 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, + 30168, 31095, 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, + 34276, 35342, 35588, 35910, 36367, 36867, 36879, 37913, 38518, 38957, + 39472, 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, + 30643, 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, + 24499, 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, + 27233, 20984, 31361, 26932, 23626, 40182, 33515, 23493, 37193, 28702, + 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, + 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, + 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, + 20108, 23612, 24336, 36841, 21250, 36049, 32905, 34425, 24319, 26085, + 20083, 20837, 22914, 23615, 38894, 20219, 22922, 24525, 35469, 28641, + 31152, 31074, 23527, 33905, 29483, 29105, 24180, 24565, 25467, 25754, + 29123, 31896, 20035, 24316, 20043, 22492, 22178, 24745, 28611, 32013, + 33021, 33075, 33215, 36786, 35223, 34468, 24052, 25226, 25773, 35207, + 26487, 27874, 27966, 29750, 30772, 23110, 32629, 33453, 39340, 20467, + 24259, 25309, 25490, 25943, 26479, 30403, 29260, 32972, 32954, 36649, + 37197, 20493, 22521, 23186, 26757, 26995, 29028, 29437, 36023, 22770, + 36064, 38506, 36889, 34687, 31204, 30695, 33833, 20271, 21093, 21338, + 25293, 26575, 27850, 30333, 31636, 31893, 33334, 34180, 36843, 26333, + 28448, 29190, 32283, 33707, 39361, 40614, 20989, 31665, 30834, 31672, + 32903, 31560, 27368, 24161, 32908, 30033, 30048, 20843, 37474, 28300, + 30330, 37271, 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, + 22617, 34532, 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, + 26001, 26495, 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, + 34281, 36009, 31684, 37318, 29033, 38930, 39151, 25405, 26217, 30058, + 30436, 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, + 24754, 25161, 25209, 25259, 26000, 27604, 27852, 30130, 30382, 30865, + 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, 38750, 39131, + 27147, 31800, 20633, 23614, 24494, 26503, 27608, 29749, 30473, 32654, + 40763, 26570, 31255, 21305, 30091, 39661, 24422, 33181, 33777, 32920, + 24380, 24517, 30050, 31558, 36924, 26727, 23019, 23195, 32016, 30334, + 35628, 20469, 24426, 27161, 27703, 28418, 29922, 31080, 34920, 35413, + 35961, 24287, 25551, 30149, 31186, 33495, 37672, 37618, 33948, 34541, + 39981, 21697, 24428, 25996, 27996, 28693, 36007, 36051, 38971, 25935, + 29942, 19981, 20184, 22496, 22827, 23142, 23500, 20904, 24067, 24220, + 24598, 25206, 25975, 26023, 26222, 28014, 29238, 31526, 33104, 33178, + 33433, 35676, 36000, 36070, 36212, 38428, 38468, 20398, 25771, 27494, + 33310, 33889, 34154, 37096, 23553, 26963, 39080, 33914, 34135, 20239, + 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, + 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, + 25198, 28954, 22894, 31881, 31966, 32027, 38640, 25991, 32862, 19993, + 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, 38281, + 38491, 31859, 38913, 20731, 22721, 30294, 30887, 21029, 30629, 34065, + 31622, 20559, 22793, 29255, 31687, 32232, 36794, 36820, 36941, 20415, + 21193, 23081, 24321, 38829, 20445, 33303, 37610, 22275, 25429, 27497, + 29995, 35036, 36628, 31298, 21215, 22675, 24917, 25098, 26286, 27597, + 31807, 33769, 20515, 20472, 21253, 21574, 22577, 22857, 23453, 23792, + 23791, 23849, 24214, 25265, 25447, 25918, 26041, 26379, 27861, 27873, + 28921, 30770, 32299, 32990, 33459, 33804, 34028, 34562, 35090, 35370, + 35914, 37030, 37586, 39165, 40179, 40300, 20047, 20129, 20621, 21078, + 22346, 22952, 24125, 24536, 24537, 25151, 26292, 26395, 26576, 26834, + 20882, 32033, 32938, 33192, 35584, 35980, 36031, 37502, 38450, 21536, + 38956, 21271, 20693, 21340, 22696, 25778, 26420, 29287, 30566, 31302, + 37350, 21187, 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, + 30406, 25705, 30952, 39764, 40635, 22475, 22969, 26151, 26522, 27598, + 21737, 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, + 20451, 21448, 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, + 24930, 28288, 28459, 34067, 21619, 26410, 39749, 24051, 31637, 23724, + 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, 27665, 30496, + 21209, 22818, 28961, 29279, 30683, 38695, 40289, 26891, 23167, 23064, + 20901, 21517, 21629, 26126, 30431, 36855, 37528, 40180, 23018, 29277, + 28357, 20813, 26825, 32191, 32236, 38754, 40634, 25720, 27169, 33538, + 22916, 23391, 27611, 29467, 30450, 32178, 32791, 33945, 20786, 26408, + 40665, 30446, 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, + 24758, 32011, 38272, 21249, 20063, 20918, 22812, 29242, 32822, 37326, + 24357, 30690, 21380, 24441, 32004, 34220, 35379, 36493, 38742, 26611, + 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, 21807, 20305, + 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, 26377, 26586, + 28263, 28044, 29494, 29495, 30001, 31056, 35029, 35480, 36938, 37009, + 37109, 38596, 34701, 22805, 20104, 20313, 19982, 35465, 36671, 38928, + 20653, 24188, 22934, 23481, 24248, 25562, 25594, 25793, 26332, 26954, + 27096, 27915, 28342, 29076, 29992, 31407, 32650, 32768, 33865, 33993, + 35201, 35617, 36362, 36965, 38525, 39178, 24958, 25233, 27442, 27779, + 28020, 32716, 32764, 28096, 32645, 34746, 35064, 26469, 33713, 38972, + 38647, 27931, 32097, 33853, 37226, 20081, 21365, 23888, 27396, 28651, + 34253, 34349, 35239, 21033, 21519, 23653, 26446, 26792, 29702, 29827, + 30178, 35023, 35041, 37324, 38626, 38520, 24459, 29575, 31435, 33870, + 25504, 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, + 31452, 40845, 20406, 24942, 26053, 34396, 20102, 20142, 20698, 20001, + 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, 31260, 31975, + 33391, 35538, 36988, 37327, 38517, 38936, 21147, 32209, 20523, 21400, + 26519, 28107, 29136, 29747, 33256, 36650, 38563, 40023, 40607, 29792, + 22593, 28057, 32047, 39006, 20196, 20278, 20363, 20919, 21169, 23994, + 24604, 29618, 31036, 33491, 37428, 38583, 38646, 38666, 40599, 40802, + 26278, 27508, 21015, 21155, 28872, 35010, 24265, 24651, 24976, 28451, + 29001, 31806, 32244, 32879, 34030, 36899, 37676, 21570, 39791, 27347, + 28809, 36034, 36335, 38706, 21172, 23105, 24266, 24324, 26391, 27004, + 27028, 28010, 28431, 29282, 29436, 31725, 32769, 32894, 34635, 37070, + 20845, 40595, 31108, 32907, 37682, 35542, 20525, 21644, 35441, 27498, + 36036, 33031, 24785, 26528, 40434, 20121, 20120, 39952, 35435, 34241, + 34152, 26880, 28286, 30871, 33109, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24332, 19984, + 19989, 20010, 20017, 20022, 20028, 20031, 20034, 20054, 20056, 20098, + 20101, 35947, 20106, 33298, 24333, 20110, 20126, 20127, 20128, 20130, + 20144, 20147, 20150, 20174, 20173, 20164, 20166, 20162, 20183, 20190, + 20205, 20191, 20215, 20233, 20314, 20272, 20315, 20317, 20311, 20295, + 20342, 20360, 20367, 20376, 20347, 20329, 20336, 20369, 20335, 20358, + 20374, 20760, 20436, 20447, 20430, 20440, 20443, 20433, 20442, 20432, + 20452, 20453, 20506, 20520, 20500, 20522, 20517, 20485, 20252, 20470, + 20513, 20521, 20524, 20478, 20463, 20497, 20486, 20547, 20551, 26371, + 20565, 20560, 20552, 20570, 20566, 20588, 20600, 20608, 20634, 20613, + 20660, 20658, 20681, 20682, 20659, 20674, 20694, 20702, 20709, 20717, + 20707, 20718, 20729, 20725, 20745, 20737, 20738, 20758, 20757, 20756, + 20762, 20769, 20794, 20791, 20796, 20795, 20799, 20800, 20818, 20812, + 20820, 20834, 31480, 20841, 20842, 20846, 20864, 20866, 22232, 20876, + 20873, 20879, 20881, 20883, 20885, 20886, 20900, 20902, 20898, 20905, + 20906, 20907, 20915, 20913, 20914, 20912, 20917, 20925, 20933, 20937, + 20955, 20960, 34389, 20969, 20973, 20976, 20981, 20990, 20996, 21003, + 21012, 21006, 21031, 21034, 21038, 21043, 21049, 21071, 21060, 21067, + 21068, 21086, 21076, 21098, 21108, 21097, 21107, 21119, 21117, 21133, + 21140, 21138, 21105, 21128, 21137, 36776, 36775, 21164, 21165, 21180, + 21173, 21185, 21197, 21207, 21214, 21219, 21222, 39149, 21216, 21235, + 21237, 21240, 21241, 21254, 21256, 30008, 21261, 21264, 21263, 21269, + 21274, 21283, 21295, 21297, 21299, 21304, 21312, 21318, 21317, 19991, + 21321, 21325, 20950, 21342, 21353, 21358, 22808, 21371, 21367, 21378, + 21398, 21408, 21414, 21413, 21422, 21424, 21430, 21443, 31762, 38617, + 21471, 26364, 29166, 21486, 21480, 21485, 21498, 21505, 21565, 21568, + 21548, 21549, 21564, 21550, 21558, 21545, 21533, 21582, 21647, 21621, + 21646, 21599, 21617, 21623, 21616, 21650, 21627, 21632, 21622, 21636, + 21648, 21638, 21703, 21666, 21688, 21669, 21676, 21700, 21704, 21672, + 21675, 21698, 21668, 21694, 21692, 21720, 21733, 21734, 21775, 21780, + 21757, 21742, 21741, 21754, 21730, 21817, 21824, 21859, 21836, 21806, + 21852, 21829, 21846, 21847, 21816, 21811, 21853, 21913, 21888, 21679, + 21898, 21919, 21883, 21886, 21912, 21918, 21934, 21884, 21891, 21929, + 21895, 21928, 21978, 21957, 21983, 21956, 21980, 21988, 21972, 22036, + 22007, 22038, 22014, 22013, 22043, 22009, 22094, 22096, 29151, 22068, + 22070, 22066, 22072, 22123, 22116, 22063, 22124, 22122, 22150, 22144, + 22154, 22176, 22164, 22159, 22181, 22190, 22198, 22196, 22210, 22204, + 22209, 22211, 22208, 22216, 22222, 22225, 22227, 22231, 22254, 22265, + 22272, 22271, 22276, 22281, 22280, 22283, 22285, 22291, 22296, 22294, + 21959, 22300, 22310, 22327, 22328, 22350, 22331, 22336, 22351, 22377, + 22464, 22408, 22369, 22399, 22409, 22419, 22432, 22451, 22436, 22442, + 22448, 22467, 22470, 22484, 22482, 22483, 22538, 22486, 22499, 22539, + 22553, 22557, 22642, 22561, 22626, 22603, 22640, 27584, 22610, 22589, + 22649, 22661, 22713, 22687, 22699, 22714, 22750, 22715, 22712, 22702, + 22725, 22739, 22737, 22743, 22745, 22744, 22757, 22748, 22756, 22751, + 22767, 22778, 22777, 22779, 22780, 22781, 22786, 22794, 22800, 22811, + 26790, 22821, 22828, 22829, 22834, 22840, 22846, 31442, 22869, 22864, + 22862, 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, + 22941, 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, 23001, + 23002, 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, + 23093, 23094, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, + 23267, 23255, 23270, 23273, 23254, 23290, 23291, 23308, 23307, 23318, + 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, + 23386, 23387, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, + 23424, 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, 23524, + 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, 23559, + 23560, 23565, 23571, 23584, 23586, 23592, 23608, 23609, 23617, 23622, + 23630, 23635, 23632, 23631, 23409, 23660, 23662, 20066, 23670, 23673, + 23692, 23697, 23700, 22939, 23723, 23739, 23734, 23740, 23735, 23749, + 23742, 23751, 23769, 23785, 23805, 23802, 23789, 23948, 23786, 23819, + 23829, 23831, 23900, 23839, 23835, 23825, 23828, 23842, 23834, 23833, + 23832, 23884, 23890, 23886, 23883, 23916, 23923, 23926, 23943, 23940, + 23938, 23970, 23965, 23980, 23982, 23997, 23952, 23991, 23996, 24009, + 24013, 24019, 24018, 24022, 24027, 24043, 24050, 24053, 24075, 24090, + 24089, 24081, 24091, 24118, 24119, 24132, 24131, 24128, 24142, 24151, + 24148, 24159, 24162, 24164, 24135, 24181, 24182, 24186, 40636, 24191, + 24224, 24257, 24258, 24264, 24272, 24271, 24278, 24291, 24285, 24282, + 24283, 24290, 24289, 24296, 24297, 24300, 24305, 24307, 24304, 24308, + 24312, 24318, 24323, 24329, 24413, 24412, 24331, 24337, 24342, 24361, + 24365, 24376, 24385, 24392, 24396, 24398, 24367, 24401, 24406, 24407, + 24409, 24417, 24429, 24435, 24439, 24451, 24450, 24447, 24458, 24456, + 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, 24534, + 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, 24601, + 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, 24634, + 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, 24643, + 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, 24730, + 24708, 24731, 24726, 24727, 24722, 24743, 24715, 24801, 24760, 24800, + 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, 24838, + 24822, 24823, 24832, 24820, 24826, 24835, 24865, 24827, 24817, 24845, + 24846, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, 24884, + 24893, 24898, 24900, 24947, 24951, 24920, 24921, 24922, 24939, 24948, + 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, + 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, + 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, + 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, 25096, 25097, + 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, 25138, + 25139, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, 25218, + 25225, 25214, 25234, 25235, 25238, 25300, 25219, 25236, 25303, 25297, + 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, 25282, + 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, 25327, + 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, 25515, + 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, 25577, + 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, 25606, + 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, 25718, + 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, 25810, + 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, 25824, 25825, + 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, 25856, 25853, + 25880, 25884, 25861, 25892, 25891, 25899, 25908, 25909, 25911, 25910, + 25912, 30027, 25928, 25942, 25941, 25933, 25944, 25950, 25949, 25970, + 25976, 25986, 25987, 35722, 26011, 26015, 26027, 26039, 26051, 26054, + 26049, 26052, 26060, 26066, 26075, 26073, 26080, 26081, 26097, 26482, + 26122, 26115, 26107, 26483, 26165, 26166, 26164, 26140, 26191, 26180, + 26185, 26177, 26206, 26205, 26212, 26215, 26216, 26207, 26210, 26224, + 26243, 26248, 26254, 26249, 26244, 26264, 26269, 26305, 26297, 26313, + 26302, 26300, 26308, 26296, 26326, 26330, 26336, 26175, 26342, 26345, + 26352, 26357, 26359, 26383, 26390, 26398, 26406, 26407, 38712, 26414, + 26431, 26422, 26433, 26424, 26423, 26438, 26462, 26464, 26457, 26467, + 26468, 26505, 26480, 26537, 26492, 26474, 26508, 26507, 26534, 26529, + 26501, 26551, 26607, 26548, 26604, 26547, 26601, 26552, 26596, 26590, + 26589, 26594, 26606, 26553, 26574, 26566, 26599, 27292, 26654, 26694, + 26665, 26688, 26701, 26674, 26702, 26803, 26667, 26713, 26723, 26743, + 26751, 26783, 26767, 26797, 26772, 26781, 26779, 26755, 27310, 26809, + 26740, 26805, 26784, 26810, 26895, 26765, 26750, 26881, 26826, 26888, + 26840, 26914, 26918, 26849, 26892, 26829, 26836, 26855, 26837, 26934, + 26898, 26884, 26839, 26851, 26917, 26873, 26848, 26863, 26920, 26922, + 26906, 26915, 26913, 26822, 27001, 26999, 26972, 27000, 26987, 26964, + 27006, 26990, 26937, 26996, 26941, 26969, 26928, 26977, 26974, 26973, + 27009, 26986, 27058, 27054, 27088, 27071, 27073, 27091, 27070, 27086, + 23528, 27082, 27101, 27067, 27075, 27047, 27182, 27025, 27040, 27036, + 27029, 27060, 27102, 27112, 27138, 27163, 27135, 27402, 27129, 27122, + 27111, 27141, 27057, 27166, 27117, 27156, 27115, 27146, 27154, 27329, + 27171, 27155, 27204, 27148, 27250, 27190, 27256, 27207, 27234, 27225, + 27238, 27208, 27192, 27170, 27280, 27277, 27296, 27268, 27298, 27299, + 27287, 34327, 27323, 27331, 27330, 27320, 27315, 27308, 27358, 27345, + 27359, 27306, 27354, 27370, 27387, 27397, 34326, 27386, 27410, 27414, + 39729, 27423, 27448, 27447, 30428, 27449, 39150, 27463, 27459, 27465, + 27472, 27481, 27476, 27483, 27487, 27489, 27512, 27513, 27519, 27520, + 27524, 27523, 27533, 27544, 27541, 27550, 27556, 27562, 27563, 27567, + 27570, 27569, 27571, 27575, 27580, 27590, 27595, 27603, 27615, 27628, + 27627, 27635, 27631, 40638, 27656, 27667, 27668, 27675, 27684, 27683, + 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, 27774, + 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, 27845, + 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, 27935, + 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, 27916, + 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, 28037, + 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, 28126, + 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, 28142, + 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, 28203, + 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, 28216, + 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, 28338, + 28372, 28373, 28303, 28325, 28354, 28319, 28481, 28433, 28748, 28396, + 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, 28435, + 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, 28525, + 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, 28577, + 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, 28657, + 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, 28699, + 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, 28771, + 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, 28875, + 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, 29030, + 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, 29100, + 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, 29159, + 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, 29228, + 29232, 29234, 29243, 29244, 29247, 29248, 29254, 29259, 29272, 29300, + 29310, 29314, 29313, 29319, 29330, 29334, 29346, 29351, 29369, 29362, + 29379, 29382, 29380, 29390, 29394, 29410, 29408, 29409, 29433, 29431, + 20495, 29463, 29450, 29468, 29462, 29469, 29492, 29487, 29481, 29477, + 29502, 29518, 29519, 40664, 29527, 29546, 29544, 29552, 29560, 29557, + 29563, 29562, 29640, 29619, 29646, 29627, 29632, 29669, 29678, 29662, + 29858, 29701, 29807, 29733, 29688, 29746, 29754, 29781, 29759, 29791, + 29785, 29761, 29788, 29801, 29808, 29795, 29802, 29814, 29822, 29835, + 29854, 29863, 29898, 29903, 29908, 29681, 29920, 29923, 29927, 29929, + 29934, 29938, 29936, 29937, 29944, 29943, 29956, 29955, 29957, 29964, + 29966, 29965, 29973, 29971, 29982, 29990, 29996, 30012, 30020, 30029, + 30026, 30025, 30043, 30022, 30042, 30057, 30052, 30055, 30059, 30061, + 30072, 30070, 30086, 30087, 30068, 30090, 30089, 30082, 30100, 30106, + 30109, 30117, 30115, 30146, 30131, 30147, 30133, 30141, 30136, 30140, + 30129, 30157, 30154, 30162, 30169, 30179, 30174, 30206, 30207, 30204, + 30209, 30192, 30202, 30194, 30195, 30219, 30221, 30217, 30239, 30247, + 30240, 30241, 30242, 30244, 30260, 30256, 30267, 30279, 30280, 30278, + 30300, 30296, 30305, 30306, 30312, 30313, 30314, 30311, 30316, 30320, + 30322, 30326, 30328, 30332, 30336, 30339, 30344, 30347, 30350, 30358, + 30355, 30361, 30362, 30384, 30388, 30392, 30393, 30394, 30402, 30413, + 30422, 30418, 30430, 30433, 30437, 30439, 30442, 34351, 30459, 30472, + 30471, 30468, 30505, 30500, 30494, 30501, 30502, 30491, 30519, 30520, + 30535, 30554, 30568, 30571, 30555, 30565, 30591, 30590, 30585, 30606, + 30603, 30609, 30624, 30622, 30640, 30646, 30649, 30655, 30652, 30653, + 30651, 30663, 30669, 30679, 30682, 30684, 30691, 30702, 30716, 30732, + 30738, 31014, 30752, 31018, 30789, 30862, 30836, 30854, 30844, 30874, + 30860, 30883, 30901, 30890, 30895, 30929, 30918, 30923, 30932, 30910, + 30908, 30917, 30922, 30956, 30951, 30938, 30973, 30964, 30983, 30994, + 30993, 31001, 31020, 31019, 31040, 31072, 31063, 31071, 31066, 31061, + 31059, 31098, 31103, 31114, 31133, 31143, 40779, 31146, 31150, 31155, + 31161, 31162, 31177, 31189, 31207, 31212, 31201, 31203, 31240, 31245, + 31256, 31257, 31264, 31263, 31104, 31281, 31291, 31294, 31287, 31299, + 31319, 31305, 31329, 31330, 31337, 40861, 31344, 31353, 31357, 31368, + 31383, 31381, 31384, 31382, 31401, 31432, 31408, 31414, 31429, 31428, + 31423, 36995, 31431, 31434, 31437, 31439, 31445, 31443, 31449, 31450, + 31453, 31457, 31458, 31462, 31469, 31472, 31490, 31503, 31498, 31494, + 31539, 31512, 31513, 31518, 31541, 31528, 31542, 31568, 31610, 31492, + 31565, 31499, 31564, 31557, 31605, 31589, 31604, 31591, 31600, 31601, + 31596, 31598, 31645, 31640, 31647, 31629, 31644, 31642, 31627, 31634, + 31631, 31581, 31641, 31691, 31681, 31692, 31695, 31668, 31686, 31709, + 31721, 31761, 31764, 31718, 31717, 31840, 31744, 31751, 31763, 31731, + 31735, 31767, 31757, 31734, 31779, 31783, 31786, 31775, 31799, 31787, + 31805, 31820, 31811, 31828, 31823, 31808, 31824, 31832, 31839, 31844, + 31830, 31845, 31852, 31861, 31875, 31888, 31908, 31917, 31906, 31915, + 31905, 31912, 31923, 31922, 31921, 31918, 31929, 31933, 31936, 31941, + 31938, 31960, 31954, 31964, 31970, 39739, 31983, 31986, 31988, 31990, + 31994, 32006, 32002, 32028, 32021, 32010, 32069, 32075, 32046, 32050, + 32063, 32053, 32070, 32115, 32086, 32078, 32114, 32104, 32110, 32079, + 32099, 32147, 32137, 32091, 32143, 32125, 32155, 32186, 32174, 32163, + 32181, 32199, 32189, 32171, 32317, 32162, 32175, 32220, 32184, 32159, + 32176, 32216, 32221, 32228, 32222, 32251, 32242, 32225, 32261, 32266, + 32291, 32289, 32274, 32305, 32287, 32265, 32267, 32290, 32326, 32358, + 32315, 32309, 32313, 32323, 32311, 32306, 32314, 32359, 32349, 32342, + 32350, 32345, 32346, 32377, 32362, 32361, 32380, 32379, 32387, 32213, + 32381, 36782, 32383, 32392, 32393, 32396, 32402, 32400, 32403, 32404, + 32406, 32398, 32411, 32412, 32568, 32570, 32581, 32588, 32589, 32590, + 32592, 32593, 32597, 32596, 32600, 32607, 32608, 32616, 32617, 32615, + 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, 32669, + 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, 32709, + 32710, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, 39132, + 32774, 32772, 32779, 32786, 32792, 32793, 32796, 32801, 32808, 32831, + 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, 32872, 32883, + 32882, 32880, 32886, 32889, 32893, 32895, 32900, 32902, 32901, 32923, + 32915, 32922, 32941, 20880, 32940, 32987, 32997, 32985, 32989, 32964, + 32986, 32982, 33033, 33007, 33009, 33051, 33065, 33059, 33071, 33099, + 38539, 33094, 33086, 33107, 33105, 33020, 33137, 33134, 33125, 33126, + 33140, 33155, 33160, 33162, 33152, 33154, 33184, 33173, 33188, 33187, + 33119, 33171, 33193, 33200, 33205, 33214, 33208, 33213, 33216, 33218, + 33210, 33225, 33229, 33233, 33241, 33240, 33224, 33242, 33247, 33248, + 33255, 33274, 33275, 33278, 33281, 33282, 33285, 33287, 33290, 33293, + 33296, 33302, 33321, 33323, 33336, 33331, 33344, 33369, 33368, 33373, + 33370, 33375, 33380, 33378, 33384, 33386, 33387, 33326, 33393, 33399, + 33400, 33406, 33421, 33426, 33451, 33439, 33467, 33452, 33505, 33507, + 33503, 33490, 33524, 33523, 33530, 33683, 33539, 33531, 33529, 33502, + 33542, 33500, 33545, 33497, 33589, 33588, 33558, 33586, 33585, 33600, + 33593, 33616, 33605, 33583, 33579, 33559, 33560, 33669, 33690, 33706, + 33695, 33698, 33686, 33571, 33678, 33671, 33674, 33660, 33717, 33651, + 33653, 33696, 33673, 33704, 33780, 33811, 33771, 33742, 33789, 33795, + 33752, 33803, 33729, 33783, 33799, 33760, 33778, 33805, 33826, 33824, + 33725, 33848, 34054, 33787, 33901, 33834, 33852, 34138, 33924, 33911, + 33899, 33965, 33902, 33922, 33897, 33862, 33836, 33903, 33913, 33845, + 33994, 33890, 33977, 33983, 33951, 34009, 33997, 33979, 34010, 34000, + 33985, 33990, 34006, 33953, 34081, 34047, 34036, 34071, 34072, 34092, + 34079, 34069, 34068, 34044, 34112, 34147, 34136, 34120, 34113, 34306, + 34123, 34133, 34176, 34212, 34184, 34193, 34186, 34216, 34157, 34196, + 34203, 34282, 34183, 34204, 34167, 34174, 34192, 34249, 34234, 34255, + 34233, 34256, 34261, 34269, 34277, 34268, 34297, 34314, 34323, 34315, + 34302, 34298, 34310, 34338, 34330, 34352, 34367, 34381, 20053, 34388, + 34399, 34407, 34417, 34451, 34467, 34473, 34474, 34443, 34444, 34486, + 34479, 34500, 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, + 34540, 34527, 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, + 34577, 34569, 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, + 34601, 34586, 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, + 34670, 34649, 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, + 34763, 34749, 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, + 34747, 34799, 34802, 34784, 34831, 34829, 34814, 34806, 34807, 34830, + 34770, 34833, 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, + 34875, 34884, 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, + 34974, 34933, 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, + 34978, 34957, 34980, 34992, 35007, 34993, 35011, 35012, 35028, 35032, + 35033, 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, + 35082, 35091, 35139, 35102, 35109, 35114, 35115, 35137, 35140, 35131, + 35126, 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, + 35183, 35188, 35191, 35198, 35203, 35208, 35210, 35219, 35224, 35233, + 35241, 35238, 35244, 35247, 35250, 35258, 35261, 35263, 35264, 35290, + 35292, 35293, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, + 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, + 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, 35493, 35494, + 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, + 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, + 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, + 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, + 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, 35730, 35731, + 35734, 35737, 35738, 35898, 35905, 35903, 35912, 35916, 35918, 35920, + 35925, 35938, 35948, 35960, 35962, 35970, 35977, 35973, 35978, 35981, + 35982, 35988, 35964, 35992, 25117, 36013, 36010, 36029, 36018, 36019, + 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, 36090, 36091, + 36100, 36101, 36106, 36103, 36111, 36109, 36112, 40782, 36115, 36045, + 36116, 36118, 36199, 36205, 36209, 36211, 36225, 36249, 36290, 36286, + 36282, 36303, 36314, 36310, 36300, 36315, 36299, 36330, 36331, 36319, + 36323, 36348, 36360, 36361, 36351, 36381, 36382, 36368, 36383, 36418, + 36405, 36400, 36404, 36426, 36423, 36425, 36428, 36432, 36424, 36441, + 36452, 36448, 36394, 36451, 36437, 36470, 36466, 36476, 36481, 36487, + 36485, 36484, 36491, 36490, 36499, 36497, 36500, 36505, 36522, 36513, + 36524, 36528, 36550, 36529, 36542, 36549, 36552, 36555, 36571, 36579, + 36604, 36603, 36587, 36606, 36618, 36613, 36629, 36626, 36633, 36627, + 36636, 36639, 36635, 36620, 36646, 36659, 36667, 36665, 36677, 36674, + 36670, 36684, 36681, 36678, 36686, 36695, 36700, 36706, 36707, 36708, + 36764, 36767, 36771, 36781, 36783, 36791, 36826, 36837, 36834, 36842, + 36847, 36999, 36852, 36869, 36857, 36858, 36881, 36885, 36897, 36877, + 36894, 36886, 36875, 36903, 36918, 36917, 36921, 36856, 36943, 36944, + 36945, 36946, 36878, 36937, 36926, 36950, 36952, 36958, 36968, 36975, + 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, 37001, 37007, + 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, 37122, 37138, + 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, 37225, 37235, + 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, 37301, 37300, + 37306, 37312, 37313, 37321, 37323, 37328, 37334, 37343, 37345, 37339, + 37372, 37365, 37366, 37406, 37375, 37396, 37420, 37397, 37393, 37470, + 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, 37456, 37532, + 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, 37647, 37626, + 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, 37691, 37724, + 37728, 37756, 37742, 37718, 37808, 37804, 37805, 37780, 37817, 37846, + 37847, 37864, 37861, 37848, 37827, 37853, 37840, 37832, 37860, 37914, + 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, 37921, 37946, + 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, 37417, 38000, + 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, 38274, 38279, + 38282, 38292, 38294, 38296, 38297, 38304, 38312, 38311, 38317, 38332, + 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, 38357, 38356, + 38358, 38364, 38369, 38373, 38370, 38433, 38440, 38446, 38447, 38466, + 38476, 38479, 38475, 38519, 38492, 38494, 38493, 38495, 38502, 38514, + 38508, 38541, 38552, 38549, 38551, 38570, 38567, 38577, 38578, 38576, + 38580, 38582, 38584, 38585, 38606, 38603, 38601, 38605, 35149, 38620, + 38669, 38613, 38649, 38660, 38662, 38664, 38675, 38670, 38673, 38671, + 38678, 38681, 38692, 38698, 38704, 38713, 38717, 38718, 38724, 38726, + 38728, 38722, 38729, 38748, 38752, 38756, 38758, 38760, 21202, 38763, + 38769, 38777, 38789, 38780, 38785, 38778, 38790, 38795, 38799, 38800, + 38812, 38824, 38822, 38819, 38835, 38836, 38851, 38854, 38856, 38859, + 38876, 38893, 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, + 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, 39023, 39024, + 39025, 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, + 39145, 39147, 39171, 39177, 39186, 39188, 39192, 39201, 39197, 39198, + 39204, 39200, 39212, 39214, 39229, 39230, 39234, 39241, 39237, 39248, + 39243, 39249, 39250, 39244, 39253, 39319, 39320, 39333, 39341, 39342, + 39356, 39391, 39387, 39389, 39384, 39377, 39405, 39406, 39409, 39410, + 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, 39479, 39493, + 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, 39519, 39522, + 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, 39616, 39631, + 39633, 39635, 39636, 39646, 39647, 39650, 39651, 39654, 39663, 39659, + 39662, 39668, 39665, 39671, 39675, 39686, 39704, 39706, 39711, 39714, + 39715, 39717, 39719, 39720, 39721, 39722, 39726, 39727, 39730, 39748, + 39747, 39759, 39757, 39758, 39761, 39768, 39796, 39827, 39811, 39825, + 39830, 39831, 39839, 39840, 39848, 39860, 39872, 39882, 39865, 39878, + 39887, 39889, 39890, 39907, 39906, 39908, 39892, 39905, 39994, 39922, + 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, 39954, + 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, 39986, + 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, 40176, + 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, 40223, + 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, 40285, 40286, + 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, 40303, 40314, + 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, 40378, 40390, + 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, 40445, 40474, + 40475, 40478, 40565, 40569, 40573, 40577, 40584, 40587, 40588, 40594, + 40597, 40593, 40605, 40613, 40617, 40632, 40618, 40621, 38753, 40652, + 40654, 40655, 40656, 40660, 40668, 40670, 40669, 40672, 40677, 40680, + 40687, 40692, 40694, 40695, 40697, 40699, 40700, 40701, 40711, 40712, + 30391, 40725, 40737, 40748, 40766, 40778, 40786, 40788, 40803, 40799, + 40800, 40801, 40806, 40807, 40812, 40810, 40823, 40818, 40822, 40853, + 40860, 40864, 22575, 27079, 36953, 29796, 20956, 29081, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 32394, 35100, 37704, 37512, 34012, 20425, 28859, 26161, + 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, 20227, 20281, + 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, 20479, 20510, + 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, 20893, 20926, + 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, 21284, 21362, + 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, 21894, 22361, + 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, 22795, 22867, + 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, 23512, 23532, + 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, 23917, 23992, + 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, 24709, 24714, + 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, 25107, 25254, + 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, 26121, 26158, + 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, 26290, + 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, 26625, 26692, + 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, + 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, + 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, + 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, + 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, 29182, 29361, + 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, + 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, 29953, 30063, + 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, + 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, 31131, 31441, + 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, 32160, 32214, + 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, 33782, 33864, + 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, 34823, 35061, + 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, 35667, 35711, + 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, 36967, 37086, + 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, 37348, 37349, + 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, 37457, 37433, + 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, 64039, 37589, + 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, 37661, 37634, + 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, 37960, 38290, + 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, 38735, 38737, + 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, 39502, 39641, + 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, 40299, 64045, + 40473, 40657, 0x0000, 0x0000, 8560, 8561, 8562, 8563, 8564, 8565, + 8566, 8567, 8568, 8569, 65506, 65508, 65287, 65282, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 65506, 65508, 65287, 65282, + 12849, 8470, 8481, 8757, 32394, 35100, 37704, 37512, 34012, 20425, + 28859, 26161, 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, + 20227, 20281, 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, + 20479, 20510, 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, + 20893, 20926, 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, + 21284, 21362, 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, + 21894, 22361, 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, + 22795, 22867, 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, + 23512, 23532, 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, + 23917, 23992, 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, + 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, + 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, + 26121, 26158, 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, + 26272, 26290, 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, + 26625, 26692, 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, + 27206, 27251, 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, + 27866, 27908, 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, + 28217, 28252, 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, + 28712, 28805, 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, + 29182, 29361, 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, + 29650, 29703, 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, + 29953, 30063, 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, + 30753, 30798, 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, + 31131, 31441, 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, + 32160, 32214, 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, + 33782, 33864, 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, + 34823, 35061, 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, + 35667, 35711, 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, + 36967, 37086, 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, + 37348, 37349, 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, + 37457, 37433, 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, + 64039, 37589, 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, + 37661, 37634, 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, + 37960, 38290, 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, + 38735, 38737, 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, + 39502, 39641, 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, + 40299, 64045, 40473, 40657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myhtml_encoding_map_jis0212[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 728, 711, + 184, 729, 733, 175, 731, 730, 65374, 900, 901, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 161, 166, 191, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 186, 170, + 169, 174, 8482, 164, 8470, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 902, 904, 905, 906, 938, 0x0000, + 908, 0x0000, 910, 939, 0x0000, 911, 0x0000, 0x0000, 0x0000, 0x0000, + 940, 941, 942, 943, 970, 912, 972, 962, 973, 971, + 944, 974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1026, 1027, 1028, + 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, 1039, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1106, 1107, 1108, 1109, 1110, + 1111, 1112, 1113, 1114, 1115, 1116, 1118, 1119, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 198, 272, 0x0000, 294, 0x0000, 306, 0x0000, 321, + 319, 0x0000, 330, 216, 338, 0x0000, 358, 222, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 230, 273, 240, 295, 305, 307, + 312, 322, 320, 329, 331, 248, 339, 223, 359, 254, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 193, 192, 196, 194, + 258, 461, 256, 260, 197, 195, 262, 264, 268, 199, + 266, 270, 201, 200, 203, 202, 282, 278, 274, 280, + 0x0000, 284, 286, 290, 288, 292, 205, 204, 207, 206, + 463, 304, 298, 302, 296, 308, 310, 313, 317, 315, + 323, 327, 325, 209, 211, 210, 214, 212, 465, 336, + 332, 213, 340, 344, 342, 346, 348, 352, 350, 356, + 354, 218, 217, 220, 219, 364, 467, 368, 362, 370, + 366, 360, 471, 475, 473, 469, 372, 221, 376, 374, + 377, 381, 379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 225, 224, 228, 226, 259, 462, 257, 261, 229, 227, + 263, 265, 269, 231, 267, 271, 233, 232, 235, 234, + 283, 279, 275, 281, 501, 285, 287, 0x0000, 289, 293, + 237, 236, 239, 238, 464, 0x0000, 299, 303, 297, 309, + 311, 314, 318, 316, 324, 328, 326, 241, 243, 242, + 246, 244, 466, 337, 333, 245, 341, 345, 343, 347, + 349, 353, 351, 357, 355, 250, 249, 252, 251, 365, + 468, 369, 363, 371, 367, 361, 472, 476, 474, 470, + 373, 253, 255, 375, 378, 382, 380, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 19970, 19972, 19973, 19980, 19986, 19999, 20003, 20004, 20008, 20011, + 20014, 20015, 20016, 20021, 20032, 20033, 20036, 20039, 20049, 20058, + 20060, 20067, 20072, 20073, 20084, 20085, 20089, 20095, 20109, 20118, + 20119, 20125, 20143, 20153, 20163, 20176, 20186, 20187, 20192, 20193, + 20194, 20200, 20207, 20209, 20211, 20213, 20221, 20222, 20223, 20224, + 20226, 20227, 20232, 20235, 20236, 20242, 20245, 20246, 20247, 20249, + 20270, 20273, 20320, 20275, 20277, 20279, 20281, 20283, 20286, 20288, + 20290, 20296, 20297, 20299, 20300, 20306, 20308, 20310, 20312, 20319, + 20323, 20330, 20332, 20334, 20337, 20343, 20344, 20345, 20346, 20349, + 20350, 20353, 20354, 20356, 20357, 20361, 20362, 20364, 20366, 20368, + 20370, 20371, 20372, 20375, 20377, 20378, 20382, 20383, 20402, 20407, + 20409, 20411, 20412, 20413, 20414, 20416, 20417, 20421, 20422, 20424, + 20425, 20427, 20428, 20429, 20431, 20434, 20444, 20448, 20450, 20464, + 20466, 20476, 20477, 20479, 20480, 20481, 20484, 20487, 20490, 20492, + 20494, 20496, 20499, 20503, 20504, 20507, 20508, 20509, 20510, 20514, + 20519, 20526, 20528, 20530, 20531, 20533, 20544, 20545, 20546, 20549, + 20550, 20554, 20556, 20558, 20561, 20562, 20563, 20567, 20569, 20575, + 20576, 20578, 20579, 20582, 20583, 20586, 20589, 20592, 20593, 20539, + 20609, 20611, 20612, 20614, 20618, 20622, 20623, 20624, 20626, 20627, + 20628, 20630, 20635, 20636, 20638, 20639, 20640, 20641, 20642, 20650, + 20655, 20656, 20665, 20666, 20669, 20672, 20675, 20676, 20679, 20684, + 20686, 20688, 20691, 20692, 20696, 20700, 20701, 20703, 20706, 20708, + 20710, 20712, 20713, 20719, 20721, 20726, 20730, 20734, 20739, 20742, + 20743, 20744, 20747, 20748, 20749, 20750, 20722, 20752, 20759, 20761, + 20763, 20764, 20765, 20766, 20771, 20775, 20776, 20780, 20781, 20783, + 20785, 20787, 20788, 20789, 20792, 20793, 20802, 20810, 20815, 20819, + 20821, 20823, 20824, 20831, 20836, 20838, 20862, 20867, 20868, 20875, + 20878, 20888, 20893, 20897, 20899, 20909, 20920, 20922, 20924, 20926, + 20927, 20930, 20936, 20943, 20945, 20946, 20947, 20949, 20952, 20958, + 20962, 20965, 20974, 20978, 20979, 20980, 20983, 20993, 20994, 20997, + 21010, 21011, 21013, 21014, 21016, 21026, 21032, 21041, 21042, 21045, + 21052, 21061, 21065, 21077, 21079, 21080, 21082, 21084, 21087, 21088, + 21089, 21094, 21102, 21111, 21112, 21113, 21120, 21122, 21125, 21130, + 21132, 21139, 21141, 21142, 21143, 21144, 21146, 21148, 21156, 21157, + 21158, 21159, 21167, 21168, 21174, 21175, 21176, 21178, 21179, 21181, + 21184, 21188, 21190, 21192, 21196, 21199, 21201, 21204, 21206, 21211, + 21212, 21217, 21221, 21224, 21225, 21226, 21228, 21232, 21233, 21236, + 21238, 21239, 21248, 21251, 21258, 21259, 21260, 21265, 21267, 21272, + 21275, 21276, 21278, 21279, 21285, 21287, 21288, 21289, 21291, 21292, + 21293, 21296, 21298, 21301, 21308, 21309, 21310, 21314, 21324, 21323, + 21337, 21339, 21345, 21347, 21349, 21356, 21357, 21362, 21369, 21374, + 21379, 21383, 21384, 21390, 21395, 21396, 21401, 21405, 21409, 21412, + 21418, 21419, 21423, 21426, 21428, 21429, 21431, 21432, 21434, 21437, + 21440, 21445, 21455, 21458, 21459, 21461, 21466, 21469, 21470, 21472, + 21478, 21479, 21493, 21506, 21523, 21530, 21537, 21543, 21544, 21546, + 21551, 21553, 21556, 21557, 21571, 21572, 21575, 21581, 21583, 21598, + 21602, 21604, 21606, 21607, 21609, 21611, 21613, 21614, 21620, 21631, + 21633, 21635, 21637, 21640, 21641, 21645, 21649, 21653, 21654, 21660, + 21663, 21665, 21670, 21671, 21673, 21674, 21677, 21678, 21681, 21687, + 21689, 21690, 21691, 21695, 21702, 21706, 21709, 21710, 21728, 21738, + 21740, 21743, 21750, 21756, 21758, 21759, 21760, 21761, 21765, 21768, + 21769, 21772, 21773, 21774, 21781, 21802, 21803, 21810, 21813, 21814, + 21819, 21820, 21821, 21825, 21831, 21833, 21834, 21837, 21840, 21841, + 21848, 21850, 21851, 21854, 21856, 21857, 21860, 21862, 21887, 21889, + 21890, 21894, 21896, 21902, 21903, 21905, 21906, 21907, 21908, 21911, + 21923, 21924, 21933, 21938, 21951, 21953, 21955, 21958, 21961, 21963, + 21964, 21966, 21969, 21970, 21971, 21975, 21976, 21979, 21982, 21986, + 21993, 22006, 22015, 22021, 22024, 22026, 22029, 22030, 22031, 22032, + 22033, 22034, 22041, 22060, 22064, 22067, 22069, 22071, 22073, 22075, + 22076, 22077, 22079, 22080, 22081, 22083, 22084, 22086, 22089, 22091, + 22093, 22095, 22100, 22110, 22112, 22113, 22114, 22115, 22118, 22121, + 22125, 22127, 22129, 22130, 22133, 22148, 22149, 22152, 22155, 22156, + 22165, 22169, 22170, 22173, 22174, 22175, 22182, 22183, 22184, 22185, + 22187, 22188, 22189, 22193, 22195, 22199, 22206, 22213, 22217, 22218, + 22219, 22223, 22224, 22220, 22221, 22233, 22236, 22237, 22239, 22241, + 22244, 22245, 22246, 22247, 22248, 22257, 22251, 22253, 22262, 22263, + 22273, 22274, 22279, 22282, 22284, 22289, 22293, 22298, 22299, 22301, + 22304, 22306, 22307, 22308, 22309, 22313, 22314, 22316, 22318, 22319, + 22323, 22324, 22333, 22334, 22335, 22341, 22342, 22348, 22349, 22354, + 22370, 22373, 22375, 22376, 22379, 22381, 22382, 22383, 22384, 22385, + 22387, 22388, 22389, 22391, 22393, 22394, 22395, 22396, 22398, 22401, + 22403, 22412, 22420, 22423, 22425, 22426, 22428, 22429, 22430, 22431, + 22433, 22421, 22439, 22440, 22441, 22444, 22456, 22461, 22471, 22472, + 22476, 22479, 22485, 22493, 22494, 22500, 22502, 22503, 22505, 22509, + 22512, 22517, 22518, 22520, 22525, 22526, 22527, 22531, 22532, 22536, + 22537, 22497, 22540, 22541, 22555, 22558, 22559, 22560, 22566, 22567, + 22573, 22578, 22585, 22591, 22601, 22604, 22605, 22607, 22608, 22613, + 22623, 22625, 22628, 22631, 22632, 22648, 22652, 22655, 22656, 22657, + 22663, 22664, 22665, 22666, 22668, 22669, 22671, 22672, 22676, 22678, + 22685, 22688, 22689, 22690, 22694, 22697, 22705, 22706, 22724, 22716, + 22722, 22728, 22733, 22734, 22736, 22738, 22740, 22742, 22746, 22749, + 22753, 22754, 22761, 22771, 22789, 22790, 22795, 22796, 22802, 22803, + 22804, 34369, 22813, 22817, 22819, 22820, 22824, 22831, 22832, 22835, + 22837, 22838, 22847, 22851, 22854, 22866, 22867, 22873, 22875, 22877, + 22878, 22879, 22881, 22883, 22891, 22893, 22895, 22898, 22901, 22902, + 22905, 22907, 22908, 22923, 22924, 22926, 22930, 22933, 22935, 22943, + 22948, 22951, 22957, 22958, 22959, 22960, 22963, 22967, 22970, 22972, + 22977, 22979, 22980, 22984, 22986, 22989, 22994, 23005, 23006, 23007, + 23011, 23012, 23015, 23022, 23023, 23025, 23026, 23028, 23031, 23040, + 23044, 23052, 23053, 23054, 23058, 23059, 23070, 23075, 23076, 23079, + 23080, 23082, 23085, 23088, 23108, 23109, 23111, 23112, 23116, 23120, + 23125, 23134, 23139, 23141, 23143, 23149, 23159, 23162, 23163, 23166, + 23179, 23184, 23187, 23190, 23193, 23196, 23198, 23199, 23200, 23202, + 23207, 23212, 23217, 23218, 23219, 23221, 23224, 23226, 23227, 23231, + 23236, 23238, 23240, 23247, 23258, 23260, 23264, 23269, 23274, 23278, + 23285, 23286, 23293, 23296, 23297, 23304, 23319, 23348, 23321, 23323, + 23325, 23329, 23333, 23341, 23352, 23361, 23371, 23372, 23378, 23382, + 23390, 23400, 23406, 23407, 23420, 23421, 23422, 23423, 23425, 23428, + 23430, 23434, 23438, 23440, 23441, 23443, 23444, 23446, 23464, 23465, + 23468, 23469, 23471, 23473, 23474, 23479, 23482, 23484, 23488, 23489, + 23501, 23503, 23510, 23511, 23512, 23513, 23514, 23520, 23535, 23537, + 23540, 23549, 23564, 23575, 23582, 23583, 23587, 23590, 23593, 23595, + 23596, 23598, 23600, 23602, 23605, 23606, 23641, 23642, 23644, 23650, + 23651, 23655, 23656, 23657, 23661, 23664, 23668, 23669, 23674, 23675, + 23676, 23677, 23687, 23688, 23690, 23695, 23698, 23709, 23711, 23712, + 23714, 23715, 23718, 23722, 23730, 23732, 23733, 23738, 23753, 23755, + 23762, 23773, 23767, 23790, 23793, 23794, 23796, 23809, 23814, 23821, + 23826, 23851, 23843, 23844, 23846, 23847, 23857, 23860, 23865, 23869, + 23871, 23874, 23875, 23878, 23880, 23893, 23889, 23897, 23882, 23903, + 23904, 23905, 23906, 23908, 23914, 23917, 23920, 23929, 23930, 23934, + 23935, 23937, 23939, 23944, 23946, 23954, 23955, 23956, 23957, 23961, + 23963, 23967, 23968, 23975, 23979, 23984, 23988, 23992, 23993, 24003, + 24007, 24011, 24016, 24014, 24024, 24025, 24032, 24036, 24041, 24056, + 24057, 24064, 24071, 24077, 24082, 24084, 24085, 24088, 24095, 24096, + 24110, 24104, 24114, 24117, 24126, 24139, 24144, 24137, 24145, 24150, + 24152, 24155, 24156, 24158, 24168, 24170, 24171, 24172, 24173, 24174, + 24176, 24192, 24203, 24206, 24226, 24228, 24229, 24232, 24234, 24236, + 24241, 24243, 24253, 24254, 24255, 24262, 24268, 24267, 24270, 24273, + 24274, 24276, 24277, 24284, 24286, 24293, 24299, 24322, 24326, 24327, + 24328, 24334, 24345, 24348, 24349, 24353, 24354, 24355, 24356, 24360, + 24363, 24364, 24366, 24368, 24372, 24374, 24379, 24381, 24383, 24384, + 24388, 24389, 24391, 24397, 24400, 24404, 24408, 24411, 24416, 24419, + 24420, 24423, 24431, 24434, 24436, 24437, 24440, 24442, 24445, 24446, + 24457, 24461, 24463, 24470, 24476, 24477, 24482, 24487, 24491, 24484, + 24492, 24495, 24496, 24497, 24504, 24516, 24519, 24520, 24521, 24523, + 24528, 24529, 24530, 24531, 24532, 24542, 24545, 24546, 24552, 24553, + 24554, 24556, 24557, 24558, 24559, 24562, 24563, 24566, 24570, 24572, + 24583, 24586, 24589, 24595, 24596, 24599, 24600, 24602, 24607, 24612, + 24621, 24627, 24629, 24640, 24647, 24648, 24649, 24652, 24657, 24660, + 24662, 24663, 24669, 24673, 24679, 24689, 24702, 24703, 24706, 24710, + 24712, 24714, 24718, 24721, 24723, 24725, 24728, 24733, 24734, 24738, + 24740, 24741, 24744, 24752, 24753, 24759, 24763, 24766, 24770, 24772, + 24776, 24777, 24778, 24779, 24782, 24783, 24788, 24789, 24793, 24795, + 24797, 24798, 24802, 24805, 24818, 24821, 24824, 24828, 24829, 24834, + 24839, 24842, 24844, 24848, 24849, 24850, 24851, 24852, 24854, 24855, + 24857, 24860, 24862, 24866, 24874, 24875, 24880, 24881, 24885, 24886, + 24887, 24889, 24897, 24901, 24902, 24905, 24926, 24928, 24940, 24946, + 24952, 24955, 24956, 24959, 24960, 24961, 24963, 24964, 24971, 24973, + 24978, 24979, 24983, 24984, 24988, 24989, 24991, 24992, 24997, 25000, + 25002, 25005, 25016, 25017, 25020, 25024, 25025, 25026, 25038, 25039, + 25045, 25052, 25053, 25054, 25055, 25057, 25058, 25063, 25065, 25061, + 25068, 25069, 25071, 25089, 25091, 25092, 25095, 25107, 25109, 25116, + 25120, 25122, 25123, 25127, 25129, 25131, 25145, 25149, 25154, 25155, + 25156, 25158, 25164, 25168, 25169, 25170, 25172, 25174, 25178, 25180, + 25188, 25197, 25199, 25203, 25210, 25213, 25229, 25230, 25231, 25232, + 25254, 25256, 25267, 25270, 25271, 25274, 25278, 25279, 25284, 25294, + 25301, 25302, 25306, 25322, 25330, 25332, 25340, 25341, 25347, 25348, + 25354, 25355, 25357, 25360, 25363, 25366, 25368, 25385, 25386, 25389, + 25397, 25398, 25401, 25404, 25409, 25410, 25411, 25412, 25414, 25418, + 25419, 25422, 25426, 25427, 25428, 25432, 25435, 25445, 25446, 25452, + 25453, 25457, 25460, 25461, 25464, 25468, 25469, 25471, 25474, 25476, + 25479, 25482, 25488, 25492, 25493, 25497, 25498, 25502, 25508, 25510, + 25517, 25518, 25519, 25533, 25537, 25541, 25544, 25550, 25553, 25555, + 25556, 25557, 25564, 25568, 25573, 25578, 25580, 25586, 25587, 25589, + 25592, 25593, 25609, 25610, 25616, 25618, 25620, 25624, 25630, 25632, + 25634, 25636, 25637, 25641, 25642, 25647, 25648, 25653, 25661, 25663, + 25675, 25679, 25681, 25682, 25683, 25684, 25690, 25691, 25692, 25693, + 25695, 25696, 25697, 25699, 25709, 25715, 25716, 25723, 25725, 25733, + 25735, 25743, 25744, 25745, 25752, 25753, 25755, 25757, 25759, 25761, + 25763, 25766, 25768, 25772, 25779, 25789, 25790, 25791, 25796, 25801, + 25802, 25803, 25804, 25806, 25808, 25809, 25813, 25815, 25828, 25829, + 25833, 25834, 25837, 25840, 25845, 25847, 25851, 25855, 25857, 25860, + 25864, 25865, 25866, 25871, 25875, 25876, 25878, 25881, 25883, 25886, + 25887, 25890, 25894, 25897, 25902, 25905, 25914, 25916, 25917, 25923, + 25927, 25929, 25936, 25938, 25940, 25951, 25952, 25959, 25963, 25978, + 25981, 25985, 25989, 25994, 26002, 26005, 26008, 26013, 26016, 26019, + 26022, 26030, 26034, 26035, 26036, 26047, 26050, 26056, 26057, 26062, + 26064, 26068, 26070, 26072, 26079, 26096, 26098, 26100, 26101, 26105, + 26110, 26111, 26112, 26116, 26120, 26121, 26125, 26129, 26130, 26133, + 26134, 26141, 26142, 26145, 26146, 26147, 26148, 26150, 26153, 26154, + 26155, 26156, 26158, 26160, 26161, 26163, 26169, 26167, 26176, 26181, + 26182, 26186, 26188, 26193, 26190, 26199, 26200, 26201, 26203, 26204, + 26208, 26209, 26363, 26218, 26219, 26220, 26238, 26227, 26229, 26239, + 26231, 26232, 26233, 26235, 26240, 26236, 26251, 26252, 26253, 26256, + 26258, 26265, 26266, 26267, 26268, 26271, 26272, 26276, 26285, 26289, + 26290, 26293, 26299, 26303, 26304, 26306, 26307, 26312, 26316, 26318, + 26319, 26324, 26331, 26335, 26344, 26347, 26348, 26350, 26362, 26373, + 26375, 26382, 26387, 26393, 26396, 26400, 26402, 26419, 26430, 26437, + 26439, 26440, 26444, 26452, 26453, 26461, 26470, 26476, 26478, 26484, + 26486, 26491, 26497, 26500, 26510, 26511, 26513, 26515, 26518, 26520, + 26521, 26523, 26544, 26545, 26546, 26549, 26555, 26556, 26557, 26617, + 26560, 26562, 26563, 26565, 26568, 26569, 26578, 26583, 26585, 26588, + 26593, 26598, 26608, 26610, 26614, 26615, 26706, 26644, 26649, 26653, + 26655, 26664, 26663, 26668, 26669, 26671, 26672, 26673, 26675, 26683, + 26687, 26692, 26693, 26698, 26700, 26709, 26711, 26712, 26715, 26731, + 26734, 26735, 26736, 26737, 26738, 26741, 26745, 26746, 26747, 26748, + 26754, 26756, 26758, 26760, 26774, 26776, 26778, 26780, 26785, 26787, + 26789, 26793, 26794, 26798, 26802, 26811, 26821, 26824, 26828, 26831, + 26832, 26833, 26835, 26838, 26841, 26844, 26845, 26853, 26856, 26858, + 26859, 26860, 26861, 26864, 26865, 26869, 26870, 26875, 26876, 26877, + 26886, 26889, 26890, 26896, 26897, 26899, 26902, 26903, 26929, 26931, + 26933, 26936, 26939, 26946, 26949, 26953, 26958, 26967, 26971, 26979, + 26980, 26981, 26982, 26984, 26985, 26988, 26992, 26993, 26994, 27002, + 27003, 27007, 27008, 27021, 27026, 27030, 27032, 27041, 27045, 27046, + 27048, 27051, 27053, 27055, 27063, 27064, 27066, 27068, 27077, 27080, + 27089, 27094, 27095, 27106, 27109, 27118, 27119, 27121, 27123, 27125, + 27134, 27136, 27137, 27139, 27151, 27153, 27157, 27162, 27165, 27168, + 27172, 27176, 27184, 27186, 27188, 27191, 27195, 27198, 27199, 27205, + 27206, 27209, 27210, 27214, 27216, 27217, 27218, 27221, 27222, 27227, + 27236, 27239, 27242, 27249, 27251, 27262, 27265, 27267, 27270, 27271, + 27273, 27275, 27281, 27291, 27293, 27294, 27295, 27301, 27307, 27311, + 27312, 27313, 27316, 27325, 27326, 27327, 27334, 27337, 27336, 27340, + 27344, 27348, 27349, 27350, 27356, 27357, 27364, 27367, 27372, 27376, + 27377, 27378, 27388, 27389, 27394, 27395, 27398, 27399, 27401, 27407, + 27408, 27409, 27415, 27419, 27422, 27428, 27432, 27435, 27436, 27439, + 27445, 27446, 27451, 27455, 27462, 27466, 27469, 27474, 27478, 27480, + 27485, 27488, 27495, 27499, 27502, 27504, 27509, 27517, 27518, 27522, + 27525, 27543, 27547, 27551, 27552, 27554, 27555, 27560, 27561, 27564, + 27565, 27566, 27568, 27576, 27577, 27581, 27582, 27587, 27588, 27593, + 27596, 27606, 27610, 27617, 27619, 27622, 27623, 27630, 27633, 27639, + 27641, 27647, 27650, 27652, 27653, 27657, 27661, 27662, 27664, 27666, + 27673, 27679, 27686, 27687, 27688, 27692, 27694, 27699, 27701, 27702, + 27706, 27707, 27711, 27722, 27723, 27725, 27727, 27730, 27732, 27737, + 27739, 27740, 27755, 27757, 27759, 27764, 27766, 27768, 27769, 27771, + 27781, 27782, 27783, 27785, 27796, 27797, 27799, 27800, 27804, 27807, + 27824, 27826, 27828, 27842, 27846, 27853, 27855, 27856, 27857, 27858, + 27860, 27862, 27866, 27868, 27872, 27879, 27881, 27883, 27884, 27886, + 27890, 27892, 27908, 27911, 27914, 27918, 27919, 27921, 27923, 27930, + 27942, 27943, 27944, 27751, 27950, 27951, 27953, 27961, 27964, 27967, + 27991, 27998, 27999, 28001, 28005, 28007, 28015, 28016, 28028, 28034, + 28039, 28049, 28050, 28052, 28054, 28055, 28056, 28074, 28076, 28084, + 28087, 28089, 28093, 28095, 28100, 28104, 28106, 28110, 28111, 28118, + 28123, 28125, 28127, 28128, 28130, 28133, 28137, 28143, 28144, 28148, + 28150, 28156, 28160, 28164, 28190, 28194, 28199, 28210, 28214, 28217, + 28219, 28220, 28228, 28229, 28232, 28233, 28235, 28239, 28241, 28242, + 28243, 28244, 28247, 28252, 28253, 28254, 28258, 28259, 28264, 28275, + 28283, 28285, 28301, 28307, 28313, 28320, 28327, 28333, 28334, 28337, + 28339, 28347, 28351, 28352, 28353, 28355, 28359, 28360, 28362, 28365, + 28366, 28367, 28395, 28397, 28398, 28409, 28411, 28413, 28420, 28424, + 28426, 28428, 28429, 28438, 28440, 28442, 28443, 28454, 28457, 28458, + 28463, 28464, 28467, 28470, 28475, 28476, 28461, 28495, 28497, 28498, + 28499, 28503, 28505, 28506, 28509, 28510, 28513, 28514, 28520, 28524, + 28541, 28542, 28547, 28551, 28552, 28555, 28556, 28557, 28560, 28562, + 28563, 28564, 28566, 28570, 28575, 28576, 28581, 28582, 28583, 28584, + 28590, 28591, 28592, 28597, 28598, 28604, 28613, 28615, 28616, 28618, + 28634, 28638, 28648, 28649, 28656, 28661, 28665, 28668, 28669, 28672, + 28677, 28678, 28679, 28685, 28695, 28704, 28707, 28719, 28724, 28727, + 28729, 28732, 28739, 28740, 28744, 28745, 28746, 28747, 28756, 28757, + 28765, 28766, 28750, 28772, 28773, 28780, 28782, 28789, 28790, 28798, + 28801, 28805, 28806, 28820, 28821, 28822, 28823, 28824, 28827, 28836, + 28843, 28848, 28849, 28852, 28855, 28874, 28881, 28883, 28884, 28885, + 28886, 28888, 28892, 28900, 28922, 28931, 28932, 28933, 28934, 28935, + 28939, 28940, 28943, 28958, 28960, 28971, 28973, 28975, 28976, 28977, + 28984, 28993, 28997, 28998, 28999, 29002, 29003, 29008, 29010, 29015, + 29018, 29020, 29022, 29024, 29032, 29049, 29056, 29061, 29063, 29068, + 29074, 29082, 29083, 29088, 29090, 29103, 29104, 29106, 29107, 29114, + 29119, 29120, 29121, 29124, 29131, 29132, 29139, 29142, 29145, 29146, + 29148, 29176, 29182, 29184, 29191, 29192, 29193, 29203, 29207, 29210, + 29213, 29215, 29220, 29227, 29231, 29236, 29240, 29241, 29249, 29250, + 29251, 29253, 29262, 29263, 29264, 29267, 29269, 29270, 29274, 29276, + 29278, 29280, 29283, 29288, 29291, 29294, 29295, 29297, 29303, 29304, + 29307, 29308, 29311, 29316, 29321, 29325, 29326, 29331, 29339, 29352, + 29357, 29358, 29361, 29364, 29374, 29377, 29383, 29385, 29388, 29397, + 29398, 29400, 29407, 29413, 29427, 29428, 29434, 29435, 29438, 29442, + 29444, 29445, 29447, 29451, 29453, 29458, 29459, 29464, 29465, 29470, + 29474, 29476, 29479, 29480, 29484, 29489, 29490, 29493, 29498, 29499, + 29501, 29507, 29517, 29520, 29522, 29526, 29528, 29533, 29534, 29535, + 29536, 29542, 29543, 29545, 29547, 29548, 29550, 29551, 29553, 29559, + 29561, 29564, 29568, 29569, 29571, 29573, 29574, 29582, 29584, 29587, + 29589, 29591, 29592, 29596, 29598, 29599, 29600, 29602, 29605, 29606, + 29610, 29611, 29613, 29621, 29623, 29625, 29628, 29629, 29631, 29637, + 29638, 29641, 29643, 29644, 29647, 29650, 29651, 29654, 29657, 29661, + 29665, 29667, 29670, 29671, 29673, 29684, 29685, 29687, 29689, 29690, + 29691, 29693, 29695, 29696, 29697, 29700, 29703, 29706, 29713, 29722, + 29723, 29732, 29734, 29736, 29737, 29738, 29739, 29740, 29741, 29742, + 29743, 29744, 29745, 29753, 29760, 29763, 29764, 29766, 29767, 29771, + 29773, 29777, 29778, 29783, 29789, 29794, 29798, 29799, 29800, 29803, + 29805, 29806, 29809, 29810, 29824, 29825, 29829, 29830, 29831, 29833, + 29839, 29840, 29841, 29842, 29848, 29849, 29850, 29852, 29855, 29856, + 29857, 29859, 29862, 29864, 29865, 29866, 29867, 29870, 29871, 29873, + 29874, 29877, 29881, 29883, 29887, 29896, 29897, 29900, 29904, 29907, + 29912, 29914, 29915, 29918, 29919, 29924, 29928, 29930, 29931, 29935, + 29940, 29946, 29947, 29948, 29951, 29958, 29970, 29974, 29975, 29984, + 29985, 29988, 29991, 29993, 29994, 29999, 30006, 30009, 30013, 30014, + 30015, 30016, 30019, 30023, 30024, 30030, 30032, 30034, 30039, 30046, + 30047, 30049, 30063, 30065, 30073, 30074, 30075, 30076, 30077, 30078, + 30081, 30085, 30096, 30098, 30099, 30101, 30105, 30108, 30114, 30116, + 30132, 30138, 30143, 30144, 30145, 30148, 30150, 30156, 30158, 30159, + 30167, 30172, 30175, 30176, 30177, 30180, 30183, 30188, 30190, 30191, + 30193, 30201, 30208, 30210, 30211, 30212, 30215, 30216, 30218, 30220, + 30223, 30226, 30227, 30229, 30230, 30233, 30235, 30236, 30237, 30238, + 30243, 30245, 30246, 30249, 30253, 30258, 30259, 30261, 30264, 30265, + 30266, 30268, 30282, 30272, 30273, 30275, 30276, 30277, 30281, 30283, + 30293, 30297, 30303, 30308, 30309, 30317, 30318, 30319, 30321, 30324, + 30337, 30341, 30348, 30349, 30357, 30363, 30364, 30365, 30367, 30368, + 30370, 30371, 30372, 30373, 30374, 30375, 30376, 30378, 30381, 30397, + 30401, 30405, 30409, 30411, 30412, 30414, 30420, 30425, 30432, 30438, + 30440, 30444, 30448, 30449, 30454, 30457, 30460, 30464, 30470, 30474, + 30478, 30482, 30484, 30485, 30487, 30489, 30490, 30492, 30498, 30504, + 30509, 30510, 30511, 30516, 30517, 30518, 30521, 30525, 30526, 30530, + 30533, 30534, 30538, 30541, 30542, 30543, 30546, 30550, 30551, 30556, + 30558, 30559, 30560, 30562, 30564, 30567, 30570, 30572, 30576, 30578, + 30579, 30580, 30586, 30589, 30592, 30596, 30604, 30605, 30612, 30613, + 30614, 30618, 30623, 30626, 30631, 30634, 30638, 30639, 30641, 30645, + 30654, 30659, 30665, 30673, 30674, 30677, 30681, 30686, 30687, 30688, + 30692, 30694, 30698, 30700, 30704, 30705, 30708, 30712, 30715, 30725, + 30726, 30729, 30733, 30734, 30737, 30749, 30753, 30754, 30755, 30765, + 30766, 30768, 30773, 30775, 30787, 30788, 30791, 30792, 30796, 30798, + 30802, 30812, 30814, 30816, 30817, 30819, 30820, 30824, 30826, 30830, + 30842, 30846, 30858, 30863, 30868, 30872, 30881, 30877, 30878, 30879, + 30884, 30888, 30892, 30893, 30896, 30897, 30898, 30899, 30907, 30909, + 30911, 30919, 30920, 30921, 30924, 30926, 30930, 30931, 30933, 30934, + 30948, 30939, 30943, 30944, 30945, 30950, 30954, 30962, 30963, 30976, + 30966, 30967, 30970, 30971, 30975, 30982, 30988, 30992, 31002, 31004, + 31006, 31007, 31008, 31013, 31015, 31017, 31021, 31025, 31028, 31029, + 31035, 31037, 31039, 31044, 31045, 31046, 31050, 31051, 31055, 31057, + 31060, 31064, 31067, 31068, 31079, 31081, 31083, 31090, 31097, 31099, + 31100, 31102, 31115, 31116, 31121, 31123, 31124, 31125, 31126, 31128, + 31131, 31132, 31137, 31144, 31145, 31147, 31151, 31153, 31156, 31160, + 31163, 31170, 31172, 31175, 31176, 31178, 31183, 31188, 31190, 31194, + 31197, 31198, 31200, 31202, 31205, 31210, 31211, 31213, 31217, 31224, + 31228, 31234, 31235, 31239, 31241, 31242, 31244, 31249, 31253, 31259, + 31262, 31265, 31271, 31275, 31277, 31279, 31280, 31284, 31285, 31288, + 31289, 31290, 31300, 31301, 31303, 31304, 31308, 31317, 31318, 31321, + 31324, 31325, 31327, 31328, 31333, 31335, 31338, 31341, 31349, 31352, + 31358, 31360, 31362, 31365, 31366, 31370, 31371, 31376, 31377, 31380, + 31390, 31392, 31395, 31404, 31411, 31413, 31417, 31419, 31420, 31430, + 31433, 31436, 31438, 31441, 31451, 31464, 31465, 31467, 31468, 31473, + 31476, 31483, 31485, 31486, 31495, 31508, 31519, 31523, 31527, 31529, + 31530, 31531, 31533, 31534, 31535, 31536, 31537, 31540, 31549, 31551, + 31552, 31553, 31559, 31566, 31573, 31584, 31588, 31590, 31593, 31594, + 31597, 31599, 31602, 31603, 31607, 31620, 31625, 31630, 31632, 31633, + 31638, 31643, 31646, 31648, 31653, 31660, 31663, 31664, 31666, 31669, + 31670, 31674, 31675, 31676, 31677, 31682, 31685, 31688, 31690, 31700, + 31702, 31703, 31705, 31706, 31707, 31720, 31722, 31730, 31732, 31733, + 31736, 31737, 31738, 31740, 31742, 31745, 31746, 31747, 31748, 31750, + 31753, 31755, 31756, 31758, 31759, 31769, 31771, 31776, 31781, 31782, + 31784, 31788, 31793, 31795, 31796, 31798, 31801, 31802, 31814, 31818, + 31829, 31825, 31826, 31827, 31833, 31834, 31835, 31836, 31837, 31838, + 31841, 31843, 31847, 31849, 31853, 31854, 31856, 31858, 31865, 31868, + 31869, 31878, 31879, 31887, 31892, 31902, 31904, 31910, 31920, 31926, + 31927, 31930, 31931, 31932, 31935, 31940, 31943, 31944, 31945, 31949, + 31951, 31955, 31956, 31957, 31959, 31961, 31962, 31965, 31974, 31977, + 31979, 31989, 32003, 32007, 32008, 32009, 32015, 32017, 32018, 32019, + 32022, 32029, 32030, 32035, 32038, 32042, 32045, 32049, 32060, 32061, + 32062, 32064, 32065, 32071, 32072, 32077, 32081, 32083, 32087, 32089, + 32090, 32092, 32093, 32101, 32103, 32106, 32112, 32120, 32122, 32123, + 32127, 32129, 32130, 32131, 32133, 32134, 32136, 32139, 32140, 32141, + 32145, 32150, 32151, 32157, 32158, 32166, 32167, 32170, 32179, 32182, + 32183, 32185, 32194, 32195, 32196, 32197, 32198, 32204, 32205, 32206, + 32215, 32217, 32256, 32226, 32229, 32230, 32234, 32235, 32237, 32241, + 32245, 32246, 32249, 32250, 32264, 32272, 32273, 32277, 32279, 32284, + 32285, 32288, 32295, 32296, 32300, 32301, 32303, 32307, 32310, 32319, + 32324, 32325, 32327, 32334, 32336, 32338, 32344, 32351, 32353, 32354, + 32357, 32363, 32366, 32367, 32371, 32376, 32382, 32385, 32390, 32391, + 32394, 32397, 32401, 32405, 32408, 32410, 32413, 32414, 32572, 32571, + 32573, 32574, 32575, 32579, 32580, 32583, 32591, 32594, 32595, 32603, + 32604, 32605, 32609, 32611, 32612, 32613, 32614, 32621, 32625, 32637, + 32638, 32639, 32640, 32651, 32653, 32655, 32656, 32657, 32662, 32663, + 32668, 32673, 32674, 32678, 32682, 32685, 32692, 32700, 32703, 32704, + 32707, 32712, 32718, 32719, 32731, 32735, 32739, 32741, 32744, 32748, + 32750, 32751, 32754, 32762, 32765, 32766, 32767, 32775, 32776, 32778, + 32781, 32782, 32783, 32785, 32787, 32788, 32790, 32797, 32798, 32799, + 32800, 32804, 32806, 32812, 32814, 32816, 32820, 32821, 32823, 32825, + 32826, 32828, 32830, 32832, 32836, 32864, 32868, 32870, 32877, 32881, + 32885, 32897, 32904, 32910, 32924, 32926, 32934, 32935, 32939, 32952, + 32953, 32968, 32973, 32975, 32978, 32980, 32981, 32983, 32984, 32992, + 33005, 33006, 33008, 33010, 33011, 33014, 33017, 33018, 33022, 33027, + 33035, 33046, 33047, 33048, 33052, 33054, 33056, 33060, 33063, 33068, + 33072, 33077, 33082, 33084, 33093, 33095, 33098, 33100, 33106, 33111, + 33120, 33121, 33127, 33128, 33129, 33133, 33135, 33143, 33153, 33168, + 33156, 33157, 33158, 33163, 33166, 33174, 33176, 33179, 33182, 33186, + 33198, 33202, 33204, 33211, 33227, 33219, 33221, 33226, 33230, 33231, + 33237, 33239, 33243, 33245, 33246, 33249, 33252, 33259, 33260, 33264, + 33265, 33266, 33269, 33270, 33272, 33273, 33277, 33279, 33280, 33283, + 33295, 33299, 33300, 33305, 33306, 33309, 33313, 33314, 33320, 33330, + 33332, 33338, 33347, 33348, 33349, 33350, 33355, 33358, 33359, 33361, + 33366, 33372, 33376, 33379, 33383, 33389, 33396, 33403, 33405, 33407, + 33408, 33409, 33411, 33412, 33415, 33417, 33418, 33422, 33425, 33428, + 33430, 33432, 33434, 33435, 33440, 33441, 33443, 33444, 33447, 33448, + 33449, 33450, 33454, 33456, 33458, 33460, 33463, 33466, 33468, 33470, + 33471, 33478, 33488, 33493, 33498, 33504, 33506, 33508, 33512, 33514, + 33517, 33519, 33526, 33527, 33533, 33534, 33536, 33537, 33543, 33544, + 33546, 33547, 33620, 33563, 33565, 33566, 33567, 33569, 33570, 33580, + 33581, 33582, 33584, 33587, 33591, 33594, 33596, 33597, 33602, 33603, + 33604, 33607, 33613, 33614, 33617, 33621, 33622, 33623, 33648, 33656, + 33661, 33663, 33664, 33666, 33668, 33670, 33677, 33682, 33684, 33685, + 33688, 33689, 33691, 33692, 33693, 33702, 33703, 33705, 33708, 33726, + 33727, 33728, 33735, 33737, 33743, 33744, 33745, 33748, 33757, 33619, + 33768, 33770, 33782, 33784, 33785, 33788, 33793, 33798, 33802, 33807, + 33809, 33813, 33817, 33709, 33839, 33849, 33861, 33863, 33864, 33866, + 33869, 33871, 33873, 33874, 33878, 33880, 33881, 33882, 33884, 33888, + 33892, 33893, 33895, 33898, 33904, 33907, 33908, 33910, 33912, 33916, + 33917, 33921, 33925, 33938, 33939, 33941, 33950, 33958, 33960, 33961, + 33962, 33967, 33969, 33972, 33978, 33981, 33982, 33984, 33986, 33991, + 33992, 33996, 33999, 34003, 34012, 34023, 34026, 34031, 34032, 34033, + 34034, 34039, 34098, 34042, 34043, 34045, 34050, 34051, 34055, 34060, + 34062, 34064, 34076, 34078, 34082, 34083, 34084, 34085, 34087, 34090, + 34091, 34095, 34099, 34100, 34102, 34111, 34118, 34127, 34128, 34129, + 34130, 34131, 34134, 34137, 34140, 34141, 34142, 34143, 34144, 34145, + 34146, 34148, 34155, 34159, 34169, 34170, 34171, 34173, 34175, 34177, + 34181, 34182, 34185, 34187, 34188, 34191, 34195, 34200, 34205, 34207, + 34208, 34210, 34213, 34215, 34228, 34230, 34231, 34232, 34236, 34237, + 34238, 34239, 34242, 34247, 34250, 34251, 34254, 34221, 34264, 34266, + 34271, 34272, 34278, 34280, 34285, 34291, 34294, 34300, 34303, 34304, + 34308, 34309, 34317, 34318, 34320, 34321, 34322, 34328, 34329, 34331, + 34334, 34337, 34343, 34345, 34358, 34360, 34362, 34364, 34365, 34368, + 34370, 34374, 34386, 34387, 34390, 34391, 34392, 34393, 34397, 34400, + 34401, 34402, 34403, 34404, 34409, 34412, 34415, 34421, 34422, 34423, + 34426, 34445, 34449, 34454, 34456, 34458, 34460, 34465, 34470, 34471, + 34472, 34477, 34481, 34483, 34484, 34485, 34487, 34488, 34489, 34495, + 34496, 34497, 34499, 34501, 34513, 34514, 34517, 34519, 34522, 34524, + 34528, 34531, 34533, 34535, 34440, 34554, 34556, 34557, 34564, 34565, + 34567, 34571, 34574, 34575, 34576, 34579, 34580, 34585, 34590, 34591, + 34593, 34595, 34600, 34606, 34607, 34609, 34610, 34617, 34618, 34620, + 34621, 34622, 34624, 34627, 34629, 34637, 34648, 34653, 34657, 34660, + 34661, 34671, 34673, 34674, 34683, 34691, 34692, 34693, 34694, 34695, + 34696, 34697, 34699, 34700, 34704, 34707, 34709, 34711, 34712, 34713, + 34718, 34720, 34723, 34727, 34732, 34733, 34734, 34737, 34741, 34750, + 34751, 34753, 34760, 34761, 34762, 34766, 34773, 34774, 34777, 34778, + 34780, 34783, 34786, 34787, 34788, 34794, 34795, 34797, 34801, 34803, + 34808, 34810, 34815, 34817, 34819, 34822, 34825, 34826, 34827, 34832, + 34841, 34834, 34835, 34836, 34840, 34842, 34843, 34844, 34846, 34847, + 34856, 34861, 34862, 34864, 34866, 34869, 34874, 34876, 34881, 34883, + 34885, 34888, 34889, 34890, 34891, 34894, 34897, 34901, 34902, 34904, + 34906, 34908, 34911, 34912, 34916, 34921, 34929, 34937, 34939, 34944, + 34968, 34970, 34971, 34972, 34975, 34976, 34984, 34986, 35002, 35005, + 35006, 35008, 35018, 35019, 35020, 35021, 35022, 35025, 35026, 35027, + 35035, 35038, 35047, 35055, 35056, 35057, 35061, 35063, 35073, 35078, + 35085, 35086, 35087, 35093, 35094, 35096, 35097, 35098, 35100, 35104, + 35110, 35111, 35112, 35120, 35121, 35122, 35125, 35129, 35130, 35134, + 35136, 35138, 35141, 35142, 35145, 35151, 35154, 35159, 35162, 35163, + 35164, 35169, 35170, 35171, 35179, 35182, 35184, 35187, 35189, 35194, + 35195, 35196, 35197, 35209, 35213, 35216, 35220, 35221, 35227, 35228, + 35231, 35232, 35237, 35248, 35252, 35253, 35254, 35255, 35260, 35284, + 35285, 35286, 35287, 35288, 35301, 35305, 35307, 35309, 35313, 35315, + 35318, 35321, 35325, 35327, 35332, 35333, 35335, 35343, 35345, 35346, + 35348, 35349, 35358, 35360, 35362, 35364, 35366, 35371, 35372, 35375, + 35381, 35383, 35389, 35390, 35392, 35395, 35397, 35399, 35401, 35405, + 35406, 35411, 35414, 35415, 35416, 35420, 35421, 35425, 35429, 35431, + 35445, 35446, 35447, 35449, 35450, 35451, 35454, 35455, 35456, 35459, + 35462, 35467, 35471, 35472, 35474, 35478, 35479, 35481, 35487, 35495, + 35497, 35502, 35503, 35507, 35510, 35511, 35515, 35518, 35523, 35526, + 35528, 35529, 35530, 35537, 35539, 35540, 35541, 35543, 35549, 35551, + 35564, 35568, 35572, 35573, 35574, 35580, 35583, 35589, 35590, 35595, + 35601, 35612, 35614, 35615, 35594, 35629, 35632, 35639, 35644, 35650, + 35651, 35652, 35653, 35654, 35656, 35666, 35667, 35668, 35673, 35661, + 35678, 35683, 35693, 35702, 35704, 35705, 35708, 35710, 35713, 35716, + 35717, 35723, 35725, 35727, 35732, 35733, 35740, 35742, 35743, 35896, + 35897, 35901, 35902, 35909, 35911, 35913, 35915, 35919, 35921, 35923, + 35924, 35927, 35928, 35931, 35933, 35929, 35939, 35940, 35942, 35944, + 35945, 35949, 35955, 35957, 35958, 35963, 35966, 35974, 35975, 35979, + 35984, 35986, 35987, 35993, 35995, 35996, 36004, 36025, 36026, 36037, + 36038, 36041, 36043, 36047, 36054, 36053, 36057, 36061, 36065, 36072, + 36076, 36079, 36080, 36082, 36085, 36087, 36088, 36094, 36095, 36097, + 36099, 36105, 36114, 36119, 36123, 36197, 36201, 36204, 36206, 36223, + 36226, 36228, 36232, 36237, 36240, 36241, 36245, 36254, 36255, 36256, + 36262, 36267, 36268, 36271, 36274, 36277, 36279, 36281, 36283, 36288, + 36293, 36294, 36295, 36296, 36298, 36302, 36305, 36308, 36309, 36311, + 36313, 36324, 36325, 36327, 36332, 36336, 36284, 36337, 36338, 36340, + 36349, 36353, 36356, 36357, 36358, 36363, 36369, 36372, 36374, 36384, + 36385, 36386, 36387, 36390, 36391, 36401, 36403, 36406, 36407, 36408, + 36409, 36413, 36416, 36417, 36427, 36429, 36430, 36431, 36436, 36443, + 36444, 36445, 36446, 36449, 36450, 36457, 36460, 36461, 36463, 36464, + 36465, 36473, 36474, 36475, 36482, 36483, 36489, 36496, 36498, 36501, + 36506, 36507, 36509, 36510, 36514, 36519, 36521, 36525, 36526, 36531, + 36533, 36538, 36539, 36544, 36545, 36547, 36548, 36551, 36559, 36561, + 36564, 36572, 36584, 36590, 36592, 36593, 36599, 36601, 36602, 36589, + 36608, 36610, 36615, 36616, 36623, 36624, 36630, 36631, 36632, 36638, + 36640, 36641, 36643, 36645, 36647, 36648, 36652, 36653, 36654, 36660, + 36661, 36662, 36663, 36666, 36672, 36673, 36675, 36679, 36687, 36689, + 36690, 36691, 36692, 36693, 36696, 36701, 36702, 36709, 36765, 36768, + 36769, 36772, 36773, 36774, 36789, 36790, 36792, 36798, 36800, 36801, + 36806, 36810, 36811, 36813, 36816, 36818, 36819, 36821, 36832, 36835, + 36836, 36840, 36846, 36849, 36853, 36854, 36859, 36862, 36866, 36868, + 36872, 36876, 36888, 36891, 36904, 36905, 36911, 36906, 36908, 36909, + 36915, 36916, 36919, 36927, 36931, 36932, 36940, 36955, 36957, 36962, + 36966, 36967, 36972, 36976, 36980, 36985, 36997, 37000, 37003, 37004, + 37006, 37008, 37013, 37015, 37016, 37017, 37019, 37024, 37025, 37026, + 37029, 37040, 37042, 37043, 37044, 37046, 37053, 37068, 37054, 37059, + 37060, 37061, 37063, 37064, 37077, 37079, 37080, 37081, 37084, 37085, + 37087, 37093, 37074, 37110, 37099, 37103, 37104, 37108, 37118, 37119, + 37120, 37124, 37125, 37126, 37128, 37133, 37136, 37140, 37142, 37143, + 37144, 37146, 37148, 37150, 37152, 37157, 37154, 37155, 37159, 37161, + 37166, 37167, 37169, 37172, 37174, 37175, 37177, 37178, 37180, 37181, + 37187, 37191, 37192, 37199, 37203, 37207, 37209, 37210, 37211, 37217, + 37220, 37223, 37229, 37236, 37241, 37242, 37243, 37249, 37251, 37253, + 37254, 37258, 37262, 37265, 37267, 37268, 37269, 37272, 37278, 37281, + 37286, 37288, 37292, 37293, 37294, 37296, 37297, 37298, 37299, 37302, + 37307, 37308, 37309, 37311, 37314, 37315, 37317, 37331, 37332, 37335, + 37337, 37338, 37342, 37348, 37349, 37353, 37354, 37356, 37357, 37358, + 37359, 37360, 37361, 37367, 37369, 37371, 37373, 37376, 37377, 37380, + 37381, 37382, 37383, 37385, 37386, 37388, 37392, 37394, 37395, 37398, + 37400, 37404, 37405, 37411, 37412, 37413, 37414, 37416, 37422, 37423, + 37424, 37427, 37429, 37430, 37432, 37433, 37434, 37436, 37438, 37440, + 37442, 37443, 37446, 37447, 37450, 37453, 37454, 37455, 37457, 37464, + 37465, 37468, 37469, 37472, 37473, 37477, 37479, 37480, 37481, 37486, + 37487, 37488, 37493, 37494, 37495, 37496, 37497, 37499, 37500, 37501, + 37503, 37512, 37513, 37514, 37517, 37518, 37522, 37527, 37529, 37535, + 37536, 37540, 37541, 37543, 37544, 37547, 37551, 37554, 37558, 37560, + 37562, 37563, 37564, 37565, 37567, 37568, 37569, 37570, 37571, 37573, + 37574, 37575, 37576, 37579, 37580, 37581, 37582, 37584, 37587, 37589, + 37591, 37592, 37593, 37596, 37597, 37599, 37600, 37601, 37603, 37605, + 37607, 37608, 37612, 37614, 37616, 37625, 37627, 37631, 37632, 37634, + 37640, 37645, 37649, 37652, 37653, 37660, 37661, 37662, 37663, 37665, + 37668, 37669, 37671, 37673, 37674, 37683, 37684, 37686, 37687, 37703, + 37704, 37705, 37712, 37713, 37714, 37717, 37719, 37720, 37722, 37726, + 37732, 37733, 37735, 37737, 37738, 37741, 37743, 37744, 37745, 37747, + 37748, 37750, 37754, 37757, 37759, 37760, 37761, 37762, 37768, 37770, + 37771, 37773, 37775, 37778, 37781, 37784, 37787, 37790, 37793, 37795, + 37796, 37798, 37800, 37803, 37812, 37813, 37814, 37818, 37801, 37825, + 37828, 37829, 37830, 37831, 37833, 37834, 37835, 37836, 37837, 37843, + 37849, 37852, 37854, 37855, 37858, 37862, 37863, 37881, 37879, 37880, + 37882, 37883, 37885, 37889, 37890, 37892, 37896, 37897, 37901, 37902, + 37903, 37909, 37910, 37911, 37919, 37934, 37935, 37937, 37938, 37939, + 37940, 37947, 37951, 37949, 37955, 37957, 37960, 37962, 37964, 37973, + 37977, 37980, 37983, 37985, 37987, 37992, 37995, 37997, 37998, 37999, + 38001, 38002, 38020, 38019, 38264, 38265, 38270, 38276, 38280, 38284, + 38285, 38286, 38301, 38302, 38303, 38305, 38310, 38313, 38315, 38316, + 38324, 38326, 38330, 38333, 38335, 38342, 38344, 38345, 38347, 38352, + 38353, 38354, 38355, 38361, 38362, 38365, 38366, 38367, 38368, 38372, + 38374, 38429, 38430, 38434, 38436, 38437, 38438, 38444, 38449, 38451, + 38455, 38456, 38457, 38458, 38460, 38461, 38465, 38482, 38484, 38486, + 38487, 38488, 38497, 38510, 38516, 38523, 38524, 38526, 38527, 38529, + 38530, 38531, 38532, 38537, 38545, 38550, 38554, 38557, 38559, 38564, + 38565, 38566, 38569, 38574, 38575, 38579, 38586, 38602, 38610, 23986, + 38616, 38618, 38621, 38622, 38623, 38633, 38639, 38641, 38650, 38658, + 38659, 38661, 38665, 38682, 38683, 38685, 38689, 38690, 38691, 38696, + 38705, 38707, 38721, 38723, 38730, 38734, 38735, 38741, 38743, 38744, + 38746, 38747, 38755, 38759, 38762, 38766, 38771, 38774, 38775, 38776, + 38779, 38781, 38783, 38784, 38793, 38805, 38806, 38807, 38809, 38810, + 38814, 38815, 38818, 38828, 38830, 38833, 38834, 38837, 38838, 38840, + 38841, 38842, 38844, 38846, 38847, 38849, 38852, 38853, 38855, 38857, + 38858, 38860, 38861, 38862, 38864, 38865, 38868, 38871, 38872, 38873, + 38877, 38878, 38880, 38875, 38881, 38884, 38895, 38897, 38900, 38903, + 38904, 38906, 38919, 38922, 38937, 38925, 38926, 38932, 38934, 38940, + 38942, 38944, 38947, 38950, 38955, 38958, 38959, 38960, 38962, 38963, + 38965, 38949, 38974, 38980, 38983, 38986, 38993, 38994, 38995, 38998, + 38999, 39001, 39002, 39010, 39011, 39013, 39014, 39018, 39020, 39083, + 39085, 39086, 39088, 39092, 39095, 39096, 39098, 39099, 39103, 39106, + 39109, 39112, 39116, 39137, 39139, 39141, 39142, 39143, 39146, 39155, + 39158, 39170, 39175, 39176, 39185, 39189, 39190, 39191, 39194, 39195, + 39196, 39199, 39202, 39206, 39207, 39211, 39217, 39218, 39219, 39220, + 39221, 39225, 39226, 39227, 39228, 39232, 39233, 39238, 39239, 39240, + 39245, 39246, 39252, 39256, 39257, 39259, 39260, 39262, 39263, 39264, + 39323, 39325, 39327, 39334, 39344, 39345, 39346, 39349, 39353, 39354, + 39357, 39359, 39363, 39369, 39379, 39380, 39385, 39386, 39388, 39390, + 39399, 39402, 39403, 39404, 39408, 39412, 39413, 39417, 39421, 39422, + 39426, 39427, 39428, 39435, 39436, 39440, 39441, 39446, 39454, 39456, + 39458, 39459, 39460, 39463, 39469, 39470, 39475, 39477, 39478, 39480, + 39495, 39489, 39492, 39498, 39499, 39500, 39502, 39505, 39508, 39510, + 39517, 39594, 39596, 39598, 39599, 39602, 39604, 39605, 39606, 39609, + 39611, 39614, 39615, 39617, 39619, 39622, 39624, 39630, 39632, 39634, + 39637, 39638, 39639, 39643, 39644, 39648, 39652, 39653, 39655, 39657, + 39660, 39666, 39667, 39669, 39673, 39674, 39677, 39679, 39680, 39681, + 39682, 39683, 39684, 39685, 39688, 39689, 39691, 39692, 39693, 39694, + 39696, 39698, 39702, 39705, 39707, 39708, 39712, 39718, 39723, 39725, + 39731, 39732, 39733, 39735, 39737, 39738, 39741, 39752, 39755, 39756, + 39765, 39766, 39767, 39771, 39774, 39777, 39779, 39781, 39782, 39784, + 39786, 39787, 39788, 39789, 39790, 39795, 39797, 39799, 39800, 39801, + 39807, 39808, 39812, 39813, 39814, 39815, 39817, 39818, 39819, 39821, + 39823, 39824, 39828, 39834, 39837, 39838, 39846, 39847, 39849, 39852, + 39856, 39857, 39858, 39863, 39864, 39867, 39868, 39870, 39871, 39873, + 39879, 39880, 39886, 39888, 39895, 39896, 39901, 39903, 39909, 39911, + 39914, 39915, 39919, 39923, 39927, 39928, 39929, 39930, 39933, 39935, + 39936, 39938, 39947, 39951, 39953, 39958, 39960, 39961, 39962, 39964, + 39966, 39970, 39971, 39974, 39975, 39976, 39977, 39978, 39985, 39989, + 39990, 39991, 39997, 40001, 40003, 40004, 40005, 40009, 40010, 40014, + 40015, 40016, 40019, 40020, 40022, 40024, 40027, 40029, 40030, 40031, + 40035, 40041, 40042, 40028, 40043, 40040, 40046, 40048, 40050, 40053, + 40055, 40059, 40166, 40178, 40183, 40185, 40203, 40194, 40209, 40215, + 40216, 40220, 40221, 40222, 40239, 40240, 40242, 40243, 40244, 40250, + 40252, 40261, 40253, 40258, 40259, 40263, 40266, 40275, 40276, 40287, + 40291, 40290, 40293, 40297, 40298, 40299, 40304, 40310, 40311, 40315, + 40316, 40318, 40323, 40324, 40326, 40330, 40333, 40334, 40338, 40339, + 40341, 40342, 40343, 40344, 40353, 40362, 40364, 40366, 40369, 40373, + 40377, 40380, 40383, 40387, 40391, 40393, 40394, 40404, 40405, 40406, + 40407, 40410, 40414, 40415, 40416, 40421, 40423, 40425, 40427, 40430, + 40432, 40435, 40436, 40446, 40458, 40450, 40455, 40462, 40464, 40465, + 40466, 40469, 40470, 40473, 40476, 40477, 40570, 40571, 40572, 40576, + 40578, 40579, 40580, 40581, 40583, 40590, 40591, 40598, 40600, 40603, + 40606, 40612, 40616, 40620, 40622, 40623, 40624, 40627, 40628, 40629, + 40646, 40648, 40651, 40661, 40671, 40676, 40679, 40684, 40685, 40686, + 40688, 40689, 40690, 40693, 40696, 40703, 40706, 40707, 40713, 40719, + 40720, 40721, 40722, 40724, 40726, 40727, 40729, 40730, 40731, 40735, + 40738, 40742, 40746, 40747, 40751, 40753, 40754, 40756, 40759, 40761, + 40762, 40764, 40765, 40767, 40769, 40771, 40772, 40773, 40774, 40775, + 40787, 40789, 40790, 40791, 40792, 40794, 40797, 40798, 40808, 40809, + 40813, 40814, 40815, 40816, 40817, 40819, 40821, 40826, 40829, 40847, + 40848, 40849, 40850, 40852, 40854, 40855, 40862, 40865, 40866, 40867, + 40869, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_koi8_r[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 9555, 9556, 9557, 9558, + 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 1025, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, + 9578, 9579, 9580, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myhtml_encoding_map_koi8_u[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 1108, 9556, 1110, 1111, + 9559, 9560, 9561, 9562, 9563, 1169, 1118, 9566, 9567, 9568, + 9569, 1025, 1028, 9571, 1030, 1031, 9574, 9575, 9576, 9577, + 9578, 1168, 1038, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myhtml_encoding_map_macintosh[] = { + 196, 197, 199, 201, 209, 214, 220, 225, 224, 226, + 228, 227, 229, 231, 233, 232, 234, 235, 237, 236, + 238, 239, 241, 243, 242, 244, 246, 245, 250, 249, + 251, 252, 8224, 176, 162, 163, 167, 8226, 182, 223, + 174, 169, 8482, 180, 168, 8800, 198, 216, 8734, 177, + 8804, 8805, 165, 181, 8706, 8721, 8719, 960, 8747, 170, + 186, 937, 230, 248, 191, 161, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 192, 195, 213, 338, 339, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 9674, 255, 376, + 8260, 8364, 8249, 8250, 64257, 64258, 8225, 183, 8218, 8222, + 8240, 194, 202, 193, 203, 200, 205, 206, 207, 204, + 211, 212, 63743, 210, 218, 219, 217, 305, 710, 732, + 175, 728, 729, 730, 184, 733, 731, 711, +}; + +static const unsigned long myhtml_encoding_map_windows_1250[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 352, 8249, 346, 356, 381, 377, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 353, 8250, 347, 357, + 382, 378, 160, 711, 728, 321, 164, 260, 166, 167, + 168, 169, 350, 171, 172, 173, 174, 379, 176, 177, + 731, 322, 180, 181, 182, 183, 184, 261, 351, 187, + 317, 733, 318, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myhtml_encoding_map_windows_1251[] = { + 1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, + 1033, 8249, 1034, 1036, 1035, 1039, 1106, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 1113, 8250, 1114, 1116, + 1115, 1119, 160, 1038, 1118, 1032, 164, 1168, 166, 167, + 1025, 169, 1028, 171, 172, 173, 174, 1031, 176, 177, + 1030, 1110, 1169, 181, 182, 183, 1105, 8470, 1108, 187, + 1112, 1029, 1109, 1111, 1040, 1041, 1042, 1043, 1044, 1045, + 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, + 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, +}; + +static const unsigned long myhtml_encoding_map_windows_1252[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 382, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myhtml_encoding_map_windows_1253[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 157, + 158, 159, 160, 901, 902, 163, 164, 165, 166, 167, + 168, 169, 0x0000, 171, 172, 173, 174, 8213, 176, 177, + 178, 179, 900, 181, 182, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_windows_1254[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 286, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 304, 350, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 287, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 305, 351, 255, +}; + +static const unsigned long myhtml_encoding_map_windows_1255[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 156, 157, + 158, 159, 160, 161, 162, 163, 8362, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 191, 1456, 1457, 1458, 1459, 1460, 1461, + 1462, 1463, 1464, 1465, 0x0000, 1467, 1468, 1469, 1470, 1471, + 1472, 1473, 1474, 1475, 1520, 1521, 1522, 1523, 1524, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_windows_1256[] = { + 8364, 1662, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 1657, 8249, 338, 1670, 1688, 1672, 1711, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 1705, 8482, 1681, 8250, 339, 8204, + 8205, 1722, 160, 1548, 162, 163, 164, 165, 166, 167, + 168, 169, 1726, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 1563, 187, + 188, 189, 190, 1567, 1729, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 215, 1591, 1592, + 1593, 1594, 1600, 1601, 1602, 1603, 224, 1604, 226, 1605, + 1606, 1607, 1608, 231, 232, 233, 234, 235, 1609, 1610, + 238, 239, 1611, 1612, 1613, 1614, 244, 1615, 1616, 247, + 1617, 249, 1618, 251, 252, 8206, 8207, 1746, +}; + +static const unsigned long myhtml_encoding_map_windows_1257[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 168, 711, 184, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 175, + 731, 159, 160, 0x0000, 162, 163, 164, 0x0000, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 180, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 729, +}; + +static const unsigned long myhtml_encoding_map_windows_1258[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 258, 196, 197, + 198, 199, 200, 201, 202, 203, 768, 205, 206, 207, + 272, 209, 777, 211, 212, 416, 214, 215, 216, 217, + 218, 219, 220, 431, 771, 223, 224, 225, 226, 259, + 228, 229, 230, 231, 232, 233, 234, 235, 769, 237, + 238, 239, 273, 241, 803, 243, 244, 417, 246, 247, + 248, 249, 250, 251, 252, 432, 8363, 255, +}; + +static const unsigned long myhtml_encoding_map_windows_874[] = { + 8364, 129, 130, 131, 132, 8230, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 3585, 3586, 3587, 3588, 3589, 3590, 3591, + 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, + 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, + 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, + 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, + 3642, 0x0000, 0x0000, 0x0000, 0x0000, 3647, 3648, 3649, 3650, 3651, + 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, + 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, + 3672, 3673, 3674, 3675, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_x_mac_cyrillic[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 8224, 176, 1168, 163, 167, 8226, 182, 1030, + 174, 169, 8482, 1026, 1106, 8800, 1027, 1107, 8734, 177, + 8804, 8805, 1110, 181, 1169, 1032, 1028, 1108, 1031, 1111, + 1033, 1113, 1034, 1114, 1112, 1029, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 1035, 1115, 1036, 1116, 1109, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 8222, 1038, 1118, + 1039, 1119, 8470, 1025, 1105, 1103, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 8364, +}; + +static const myhtml_encoding_custom_f myhtml_encoding_function_index[] = { + myhtml_encoding_decode_utf_8, NULL, NULL, myhtml_encoding_decode_utf_8, myhtml_encoding_decode_utf_16le, + myhtml_encoding_decode_utf_16be, myhtml_encoding_decode_x_user_defined, + myhtml_encoding_decode_big5, myhtml_encoding_decode_euc_kr, myhtml_encoding_decode_gb18030, + myhtml_encoding_decode_ibm866, myhtml_encoding_decode_iso_8859_10, myhtml_encoding_decode_iso_8859_13, + myhtml_encoding_decode_iso_8859_14, myhtml_encoding_decode_iso_8859_15, myhtml_encoding_decode_iso_8859_16, + myhtml_encoding_decode_iso_8859_2, myhtml_encoding_decode_iso_8859_3, myhtml_encoding_decode_iso_8859_4, + myhtml_encoding_decode_iso_8859_5, myhtml_encoding_decode_iso_8859_6, myhtml_encoding_decode_iso_8859_7, + myhtml_encoding_decode_iso_8859_8, myhtml_encoding_decode_koi8_r, myhtml_encoding_decode_koi8_u, + myhtml_encoding_decode_macintosh, myhtml_encoding_decode_windows_1250, myhtml_encoding_decode_windows_1251, + myhtml_encoding_decode_windows_1252, myhtml_encoding_decode_windows_1253, myhtml_encoding_decode_windows_1254, + myhtml_encoding_decode_windows_1255, myhtml_encoding_decode_windows_1256, myhtml_encoding_decode_windows_1257, + myhtml_encoding_decode_windows_1258, myhtml_encoding_decode_windows_874, myhtml_encoding_decode_x_mac_cyrillic, + myhtml_encoding_decode_iso_2022_jp, myhtml_encoding_decode_gbk, myhtml_encoding_decode_shift_jis, + myhtml_encoding_decode_euc_jp, myhtml_encoding_decode_iso_8859_8_i +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_ENCODING_RESOURCE_H */ + + + + diff --git a/include/myhtml/incoming.h b/include/myhtml/incoming.h new file mode 100644 index 0000000..fde435d --- /dev/null +++ b/include/myhtml/incoming.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_INCOMING_H +#define MyHTML_INCOMING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +struct myhtml_incoming_buffer { + const char* data; + size_t length; // use of data + size_t size; // size of data + size_t offset; // begin global offset + + struct myhtml_incoming_buffer* prev; + struct myhtml_incoming_buffer* next; +}; + + +// incoming buffer +myhtml_incoming_buffer_t * myhtml_incomming_buffer_add(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, const char *html, size_t html_size); +void myhtml_incomming_buffer_clean(myhtml_incoming_buffer_t *current); + +myhtml_incoming_buffer_t * myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); + +const char * myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); +size_t myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); + +myhtml_incoming_buffer_t * myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); +myhtml_incoming_buffer_t * myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); + +size_t myhtml_incoming_buffer_convert_one_escaped_to_code_point(myhtml_incoming_buffer_t **inc_buf, size_t *relative_pos); +size_t myhtml_incoming_buffer_escaped_case_cmp(myhtml_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_INCOMING_H */ diff --git a/include/myhtml/myhtml.h b/include/myhtml/myhtml.h new file mode 100644 index 0000000..a93f162 --- /dev/null +++ b/include/myhtml/myhtml.h @@ -0,0 +1,238 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYHTML_H +#define MyHTML_MYHTML_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define mh_queue_current() tree->queue +#define myhtml_tokenizer_state_set(tree) myhtml_tree_set(tree, state) + +#define mh_queue_get(idx, attr) myhtml->queue->nodes[idx].attr + +// space, tab, LF, FF, CR +#define myhtml_whithspace(onechar, action, logic) \ + onechar action ' ' logic \ + onechar action '\t' logic \ + onechar action '\n' logic \ + onechar action '\f' logic \ + onechar action '\r' + +#define myhtml_ascii_char_cmp(onechar) \ + ((onechar >= 'a' && onechar <= 'z') || \ + (onechar >= 'A' && onechar <= 'Z')) + +#define myhtml_ascii_char_unless_cmp(onechar) \ + ((onechar < 'a' || onechar > 'z') && \ + (onechar < 'A' || onechar > 'Z')) + +struct myhtml { + mythread_t *thread; + //mchar_async_t *mchar; // for all + + myhtml_tokenizer_state_f* parse_state_func; + myhtml_insertion_f* insertion_func; + + enum myhtml_options opt; + myhtml_tree_node_t *marker; +}; + +struct myhtml_collection { + myhtml_tree_node_t **list; + size_t size; + size_t length; +}; + + +myhtml_t * myhtml_create(void); +myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); +void myhtml_clean(myhtml_t* myhtml); +myhtml_t* myhtml_destroy(myhtml_t* myhtml); + +myhtml_status_t myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +myhtml_status_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +myhtml_status_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +myhtml_status_t myhtml_parse_chunk_end(myhtml_tree_t* tree); + +// encoding +void myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); +myhtml_encoding_t myhtml_encoding_get(myhtml_tree_t* tree); + +myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, myhtml_status_t* status); +/* like a [some=value] or #id */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some~=value] or .class */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some^=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some$=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some*=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some|=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, myhtml_status_t *status); + +myhtml_tree_node_t * myhtml_node_first(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_node_next(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_prev(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_parent(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_child(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_last_child(myhtml_tree_node_t *node); + +myhtml_tree_node_t * myhtml_node_insert_to_appropriate_place(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_append_child(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_insert_after(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_insert_before(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); + +myhtml_tree_node_t * myhtml_node_create(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +myhtml_tree_node_t * myhtml_node_remove(myhtml_tree_t* tree, myhtml_tree_node_t *node); +void myhtml_node_delete(myhtml_tree_t* tree, myhtml_tree_node_t *node); +void myhtml_node_delete_recursive(myhtml_tree_t* tree, myhtml_tree_node_t *node); +void myhtml_node_free(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +myhtml_token_node_t* myhtml_node_token(myhtml_tree_node_t *node); +myhtml_namespace_t myhtml_node_namespace(myhtml_tree_node_t *node); +void myhtml_node_namespace_set(myhtml_tree_node_t *node, myhtml_namespace_t ns); +myhtml_tag_id_t myhtml_node_tag_id(myhtml_tree_node_t *node); +const char * myhtml_tag_name_by_id(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, size_t *length); +myhtml_tag_id_t myhtml_tag_id_by_name(myhtml_tree_t* tree, const char *tag_name, size_t length); +bool myhtml_node_is_close_self(myhtml_tree_node_t *node); +myhtml_tree_attr_t * myhtml_node_attribute_first(myhtml_tree_node_t *node); +myhtml_tree_attr_t * myhtml_node_attribute_last(myhtml_tree_node_t *node); +const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length); +myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node); +myhtml_position_t myhtml_node_raw_pasition(myhtml_tree_node_t *node); +myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); + +/* attributes */ +myhtml_tree_attr_t * myhtml_attribute_next(myhtml_tree_attr_t *attr); +myhtml_tree_attr_t * myhtml_attribute_prev(myhtml_tree_attr_t *attr); +enum myhtml_namespace myhtml_attribute_namespace(myhtml_tree_attr_t *attr); +void myhtml_attribute_namespace_set(myhtml_tree_attr_t *attr, myhtml_namespace_t ns); + +const char * myhtml_attribute_key(myhtml_tree_attr_t *attr, size_t *length); +const char * myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); +myhtml_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr); +myhtml_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr); +myhtml_tree_attr_t * myhtml_attribute_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); +myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_t *tree, myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myhtml_encoding_t encoding); +myhtml_tree_attr_t * myhtml_attribute_remove(myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); +myhtml_tree_attr_t * myhtml_attribute_remove_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); +void myhtml_attribute_delete(myhtml_tree_t *tree, myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); +void myhtml_attribute_free(myhtml_tree_t *tree, myhtml_tree_attr_t *attr); +myhtml_position_t myhtml_attribute_key_raw_position(myhtml_tree_attr_t *attr); +myhtml_position_t myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr); + +/* collection */ +myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *status); +void myhtml_collection_clean(myhtml_collection_t *collection); +myhtml_collection_t * myhtml_collection_destroy(myhtml_collection_t *collection); +myhtml_status_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); + +// strings +myhtml_string_t * myhtml_node_text_set(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); +myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); + +bool myhtml_utils_strcmp(const char* ab, const char* to_lowercase, size_t size); +bool myhtml_is_html_node(myhtml_tree_node_t *node, myhtml_tag_id_t tag_id); + +// queue +void myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token); + +/** + * Platform-specific hdef performance clock queries. + * Implemented in perf.c + */ + +/** Get clock resolution */ +uint64_t myhtml_hperf_res(myhtml_status_t *status); + +/** Get current value in clock ticks */ +uint64_t myhtml_hperf_clock(myhtml_status_t *status); + +/** Print an hperf measure */ +myhtml_status_t myhtml_hperf_print(const char *name, uint64_t x, uint64_t y, FILE *fh); +myhtml_status_t myhtml_hperf_print_by_val(const char *name, uint64_t x, FILE *fh); + +/* version */ +myhtml_version_t myhtml_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/include/myhtml/mynamespace.h b/include/myhtml/mynamespace.h new file mode 100644 index 0000000..939e6f3 --- /dev/null +++ b/include/myhtml/mynamespace.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYNAMESPACE_H +#define MyHTML_MYNAMESPACE_H +#pragma once + +#define MyHTML_NAMESPACE_DETECT_NAME_STATIC_SIZE 19 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include + +struct myhtml_namespace_detect_name_entry { + const char* name; + size_t name_length; + + myhtml_namespace_t ns; + + size_t next; + size_t curr; +} +typedef myhtml_namespace_detect_name_entry_t; + +struct myhtml_namespace_detect_url_entry { + const char* url; + size_t url_length; + + myhtml_namespace_t ns; +} +typedef myhtml_namespace_detect_url_entry_t; + +const char * myhtml_namespace_name_by_id(myhtml_namespace_t ns, size_t *length); +bool myhtml_namespace_id_by_name(const char *name, size_t length, myhtml_namespace_t *ns); +myhtml_namespace_t myhtml_namespace_id_by_url(const char *url, size_t length); +const myhtml_namespace_detect_name_entry_t * myhtml_namespace_name_entry_by_name(const char* name, size_t length); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MYNAMESPACE_H */ diff --git a/include/myhtml/mynamespace_resource.h b/include/myhtml/mynamespace_resource.h new file mode 100644 index 0000000..8dfdad2 --- /dev/null +++ b/include/myhtml/mynamespace_resource.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + */ + +#ifndef MyHTML_MYNAMESPACE_RESOURCE_H +#define MyHTML_MYNAMESPACE_RESOURCE_H +#pragma once + +static const myhtml_namespace_detect_name_entry_t myhtml_namespace_detect_name_entry_static_list_index[] = +{ + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"SVG", 3, MyHTML_NAMESPACE_SVG, 0, 6}, + {"XML", 3, MyHTML_NAMESPACE_XML, 0, 7}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"MATHML", 6, MyHTML_NAMESPACE_MATHML, 0, 10}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"XMLNS", 5, MyHTML_NAMESPACE_XMLNS, 0, 12}, + {"HTML", 4, MyHTML_NAMESPACE_HTML, 0, 13}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"XLINK", 5, MyHTML_NAMESPACE_XLINK, 0, 19}, +}; + +static const char myhtml_namespace_resource_names_map[][8] = { + "", "HTML", "MathML", "SVG", "XLink", "XML", "XMLNS", "*" +}; + +static const myhtml_namespace_detect_url_entry_t myhtml_namespace_detect_url_entry_static_list_index[] = { + {"http://www.w3.org/1999/xhtml", 28, MyHTML_NAMESPACE_HTML}, + {"http://www.w3.org/1998/Math/MathML", 34, MyHTML_NAMESPACE_MATHML}, + {"http://www.w3.org/2000/svg", 26, MyHTML_NAMESPACE_SVG}, + {"http://www.w3.org/1999/xlink", 28, MyHTML_NAMESPACE_XLINK}, + {"http://www.w3.org/XML/1998/namespace", 36, MyHTML_NAMESPACE_XML}, + {"http://www.w3.org/2000/xmlns/", 29, MyHTML_NAMESPACE_XMLNS}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF} +}; + +#endif /* MyHTML_MYNAMESPACE_RESOURCE_H */ diff --git a/include/myhtml/myosi.h b/include/myhtml/myosi.h new file mode 100644 index 0000000..9b2da8a --- /dev/null +++ b/include/myhtml/myosi.h @@ -0,0 +1,514 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYOSI_H +#define MyHTML_MYOSI_H +#pragma once + +#include +#include +#include +#include +#include +#include + +#define MyHTML_VERSION_MAJOR 1 +#define MyHTML_VERSION_MINOR 0 +#define MyHTML_VERSION_PATCH 3 + +#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WINPTHREADS_VERSION) +#define IS_OS_WINDOWS +#include +#endif + +#if defined(_MSC_VER) +# define MyHTML_DEPRECATED(func, message) __declspec(deprecated(message)) func +#elif defined(__GNUC__) || defined(__INTEL_COMPILER) +# define MyHTML_DEPRECATED(func, message) func __attribute__((deprecated(message))) +#else +# define MyHTML_DEPRECATED(func, message) func +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Mem */ +#ifdef MyHTML_EXTERN_MALLOC + extern void * MyHTML_EXTERN_MALLOC(size_t size); + #define myhtml_malloc MyHTML_EXTERN_MALLOC +#else + #define myhtml_malloc myhtml_mem_malloc +#endif + +#ifdef MyHTML_EXTERN_REALLOC + extern void * MyHTML_EXTERN_REALLOC(void* dst, size_t size); + #define myhtml_realloc MyHTML_EXTERN_REALLOC +#else + #define myhtml_realloc myhtml_mem_realloc +#endif + +#ifdef MyHTML_EXTERN_CALLOC + extern void * MyHTML_EXTERN_CALLOC(size_t num, size_t size); + #define myhtml_calloc MyHTML_EXTERN_CALLOC +#else + #define myhtml_calloc myhtml_mem_calloc +#endif + +#ifdef MyHTML_EXTERN_FREE + extern void MyHTML_EXTERN_FREE(void* dst); + #define myhtml_free MyHTML_EXTERN_FREE +#else + #define myhtml_free myhtml_mem_free +#endif + +/* Debug */ +#ifdef DEBUG_MODE + #define MyHTML_DEBUG(format, ...) \ + myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) +#else + #define MyHTML_DEBUG(format, ...) +#endif + +#ifdef DEBUG_MODE + #define MyHTML_DEBUG_ERROR(format, ...) \ + myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) +#else + #define MyHTML_DEBUG_ERROR(format, ...) +#endif + +#define myhtml_base_add(myhtml, point, lenn, sizen, strcn, size) \ + myhtml->Lenn++; \ + if(myhtml->lenn == myhtml->sizen) { \ + myhtml->sizen += size; \ + myhtml->point = (strcn*)myhtml_realloc(myhtml->point, \ + sizeof(strcn) * myhtml->sizen); \ + } + + +// encoding +// https://encoding.spec.whatwg.org/#the-encoding +// https://encoding.spec.whatwg.org/#legacy-single-byte-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(simplified)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(traditional)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-japanese-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-korean-encodings +// https://encoding.spec.whatwg.org/#legacy-miscellaneous-encodings + +enum myhtml_encoding_list { + MyHTML_ENCODING_DEFAULT = 0x00, +// MyHTML_ENCODING_AUTO = 0x01, // future +// MyHTML_ENCODING_CUSTOM = 0x02, // future + MyHTML_ENCODING_UTF_8 = 0x00, // default encoding + MyHTML_ENCODING_UTF_16LE = 0x04, + MyHTML_ENCODING_UTF_16BE = 0x05, + MyHTML_ENCODING_X_USER_DEFINED = 0x06, + MyHTML_ENCODING_BIG5 = 0x07, + MyHTML_ENCODING_EUC_KR = 0x08, + MyHTML_ENCODING_GB18030 = 0x09, + MyHTML_ENCODING_IBM866 = 0x0a, + MyHTML_ENCODING_ISO_8859_10 = 0x0b, + MyHTML_ENCODING_ISO_8859_13 = 0x0c, + MyHTML_ENCODING_ISO_8859_14 = 0x0d, + MyHTML_ENCODING_ISO_8859_15 = 0x0e, + MyHTML_ENCODING_ISO_8859_16 = 0x0f, + MyHTML_ENCODING_ISO_8859_2 = 0x10, + MyHTML_ENCODING_ISO_8859_3 = 0x11, + MyHTML_ENCODING_ISO_8859_4 = 0x12, + MyHTML_ENCODING_ISO_8859_5 = 0x13, + MyHTML_ENCODING_ISO_8859_6 = 0x14, + MyHTML_ENCODING_ISO_8859_7 = 0x15, + MyHTML_ENCODING_ISO_8859_8 = 0x16, + MyHTML_ENCODING_KOI8_R = 0x17, + MyHTML_ENCODING_KOI8_U = 0x18, + MyHTML_ENCODING_MACINTOSH = 0x19, + MyHTML_ENCODING_WINDOWS_1250 = 0x1a, + MyHTML_ENCODING_WINDOWS_1251 = 0x1b, + MyHTML_ENCODING_WINDOWS_1252 = 0x1c, + MyHTML_ENCODING_WINDOWS_1253 = 0x1d, + MyHTML_ENCODING_WINDOWS_1254 = 0x1e, + MyHTML_ENCODING_WINDOWS_1255 = 0x1f, + MyHTML_ENCODING_WINDOWS_1256 = 0x20, + MyHTML_ENCODING_WINDOWS_1257 = 0x21, + MyHTML_ENCODING_WINDOWS_1258 = 0x22, + MyHTML_ENCODING_WINDOWS_874 = 0x23, + MyHTML_ENCODING_X_MAC_CYRILLIC = 0x24, + MyHTML_ENCODING_ISO_2022_JP = 0x25, + MyHTML_ENCODING_GBK = 0x26, + MyHTML_ENCODING_SHIFT_JIS = 0x27, + MyHTML_ENCODING_EUC_JP = 0x28, + MyHTML_ENCODING_ISO_8859_8_I = 0x29, + MyHTML_ENCODING_LAST_ENTRY = 0x2a +} +typedef myhtml_encoding_t; + +// char references +typedef struct myhtml_data_process_entry myhtml_data_process_entry_t; + +// strings +typedef struct myhtml_string myhtml_string_t; + +// thread +enum mythread_thread_opt { + MyTHREAD_OPT_UNDEF = 0x00, + MyTHREAD_OPT_WAIT = 0x01, + MyTHREAD_OPT_QUIT = 0x02, + MyTHREAD_OPT_STOP = 0x04 +} +typedef mythread_thread_opt_t; + +typedef struct mythread_queue_list_entry mythread_queue_list_entry_t; +typedef struct mythread_queue_thread_param mythread_queue_thread_param_t; +typedef struct mythread_queue_list mythread_queue_list_t; +typedef struct mythread_queue_node mythread_queue_node_t; +typedef struct mythread_queue mythread_queue_t; + +typedef size_t mythread_id_t; +typedef struct mythread_workers_list mythread_workers_list_t; +typedef struct mythread_context mythread_context_t; +typedef struct mythread_list mythread_list_t; +typedef struct mythread mythread_t; + +// tree +enum myhtml_tree_flags { + MyHTML_TREE_FLAGS_CLEAN = 0x000, + MyHTML_TREE_FLAGS_SCRIPT = 0x001, + MyHTML_TREE_FLAGS_FRAMESET_OK = 0x002, + MyHTML_TREE_FLAGS_IFRAME_SRCDOC = 0x004, + MyHTML_TREE_FLAGS_ALREADY_STARTED = 0x008, + MyHTML_TREE_FLAGS_SINGLE_MODE = 0x010, + MyHTML_TREE_FLAGS_PARSE_END = 0x020, + MyHTML_TREE_FLAGS_PARSE_FLAG = 0x040, + MyHTML_TREE_FLAGS_PARSE_FLAG_EMIT_NEWLINE = 0x080 +}; + +enum myhtml_tree_parse_flags { + MyHTML_TREE_PARSE_FLAGS_CLEAN = 0x000, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE = 0x001, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_PROCESS_TOKEN = 0x003, + MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN = 0x004, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE = 0x008, +} +typedef myhtml_tree_parse_flags_t; + +typedef struct myhtml_tree_temp_tag_name myhtml_tree_temp_tag_name_t; +typedef struct myhtml_tree_insertion_list myhtml_tree_insertion_list_t; +typedef struct myhtml_tree_token_list myhtml_tree_token_list_t; +typedef struct myhtml_tree_list myhtml_tree_list_t; +typedef struct myhtml_tree_indexes myhtml_tree_indexes_t; +typedef struct myhtml_tree_doctype myhtml_tree_doctype_t; +typedef struct myhtml_async_args myhtml_async_args_t; + +typedef struct myhtml_tree_node myhtml_tree_node_t; +typedef struct myhtml_tree myhtml_tree_t; + +// token +enum myhtml_token_type { + MyHTML_TOKEN_TYPE_OPEN = 0x000, + MyHTML_TOKEN_TYPE_CLOSE = 0x001, + MyHTML_TOKEN_TYPE_CLOSE_SELF = 0x002, + MyHTML_TOKEN_TYPE_DONE = 0x004, + MyHTML_TOKEN_TYPE_WHITESPACE = 0x008, + MyHTML_TOKEN_TYPE_RCDATA = 0x010, + MyHTML_TOKEN_TYPE_RAWTEXT = 0x020, + MyHTML_TOKEN_TYPE_SCRIPT = 0x040, + MyHTML_TOKEN_TYPE_PLAINTEXT = 0x080, + MyHTML_TOKEN_TYPE_CDATA = 0x100, + MyHTML_TOKEN_TYPE_DATA = 0x200, + MyHTML_TOKEN_TYPE_COMMENT = 0x400, + MyHTML_TOKEN_TYPE_NULL = 0x800 +}; + +typedef size_t myhtml_token_index_t; +typedef size_t myhtml_token_attr_index_t; +typedef struct myhtml_token_replacement_entry myhtml_token_replacement_entry_t; +typedef struct myhtml_token_namespace_replacement myhtml_token_namespace_replacement_t; + +typedef struct myhtml_token_attr myhtml_token_attr_t; +typedef struct myhtml_token_node myhtml_token_node_t; +typedef struct myhtml_token myhtml_token_t; + +// tags +enum myhtml_tag_categories { + MyHTML_TAG_CATEGORIES_UNDEF = 0x000, + MyHTML_TAG_CATEGORIES_ORDINARY = 0x001, + MyHTML_TAG_CATEGORIES_SPECIAL = 0x002, + MyHTML_TAG_CATEGORIES_FORMATTING = 0x004, + MyHTML_TAG_CATEGORIES_SCOPE = 0x008, + MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM = 0x010, + MyHTML_TAG_CATEGORIES_SCOPE_BUTTON = 0x020, + MyHTML_TAG_CATEGORIES_SCOPE_TABLE = 0x040, + MyHTML_TAG_CATEGORIES_SCOPE_SELECT = 0x080 +}; + +typedef struct myhtml_tag_index_node myhtml_tag_index_node_t; +typedef struct myhtml_tag_index_entry myhtml_tag_index_entry_t; +typedef struct myhtml_tag_index myhtml_tag_index_t; + +typedef size_t myhtml_tag_id_t; + +typedef struct myhtml_tag myhtml_tag_t; + +// stream +typedef struct myhtml_stream_buffer_entry myhtml_stream_buffer_entry_t; +typedef struct myhtml_stream_buffer myhtml_stream_buffer_t; + +// parse +enum myhtml_tokenizer_state { + MyHTML_TOKENIZER_STATE_DATA = 0x000, + MyHTML_TOKENIZER_STATE_CHARACTER_REFERENCE_IN_DATA = 0x001, + MyHTML_TOKENIZER_STATE_RCDATA = 0x002, + MyHTML_TOKENIZER_STATE_CHARACTER_REFERENCE_IN_RCDATA = 0x003, + MyHTML_TOKENIZER_STATE_RAWTEXT = 0x004, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA = 0x005, + MyHTML_TOKENIZER_STATE_PLAINTEXT = 0x006, + MyHTML_TOKENIZER_STATE_TAG_OPEN = 0x007, + MyHTML_TOKENIZER_STATE_END_TAG_OPEN = 0x008, + MyHTML_TOKENIZER_STATE_TAG_NAME = 0x009, + MyHTML_TOKENIZER_STATE_RCDATA_LESS_THAN_SIGN = 0x00a, + MyHTML_TOKENIZER_STATE_RCDATA_END_TAG_OPEN = 0x00b, + MyHTML_TOKENIZER_STATE_RCDATA_END_TAG_NAME = 0x00c, + MyHTML_TOKENIZER_STATE_RAWTEXT_LESS_THAN_SIGN = 0x00d, + MyHTML_TOKENIZER_STATE_RAWTEXT_END_TAG_OPEN = 0x00e, + MyHTML_TOKENIZER_STATE_RAWTEXT_END_TAG_NAME = 0x00f, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_LESS_THAN_SIGN = 0x010, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_END_TAG_OPEN = 0x011, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_END_TAG_NAME = 0x012, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPE_START = 0x013, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPE_START_DASH = 0x014, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED = 0x015, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_DASH = 0x016, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_DASH_DASH = 0x017, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN = 0x018, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN = 0x019, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME = 0x01a, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPE_START = 0x01b, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED = 0x01c, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH = 0x01d, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH = 0x01e, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN = 0x01f, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPE_END = 0x020, + MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME = 0x021, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_NAME = 0x022, + MyHTML_TOKENIZER_STATE_AFTER_ATTRIBUTE_NAME = 0x023, + MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_VALUE = 0x024, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_DOUBLE_QUOTED = 0x025, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_SINGLE_QUOTED = 0x026, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_UNQUOTED = 0x027, + MyHTML_TOKENIZER_STATE_CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE = 0x028, + MyHTML_TOKENIZER_STATE_AFTER_ATTRIBUTE_VALUE__QUOTED = 0x029, + MyHTML_TOKENIZER_STATE_SELF_CLOSING_START_TAG = 0x02a, + MyHTML_TOKENIZER_STATE_BOGUS_COMMENT = 0x02b, + MyHTML_TOKENIZER_STATE_MARKUP_DECLARATION_OPEN = 0x02c, + MyHTML_TOKENIZER_STATE_COMMENT_START = 0x02d, + MyHTML_TOKENIZER_STATE_COMMENT_START_DASH = 0x02e, + MyHTML_TOKENIZER_STATE_COMMENT = 0x02f, + MyHTML_TOKENIZER_STATE_COMMENT_END_DASH = 0x030, + MyHTML_TOKENIZER_STATE_COMMENT_END = 0x031, + MyHTML_TOKENIZER_STATE_COMMENT_END_BANG = 0x032, + MyHTML_TOKENIZER_STATE_DOCTYPE = 0x033, + MyHTML_TOKENIZER_STATE_BEFORE_DOCTYPE_NAME = 0x034, + MyHTML_TOKENIZER_STATE_DOCTYPE_NAME = 0x035, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_NAME = 0x036, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_PUBLIC_KEYWORD = 0x037, + MyHTML_TOKENIZER_STATE_BEFORE_DOCTYPE_PUBLIC_IDENTIFIER = 0x038, + MyHTML_TOKENIZER_STATE_DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED = 0x039, + MyHTML_TOKENIZER_STATE_DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED = 0x03a, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_PUBLIC_IDENTIFIER = 0x03b, + MyHTML_TOKENIZER_STATE_BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS = 0x03c, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_SYSTEM_KEYWORD = 0x03d, + MyHTML_TOKENIZER_STATE_BEFORE_DOCTYPE_SYSTEM_IDENTIFIER = 0x03e, + MyHTML_TOKENIZER_STATE_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED = 0x03f, + MyHTML_TOKENIZER_STATE_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED = 0x040, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_SYSTEM_IDENTIFIER = 0x041, + MyHTML_TOKENIZER_STATE_BOGUS_DOCTYPE = 0x042, + MyHTML_TOKENIZER_STATE_CDATA_SECTION = 0x043, + MyHTML_TOKENIZER_STATE_CUSTOM_AFTER_DOCTYPE_NAME_A_Z = 0x044, + MyHTML_TOKENIZER_STATE_FIRST_ENTRY = MyHTML_TOKENIZER_STATE_DATA, + MyHTML_TOKENIZER_STATE_LAST_ENTRY = 0x045 +}; + +enum myhtml_insertion_mode { + MyHTML_INSERTION_MODE_INITIAL = 0x000, + MyHTML_INSERTION_MODE_BEFORE_HTML = 0x001, + MyHTML_INSERTION_MODE_BEFORE_HEAD = 0x002, + MyHTML_INSERTION_MODE_IN_HEAD = 0x003, + MyHTML_INSERTION_MODE_IN_HEAD_NOSCRIPT = 0x004, + MyHTML_INSERTION_MODE_AFTER_HEAD = 0x005, + MyHTML_INSERTION_MODE_IN_BODY = 0x006, + MyHTML_INSERTION_MODE_TEXT = 0x007, + MyHTML_INSERTION_MODE_IN_TABLE = 0x008, + MyHTML_INSERTION_MODE_IN_TABLE_TEXT = 0x009, + MyHTML_INSERTION_MODE_IN_CAPTION = 0x00a, + MyHTML_INSERTION_MODE_IN_COLUMN_GROUP = 0x00b, + MyHTML_INSERTION_MODE_IN_TABLE_BODY = 0x00c, + MyHTML_INSERTION_MODE_IN_ROW = 0x00d, + MyHTML_INSERTION_MODE_IN_CELL = 0x00e, + MyHTML_INSERTION_MODE_IN_SELECT = 0x00f, + MyHTML_INSERTION_MODE_IN_SELECT_IN_TABLE = 0x010, + MyHTML_INSERTION_MODE_IN_TEMPLATE = 0x011, + MyHTML_INSERTION_MODE_AFTER_BODY = 0x012, + MyHTML_INSERTION_MODE_IN_FRAMESET = 0x013, + MyHTML_INSERTION_MODE_AFTER_FRAMESET = 0x014, + MyHTML_INSERTION_MODE_AFTER_AFTER_BODY = 0x015, + MyHTML_INSERTION_MODE_AFTER_AFTER_FRAMESET = 0x016, + MyHTML_INSERTION_MODE_LAST_ENTRY = 0x017 +}; + +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum myhtml_status { + MyHTML_STATUS_OK = 0x0000, + MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0001, + MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, + MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, + MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, + MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, + MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, + MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, + MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, + MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, + MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, + MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, + MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, + MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, + MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, + MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, + MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, + MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, + MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, + MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, + MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, + MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, + MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 +} +typedef myhtml_status_t; + +enum myhtml_namespace { + MyHTML_NAMESPACE_UNDEF = 0x00, + MyHTML_NAMESPACE_HTML = 0x01, + MyHTML_NAMESPACE_MATHML = 0x02, + MyHTML_NAMESPACE_SVG = 0x03, + MyHTML_NAMESPACE_XLINK = 0x04, + MyHTML_NAMESPACE_XML = 0x05, + MyHTML_NAMESPACE_XMLNS = 0x06, + + /* MyHTML_NAMESPACE_ANY == MyHTML_NAMESPACE_LAST_ENTRY */ + MyHTML_NAMESPACE_ANY = 0x07, + MyHTML_NAMESPACE_LAST_ENTRY = 0x07 +} +typedef myhtml_namespace_t; + +enum myhtml_options { + MyHTML_OPTIONS_DEFAULT = 0x00, + MyHTML_OPTIONS_PARSE_MODE_SINGLE = 0x01, + MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE = 0x02, + MyHTML_OPTIONS_PARSE_MODE_SEPARATELY = 0x04 +}; + +struct myhtml_position { + size_t begin; + size_t length; +} +typedef myhtml_position_t; + +struct myhtml_version { + int major; + int minor; + int patch; +} +typedef myhtml_version_t; + +typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; +typedef myhtml_token_attr_t myhtml_tree_attr_t; +typedef struct myhtml_collection myhtml_collection_t; +typedef struct myhtml myhtml_t; + +// parser state function +typedef size_t (*myhtml_tokenizer_state_f)(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +// parser stream function +typedef void (*mythread_f)(mythread_id_t thread_id, mythread_queue_node_t *qnode); + +// parser insertion mode function +typedef bool (*myhtml_insertion_f)(myhtml_tree_t* tree, myhtml_token_node_t* token); + +// char references state +typedef size_t (*myhtml_data_process_state_f)(myhtml_data_process_entry_t* charef, myhtml_string_t* str, const char* data, size_t offset, size_t size); + +// callback functions +typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); +typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); + +// find attribute value functions +typedef bool (*myhtml_attribute_value_find_f)(myhtml_string_t* str_key, const char* value, size_t value_len); + + +void * myhtml_mem_malloc(size_t size); +void * myhtml_mem_realloc(void* dst, size_t size); +void * myhtml_mem_calloc(size_t num, size_t size); +void myhtml_mem_free(void* dst); + +void myhtml_print(FILE* out, const char* format, ...); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/include/myhtml/mystring.h b/include/myhtml/mystring.h new file mode 100644 index 0000000..755f627 --- /dev/null +++ b/include/myhtml/mystring.h @@ -0,0 +1,146 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYSTRING_H +#define MyHTML_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#define myhtml_string_get(str, attr) str->attr +#define myhtml_string_set(str, attr) myhtml_string_get(str, attr) +#define myhtml_string_len(str) myhtml_string_get(str, length) + +#define MyHTML_STRING_PREPROCESSOR_CHECK_BUFFER_SIZE(str, unsigned_data) \ + if(str->length >= str->size) { \ + myhtml_string_realloc(str, (str->length + 5)); \ + \ + unsigned_data = (unsigned char*)str->data; \ + } + +#define MyHTML_STRING_REALLOC_IF_NEED(str, need_length, upto) \ + if((str->length + need_length) >= str->size) { \ + myhtml_string_realloc(str, (str->length + need_length + upto)); \ + } \ + +#define MyHTML_STRING_APPEND_BYTE_WITHOUT_REALLOC(onechar, str) \ + str->data[str->length] = onechar; \ + str->length++ + +#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto) \ + if(str->length >= str->size) { \ + myhtml_string_realloc(str, (str->length + upto)); \ + } \ + str->data[str->length] = onechar + +#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC(onechar, str) \ + str->data[str->length] = onechar + +#define MyHTML_STRING_APPEND_BYTE(onechar, str, upto) \ + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto); \ + str->length++ + +#define myhtml_mystring_whitespace(onechar, action, logic) \ + (onechar action ' ' logic \ + onechar action '\t' logic \ + onechar action '\n' logic \ + onechar action '\f' logic \ + onechar action '\r') + +struct myhtml_string { + char* data; + size_t size; + size_t length; + + mchar_async_t *mchar; + size_t node_idx; +}; + +typedef size_t myhtml_string_index_t; + +char * myhtml_string_init(mchar_async_t *mchar, size_t node_idx, myhtml_string_t* str, size_t size); +char * myhtml_string_realloc(myhtml_string_t *str, size_t new_size); + +void myhtml_string_clean(myhtml_string_t* str); +void myhtml_string_clean_all(myhtml_string_t* str); +myhtml_string_t * myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); + +/* basic api */ +char * myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); +char * myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); +void myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); + +char * myhtml_string_data(myhtml_string_t *str); +size_t myhtml_string_length(myhtml_string_t *str); +size_t myhtml_string_size(myhtml_string_t *str); +char * myhtml_string_data_set(myhtml_string_t *str, char *data); +size_t myhtml_string_size_set(myhtml_string_t *str, size_t size); +size_t myhtml_string_length_set(myhtml_string_t *str, size_t length); + +/* append */ +void myhtml_string_append(myhtml_string_t* str, const char* data, size_t length); +void myhtml_string_append_one(myhtml_string_t* str, const char data); +void myhtml_string_append_lowercase(myhtml_string_t* str, const char* data, size_t length); +void myhtml_string_append_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); + +/* append with convert encoding */ +void myhtml_string_append_chunk_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); +void myhtml_string_append_one_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char data, myhtml_encoding_t encoding); + +/* append with convert encoding lowercase */ +void myhtml_string_append_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); +void myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); + +/* Oh, long long long name */ + +/* append with convert encoding with preprocessing */ +size_t myhtml_string_append_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); + +/* append with convert encoding lowercase with preprocessing */ +size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); + +void myhtml_string_append_with_replacement_null_characters_only(myhtml_string_t* str, const char* buff, size_t length); + +/* append with preprocessing */ +size_t myhtml_string_before_append_any_preprocessing(myhtml_string_t* str, const char* buff, size_t length, size_t last_position); +size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); +size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); +size_t myhtml_string_raw_set_replacement_character(myhtml_string_t* target, size_t position); + +/* other functions */ +void myhtml_string_copy(myhtml_string_t* dest, myhtml_string_t* target); +size_t myhtml_string_raw_copy(char* str1, const char* str2, size_t size); +void myhtml_string_stay_only_whitespace(myhtml_string_t* target); +size_t myhtml_string_crop_whitespace_from_begin(myhtml_string_t* target); +size_t myhtml_string_whitespace_from_begin(myhtml_string_t* target); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_mystring_h */ diff --git a/include/myhtml/parser.h b/include/myhtml/parser.h new file mode 100644 index 0000000..0925bec --- /dev/null +++ b/include/myhtml/parser.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_PARSER_H +#define MyHTML_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +void myhtml_parser_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); +void myhtml_parser_worker(mythread_id_t thread_id, mythread_queue_node_t *qnode); +void myhtml_parser_worker_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); + +size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_parser_h */ diff --git a/include/myhtml/rules.h b/include/myhtml/rules.h new file mode 100644 index 0000000..636cba4 --- /dev/null +++ b/include/myhtml/rules.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_RULES_H +#define MyHTML_RULES_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + + +myhtml_status_t myhtml_rules_init(myhtml_t* myhtml); +void myhtml_rules_stop_parsing(myhtml_tree_t* tree); + +bool myhtml_rules_tree_dispatcher(myhtml_tree_t* tree, myhtml_token_node_t* token); +bool myhtml_insertion_mode_in_body_other_end_tag(myhtml_tree_t* tree, myhtml_token_node_t* token); +bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* token); +bool myhtml_insertion_mode_in_template(myhtml_tree_t* tree, myhtml_token_node_t* token); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_rules_h */ diff --git a/include/myhtml/stream.h b/include/myhtml/stream.h new file mode 100644 index 0000000..14dd31c --- /dev/null +++ b/include/myhtml/stream.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_STREAM_H +#define MyHTML_STREAM_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + + +struct myhtml_stream_buffer_entry { + char* data; + size_t length; + size_t size; +}; + +struct myhtml_stream_buffer { + myhtml_stream_buffer_entry_t* entries; + size_t length; + size_t size; + + myhtml_encoding_result_t res; +}; + +myhtml_stream_buffer_t * myhtml_stream_buffer_create(void); +myhtml_status_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size); +void myhtml_stream_buffer_clean(myhtml_stream_buffer_t* stream_buffer); +myhtml_stream_buffer_t * myhtml_stream_buffer_destroy(myhtml_stream_buffer_t* stream_buffer, bool self_destroy); +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_add_entry(myhtml_stream_buffer_t* stream_buffer, size_t entry_data_size); +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_current_entry(myhtml_stream_buffer_t* stream_buffer); + +myhtml_status_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size); +void myhtml_stream_buffer_entry_clean(myhtml_stream_buffer_entry_t* stream_buffer_entry); +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_entry_destroy(myhtml_stream_buffer_entry_t* stream_buffer_entry, bool self_destroy); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_STREAM_H */ diff --git a/include/myhtml/tag.h b/include/myhtml/tag.h new file mode 100644 index 0000000..d6a49bb --- /dev/null +++ b/include/myhtml/tag.h @@ -0,0 +1,149 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef myhtml_tag_H +#define myhtml_tag_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define myhtml_tag_get(tags, idx, attr) tags->context[idx].attr + +#define myhtml_tag_context_clean(tags, idx) \ + tags->context[idx].id = 0; \ + tags->context[idx].name = NULL; \ + tags->context[idx].name_length = 0; \ + tags->context[idx].data_parser = MyHTML_TOKENIZER_STATE_DATA; \ + memset(tags->context[idx].cats, MyHTML_TAG_CATEGORIES_UNDEF, sizeof(tags->context[idx].cats)); + + +#define myhtml_tag_context_add(tags) \ + tags->context_length++; \ + if(tags->context_length == tags->context_size) { \ + tags->context_size += 4096; \ + tags->context = (myhtml_tag_context_t*)myhtml_realloc(tags->context, \ + sizeof(myhtml_tag_context_t) * tags->context_size); \ + } \ + myhtml_tag_context_clean(tags, tags->context_length) + +#define myhtml_tag_index_clean_node(index_node) \ + memset(index_node, 0, sizeof(myhtml_tag_index_node_t)); + +struct myhtml_tag_index_entry { + myhtml_tag_index_node_t *first; + myhtml_tag_index_node_t *last; + size_t count; +}; + +struct myhtml_tag_index_node { + myhtml_tag_index_node_t *next; + myhtml_tag_index_node_t *prev; + + myhtml_tree_node_t* node; +}; + +struct myhtml_tag_index { + myhtml_tag_index_entry_t* tags; + size_t tags_length; + size_t tags_size; +}; + +struct myhtml_tag_context { + myhtml_tag_id_t id; + + const char* name; + size_t name_length; + + enum myhtml_tokenizer_state data_parser; + enum myhtml_tag_categories cats[MyHTML_NAMESPACE_LAST_ENTRY]; +} +typedef myhtml_tag_context_t; + +struct myhtml_tag_static_list { + const myhtml_tag_context_t* ctx; + size_t next; + size_t cur; +} +typedef myhtml_tag_static_list_t; + +struct myhtml_tag { + mctree_t* tree; + mcsimple_t* mcsimple_context; + + size_t tags_count; + size_t mchar_node; + + mchar_async_t *mchar; + mcobject_t *mcobject_tag_index; +}; + +myhtml_tag_t * myhtml_tag_create(void); +myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags); +void myhtml_tag_clean(myhtml_tag_t* tags); +myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags); + +myhtml_tag_id_t myhtml_tag_add(myhtml_tag_t* tags, const char* key, size_t key_size, + enum myhtml_tokenizer_state data_parser, bool to_lcase); + +void myhtml_tag_set_category(myhtml_tag_t* tags, myhtml_tag_id_t tag_idx, + enum myhtml_namespace ns, enum myhtml_tag_categories cats); + +myhtml_tag_index_t * myhtml_tag_index_create(void); +myhtml_status_t myhtml_tag_index_init(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index); +void myhtml_tag_index_clean(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index); +myhtml_tag_index_t * myhtml_tag_index_destroy(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index); + +myhtml_status_t myhtml_tag_index_add(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index, myhtml_tree_node_t* node); +myhtml_tag_index_entry_t * myhtml_tag_index_entry(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); +myhtml_tag_index_node_t * myhtml_tag_index_first(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); +myhtml_tag_index_node_t * myhtml_tag_index_last(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); +myhtml_tag_index_node_t * myhtml_tag_index_next(myhtml_tag_index_node_t *index_node); +myhtml_tag_index_node_t * myhtml_tag_index_prev(myhtml_tag_index_node_t *index_node); +myhtml_tree_node_t * myhtml_tag_index_tree_node(myhtml_tag_index_node_t *index_node); + +size_t myhtml_tag_index_entry_count(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +const myhtml_tag_context_t * myhtml_tag_get_by_id(myhtml_tag_t* tags, myhtml_tag_id_t tag_id); +const myhtml_tag_context_t * myhtml_tag_get_by_name(myhtml_tag_t* tags, const char* name, size_t length); + +const myhtml_tag_context_t * myhtml_tag_static_get_by_id(size_t idx); +const myhtml_tag_context_t * myhtml_tag_static_search(const char* name, size_t length); + +void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/include/myhtml/tag_const.h b/include/myhtml/tag_const.h new file mode 100644 index 0000000..0f5b389 --- /dev/null +++ b/include/myhtml/tag_const.h @@ -0,0 +1,293 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TAG_CONST_H +#define MyHTML_TAG_CONST_H +#pragma once + +#define MyHTML_BASE_STATIC_SIZE 479 + + +#ifdef __cplusplus +extern "C" { +#endif + +enum myhtml_tags { + MyHTML_TAG__UNDEF = 0x000, + MyHTML_TAG__TEXT = 0x001, + MyHTML_TAG__COMMENT = 0x002, + MyHTML_TAG__DOCTYPE = 0x003, + MyHTML_TAG_A = 0x004, + MyHTML_TAG_ABBR = 0x005, + MyHTML_TAG_ACRONYM = 0x006, + MyHTML_TAG_ADDRESS = 0x007, + MyHTML_TAG_ANNOTATION_XML = 0x008, + MyHTML_TAG_APPLET = 0x009, + MyHTML_TAG_AREA = 0x00a, + MyHTML_TAG_ARTICLE = 0x00b, + MyHTML_TAG_ASIDE = 0x00c, + MyHTML_TAG_AUDIO = 0x00d, + MyHTML_TAG_B = 0x00e, + MyHTML_TAG_BASE = 0x00f, + MyHTML_TAG_BASEFONT = 0x010, + MyHTML_TAG_BDI = 0x011, + MyHTML_TAG_BDO = 0x012, + MyHTML_TAG_BGSOUND = 0x013, + MyHTML_TAG_BIG = 0x014, + MyHTML_TAG_BLINK = 0x015, + MyHTML_TAG_BLOCKQUOTE = 0x016, + MyHTML_TAG_BODY = 0x017, + MyHTML_TAG_BR = 0x018, + MyHTML_TAG_BUTTON = 0x019, + MyHTML_TAG_CANVAS = 0x01a, + MyHTML_TAG_CAPTION = 0x01b, + MyHTML_TAG_CENTER = 0x01c, + MyHTML_TAG_CITE = 0x01d, + MyHTML_TAG_CODE = 0x01e, + MyHTML_TAG_COL = 0x01f, + MyHTML_TAG_COLGROUP = 0x020, + MyHTML_TAG_COMMAND = 0x021, + MyHTML_TAG_COMMENT = 0x022, + MyHTML_TAG_DATALIST = 0x023, + MyHTML_TAG_DD = 0x024, + MyHTML_TAG_DEL = 0x025, + MyHTML_TAG_DETAILS = 0x026, + MyHTML_TAG_DFN = 0x027, + MyHTML_TAG_DIALOG = 0x028, + MyHTML_TAG_DIR = 0x029, + MyHTML_TAG_DIV = 0x02a, + MyHTML_TAG_DL = 0x02b, + MyHTML_TAG_DT = 0x02c, + MyHTML_TAG_EM = 0x02d, + MyHTML_TAG_EMBED = 0x02e, + MyHTML_TAG_FIELDSET = 0x02f, + MyHTML_TAG_FIGCAPTION = 0x030, + MyHTML_TAG_FIGURE = 0x031, + MyHTML_TAG_FONT = 0x032, + MyHTML_TAG_FOOTER = 0x033, + MyHTML_TAG_FORM = 0x034, + MyHTML_TAG_FRAME = 0x035, + MyHTML_TAG_FRAMESET = 0x036, + MyHTML_TAG_H1 = 0x037, + MyHTML_TAG_H2 = 0x038, + MyHTML_TAG_H3 = 0x039, + MyHTML_TAG_H4 = 0x03a, + MyHTML_TAG_H5 = 0x03b, + MyHTML_TAG_H6 = 0x03c, + MyHTML_TAG_HEAD = 0x03d, + MyHTML_TAG_HEADER = 0x03e, + MyHTML_TAG_HGROUP = 0x03f, + MyHTML_TAG_HR = 0x040, + MyHTML_TAG_HTML = 0x041, + MyHTML_TAG_I = 0x042, + MyHTML_TAG_IFRAME = 0x043, + MyHTML_TAG_IMAGE = 0x044, + MyHTML_TAG_IMG = 0x045, + MyHTML_TAG_INPUT = 0x046, + MyHTML_TAG_INS = 0x047, + MyHTML_TAG_ISINDEX = 0x048, + MyHTML_TAG_KBD = 0x049, + MyHTML_TAG_KEYGEN = 0x04a, + MyHTML_TAG_LABEL = 0x04b, + MyHTML_TAG_LEGEND = 0x04c, + MyHTML_TAG_LI = 0x04d, + MyHTML_TAG_LINK = 0x04e, + MyHTML_TAG_LISTING = 0x04f, + MyHTML_TAG_MAIN = 0x050, + MyHTML_TAG_MAP = 0x051, + MyHTML_TAG_MARK = 0x052, + MyHTML_TAG_MARQUEE = 0x053, + MyHTML_TAG_MENU = 0x054, + MyHTML_TAG_MENUITEM = 0x055, + MyHTML_TAG_META = 0x056, + MyHTML_TAG_METER = 0x057, + MyHTML_TAG_MTEXT = 0x058, + MyHTML_TAG_NAV = 0x059, + MyHTML_TAG_NOBR = 0x05a, + MyHTML_TAG_NOEMBED = 0x05b, + MyHTML_TAG_NOFRAMES = 0x05c, + MyHTML_TAG_NOSCRIPT = 0x05d, + MyHTML_TAG_OBJECT = 0x05e, + MyHTML_TAG_OL = 0x05f, + MyHTML_TAG_OPTGROUP = 0x060, + MyHTML_TAG_OPTION = 0x061, + MyHTML_TAG_OUTPUT = 0x062, + MyHTML_TAG_P = 0x063, + MyHTML_TAG_PARAM = 0x064, + MyHTML_TAG_PLAINTEXT = 0x065, + MyHTML_TAG_PRE = 0x066, + MyHTML_TAG_PROGRESS = 0x067, + MyHTML_TAG_Q = 0x068, + MyHTML_TAG_RB = 0x069, + MyHTML_TAG_RP = 0x06a, + MyHTML_TAG_RT = 0x06b, + MyHTML_TAG_RTC = 0x06c, + MyHTML_TAG_RUBY = 0x06d, + MyHTML_TAG_S = 0x06e, + MyHTML_TAG_SAMP = 0x06f, + MyHTML_TAG_SCRIPT = 0x070, + MyHTML_TAG_SECTION = 0x071, + MyHTML_TAG_SELECT = 0x072, + MyHTML_TAG_SMALL = 0x073, + MyHTML_TAG_SOURCE = 0x074, + MyHTML_TAG_SPAN = 0x075, + MyHTML_TAG_STRIKE = 0x076, + MyHTML_TAG_STRONG = 0x077, + MyHTML_TAG_STYLE = 0x078, + MyHTML_TAG_SUB = 0x079, + MyHTML_TAG_SUMMARY = 0x07a, + MyHTML_TAG_SUP = 0x07b, + MyHTML_TAG_SVG = 0x07c, + MyHTML_TAG_TABLE = 0x07d, + MyHTML_TAG_TBODY = 0x07e, + MyHTML_TAG_TD = 0x07f, + MyHTML_TAG_TEMPLATE = 0x080, + MyHTML_TAG_TEXTAREA = 0x081, + MyHTML_TAG_TFOOT = 0x082, + MyHTML_TAG_TH = 0x083, + MyHTML_TAG_THEAD = 0x084, + MyHTML_TAG_TIME = 0x085, + MyHTML_TAG_TITLE = 0x086, + MyHTML_TAG_TR = 0x087, + MyHTML_TAG_TRACK = 0x088, + MyHTML_TAG_TT = 0x089, + MyHTML_TAG_U = 0x08a, + MyHTML_TAG_UL = 0x08b, + MyHTML_TAG_VAR = 0x08c, + MyHTML_TAG_VIDEO = 0x08d, + MyHTML_TAG_WBR = 0x08e, + MyHTML_TAG_XMP = 0x08f, + MyHTML_TAG_ALTGLYPH = 0x090, + MyHTML_TAG_ALTGLYPHDEF = 0x091, + MyHTML_TAG_ALTGLYPHITEM = 0x092, + MyHTML_TAG_ANIMATE = 0x093, + MyHTML_TAG_ANIMATECOLOR = 0x094, + MyHTML_TAG_ANIMATEMOTION = 0x095, + MyHTML_TAG_ANIMATETRANSFORM = 0x096, + MyHTML_TAG_CIRCLE = 0x097, + MyHTML_TAG_CLIPPATH = 0x098, + MyHTML_TAG_COLOR_PROFILE = 0x099, + MyHTML_TAG_CURSOR = 0x09a, + MyHTML_TAG_DEFS = 0x09b, + MyHTML_TAG_DESC = 0x09c, + MyHTML_TAG_ELLIPSE = 0x09d, + MyHTML_TAG_FEBLEND = 0x09e, + MyHTML_TAG_FECOLORMATRIX = 0x09f, + MyHTML_TAG_FECOMPONENTTRANSFER = 0x0a0, + MyHTML_TAG_FECOMPOSITE = 0x0a1, + MyHTML_TAG_FECONVOLVEMATRIX = 0x0a2, + MyHTML_TAG_FEDIFFUSELIGHTING = 0x0a3, + MyHTML_TAG_FEDISPLACEMENTMAP = 0x0a4, + MyHTML_TAG_FEDISTANTLIGHT = 0x0a5, + MyHTML_TAG_FEDROPSHADOW = 0x0a6, + MyHTML_TAG_FEFLOOD = 0x0a7, + MyHTML_TAG_FEFUNCA = 0x0a8, + MyHTML_TAG_FEFUNCB = 0x0a9, + MyHTML_TAG_FEFUNCG = 0x0aa, + MyHTML_TAG_FEFUNCR = 0x0ab, + MyHTML_TAG_FEGAUSSIANBLUR = 0x0ac, + MyHTML_TAG_FEIMAGE = 0x0ad, + MyHTML_TAG_FEMERGE = 0x0ae, + MyHTML_TAG_FEMERGENODE = 0x0af, + MyHTML_TAG_FEMORPHOLOGY = 0x0b0, + MyHTML_TAG_FEOFFSET = 0x0b1, + MyHTML_TAG_FEPOINTLIGHT = 0x0b2, + MyHTML_TAG_FESPECULARLIGHTING = 0x0b3, + MyHTML_TAG_FESPOTLIGHT = 0x0b4, + MyHTML_TAG_FETILE = 0x0b5, + MyHTML_TAG_FETURBULENCE = 0x0b6, + MyHTML_TAG_FILTER = 0x0b7, + MyHTML_TAG_FONT_FACE = 0x0b8, + MyHTML_TAG_FONT_FACE_FORMAT = 0x0b9, + MyHTML_TAG_FONT_FACE_NAME = 0x0ba, + MyHTML_TAG_FONT_FACE_SRC = 0x0bb, + MyHTML_TAG_FONT_FACE_URI = 0x0bc, + MyHTML_TAG_FOREIGNOBJECT = 0x0bd, + MyHTML_TAG_G = 0x0be, + MyHTML_TAG_GLYPH = 0x0bf, + MyHTML_TAG_GLYPHREF = 0x0c0, + MyHTML_TAG_HKERN = 0x0c1, + MyHTML_TAG_LINE = 0x0c2, + MyHTML_TAG_LINEARGRADIENT = 0x0c3, + MyHTML_TAG_MARKER = 0x0c4, + MyHTML_TAG_MASK = 0x0c5, + MyHTML_TAG_METADATA = 0x0c6, + MyHTML_TAG_MISSING_GLYPH = 0x0c7, + MyHTML_TAG_MPATH = 0x0c8, + MyHTML_TAG_PATH = 0x0c9, + MyHTML_TAG_PATTERN = 0x0ca, + MyHTML_TAG_POLYGON = 0x0cb, + MyHTML_TAG_POLYLINE = 0x0cc, + MyHTML_TAG_RADIALGRADIENT = 0x0cd, + MyHTML_TAG_RECT = 0x0ce, + MyHTML_TAG_SET = 0x0cf, + MyHTML_TAG_STOP = 0x0d0, + MyHTML_TAG_SWITCH = 0x0d1, + MyHTML_TAG_SYMBOL = 0x0d2, + MyHTML_TAG_TEXT = 0x0d3, + MyHTML_TAG_TEXTPATH = 0x0d4, + MyHTML_TAG_TREF = 0x0d5, + MyHTML_TAG_TSPAN = 0x0d6, + MyHTML_TAG_USE = 0x0d7, + MyHTML_TAG_VIEW = 0x0d8, + MyHTML_TAG_VKERN = 0x0d9, + MyHTML_TAG_MATH = 0x0da, + MyHTML_TAG_MACTION = 0x0db, + MyHTML_TAG_MALIGNGROUP = 0x0dc, + MyHTML_TAG_MALIGNMARK = 0x0dd, + MyHTML_TAG_MENCLOSE = 0x0de, + MyHTML_TAG_MERROR = 0x0df, + MyHTML_TAG_MFENCED = 0x0e0, + MyHTML_TAG_MFRAC = 0x0e1, + MyHTML_TAG_MGLYPH = 0x0e2, + MyHTML_TAG_MI = 0x0e3, + MyHTML_TAG_MLABELEDTR = 0x0e4, + MyHTML_TAG_MLONGDIV = 0x0e5, + MyHTML_TAG_MMULTISCRIPTS = 0x0e6, + MyHTML_TAG_MN = 0x0e7, + MyHTML_TAG_MO = 0x0e8, + MyHTML_TAG_MOVER = 0x0e9, + MyHTML_TAG_MPADDED = 0x0ea, + MyHTML_TAG_MPHANTOM = 0x0eb, + MyHTML_TAG_MROOT = 0x0ec, + MyHTML_TAG_MROW = 0x0ed, + MyHTML_TAG_MS = 0x0ee, + MyHTML_TAG_MSCARRIES = 0x0ef, + MyHTML_TAG_MSCARRY = 0x0f0, + MyHTML_TAG_MSGROUP = 0x0f1, + MyHTML_TAG_MSLINE = 0x0f2, + MyHTML_TAG_MSPACE = 0x0f3, + MyHTML_TAG_MSQRT = 0x0f4, + MyHTML_TAG_MSROW = 0x0f5, + MyHTML_TAG_MSTACK = 0x0f6, + MyHTML_TAG_MSTYLE = 0x0f7, + MyHTML_TAG_MSUB = 0x0f8, + MyHTML_TAG_MSUP = 0x0f9, + MyHTML_TAG_MSUBSUP = 0x0fa, + MyHTML_TAG__END_OF_FILE = 0x0fb, + MyHTML_TAG_FIRST_ENTRY = MyHTML_TAG__TEXT, + MyHTML_TAG_LAST_ENTRY = 0x0fc +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/include/myhtml/thread.h b/include/myhtml/thread.h new file mode 100644 index 0000000..e66a15d --- /dev/null +++ b/include/myhtml/thread.h @@ -0,0 +1,212 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_THREAD_H +#define MyHTML_THREAD_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + +#if !defined(IS_OS_WINDOWS) +# include +# include +#endif + +#include +#include + +#include +#include + +#include +#include +#include + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +#define MyTHREAD_SEM_NAME "myhtml" + + +#ifdef MyHTML_BUILD_WITHOUT_THREADS + +struct mythread { + int sys_last_error; +}; + +#else /* MyHTML_BUILD_WITHOUT_THREADS */ + +void mythread_function_stream(void *arg); +void mythread_function_batch(void *arg); + +// thread +struct mythread_context { + mythread_id_t id; + +#if defined(IS_OS_WINDOWS) + HANDLE mutex; +#else + pthread_mutex_t *mutex; +#endif + + size_t sem_name_size; + + mythread_f func; + + volatile size_t t_count; + volatile mythread_thread_opt_t opt; + + mythread_t *mythread; +}; + +struct mythread_list { +#if defined(IS_OS_WINDOWS) + HANDLE pth; +#else + pthread_t pth; +#endif + mythread_context_t data; +}; + +struct mythread_workers_list { + mythread_list_t *list; + size_t count; +}; + +struct mythread { + mythread_list_t *pth_list; + size_t pth_list_length; + size_t pth_list_size; + size_t pth_list_root; + + mythread_queue_list_t *queue_list; + + char *sem_prefix; + size_t sem_prefix_length; + +#if !defined(IS_OS_WINDOWS) + pthread_attr_t *attr; +#endif + + int sys_last_error; + + mythread_id_t batch_first_id; + mythread_id_t batch_count; + + volatile mythread_thread_opt_t stream_opt; + volatile mythread_thread_opt_t batch_opt; +}; + +mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_f func, myhtml_status_t *status); +mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml_status_t *status, size_t count); + +void myhtml_thread_nanosleep(const struct timespec *tomeout); + +#endif + +mythread_t * mythread_create(void); +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size); +void mythread_clean(mythread_t *mythread); +mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy); + +void mythread_stream_quit_all(mythread_t *mythread); +void mythread_batch_quit_all(mythread_t *mythread); + +void mythread_stream_stop_all(mythread_t *mythread); +void mythread_batch_stop_all(mythread_t *mythread); + +void mythread_stop_all(mythread_t *mythread); +void mythread_wait_all_for_done(mythread_t *mythread); +void mythread_resume_all(mythread_t *mythread); +void mythread_suspend_all(mythread_t *mythread); + +// queue +struct mythread_queue_node { + mythread_queue_node_t *prev; + myhtml_token_node_t *token; + myhtml_tree_t *tree; +}; + +struct mythread_queue_thread_param { + volatile size_t use; +}; + +struct mythread_queue_list_entry { + mythread_queue_list_entry_t *next; + mythread_queue_list_entry_t *prev; + mythread_queue_t *queue; + mythread_queue_thread_param_t *thread_param; +}; + +struct mythread_queue_list { + mythread_queue_list_entry_t *first; + mythread_queue_list_entry_t *last; + + volatile size_t count; +}; + +struct mythread_queue { + mythread_queue_node_t **nodes; + + size_t nodes_pos; + size_t nodes_pos_size; + size_t nodes_length; + + volatile size_t nodes_uses; + volatile size_t nodes_size; + volatile size_t nodes_root; +}; + +mythread_queue_t * mythread_queue_create(size_t size, myhtml_status_t *status); +void mythread_queue_clean(mythread_queue_t* queue); +mythread_queue_t * mythread_queue_destroy(mythread_queue_t* token); + +void mythread_queue_node_clean(mythread_queue_node_t* qnode); + +size_t mythread_queue_count_used_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode); +mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, myhtml_status_t *status); +mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, myhtml_status_t *status); + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + +mythread_queue_list_t * mythread_queue_list_create(mythread_t *mythread, myhtml_status_t *status); +mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status); +mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue); +void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry); +void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry); + +mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, myhtml_status_t *status); + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* defined(__myhtml__myhtml_thread__) */ + diff --git a/include/myhtml/token.h b/include/myhtml/token.h new file mode 100644 index 0000000..d32ae4a --- /dev/null +++ b/include/myhtml/token.h @@ -0,0 +1,168 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TOKEN_H +#define MyHTML_TOKEN_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define myhtml_token_attr_malloc(token, attr_node, thread_idx) \ + attr_node = mcobject_async_malloc(token->attr_obj, thread_idx, NULL); \ + myhtml_token_attr_clean(attr_node) + +#define myhtml_token_node_set_done(token_node) token_node->type |= MyHTML_TOKEN_TYPE_DONE + +#define myhtml_token_node_malloc(token, token_node, thread_idx) \ + token_node = (myhtml_token_node_t*)mcobject_async_malloc(token->nodes_obj, thread_idx, NULL); \ + myhtml_token_node_clean(token_node) + +struct myhtml_token_replacement_entry { + char* from; + size_t from_size; + + char* to; + size_t to_size; +}; + +struct myhtml_token_namespace_replacement { + char* from; + size_t from_size; + + char* to; + size_t to_size; + + enum myhtml_namespace ns; +}; + +struct myhtml_token_attr { + myhtml_token_attr_t* next; + myhtml_token_attr_t* prev; + + myhtml_string_t key; + myhtml_string_t value; + + size_t raw_key_begin; + size_t raw_key_length; + size_t raw_value_begin; + size_t raw_value_length; + + enum myhtml_namespace ns; +}; + +struct myhtml_token_node { + myhtml_tag_id_t tag_id; + + myhtml_string_t str; + + size_t raw_begin; + size_t raw_length; + + size_t element_begin; + size_t element_length; + + myhtml_token_attr_t* attr_first; + myhtml_token_attr_t* attr_last; + + volatile enum myhtml_token_type type; +}; + +struct myhtml_token { + myhtml_tree_t* tree; // ref + + mcobject_async_t* nodes_obj; // myhtml_token_node_t + mcobject_async_t* attr_obj; // myhtml_token_attr_t + + // def thread node id + size_t mcasync_token_id; + size_t mcasync_attr_id; + + bool is_new_tmp; +}; + +myhtml_token_t * myhtml_token_create(myhtml_tree_t* tree, size_t size); +void myhtml_token_clean(myhtml_token_t* token); +void myhtml_token_clean_all(myhtml_token_t* token); +myhtml_token_t * myhtml_token_destroy(myhtml_token_t* token); + +myhtml_tag_id_t myhtml_token_node_tag_id(myhtml_token_node_t *token_node); +myhtml_position_t myhtml_token_node_raw_pasition(myhtml_token_node_t *token_node); +myhtml_position_t myhtml_token_node_element_pasition(myhtml_token_node_t *token_node); + +myhtml_tree_attr_t * myhtml_token_node_attribute_first(myhtml_token_node_t *token_node); +myhtml_tree_attr_t * myhtml_token_node_attribute_last(myhtml_token_node_t *token_node); + +const char * myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); +myhtml_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node); + +bool myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); + +void myhtml_token_node_clean(myhtml_token_node_t* node); +void myhtml_token_attr_clean(myhtml_token_attr_t* attr); +myhtml_token_attr_t * myhtml_token_attr_remove(myhtml_token_node_t* node, myhtml_token_attr_t* attr); +myhtml_token_attr_t * myhtml_token_attr_remove_by_name(myhtml_token_node_t* node, const char* name, size_t name_length); +void myhtml_token_attr_delete_all(myhtml_token_t* token, myhtml_token_node_t* node); +void myhtml_token_delete(myhtml_token_t* token, myhtml_token_node_t* node); +void myhtml_token_node_wait_for_done(myhtml_token_node_t* node); +void myhtml_token_set_done(myhtml_token_node_t* node); + +myhtml_token_attr_t * myhtml_token_attr_match(myhtml_token_t* token, myhtml_token_node_t* target, const char* key, size_t key_size, const char* value, size_t value_size); +myhtml_token_attr_t * myhtml_token_attr_match_case(myhtml_token_t* token, myhtml_token_node_t* target, const char* key, size_t key_size, const char* value, size_t value_size); + +bool myhtml_token_release_and_check_doctype_attributes(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_tree_doctype_t* return_doctype); + +void myhtml_token_adjust_mathml_attributes(myhtml_token_node_t* target); +void myhtml_token_adjust_svg_attributes(myhtml_token_node_t* target); +void myhtml_token_adjust_foreign_attributes(myhtml_token_node_t* target); + +myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx); +myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx, myhtml_encoding_t encoding); +void myhtml_token_node_text_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* text, size_t text_len); +void myhtml_token_node_attr_copy(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); +void myhtml_token_node_attr_copy_with_check(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); +myhtml_token_node_t * myhtml_token_node_clone(myhtml_token_t* token, myhtml_token_node_t* node, size_t token_thread_idx, size_t attr_thread_idx); +bool myhtml_token_attr_copy(myhtml_token_t* token, myhtml_token_attr_t* attr, myhtml_token_node_t* dest, size_t thread_idx); +myhtml_token_attr_t * myhtml_token_attr_by_name(myhtml_token_node_t* node, const char* name, size_t name_size); +bool myhtml_token_attr_compare(myhtml_token_node_t* target, myhtml_token_node_t* dest); +myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, myhtml_token_node_t* token_to, myhtml_token_node_t* token_from, bool cp_reverse); +void myhtml_token_set_replacement_character_for_null_token(myhtml_tree_t* tree, myhtml_token_node_t* node); + +void myhtml_token_print_param_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); +void myhtml_token_print_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); +void myhtml_token_print_attr(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_token_h */ diff --git a/include/myhtml/tokenizer.h b/include/myhtml/tokenizer.h new file mode 100644 index 0000000..b0b4eb6 --- /dev/null +++ b/include/myhtml/tokenizer.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TOKENIZER_H +#define MyHTML_TOKENIZER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#define MyHTML_TOKENIZER_CHAR_OTHER '\000' +#define MyHTML_TOKENIZER_CHAR_A_Z_a_z '\001' +#define MyHTML_TOKENIZER_CHAR_WHITESPACE '\002' + +#define myhtml_tokenizer_inc_html_offset(offset, size) \ + offset++; \ + if(offset >= size) \ + return offset + +myhtml_status_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length); +myhtml_status_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length); +myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length); +myhtml_status_t myhtml_tokenizer_end(myhtml_tree_t* tree); +void myhtml_tokenizer_set_state(myhtml_tree_t* tree, myhtml_token_node_t* token_node); + +void myhtml_tokenizer_calc_current_namespace(myhtml_tree_t* tree, myhtml_token_node_t* token_node); + +myhtml_tree_node_t * myhtml_tokenizer_fragment_init(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, enum myhtml_namespace ns); + +void myhtml_tokenizer_wait(myhtml_tree_t* tree); +void myhtml_tokenizer_post(myhtml_tree_t* tree); +void myhtml_tokenizer_pause(myhtml_tree_t* tree); + +myhtml_status_t myhtml_tokenizer_state_init(myhtml_t* myhtml); +void myhtml_tokenizer_state_destroy(myhtml_t* myhtml); + +myhtml_token_node_t * myhtml_tokenizer_queue_create_text_node_if_need(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t absolute_html_offset, enum myhtml_token_type type); +void myhtml_check_tag_parser(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset); + +size_t myhtml_tokenizer_state_bogus_comment(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/include/myhtml/tokenizer_doctype.h b/include/myhtml/tokenizer_doctype.h new file mode 100644 index 0000000..6e36004 --- /dev/null +++ b/include/myhtml/tokenizer_doctype.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TOKENIZER_DOCTYPE_H +#define MyHTML_TOKENIZER_DOCTYPE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +size_t myhtml_tokenizer_state_doctype(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_before_doctype_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_doctype_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_after_doctype_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_custom_after_doctype_name_a_z(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_before_doctype_public_identifier(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_doctype_public_identifier_double_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_doctype_public_identifier_single_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_after_doctype_public_identifier(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_doctype_system_identifier_double_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_doctype_system_identifier_single_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_after_doctype_system_identifier(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_bogus_doctype(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_tokenizer_doctype_h */ diff --git a/include/myhtml/tokenizer_end.h b/include/myhtml/tokenizer_end.h new file mode 100644 index 0000000..08f3906 --- /dev/null +++ b/include/myhtml/tokenizer_end.h @@ -0,0 +1,102 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TOKENIZER_END_H +#define MyHTML_TOKENIZER_END_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +size_t myhtml_tokenizer_end_state_data(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_self_closing_start_tag(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_markup_declaration_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_before_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_after_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_before_attribute_value(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_attribute_value_double_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_attribute_value_single_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_attribute_value_unquoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_comment_start(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_comment_start_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_comment(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_comment_end(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_comment_end_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_comment_end_bang(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_bogus_comment(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_cdata_section(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +size_t myhtml_tokenizer_end_state_rcdata(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_rcdata_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_rcdata_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_rcdata_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +size_t myhtml_tokenizer_end_state_rawtext(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_rawtext_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_rawtext_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_rawtext_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +size_t myhtml_tokenizer_end_state_plaintext(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_doctype(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_before_doctype_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_doctype_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_after_doctype_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_custom_after_doctype_name_a_z(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_before_doctype_public_identifier(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_doctype_public_identifier_double_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_doctype_public_identifier_single_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_after_doctype_public_identifier(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_doctype_system_identifier_double_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_doctype_system_identifier_single_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_after_doctype_system_identifier(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_bogus_doctype(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escape_start(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escape_start_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escaped(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escaped_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escaped_dash_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escaped_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escaped_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_escaped_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_double_escape_start(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_double_escaped(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_double_escaped_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_double_escaped_dash_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_double_escaped_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_end_state_script_data_double_escape_end(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_tokenizer_end_h */ diff --git a/include/myhtml/tokenizer_script.h b/include/myhtml/tokenizer_script.h new file mode 100644 index 0000000..b1d61b3 --- /dev/null +++ b/include/myhtml/tokenizer_script.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TOKENIZER_SCRIPT_H +#define MyHTML_TOKENIZER_SCRIPT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +size_t myhtml_tokenizer_state_script_data(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escape_start(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escape_start_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escaped(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escaped_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escaped_dash_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escaped_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escaped_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_escaped_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_double_escape_start(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_double_escaped(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_double_escaped_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_double_escaped_dash_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_double_escaped_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); +size_t myhtml_tokenizer_state_script_data_double_escape_end(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_tokenizer_script_h */ diff --git a/include/myhtml/tree.h b/include/myhtml/tree.h new file mode 100644 index 0000000..78ef23a --- /dev/null +++ b/include/myhtml/tree.h @@ -0,0 +1,426 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TREE_H +#define MyHTML_TREE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define myhtml_tree_get(tree, attr) tree->attr +#define myhtml_tree_set(tree, attr) tree->attr + +#define myhtml_tree_token_current(tree) myhtml_tree_get(tree, token_current) +#define myhtml_tree_token_attr_current(tree) myhtml_tree_get(tree, attr_current) + +#define myhtml_tree_node_get(tree, node_id, attr) tree->nodes[node_id].attr + +#define myhtml_tree_node_callback_insert(tree, node) \ + if(tree->callback_tree_node_insert) \ + tree->callback_tree_node_insert(tree, node, tree->callback_tree_node_insert_ctx) + +#define myhtml_tree_node_callback_remove(tree, node) \ + if(tree->callback_tree_node_remove) \ + tree->callback_tree_node_remove(tree, node, tree->callback_tree_node_remove_ctx) + +enum myhtml_tree_node_type { + MyHTML_TYPE_NONE = 0, + MyHTML_TYPE_BLOCK = 1, + MyHTML_TYPE_INLINE = 2, + MyHTML_TYPE_TABLE = 3, + MyHTML_TYPE_META = 4, + MyHTML_TYPE_COMMENT = 5 +}; + +enum myhtml_close_type { + MyHTML_CLOSE_TYPE_NONE = 0, + MyHTML_CLOSE_TYPE_NOW = 1, + MyHTML_CLOSE_TYPE_SELF = 2, + MyHTML_CLOSE_TYPE_BLOCK = 3 +}; + +enum myhtml_tree_node_flags { + MyHTML_TREE_NODE_UNDEF = 0, + MyHTML_TREE_NODE_PARSER_INSERTED = 1, + MyHTML_TREE_NODE_BLOCKING = 2 +}; + +struct myhtml_tree_node { + enum myhtml_tree_node_flags flags; + + myhtml_tag_id_t tag_id; + enum myhtml_namespace ns; + + myhtml_tree_node_t* prev; // предыдущий ид элемента этого же уровня + myhtml_tree_node_t* next; // следеющий ид эелента этого же уровня + myhtml_tree_node_t* child; // ид чилда + myhtml_tree_node_t* parent; // ид родителя + + myhtml_tree_node_t* last_child; // + + myhtml_token_node_t* token; +}; + +enum myhtml_tree_compat_mode { + MyHTML_TREE_COMPAT_MODE_NO_QUIRKS = 0x00, + MyHTML_TREE_COMPAT_MODE_QUIRKS = 0x01, + MyHTML_TREE_COMPAT_MODE_LIMITED_QUIRKS = 0x02 +}; + +enum myhtml_tree_doctype_id { + MyHTML_TREE_DOCTYPE_ID_NAME = 0x00, + MyHTML_TREE_DOCTYPE_ID_SYSTEM = 0x01, + MyHTML_TREE_DOCTYPE_ID_PUBLIC = 0x02 +}; + +enum myhtml_tree_insertion_mode { + MyHTML_TREE_INSERTION_MODE_DEFAULT = 0x00, + MyHTML_TREE_INSERTION_MODE_BEFORE = 0x01, + MyHTML_TREE_INSERTION_MODE_AFTER = 0x02 +}; + +struct myhtml_async_args { + size_t mchar_node_id; +}; + +struct myhtml_tree_doctype { + bool is_html; + char* attr_name; + char* attr_public; + char* attr_system; +}; + +struct myhtml_tree_indexes { + myhtml_tag_index_t* tags; +}; + +struct myhtml_tree_list { + myhtml_tree_node_t** list; + volatile size_t length; + size_t size; +}; + +struct myhtml_tree_token_list { + myhtml_token_node_t** list; + size_t length; + size_t size; +}; + +struct myhtml_tree_insertion_list { + enum myhtml_insertion_mode* list; + size_t length; + size_t size; +}; + +struct myhtml_tree_temp_tag_name { + char *data; + size_t length; + size_t size; +}; + +struct myhtml_tree_special_token { + myhtml_token_node_t *token; + myhtml_namespace_t ns; +} +typedef myhtml_tree_special_token_t; + +struct myhtml_tree_special_token_list { + myhtml_tree_special_token_t *list; + size_t length; + size_t size; +} +typedef myhtml_tree_special_token_list_t; + +struct myhtml_tree_temp_stream { + struct myhtml_tree_temp_tag_name** data; + size_t length; + size_t size; + + myhtml_encoding_result_t res; + struct myhtml_tree_temp_tag_name* current; +}; + +struct myhtml_tree { + // ref + myhtml_t* myhtml; + mchar_async_t* mchar; + myhtml_token_t* token; + mcobject_async_t* tree_obj; + mcsync_t* sync; + mythread_queue_list_entry_t* queue_entry; + mythread_queue_t* queue; + myhtml_tag_t* tags; + void* modest; + + // init id's + size_t mcasync_token_id; + size_t mcasync_attr_id; + size_t mcasync_tree_id; + size_t mchar_node_id; + myhtml_token_attr_t* attr_current; + myhtml_tag_id_t tmp_tag_id; + myhtml_token_node_t* current_token_node; + mythread_queue_node_t* current_qnode; + + mcobject_t* mcobject_incoming_buf; + myhtml_incoming_buffer_t* incoming_buf; + myhtml_incoming_buffer_t* incoming_buf_first; + + myhtml_tree_indexes_t* indexes; + + // ref for nodes + myhtml_tree_node_t* document; + myhtml_tree_node_t* fragment; + myhtml_tree_node_t* node_head; + myhtml_tree_node_t* node_html; + myhtml_tree_node_t* node_body; + myhtml_tree_node_t* node_form; + myhtml_tree_doctype_t doctype; + + // for build tree + myhtml_tree_list_t* active_formatting; + myhtml_tree_list_t* open_elements; + myhtml_tree_list_t* other_elements; + myhtml_tree_token_list_t* token_list; + myhtml_tree_insertion_list_t* template_insertion; + myhtml_async_args_t* async_args; + myhtml_stream_buffer_t* stream_buffer; + myhtml_token_node_t* volatile token_last_done; + + // for detect namespace out of tree builder + myhtml_token_node_t* token_namespace; + + // tree params + enum myhtml_tokenizer_state state; + enum myhtml_tokenizer_state state_of_builder; + enum myhtml_insertion_mode insert_mode; + enum myhtml_insertion_mode orig_insert_mode; + enum myhtml_tree_compat_mode compat_mode; + volatile enum myhtml_tree_flags flags; + volatile myhtml_tree_parse_flags_t parse_flags; + bool foster_parenting; + size_t global_offset; + + myhtml_encoding_t encoding; + myhtml_encoding_t encoding_usereq; + myhtml_tree_temp_tag_name_t temp_tag_name; + + /* callback */ + myhtml_callback_token_f callback_before_token; + myhtml_callback_token_f callback_after_token; + + void* callback_before_token_ctx; + void* callback_after_token_ctx; + + myhtml_callback_tree_node_f callback_tree_node_insert; + myhtml_callback_tree_node_f callback_tree_node_remove; + + void* callback_tree_node_insert_ctx; + void* callback_tree_node_remove_ctx; +}; + +// base +myhtml_tree_t * myhtml_tree_create(void); +myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); +void myhtml_tree_clean(myhtml_tree_t* tree); +void myhtml_tree_clean_all(myhtml_tree_t* tree); +myhtml_tree_t * myhtml_tree_destroy(myhtml_tree_t* tree); + +/* parse flags */ +myhtml_tree_parse_flags_t myhtml_tree_parse_flags(myhtml_tree_t* tree); +void myhtml_tree_parse_flags_set(myhtml_tree_t* tree, myhtml_tree_parse_flags_t flags); + +myhtml_t * myhtml_tree_get_myhtml(myhtml_tree_t* tree); +myhtml_tag_t * myhtml_tree_get_tag(myhtml_tree_t* tree); +myhtml_tag_index_t * myhtml_tree_get_tag_index(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_tree_get_document(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_tree_get_node_html(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_tree_get_node_head(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_tree_get_node_body(myhtml_tree_t* tree); + +mchar_async_t * myhtml_tree_get_mchar(myhtml_tree_t* tree); +size_t myhtml_tree_get_mchar_node_id(myhtml_tree_t* tree); + +// list +myhtml_tree_list_t * myhtml_tree_list_init(void); +void myhtml_tree_list_clean(myhtml_tree_list_t* list); +myhtml_tree_list_t * myhtml_tree_list_destroy(myhtml_tree_list_t* list, bool destroy_self); + +void myhtml_tree_list_append(myhtml_tree_list_t* list, myhtml_tree_node_t* node); +void myhtml_tree_list_append_after_index(myhtml_tree_list_t* list, myhtml_tree_node_t* node, size_t index); +void myhtml_tree_list_insert_by_index(myhtml_tree_list_t* list, myhtml_tree_node_t* node, size_t index); +myhtml_tree_node_t * myhtml_tree_list_current_node(myhtml_tree_list_t* list); + +// token list +myhtml_tree_token_list_t * myhtml_tree_token_list_init(void); +void myhtml_tree_token_list_clean(myhtml_tree_token_list_t* list); +myhtml_tree_token_list_t * myhtml_tree_token_list_destroy(myhtml_tree_token_list_t* list, bool destroy_self); + +void myhtml_tree_token_list_append(myhtml_tree_token_list_t* list, myhtml_token_node_t* token); +void myhtml_tree_token_list_append_after_index(myhtml_tree_token_list_t* list, myhtml_token_node_t* token, size_t index); +myhtml_token_node_t * myhtml_tree_token_list_current_node(myhtml_tree_token_list_t* list); + +// active formatting +myhtml_tree_list_t * myhtml_tree_active_formatting_init(myhtml_tree_t* tree); +void myhtml_tree_active_formatting_clean(myhtml_tree_t* tree); +myhtml_tree_list_t * myhtml_tree_active_formatting_destroy(myhtml_tree_t* tree); + +bool myhtml_tree_active_formatting_is_marker(myhtml_tree_t* tree, myhtml_tree_node_t* idx); +myhtml_tree_node_t* myhtml_tree_active_formatting_between_last_marker(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, size_t* return_idx); + +void myhtml_tree_active_formatting_append(myhtml_tree_t* tree, myhtml_tree_node_t* node); +void myhtml_tree_active_formatting_append_with_check(myhtml_tree_t* tree, myhtml_tree_node_t* node); +void myhtml_tree_active_formatting_pop(myhtml_tree_t* tree); +void myhtml_tree_active_formatting_remove(myhtml_tree_t* tree, myhtml_tree_node_t* node); +void myhtml_tree_active_formatting_remove_by_index(myhtml_tree_t* tree, size_t idx); + +void myhtml_tree_active_formatting_reconstruction(myhtml_tree_t* tree); +void myhtml_tree_active_formatting_up_to_last_marker(myhtml_tree_t* tree); + +bool myhtml_tree_active_formatting_find(myhtml_tree_t* tree, myhtml_tree_node_t* idx, size_t* return_idx); +myhtml_tree_node_t* myhtml_tree_active_formatting_current_node(myhtml_tree_t* tree); + +// open elements +myhtml_tree_list_t * myhtml_tree_open_elements_init(myhtml_tree_t* tree); +void myhtml_tree_open_elements_clean(myhtml_tree_t* tree); +myhtml_tree_list_t * myhtml_tree_open_elements_destroy(myhtml_tree_t* tree); + +myhtml_tree_node_t* myhtml_tree_current_node(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_tree_adjusted_current_node(myhtml_tree_t* tree); + +void myhtml_tree_open_elements_append(myhtml_tree_t* tree, myhtml_tree_node_t* node); +void myhtml_tree_open_elements_append_after_index(myhtml_tree_t* tree, myhtml_tree_node_t* node, size_t index); +void myhtml_tree_open_elements_pop(myhtml_tree_t* tree); +void myhtml_tree_open_elements_pop_until(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, bool is_exclude); +void myhtml_tree_open_elements_pop_until_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node_idx, bool is_exclude); +void myhtml_tree_open_elements_pop_until_by_index(myhtml_tree_t* tree, size_t idx, bool is_exclude); +void myhtml_tree_open_elements_remove(myhtml_tree_t* tree, myhtml_tree_node_t* node); + +bool myhtml_tree_open_elements_find(myhtml_tree_t* tree, myhtml_tree_node_t* idx, size_t* pos); +bool myhtml_tree_open_elements_find_reverse(myhtml_tree_t* tree, myhtml_tree_node_t* idx, size_t* pos); +myhtml_tree_node_t * myhtml_tree_open_elements_find_by_tag_idx(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, size_t* return_index); +myhtml_tree_node_t * myhtml_tree_open_elements_find_by_tag_idx_reverse(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, size_t* return_index); +myhtml_tree_node_t * myhtml_tree_element_in_scope(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, enum myhtml_tag_categories category); +bool myhtml_tree_element_in_scope_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, enum myhtml_tag_categories category); +void myhtml_tree_generate_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_id_t exclude_tag_idx, myhtml_namespace_t mynamespace); +void myhtml_tree_generate_all_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_id_t exclude_tag_idx, myhtml_namespace_t mynamespace); +myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting(myhtml_tree_t* tree, myhtml_tree_node_t* override_target, enum myhtml_tree_insertion_mode* mode); +myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting_in_tree(myhtml_tree_t* tree, myhtml_tree_node_t* target, enum myhtml_tree_insertion_mode* mode); + +// template insertion +myhtml_tree_insertion_list_t * myhtml_tree_template_insertion_init(myhtml_tree_t* tree); +void myhtml_tree_template_insertion_clean(myhtml_tree_t* tree); +myhtml_tree_insertion_list_t * myhtml_tree_template_insertion_destroy(myhtml_tree_t* tree); + +void myhtml_tree_template_insertion_append(myhtml_tree_t* tree, enum myhtml_insertion_mode insert_mode); +void myhtml_tree_template_insertion_pop(myhtml_tree_t* tree); + +void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree); + +bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_id_t subject_tag_idx); +size_t myhtml_tree_template_insertion_length(myhtml_tree_t* tree); + +// other for a tree +myhtml_tree_node_t * myhtml_tree_node_create(myhtml_tree_t* tree); +void myhtml_tree_node_delete(myhtml_tree_t* tree, myhtml_tree_node_t* node); +void myhtml_tree_node_delete_recursive(myhtml_tree_t* tree, myhtml_tree_node_t* node); +void myhtml_tree_node_clean(myhtml_tree_node_t* tree_node); +void myhtml_tree_node_free(myhtml_tree_t* tree, myhtml_tree_node_t* node); +myhtml_tree_node_t * myhtml_tree_node_clone(myhtml_tree_t* tree, myhtml_tree_node_t* node); + +void myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out); +void myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc); +void myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc); + +void myhtml_tree_node_add_child(myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); +void myhtml_tree_node_insert_before(myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); +void myhtml_tree_node_insert_after(myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); +void myhtml_tree_node_insert_by_mode(myhtml_tree_t* tree, myhtml_tree_node_t* adjusted_location, myhtml_tree_node_t* node, enum myhtml_tree_insertion_mode mode); +myhtml_tree_node_t * myhtml_tree_node_remove(myhtml_tree_t* tree, myhtml_tree_node_t* node); + +myhtml_tree_node_t * myhtml_tree_node_insert_html_element(myhtml_tree_t* tree, myhtml_token_node_t* token); +myhtml_tree_node_t * myhtml_tree_node_insert_foreign_element(myhtml_tree_t* tree, myhtml_token_node_t* token); +myhtml_tree_node_t * myhtml_tree_node_insert_by_token(myhtml_tree_t* tree, myhtml_token_node_t* token, enum myhtml_namespace ns); +myhtml_tree_node_t * myhtml_tree_node_insert(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, enum myhtml_namespace ns); +myhtml_tree_node_t * myhtml_tree_node_insert_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* idx); +myhtml_tree_node_t * myhtml_tree_node_insert_comment(myhtml_tree_t* tree, myhtml_token_node_t* token, myhtml_tree_node_t* parent); +myhtml_tree_node_t * myhtml_tree_node_insert_doctype(myhtml_tree_t* tree, myhtml_token_node_t* token); +myhtml_tree_node_t * myhtml_tree_node_insert_root(myhtml_tree_t* tree, myhtml_token_node_t* token, enum myhtml_namespace ns); +myhtml_tree_node_t * myhtml_tree_node_insert_text(myhtml_tree_t* tree, myhtml_token_node_t* token); +myhtml_tree_node_t * myhtml_tree_node_find_parent_by_tag_id(myhtml_tree_node_t* node, myhtml_tag_id_t tag_id); + +// indexes +myhtml_tree_indexes_t * myhtml_tree_index_create(myhtml_tree_t* tree, myhtml_tag_t* tags); +void myhtml_tree_index_clean(myhtml_tree_t* tree, myhtml_tag_t* tags); +myhtml_tree_indexes_t * myhtml_tree_index_destroy(myhtml_tree_t* tree, myhtml_tag_t* tags); + +void myhtml_tree_index_append(myhtml_tree_t* tree, myhtml_tree_node_t* node); +myhtml_tree_node_t * myhtml_tree_index_get(myhtml_tree_t* tree, myhtml_tag_id_t tag_id); + +// other +void myhtml_tree_wait_for_last_done_token(myhtml_tree_t* tree, myhtml_token_node_t* token_for_wait); + +void myhtml_tree_tags_close_p(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_tree_generic_raw_text_element_parsing_algorithm(myhtml_tree_t* tree, myhtml_token_node_t* token_node); +void myhtml_tree_clear_stack_back_table_context(myhtml_tree_t* tree); +void myhtml_tree_clear_stack_back_table_body_context(myhtml_tree_t* tree); +void myhtml_tree_clear_stack_back_table_row_context(myhtml_tree_t* tree); +void myhtml_tree_close_cell(myhtml_tree_t* tree, myhtml_tree_node_t* tr_or_th_node); + +bool myhtml_tree_is_mathml_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node); +bool myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node); + +// temp tag name +myhtml_status_t myhtml_tree_temp_tag_name_init(myhtml_tree_temp_tag_name_t* temp_tag_name); +void myhtml_tree_temp_tag_name_clean(myhtml_tree_temp_tag_name_t* temp_tag_name); +myhtml_tree_temp_tag_name_t * myhtml_tree_temp_tag_name_destroy(myhtml_tree_temp_tag_name_t* temp_tag_name, bool self_destroy); +myhtml_status_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* temp_tag_name, const char* name, size_t name_len); +myhtml_status_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t* temp_tag_name, const char name); + +/* special tonek list */ +myhtml_status_t myhtml_tree_special_list_init(myhtml_tree_special_token_list_t* special); +myhtml_status_t myhtml_tree_special_list_append(myhtml_tree_special_token_list_t* special, myhtml_token_node_t *token, myhtml_namespace_t ns); +size_t myhtml_tree_special_list_length(myhtml_tree_special_token_list_t* special); +myhtml_tree_special_token_t * myhtml_tree_special_list_get_last(myhtml_tree_special_token_list_t* special); +size_t myhtml_tree_special_list_pop(myhtml_tree_special_token_list_t* special); + +/* incoming buffer */ +myhtml_incoming_buffer_t * myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); +const char * myhtml_tree_incomming_buffer_make_data(myhtml_tree_t *tree, size_t begin, size_t length); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_tree_h */ + + diff --git a/include/myhtml/utils.h b/include/myhtml/utils.h new file mode 100644 index 0000000..8843fe3 --- /dev/null +++ b/include/myhtml/utils.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_H +#define MyHTML_UTILS_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define myhtml_utils_whithspace(onechar, action, logic) \ + (onechar action ' ' logic \ + onechar action '\t' logic \ + onechar action '\n' logic \ + onechar action '\f' logic \ + onechar action '\r') + +size_t myhtml_strncasecmp(const char* str1, const char* str2, size_t size); +size_t myhtml_strcasecmp(const char* str1, const char* str2); +size_t myhtml_strncmp(const char* str1, const char* str2, size_t size); +size_t myhtml_strcmp(const char* str1, const char* str2); +size_t myhtml_strcmp_ws(const char* str1, const char* str2); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* utils_h */ diff --git a/include/myhtml/utils/mchar_async.h b/include/myhtml/utils/mchar_async.h new file mode 100644 index 0000000..eec939a --- /dev/null +++ b/include/myhtml/utils/mchar_async.h @@ -0,0 +1,129 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_MCHAR_ASYNC_H +#define MyHTML_UTILS_MCHAR_ASYNC_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define mchar_async_cache_has_nodes(cache) cache.count + +typedef struct mchar_async_node mchar_async_node_t; + +struct mchar_async_cache_node { + void *value; + size_t size; + + size_t left; + size_t right; + size_t parent; +} +typedef mchar_async_cache_node_t; + +struct mchar_async_chunk { + char *begin; + size_t length; + size_t size; + + struct mchar_async_chunk *next; + struct mchar_async_chunk *prev; +} +typedef mchar_async_chunk_t; + +struct mchar_async_cache { + mchar_async_cache_node_t *nodes; + size_t nodes_size; + size_t nodes_length; + size_t nodes_root; + + size_t count; + + size_t *index; + size_t index_length; + size_t index_size; +} +typedef mchar_async_cache_t; + +struct mchar_async_node { + mchar_async_chunk_t *chunk; + mchar_async_cache_t cache; +}; + +struct mchar_async { + size_t origin_size; + + mchar_async_chunk_t **chunks; + size_t chunks_pos_size; + size_t chunks_pos_length; + size_t chunks_size; + size_t chunks_length; + + mchar_async_cache_t chunk_cache; + + mchar_async_node_t *nodes; + size_t nodes_length; + size_t nodes_size; + + size_t *nodes_cache; + size_t nodes_cache_length; + size_t nodes_cache_size; + + mcsync_t *mcsync; +} +typedef mchar_async_t; + + +mchar_async_t * mchar_async_create(size_t pos_size, size_t size); +void mchar_async_init(mchar_async_t *mchar_async, size_t chunk_len, size_t char_size); +void mchar_async_clean(mchar_async_t *mchar_async); +mchar_async_t * mchar_async_destroy(mchar_async_t *mchar_async, int destroy_self); + +char * mchar_async_malloc(mchar_async_t *mchar_async, size_t node_idx, size_t size); +char * mchar_async_realloc(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t data_len, size_t new_size); +void mchar_async_free(mchar_async_t *mchar_async, size_t node_idx, char *entry); + +size_t mchar_async_node_add(mchar_async_t *mchar_async); +void mchar_async_node_clean(mchar_async_t *mchar_async, size_t node_idx); +void mchar_async_node_delete(mchar_async_t *mchar_async, size_t node_idx); + +mchar_async_chunk_t * mchar_async_chunk_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length); +char * mchar_async_crop_first_chars(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t crop_len); +char * mchar_async_crop_first_chars_without_cache(char *data, size_t crop_len); + +// cache +void mchar_async_cache_init(mchar_async_cache_t *cache); +mchar_async_cache_t * mchar_async_cache_destroy(mchar_async_cache_t *cache, bool self_destroy); +void mchar_async_cache_clean(mchar_async_cache_t *cache); + +void mchar_async_cache_add(mchar_async_cache_t *cache, void* value, size_t size); +size_t mchar_async_cache_delete(mchar_async_cache_t *cache, size_t size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mchar_async_h */ + diff --git a/include/myhtml/utils/mcobject.h b/include/myhtml/utils/mcobject.h new file mode 100644 index 0000000..b641327 --- /dev/null +++ b/include/myhtml/utils/mcobject.h @@ -0,0 +1,70 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_MCOBJECT_H +#define MyHTML_UTILS_MCOBJECT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct mcobject_chunk { + unsigned char *begin; + size_t length; + size_t size; + + struct mcobject_chunk *next; + struct mcobject_chunk *prev; +} +typedef mcobject_chunk_t; + +struct mcobject { + mcobject_chunk_t *chunk; + + void **cache; + size_t cache_size; + size_t cache_length; + + size_t struct_size; + size_t chunk_size; +} +typedef mcobject_t; + + +mcobject_t * mcobject_create(void); +myhtml_status_t mcobject_init(mcobject_t *mcobject, size_t chunk_size, size_t struct_size); +void mcobject_clean(mcobject_t *mcobject); +mcobject_t * mcobject_destroy(mcobject_t *mcobject, bool destroy_self); + +void mcobject_chunk_malloc(mcobject_t* mcobject, myhtml_status_t* status); + +void * mcobject_malloc(mcobject_t *mcobject, myhtml_status_t* status); +myhtml_status_t mcobject_free(mcobject_t *mcobject, void *entry); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_UTILS_MCOBJECT_H */ + diff --git a/include/myhtml/utils/mcobject_async.h b/include/myhtml/utils/mcobject_async.h new file mode 100644 index 0000000..4d632c2 --- /dev/null +++ b/include/myhtml/utils/mcobject_async.h @@ -0,0 +1,114 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_MCOBJECT_ASYNC_H +#define MyHTML_UTILS_MCOBJECT_ASYNC_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +enum mcobject_async_status { + MCOBJECT_ASYNC_STATUS_OK = 0, + MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION = 1, + MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION = 2, + MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION = 3, + MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION = 4, + MCOBJECT_ASYNC_STATUS_NODES_ERROR_BAD_NODE_ID = 5, + MCOBJECT_ASYNC_STATUS_CACHE_ERROR_MEMORY_REALLOC = 6 +} +typedef mcobject_async_status_t; + +struct mcobject_async_chunk { + unsigned char *begin; + size_t length; + size_t size; + + struct mcobject_async_chunk *next; + struct mcobject_async_chunk *prev; +} +typedef mcobject_async_chunk_t; + +struct mcobject_async_node { + mcobject_async_chunk_t *chunk; + + void **cache; + size_t cache_size; + size_t cache_length; +} +typedef mcobject_async_node_t; + +struct mcobject_async { + size_t origin_size; + size_t struct_size; + size_t struct_size_sn; + + mcobject_async_chunk_t **chunk_cache; + size_t chunk_cache_size; + size_t chunk_cache_length; + + mcobject_async_chunk_t **chunks; + size_t chunks_pos_size; + size_t chunks_pos_length; + size_t chunks_size; + size_t chunks_length; + + mcobject_async_node_t *nodes; + size_t nodes_length; + size_t nodes_size; + + size_t *nodes_cache; + size_t nodes_cache_length; + size_t nodes_cache_size; + + mcsync_t *mcsync; +} +typedef mcobject_async_t; + +mcobject_async_t * mcobject_async_create(void); +mcobject_async_status_t mcobject_async_init(mcobject_async_t *mcobj_async, size_t chunk_len, size_t obj_size_by_one_chunk, size_t struct_size); + +void mcobject_async_clean(mcobject_async_t *mcobj_async); +mcobject_async_t * mcobject_async_destroy(mcobject_async_t *mcobj_async, int destroy_self); + +size_t mcobject_async_node_add(mcobject_async_t *mcobj_async, mcobject_async_status_t *status); +void mcobject_async_node_clean(mcobject_async_t *mcobj_async, size_t node_idx); +void mcobject_async_node_all_clean(mcobject_async_t *mcobj_async); +void mcobject_async_node_delete(mcobject_async_t *mcobj_async, size_t node_idx); + +void * mcobject_async_malloc(mcobject_async_t *mcobj_async, size_t node_idx, mcobject_async_status_t *status); +mcobject_async_status_t mcobject_async_free(mcobject_async_t *mcobj_async, void *entry); + +mcobject_async_chunk_t * mcobject_async_chunk_malloc(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); +mcobject_async_chunk_t * mcobject_async_chunk_malloc_without_lock(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mcobject_async_h */ + + + + diff --git a/include/myhtml/utils/mcsimple.h b/include/myhtml/utils/mcsimple.h new file mode 100644 index 0000000..76a0294 --- /dev/null +++ b/include/myhtml/utils/mcsimple.h @@ -0,0 +1,61 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_MCSIMPLE_H +#define MyHTML_UTILS_MCSIMPLE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct mcsimple { + size_t struct_size; + + uint8_t **list; + + size_t list_pos_size; + size_t list_pos_length; + size_t list_pos_length_used; + size_t list_size; + size_t list_length; +} +typedef mcsimple_t; + + +mcsimple_t * mcsimple_create(void); +void mcsimple_init(mcsimple_t *mcsimple, size_t pos_size, size_t list_size, size_t struct_size); +void mcsimple_clean(mcsimple_t *mcsimple); +mcsimple_t * mcsimple_destroy(mcsimple_t *mcsimple, bool destroy_self); + +uint8_t * mcsimple_init_list_entries(mcsimple_t *mcsimple, size_t pos); + +void * mcsimple_malloc(mcsimple_t *mcsimple); +void * mcsimple_get_by_absolute_position(mcsimple_t *mcsimple, size_t pos); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_UTILS_MCSIMPLE_H */ + diff --git a/include/myhtml/utils/mcsync.h b/include/myhtml/utils/mcsync.h new file mode 100644 index 0000000..b9e268b --- /dev/null +++ b/include/myhtml/utils/mcsync.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_MCSYNC_H +#define MyHTML_UTILS_MCSYNC_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#include + +#if !defined(MyHTML_BUILD_WITHOUT_THREADS) +#if defined(IS_OS_WINDOWS) + typedef CRITICAL_SECTION pthread_mutex_t; + typedef unsigned long pthread_mutexattr_t; +#else +# include +#endif +#endif + +enum mcsync_status { + MCSYNC_STATUS_OK = 0, + MCSYNC_STATUS_NOT_OK = 1, + MCSYNC_STATUS_ERROR_MEM_ALLOCATE = 2 +} +typedef mcsync_status_t; + +struct mcsync { + int spinlock; +#if !defined(MyHTML_BUILD_WITHOUT_THREADS) + pthread_mutex_t *mutex; +#endif +} +typedef mcsync_t; + +mcsync_t * mcsync_create(void); +mcsync_status_t mcsync_init(mcsync_t* mcsync); +void mcsync_clean(mcsync_t* mcsync); +mcsync_t * mcsync_destroy(mcsync_t* mcsync, int destroy_self); + +mcsync_status_t mcsync_lock(mcsync_t* mclock); +mcsync_status_t mcsync_unlock(mcsync_t* mclock); + +mcsync_status_t mcsync_mutex_lock(mcsync_t* mclock); +mcsync_status_t mcsync_mutex_unlock(mcsync_t* mclock); + +#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && defined(IS_OS_WINDOWS) + static int pthread_mutex_lock(pthread_mutex_t *mutex); + static int pthread_mutex_unlock(pthread_mutex_t *mutex); + static int pthread_mutex_init(pthread_mutex_t *m, pthread_mutexattr_t *a); + static int pthread_mutex_destroy(pthread_mutex_t *m); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mcsync_h */ diff --git a/include/myhtml/utils/mctree.h b/include/myhtml/utils/mctree.h new file mode 100644 index 0000000..1ea16fe --- /dev/null +++ b/include/myhtml/utils/mctree.h @@ -0,0 +1,97 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_MCTREE_H +#define MyHTML_UTILS_MCTREE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include +#include +#include + +#define mctree_node_get_free_id(mctree) mctree->nodes_length + +#define mctree_node_clean(mctree, idx) \ + mctree->nodes[idx].str = NULL; \ + mctree->nodes[idx].value = NULL; \ + mctree->nodes[idx].child_count = 0; \ + mctree->nodes[idx].prev = 0; \ + mctree->nodes[idx].next = 0; \ + mctree->nodes[idx].child = 0 + +#define mctree_node_add(mctree) \ + mctree->nodes_length++; \ + if(mctree->nodes_length == mctree->nodes_size) { \ + mctree->nodes_size += 4096; \ + mctree->nodes = (mctree_node_t*)myhtml_realloc(mctree->nodes, \ + sizeof(mctree_node_t) * mctree->nodes_size); \ + } \ + mctree_node_clean(mctree, mctree->nodes_length) + +#define mctree_make_first_idx(mctree, key, size) \ + ((myhtml_string_chars_lowercase_map[ (const unsigned char)(key[0]) ] + myhtml_string_chars_lowercase_map[ (const unsigned char)(key[size - 1]) ]) % mctree->start_size) + 1 + + +typedef size_t mctree_index_t; + +struct mctree_node { + const char* str; + size_t str_size; + void* value; + + size_t child_count; + mctree_index_t prev; + mctree_index_t next; + mctree_index_t child; +} +typedef mctree_node_t; + +struct mctree_tree { + mctree_node_t* nodes; + size_t nodes_length; + size_t nodes_size; + + size_t start_size; +} +typedef mctree_t; + +typedef void (*mctree_before_insert_f)(const char* key, size_t key_size, void **value); + + +mctree_t * mctree_create(size_t start_size); +void mctree_clean(mctree_t* mctree); +mctree_t * mctree_destroy(mctree_t* mctree); + +mctree_index_t mctree_insert(mctree_t* mctree, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert); +mctree_index_t mctree_search(mctree_t* mctree, const char* key, size_t key_size); +mctree_index_t mctree_search_lowercase(mctree_t* mctree, const char* key, size_t key_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* defined(__mhtml__mtree__) */ diff --git a/include/myhtml/utils/resources.h b/include/myhtml/utils/resources.h new file mode 100644 index 0000000..a20f3a3 --- /dev/null +++ b/include/myhtml/utils/resources.h @@ -0,0 +1,208 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_UTILS_RESOURCES_H +#define MyHTML_UTILS_RESOURCES_H +#pragma once + +#include + +static const unsigned char myhtml_string_chars_num_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char myhtml_string_chars_hex_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char myhtml_string_chars_lowercase_map[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, + 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, + 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, + 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, + 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, + 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff +}; + +static const size_t replacement_character[] = { + 65533, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 8364, 129, 8218, 402, 8222, 8230, 8224, + 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, + 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, + 8482, 353, 8250, 339, 157, 382, 376 +}; + +static const size_t myhtml_string_alphanumeric_character[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char myhtml_tokenizer_chars_map[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +#endif /* MyHTML_UTILS_RESOURCES_H */ diff --git a/projects/CMakeLists.txt b/projects/CMakeLists.txt new file mode 100644 index 0000000..09009ef --- /dev/null +++ b/projects/CMakeLists.txt @@ -0,0 +1,200 @@ +cmake_minimum_required( VERSION 2.8.8 ) + +################ +## version and path +######################### +set(MODEST_PROJECT_NAME "modest") +set(MODEST_PROJECT_DIR_ROOT "..") +set(MODEST_PROJECT_DIR_LIB "${MODEST_PROJECT_DIR_ROOT}/lib") +set(MODEST_PROJECT_API_HEADER "${MODEST_PROJECT_DIR_ROOT}/include/") +set(MODEST_PROJECT_SOURCE "${MODEST_PROJECT_DIR_ROOT}/source") + +set(MODEST_VERSION_MAJOR 0) +set(MODEST_VERSION_MINOR 0) +set(MODEST_VERSION_PATCH 1) +set(MODEST_VERSION_STRING "${MODEST_VERSION_MAJOR}.${MODEST_VERSION_MINOR}.${MODEST_VERSION_PATCH}") + +project(${MODEST_PROJECT_NAME}) + +################ +## Detect OS +######################### +set(MODEST_PLATFORM "UNDEF") + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + if(EXISTS "/etc/debian_version") + set(MODEST_PLATFORM "Debian") + endif(EXISTS "/etc/debian_version") + + if(EXISTS "/etc/redhat-release") + set(MODEST_PLATFORM "Redhat") + endif(EXISTS "/etc/redhat-release") + + if(EXISTS "/etc/fedora-release") + set(MODEST_PLATFORM "Redhat") + endif(EXISTS "/etc/fedora-release") + + if(EXISTS "/etc/SuSE-release") + set(MODEST_PLATFORM "SuSe") + endif(EXISTS "/etc/SuSE-release") + + if(EXISTS "/etc/gentoo-release") + set(MODEST_PLATFORM "Gentoo") + endif(EXISTS "/etc/gentoo-release") +endif() + +################ +## lib param +######################### +if(POLICY CMP0042) + cmake_policy(SET CMP0042 OLD) +endif() + +set(MODEST_PROJECT_LIB_NAME "${MODEST_PROJECT_NAME}") +set(MODEST_PROJECT_LIB_NAME_STATIC "${MODEST_PROJECT_NAME}_static") + +if(NOT DEFINED CMAKE_INSTALL_LIBDIR) + set(CMAKE_INSTALL_LIBDIR "lib") +endif() + +if(NOT DEFINED MODEST_OPTIMIZATION_LEVEL) + set(MODEST_OPTIMIZATION_LEVEL "-O2") +endif() + +if(NOT DEFINED MODEST_BUILD_WITHOUT_THREADS) + set(MODEST_BUILD_WITHOUT_THREADS "NO") +endif() + +################ +## extern mem functions +######################### +if(DEFINED MODEST_EXTERN_MALLOC) + add_definitions(-DMODEST_EXTERN_MALLOC=${MODEST_EXTERN_MALLOC}) +endif() + +if(DEFINED MODEST_EXTERN_REALLOC) + add_definitions(-DMODEST_EXTERN_REALLOC=${MODEST_EXTERN_REALLOC}) +endif() + +if(DEFINED MODEST_EXTERN_CALLOC) + add_definitions(-DMODEST_EXTERN_CALLOC=${MODEST_EXTERN_CALLOC}) +endif() + +if(DEFINED MODEST_EXTERN_FREE) + add_definitions(-DMODEST_EXTERN_FREE=${MODEST_EXTERN_FREE}) +endif() + +################ +## ARGS +######################### +set(INSTALL_DLL_EXE_DIR "bin") + +option(MODEST_BUILD_SHARED "Build shared library" ON) +option(MODEST_BUILD_STATIC "Build static library" ON) +option(MODEST_INSTALL_HEADER "Install header files" OFF) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MODEST_OPTIMIZATION_LEVEL}") + +include_directories(${MODEST_PROJECT_SOURCE}) +FILE(GLOB_RECURSE ALL_SOURCE_LIST "${MODEST_PROJECT_SOURCE}/*.c") + +if (!UNIX AND WIN32) + if(${CMAKE_CL_64}) + add_definitions(-D_WIN64) + else() + add_definitions(-D_WIN32) + endif() +endif() + +if(${CMAKE_C_COMPILER_ID} STREQUAL MSVC) + add_definitions(/wd4100 /wd4255 /wd4820 /wd4668) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + + message(STATUS "Windows set definitions") +else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall --std=c99 -fPIC") + + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_definitions(-D_POSIX_C_SOURCE=199309L) + endif() + + if(MODEST_BUILD_WITHOUT_THREADS STREQUAL "NO") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") + endif() +endif() + +if(MODEST_BUILD_WITHOUT_THREADS STREQUAL "YES") + message(STATUS "Build without POSIX Threads") + add_definitions(-DMODEST_BUILD_WITHOUT_THREADS) +else() + message(STATUS "Build with POSIX Threads") +endif() + +################ +## build +######################### +if(MODEST_BUILD_SHARED) + add_library(${MODEST_PROJECT_NAME} SHARED ${ALL_SOURCE_LIST}) + set_target_properties(${MODEST_PROJECT_NAME} PROPERTIES OUTPUT_NAME ${MODEST_PROJECT_NAME}) + set_target_properties(${MODEST_PROJECT_NAME} PROPERTIES VERSION ${MODEST_VERSION_STRING} SOVERSION ${MODEST_VERSION_MAJOR}) +endif() + +if(MODEST_BUILD_STATIC) + add_library(${MODEST_PROJECT_LIB_NAME_STATIC} STATIC ${ALL_SOURCE_LIST}) + set_target_properties(${MODEST_PROJECT_LIB_NAME_STATIC} PROPERTIES OUTPUT_NAME ${MODEST_PROJECT_LIB_NAME_STATIC}) + set_target_properties(${MODEST_PROJECT_LIB_NAME_STATIC} PROPERTIES VERSION ${MODEST_VERSION_STRING} SOVERSION ${MODEST_VERSION_MAJOR}) +endif() + +################ +## install +######################### +if(MODEST_INSTALL_HEADER) + install(DIRECTORY "${MODEST_PROJECT_API_HEADER}" DESTINATION "include" FILES_MATCHING PATTERN "*.h") +endif() + +if(MODEST_BUILD_SHARED) + install(TARGETS ${MODEST_PROJECT_LIB_NAME} + RUNTIME DESTINATION "${INSTALL_DLL_EXE_DIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") +endif() + +if(MODEST_BUILD_STATIC) + install(TARGETS ${MODEST_PROJECT_LIB_NAME_STATIC} + RUNTIME DESTINATION "${INSTALL_DLL_EXE_DIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") +endif() + +################ +## Build an RPM. +######################### +set(CPACK_PACKAGE_VERSION ${MODEST_VERSION_STRING}) + +if(MODEST_PLATFORM STREQUAL "Debian") + set(CPACK_GENERATOR "DEB") +elseif(MODEST_PLATFORM STREQUAL "Redhat") + set(CPACK_GENERATOR "RPM") +elseif(MODEST_PLATFORM STREQUAL "SuSe") + set(CPACK_GENERATOR "RPM") +else() + set(CPACK_GENERATOR "TGZ") +endif() + +set(CPACK_PACKAGE_NAME "modest") +set(CPACK_PACKAGE_RELEASE 1) +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Modest is a fast HTML Render implemented as a pure C99 library with no outside dependencies.") +set(CPACK_PACKAGE_CONTACT "Alexander Borisov") +set(CPACK_PACKAGE_VENDOR "Alexander Borisov") + +if(32BIT) + set(CPACK_RPM_PACKAGE_ARCHITECTURE i686) +else() + set(CPACK_RPM_PACKAGE_ARCHITECTURE x86_64) +endif() + +if(MODEST_BUILD_WITHOUT_THREADS STREQUAL "YES") + set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}-without-threads.${CPACK_RPM_PACKAGE_ARCHITECTURE}") +else() + set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}.${CPACK_RPM_PACKAGE_ARCHITECTURE}") +endif() + +include(CPack) diff --git a/source/modest/Makefile.mk b/source/modest/Makefile.mk new file mode 100644 index 0000000..c589dfb --- /dev/null +++ b/source/modest/Makefile.mk @@ -0,0 +1,14 @@ +find_files_h = $(wildcard $(SRCDIR)/modest/$(dir)/*.h) +find_files_c = $(wildcard $(SRCDIR)/modest/$(dir)/*.c) + +SUBDIRS := . finder +HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) +SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) + +modest_clone: MODEST_DIR_$(SUBDIRS) + mkdir -p $(INCLUDE_TMP)/modest + cp $(SRCDIR)/modest/*.h $(INCLUDE_TMP)/modest + +MODEST_DIR_$(SUBDIRS): + mkdir -p $(INCLUDE_TMP)/modest/$(patsubst MODEST_DIR_%,%,$@) + cp $(SRCDIR)/modest/$(patsubst MODEST_DIR_%,%,$@)/*.h $(INCLUDE_TMP)/modest/$(patsubst MODEST_DIR_%,%,$@)/ diff --git a/source/modest/finder/finder.c b/source/modest/finder/finder.c new file mode 100644 index 0000000..c57807f --- /dev/null +++ b/source/modest/finder/finder.c @@ -0,0 +1,358 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "modest/finder/finder.h" +#include "modest/finder/resource.h" + +modest_finder_t * modest_finder_create(void) +{ + return (modest_finder_t*)myhtml_calloc(1, sizeof(modest_finder_t)); +} + +modest_status_t modest_finder_init(modest_finder_t* finder, myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet) +{ + finder->tree = myhtml_tree; + finder->stylesheet = stylesheet; + + return MODEST_STATUS_OK; +} + +void modest_finder_clean(modest_finder_t* finder) +{ + finder->callback_found = NULL; + finder->callback_found_ctx = NULL; +} + +modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destroy) +{ + if(finder == NULL) + return NULL; + + if(self_destroy) { + myhtml_free(finder); + return NULL; + } + + return finder; +} + +modest_finder_t * modest_finder_create_simple(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet) +{ + modest_finder_t *finder = modest_finder_create(); + + if(finder == NULL) + return NULL; + + if(modest_finder_init(finder, myhtml_tree, stylesheet) != MyHTML_STATUS_OK) + return modest_finder_destroy(finder, true); + + return finder; +} + +void modest_finder_callback_found_set(modest_finder_t* finder, modest_finder_callback_f callback, void* callback_ctx) +{ + finder->callback_found = callback; + finder->callback_found_ctx = callback_ctx; +} + +void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx) +{ + myhtml_collection_t* collection = (myhtml_collection_t*)finder->callback_found_ctx; + + if(myhtml_collection_check_size(collection, 1, 1024) == MyHTML_STATUS_OK) { + collection->list[ collection->length ] = node; + collection->length++; + } +} + +void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx) +{ + bool *is = (bool*)ctx; + + if(*is == false) + *is = true; +} + +modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list) +{ + if(collection == NULL) + return NULL; + + modest_finder_t *finder = modest_finder_create(); + + if(finder == NULL) + return NULL; + + modest_status_t status = modest_finder_init(finder, myhtml_tree, stylesheet); + + if(status != MODEST_STATUS_OK) { + modest_finder_destroy(finder, true); + return NULL; + } + + if(*collection == NULL) { + myhtml_status_t status; + *collection = myhtml_collection_create(4096, &status); + + if(status) { + modest_finder_destroy(finder, true); + return NULL; + } + } + else + myhtml_collection_clean(*collection); + + if(base_node == NULL) { + if(myhtml_tree->node_html) + base_node = myhtml_tree->node_html; + else + return finder; + } + + if(selector_list == NULL) { + if(stylesheet->sel_list_first) + selector_list = stylesheet->sel_list_first; + else + return finder; + } + + modest_finder_callback_found_set(finder, modest_finder_callback_found_with_collection, *collection); + + while(selector_list) { + for(size_t i = 0; i < selector_list->selector_list_length; i++) { + modest_finder_node_combinator_begin(finder, base_node, selector_list->selector_list[i]); + } + + selector_list = selector_list->next; + } + + return finder; +} + +myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, myhtml_tree_node_t* base_node, myhtml_collection_t* collection) +{ + if(finder == NULL || sel_list == NULL || base_node == NULL) + return NULL; + + if(collection == NULL) { + myhtml_status_t status; + collection = myhtml_collection_create(4096, &status); + + if(status) + return NULL; + } + + modest_finder_callback_found_set(finder, modest_finder_callback_found_with_collection, collection); + + for(size_t i = 0; i < sel_list->selector_list_length; i++) { + modest_finder_node_combinator_begin(finder, base_node, sel_list->selector_list[i]); + } + + return collection; +} + +void modest_finder_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + modest_finder_node_combinator_begin(finder, base_node, selector); +} + +myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node; + + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && + modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + { + if(selector->next == NULL) { + if(finder->callback_found) + finder->callback_found(finder, node, finder->callback_found_ctx); + } + else { + myhtml_tree_node_t *find_node = modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + + if(find_node == NULL) { + while(node != base_node && node->next == NULL) + node = node->parent; + + if(node == base_node) + break; + + node = node->next; + continue; + } + } + } + + if(node->child) + node = node->child; + else { + while(node != base_node && node->next == NULL) + node = node->parent; + + if(node == base_node) + break; + + node = node->next; + } + } + + return NULL; +} + +/* some */ +myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id != MyHTML_TAG__TEXT && base_node->tag_id != MyHTML_TAG__COMMENT && + modest_finder_static_selector_type_map[selector->type](finder, base_node, selector)) { + if(selector->next == NULL) { + if(finder->callback_found) + finder->callback_found(finder, base_node, finder->callback_found_ctx); + } + else { + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, base_node, selector->next); + } + } + + return base_node; +} + +/* E F or E >> F */ +myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->child; + + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && + modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + { + if(selector->next == NULL) { + if(finder->callback_found) + finder->callback_found(finder, node, finder->callback_found_ctx); + } + else { + myhtml_tree_node_t *find_node = modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + + if(find_node == NULL) { + while(node != base_node && node->next == NULL) + node = node->parent; + + if(node == base_node) + break; + + node = node->next; + continue; + } + } + } + + if(node->child) + node = node->child; + else { + while(node != base_node && node->next == NULL) + node = node->parent; + + if(node == base_node) + break; + + node = node->next; + } + } + + return NULL; +} + +/* E > F */ +myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->child; + + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && + modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + { + if(selector->next == NULL) { + if(finder->callback_found) + finder->callback_found(finder, node, finder->callback_found_ctx); + } + else { + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + } + } + + node = node->next; + } + + return base_node; +} + +/* E + F */ +myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->next; + + if(base_node->next) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && + modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + { + if(selector->next == NULL) { + if(finder->callback_found) + finder->callback_found(finder, node, finder->callback_found_ctx); + } + else { + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + } + } + } + + return base_node; +} + +/* E ~ F */ +myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->next; + + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && + modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + { + if(selector->next == NULL) { + if(finder->callback_found) + finder->callback_found(finder, node, finder->callback_found_ctx); + } + else { + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + } + } + + node = node->next; + } + + return base_node; +} + +/* E || F */ +myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return base_node; +} + + diff --git a/source/modest/finder/finder.h b/source/modest/finder/finder.h new file mode 100644 index 0000000..b377393 --- /dev/null +++ b/source/modest/finder/finder.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_FINDER_H +#define MODEST_FINDER_FINDER_H +#pragma once + +#include "modest/finder/myosi.h" +#include "modest/finder/type.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/list.h" + +#ifdef __cplusplus +//extern "C" { +#endif + +typedef bool (*modest_finder_selector_type_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); + +/* init */ +modest_finder_t * modest_finder_create(void); +modest_status_t modest_finder_init(modest_finder_t* finder, myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet); +void modest_finder_clean(modest_finder_t* finder); +modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destroy); + +/* simple api */ +modest_finder_t * modest_finder_create_simple(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet); + +/* callbacks */ +void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); + +/* base api */ +void modest_finder_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list); +myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, myhtml_tree_node_t* base_node, myhtml_collection_t* collection); + +/* process */ +myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_FINDER_H */ diff --git a/source/modest/finder/match.c b/source/modest/finder/match.c new file mode 100644 index 0000000..97d5f9d --- /dev/null +++ b/source/modest/finder/match.c @@ -0,0 +1,287 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "modest/finder/match.h" + +bool modest_finder_match_attribute_only_key(myhtml_token_attr_t* attr, const char* key, size_t key_len) +{ + if(key == NULL) + return false; + + while (attr) + { + if(attr->key.length == key_len) { + if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + return true; + } + + attr = attr->next; + } + + return false; +} + +bool modest_finder_match_attribute_eq(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive) +{ + if(key == NULL || value == NULL) + return false; + + while (attr) + { + if(attr->key.length == key_len) { + if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + { + if(attr->value.length == value_len) { + if(case_sensitive) { + if(strncmp(value, attr->value.data, value_len) == 0) { + return true; + } + } + else { + if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) { + return true; + } + } + } + + break; + } + } + + attr = attr->next; + } + + return false; +} + +bool modest_finder_match_attribute_ws(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive) +{ + if(key == NULL || value == NULL) + return false; + + while (attr) + { + if(attr->key.length == key_len) { + if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + { + size_t i = 0; + + if(attr->value.length >= value_len) { + if(case_sensitive) + { + while(i < attr->value.length) + { + size_t end = i + value_len; + + if(end > attr->value.length) + return false; + + if( + (myhtml_strncmp(value, &attr->value.data[i], value_len) == 0) && + (myhtml_utils_whithspace(attr->value.data[end], ==, ||) || end == attr->value.length)) + { + return true; + } + + i++; + } + } + else { + while(i < attr->value.length) + { + size_t end = i + value_len; + + if(end > attr->value.length) + return false; + + if( + (myhtml_strncasecmp(value, &attr->value.data[i], value_len) == 0) && + (myhtml_utils_whithspace(attr->value.data[end], ==, ||) || end == attr->value.length)) + { + return true; + } + + i++; + } + } + } + + break; + } + } + + attr = attr->next; + } + + return false; +} + +bool modest_finder_match_attribute_begin(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive) +{ + if(key == NULL || value == NULL) + return false; + + while (attr) + { + if(attr->key.length == key_len) { + if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + { + if(attr->value.length >= value_len) { + if(case_sensitive) { + if(myhtml_strncmp(value, attr->value.data, value_len) == 0) + return true; + } + else { + if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) + return true; + } + } + + break; + } + } + + attr = attr->next; + } + + return false; +} + +bool modest_finder_match_attribute_end(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive) +{ + if(key == NULL || value == NULL) + return false; + + while (attr) + { + if(attr->key.length == key_len) { + if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + { + if(attr->value.length >= value_len) { + if(case_sensitive) { + if(myhtml_strncmp(value, &attr->value.data[ (attr->value.length - value_len) ], value_len) == 0) + return true; + } + else { + if(myhtml_strncasecmp(value, &attr->value.data[ (attr->value.length - value_len) ], value_len) == 0) + return true; + } + } + + break; + } + } + + attr = attr->next; + } + + return false; +} + +bool modest_finder_match_attribute_sub(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive) +{ + if(key == NULL || value == NULL) + return false; + + while (attr) + { + if(attr->key.length == key_len) { + if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + { + if(attr->value.length >= value_len) { + size_t i = 0; + + if(case_sensitive) + { + while ((i + value_len) <= attr->value.length) + { + if(myhtml_strncmp(value, &attr->value.data[i], value_len) == 0) + return true; + + i++; + } + } + else { + while ((i + value_len) <= attr->value.length) + { + if(myhtml_strncasecmp(value, &attr->value.data[i], value_len) == 0) + return true; + + i++; + } + } + } + + break; + } + } + + attr = attr->next; + } + + return false; +} + +bool modest_finder_match_attribute_hsp(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive) +{ + if(key == NULL || value == NULL) + return false; + + while (attr) + { + if(attr->key.length == key_len) { + if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + { + if(attr->value.length == value_len) { + if(case_sensitive) { + if(myhtml_strncmp(value, attr->value.data, value_len) == 0) + return true; + } + else { + if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) + return true; + } + } + else if(attr->value.length > value_len) { + if(case_sensitive) { + if(myhtml_strncmp(value, attr->value.data, value_len) == 0) { + if(attr->value.data[value_len] == '-') + return true; + } + } + else { + if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) { + if(attr->value.data[value_len] == '-') + return true; + } + } + } + + break; + } + } + + attr = attr->next; + } + + return false; +} + + diff --git a/source/modest/finder/match.h b/source/modest/finder/match.h new file mode 100644 index 0000000..c7ee945 --- /dev/null +++ b/source/modest/finder/match.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_MATCH_H +#define MODEST_FINDER_MATCH_H +#pragma once + +#include "myhtml/myosi.h" +#include "myhtml/tree.h" + +#ifdef __cplusplus +//extern "C" { +#endif + +bool modest_finder_match_attribute_only_key(myhtml_token_attr_t* attr, const char* key, size_t key_len); +bool modest_finder_match_attribute_eq(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_ws(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_begin(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_end(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_sub(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); +bool modest_finder_match_attribute_hsp(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_MATCH_H */ diff --git a/source/modest/finder/myosi.h b/source/modest/finder/myosi.h new file mode 100644 index 0000000..682e452 --- /dev/null +++ b/source/modest/finder/myosi.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_MYOSI_H +#define MODEST_FINDER_MYOSI_H +#pragma once + +#include "modest/myosi.h" +#include "myhtml/myosi.h" +#include "mycss/myosi.h" + +#ifdef __cplusplus +//extern "C" { +#endif + +struct modest_finder typedef modest_finder_t; + +typedef void (*modest_finder_callback_f)(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +typedef bool (*modest_finder_match_f)(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); + +struct modest_finder { + myhtml_tree_t* tree; + mycss_stylesheet_t* stylesheet; + + modest_finder_callback_f callback_found; + void* callback_found_ctx; +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_MYOSI_H */ diff --git a/source/modest/finder/pseudo_class.c b/source/modest/finder/pseudo_class.c new file mode 100644 index 0000000..9cd9653 --- /dev/null +++ b/source/modest/finder/pseudo_class.c @@ -0,0 +1,832 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "modest/finder/pseudo_class.h" +#include "modest/finder/resource.h" + +bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + mycss_selectors_list_t *list = selector->value; + + modest_finder_callback_f current_callback_found = finder->callback_found; + void *current_ctx = finder->callback_found_ctx; + + bool i_found; + + finder->callback_found = modest_finder_callback_found_with_bool; + finder->callback_found_ctx = &i_found; + + for(size_t i = 0; i < list->selector_list_length; i++) + { + i_found = false; + modest_finder_node_combinator_undef(finder, base_node, list->selector_list[i]); + + if(i_found == true) { + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return true; + } + } + + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return false; +} + +/* after create render */ +bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + mycss_selectors_list_t *list = selector->value; + + modest_finder_callback_f current_callback_found = finder->callback_found; + void *current_ctx = finder->callback_found_ctx; + + bool i_found; + + finder->callback_found = modest_finder_callback_found_with_bool; + finder->callback_found_ctx = &i_found; + + for(size_t i = 0; i < list->selector_list_length; i++) + { + i_found = false; + + mycss_selectors_entry_t *sel_entry = list->selector_list[i]; + + if(sel_entry->combinator == MyCSS_SELECTORS_COMBINATOR_UNDEF) + modest_finder_node_combinator_descendant(finder, base_node, sel_entry); + else + modest_finder_static_selector_combinator_map[sel_entry->combinator](finder, base_node, sel_entry); + + if(i_found == true) { + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return true; + } + } + + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + mycss_selectors_list_t *list = selector->value; + + modest_finder_callback_f current_callback_found = finder->callback_found; + void *current_ctx = finder->callback_found_ctx; + + bool i_found; + + finder->callback_found = modest_finder_callback_found_with_bool; + finder->callback_found_ctx = &i_found; + + for(size_t i = 0; i < list->selector_list_length; i++) + { + i_found = false; + modest_finder_node_combinator_undef(finder, base_node, list->selector_list[i]); + + if(i_found == true) { + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return true; + } + } + + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + mycss_selectors_list_t *list = selector->value; + + modest_finder_callback_f current_callback_found = finder->callback_found; + void *current_ctx = finder->callback_found_ctx; + + bool i_found; + + finder->callback_found = modest_finder_callback_found_with_bool; + finder->callback_found_ctx = &i_found; + + for(size_t i = 0; i < list->selector_list_length; i++) + { + i_found = false; + modest_finder_node_combinator_undef(finder, base_node, list->selector_list[i]); + + if(i_found == true) { + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return false; + } + } + + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(selector->value == NULL) + return NULL; + + mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); + + long node_pos = 0; + myhtml_tree_node_t* node = base_node; + + if(anb->of) { + modest_finder_callback_f current_callback_found = finder->callback_found; + void *current_ctx = finder->callback_found_ctx; + + bool i_found; + + finder->callback_found = modest_finder_callback_found_with_bool; + finder->callback_found_ctx = &i_found; + + mycss_selectors_list_t *list = anb->of; + + while(node) + { + for(size_t i = 0; i < list->selector_list_length; i++) + { + i_found = false; + modest_finder_node_combinator_undef(finder, node, list->selector_list[i]); + + if(i_found == true) { + node_pos++; + break; + } + else if(node_pos == 0) { + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return false; + } + } + + node = node->prev; + } + + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + if(node_pos == 0) + return false; + } + else { + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT) + node_pos++; + + node = node->prev; + } + } + + if(anb->a == 0) { + if(anb->b == node_pos) + return true; + } + else { + double n = (double)(node_pos - anb->b) / (double)anb->a; + + if(n >= 0.0f && (n - (double)((long)(n))) == 0.0f) + return true; + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(selector->value == NULL) + return NULL; + + mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); + + long node_pos = 0; + myhtml_tree_node_t* node = base_node; + + if(anb->of) { + modest_finder_callback_f current_callback_found = finder->callback_found; + void *current_ctx = finder->callback_found_ctx; + + bool i_found; + + finder->callback_found = modest_finder_callback_found_with_bool; + finder->callback_found_ctx = &i_found; + + mycss_selectors_list_t *list = anb->of; + + while(node) + { + for(size_t i = 0; i < list->selector_list_length; i++) + { + i_found = false; + modest_finder_node_combinator_undef(finder, node, list->selector_list[i]); + + if(i_found == true) { + node_pos++; + break; + } + else if(node_pos == 0) { + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + return false; + } + } + + node = node->next; + } + + finder->callback_found = current_callback_found; + finder->callback_found_ctx = current_ctx; + + if(node_pos == 0) + return false; + } + else { + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT) + node_pos++; + + node = node->next; + } + } + + if(anb->a == 0) { + if(anb->b == node_pos) + return true; + } + else { + double n = (double)(node_pos - anb->b) / (double)anb->a; + + if(n >= 0.0f && (n - (double)((long)(n))) == 0.0f) + return true; + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(selector->value == NULL) + return NULL; + + mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); + + long node_pos = 0; + myhtml_tree_node_t* node = base_node; + + while(node) { + if(node->tag_id == base_node->tag_id && node->ns == base_node->ns) { + node_pos++; + } + + node = node->next; + } + + if(anb->a == 0) { + if(anb->b != node_pos) + return false; + } + else { + double n = (double)(node_pos - anb->b) / (double)anb->a; + + if(n < 0.0f || (n - (double)((long)(n))) != 0.0f) + return false; + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(selector->value == NULL) + return NULL; + + mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); + + long node_pos = 0; + myhtml_tree_node_t* node = base_node; + + while(node) { + if(node->tag_id == base_node->tag_id && node->ns == base_node->ns) { + node_pos++; + } + + node = node->prev; + } + + if(anb->a == 0) { + if(anb->b != node_pos) + return false; + } + else { + double n = (double)(node_pos - anb->b) / (double)anb->a; + + if(n < 0.0f || (n - (double)((long)(n))) != 0.0f) + return false; + } + + return true; +} + +/* classes */ +bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id == MyHTML_TAG_A || + base_node->tag_id == MyHTML_TAG_AREA || + base_node->tag_id == MyHTML_TAG_MAP) + { + if(base_node->token) + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "href", 4); + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->child; + + while(node) { + if(node->tag_id != MyHTML_TAG__COMMENT) { + if(node->tag_id != MyHTML_TAG__TEXT) + return false; + + if(node->token) { + const char *data = node->token->str.data; + size_t len = node->token->str.length; + + for(size_t i = 0; i < len; i++) { + if(data[i] != ' ' && data[i] != '\t' && data[i] != '\n' && data[i] != '\r') + return false; + } + } + } + + if(node->child) + node = node->child; + else { + while(node != base_node && node->next == NULL) + node = node->parent; + + if(node == base_node) + break; + + node = node->next; + } + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id == MyHTML_TAG_INPUT || base_node->tag_id == MyHTML_TAG_MENUITEM) + { + myhtml_token_attr_t* attr = base_node->token->attr_first; + + while (attr) + { + if(attr->key.length == 4) { + if(myhtml_strncasecmp("type", attr->key.data, 4) == 0) + { + if(attr->value.length == 8) { + if(myhtml_strncasecmp("checkbox", attr->value.data, 8) == 0) { + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "checked", 7); + } + } + else if(attr->value.length == 5) { + if(myhtml_strncasecmp("radio", attr->value.data, 5) == 0) { + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "checked", 7); + } + } + + break; + } + } + + attr = attr->next; + } + } + else if(base_node->tag_id == MyHTML_TAG_OPTION) { + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "selected", 8); + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->token == NULL) + return false; + + if(base_node->tag_id == MyHTML_TAG_BUTTON || + base_node->tag_id == MyHTML_TAG_INPUT || + base_node->tag_id == MyHTML_TAG_SELECT || + base_node->tag_id == MyHTML_TAG_TEXTAREA) + { + if(modest_finder_match_attribute_only_key(base_node->token->attr_first, "disabled", 8)) + return true; + + myhtml_tree_node_t* node = base_node->parent; + + while(node) { + /* oh, see https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled */ + if(node->tag_id == MyHTML_TAG_FIELDSET) { + if(node->child && node->child->tag_id != MyHTML_TAG_LEGEND) { + if(node->token && modest_finder_match_attribute_only_key(node->token->attr_first, "disabled", 8)) + return true; + } + } + + node = node->parent; + } + + return false; + } + + /* see https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled */ + if(base_node->tag_id == MyHTML_TAG_OPTION) { + if(modest_finder_match_attribute_only_key(base_node->token->attr_first, "disabled", 8)) + return true; + + myhtml_tree_node_t* node = base_node->parent; + + while(node) { + if(node->tag_id == MyHTML_TAG_OPTGROUP) { + if(node->token) + return modest_finder_match_attribute_only_key(node->token->attr_first, "disabled", 8); + + return false; + } + + node = node->parent; + } + + return false; + } + + if(base_node->tag_id == MyHTML_TAG_OPTGROUP || + base_node->tag_id == MyHTML_TAG_MENUITEM) { + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "disabled", 8); + } + + if(base_node->tag_id == MyHTML_TAG_FIELDSET) + { + if(modest_finder_match_attribute_only_key(base_node->token->attr_first, "disabled", 8)) + return true; + + myhtml_tree_node_t* node = base_node->parent; + + while(node) { + /* oh, see https://html.spec.whatwg.org/multipage/forms.html#concept-fieldset-disabled */ + if(node->tag_id == MyHTML_TAG_FIELDSET) { + if(node->child && node->child->tag_id != MyHTML_TAG_LEGEND) { + if(node->token && modest_finder_match_attribute_only_key(node->token->attr_first, "disabled", 8)) + return true; + } + } + + node = node->parent; + } + + return false; + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->child; + + while(node) { + if(node->tag_id != MyHTML_TAG__COMMENT) + return false; + + if(node->child) + node = node->child; + else { + while(node != base_node && node->next == NULL) + node = node->parent; + + if(node == base_node) + break; + + node = node->next; + } + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return ~modest_finder_selector_sub_type_pseudo_class_disabled(finder, base_node, selector); +} + +bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->prev; + + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT) + return false; + + node = node->prev; + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->prev; + + while(node) { + if(node->tag_id == base_node->tag_id && node->ns == base_node->ns) + return false; + + node = node->prev; + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->next; + + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT) + return false; + + node = node->next; + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + myhtml_tree_node_t *node = base_node->next; + + while(node) { + if(node->tag_id == base_node->tag_id && node->ns == base_node->ns) + return false; + + node = node->next; + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id == MyHTML_TAG_A || + base_node->tag_id == MyHTML_TAG_AREA || + base_node->tag_id == MyHTML_TAG_LINK) + { + if(base_node->token) + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "href", 4); + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return + modest_finder_selector_sub_type_pseudo_class_first_child(finder, base_node, selector) && + modest_finder_selector_sub_type_pseudo_class_last_child(finder, base_node, selector); +} + +bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return + modest_finder_selector_sub_type_pseudo_class_first_of_type(finder, base_node, selector) && + modest_finder_selector_sub_type_pseudo_class_last_of_type(finder, base_node, selector); +} + +bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id == MyHTML_TAG_INPUT || + base_node->tag_id == MyHTML_TAG_SELECT || + base_node->tag_id == MyHTML_TAG_TEXTAREA) + { + if(base_node->token) + return ~modest_finder_match_attribute_only_key(base_node->token->attr_first, "required", 8); + else + return true; + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id == MyHTML_TAG_INPUT || + base_node->tag_id == MyHTML_TAG_TEXTAREA) + { + if(base_node->token) + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "placeholder", 11); + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(modest_finder_selector_sub_type_pseudo_class_read_write(finder, base_node, selector)) + return false; + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id == MyHTML_TAG_INPUT || + base_node->tag_id == MyHTML_TAG_TEXTAREA) + { + if(modest_finder_match_attribute_only_key(base_node->token->attr_first, "readonly", 8)) + return false; + + return ~modest_finder_selector_sub_type_pseudo_class_disabled(finder, base_node, selector); + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(base_node->tag_id == MyHTML_TAG_INPUT || + base_node->tag_id == MyHTML_TAG_SELECT || + base_node->tag_id == MyHTML_TAG_TEXTAREA) + { + if(base_node->token) + return modest_finder_match_attribute_only_key(base_node->token->attr_first, "required", 8); + } + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + if(finder->tree->node_html == base_node) + return true; + + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +{ + return false; +} + + diff --git a/source/modest/finder/pseudo_class.h b/source/modest/finder/pseudo_class.h new file mode 100644 index 0000000..23e736b --- /dev/null +++ b/source/modest/finder/pseudo_class.h @@ -0,0 +1,92 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_PSEUDO_CLASS_H +#define MODEST_FINDER_PSEUDO_CLASS_H +#pragma once + +#include "modest/finder/myosi.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/value.h" +#include "modest/finder/finder.h" + +#ifdef __cplusplus +//extern "C" { +#endif + +bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); + +/* classes */ +bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_PSEUDO_CLASS_H */ diff --git a/source/modest/finder/resource.h b/source/modest/finder/resource.h new file mode 100644 index 0000000..839914a --- /dev/null +++ b/source/modest/finder/resource.h @@ -0,0 +1,125 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_RESOURCE_H +#define MODEST_FINDER_RESOURCE_H +#pragma once + +/* see enum mycss_selectors_type (mycss_selectors_type_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_type_f modest_finder_static_selector_type_map[MyCSS_SELECTORS_TYPE_LAST_ENTRY] = +{ + modest_finder_selector_type_undef, /* MyCSS_SELECTORS_TYPE_UNDEF */ + modest_finder_selector_type_element, /* MyCSS_SELECTORS_TYPE_ELEMENT */ + modest_finder_selector_type_id, /* MyCSS_SELECTORS_TYPE_ID */ + modest_finder_selector_type_class, /* MyCSS_SELECTORS_TYPE_CLASS */ + modest_finder_selector_type_attribute, /* MyCSS_SELECTORS_TYPE_ATTRIBUTE */ + modest_finder_selector_type_pseudo_class_function, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION */ + modest_finder_selector_type_pseudo_class, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS */ + modest_finder_selector_type_pseudo_element_function, /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION */ + modest_finder_selector_type_pseudo_element /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT */ +}; + +/* see enum mycss_selectors_sub_type (mycss_selectors_sub_type_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_type_f modest_finder_static_selector_sub_type_pseudo_class_function_map[MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY] = +{ + modest_finder_selector_sub_type_pseudo_class_function_undef, /* UNDEF */ + modest_finder_selector_sub_type_pseudo_class_function_undef, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_UNKNOWN */ + modest_finder_selector_sub_type_pseudo_class_function_current, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT */ + modest_finder_selector_sub_type_pseudo_class_function_dir, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR */ + modest_finder_selector_sub_type_pseudo_class_function_drop, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP */ + modest_finder_selector_sub_type_pseudo_class_function_has, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS */ + modest_finder_selector_sub_type_pseudo_class_function_lang, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG */ + modest_finder_selector_sub_type_pseudo_class_function_matches, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES */ + modest_finder_selector_sub_type_pseudo_class_function_not, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT */ + modest_finder_selector_sub_type_pseudo_class_function_nth_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD */ + modest_finder_selector_sub_type_pseudo_class_function_nth_column, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN */ + modest_finder_selector_sub_type_pseudo_class_function_nth_last_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD */ + modest_finder_selector_sub_type_pseudo_class_function_nth_last_column, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN */ + modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_function_nth_of_type /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE */ + +}; + +/* see enum mycss_selectors_sub_type (mycss_selectors_sub_type_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_type_f modest_finder_static_selector_sub_type_pseudo_class_map[MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_ENTRY] = +{ + modest_finder_selector_sub_type_pseudo_class_undef, /* UNDEF */ + modest_finder_selector_sub_type_pseudo_class_undef, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNKNOWN */ + modest_finder_selector_sub_type_pseudo_class_active, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ACTIVE */ + modest_finder_selector_sub_type_pseudo_class_any_link, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ANY_LINK */ + modest_finder_selector_sub_type_pseudo_class_blank, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_BLANK */ + modest_finder_selector_sub_type_pseudo_class_checked, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CHECKED */ + modest_finder_selector_sub_type_pseudo_class_current, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CURRENT */ + modest_finder_selector_sub_type_pseudo_class_default, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DEFAULT */ + modest_finder_selector_sub_type_pseudo_class_disabled, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DISABLED */ + modest_finder_selector_sub_type_pseudo_class_drop, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DROP */ + modest_finder_selector_sub_type_pseudo_class_empty, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_EMPTY */ + modest_finder_selector_sub_type_pseudo_class_enabled, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ENABLED */ + modest_finder_selector_sub_type_pseudo_class_first_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_CHILD */ + modest_finder_selector_sub_type_pseudo_class_first_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_focus, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FOCUS */ + modest_finder_selector_sub_type_pseudo_class_future, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUTURE */ + modest_finder_selector_sub_type_pseudo_class_hover, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_HOVER */ + modest_finder_selector_sub_type_pseudo_class_in_range, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_IN_RANGE */ + modest_finder_selector_sub_type_pseudo_class_indeterminate, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INDETERMINATE */ + modest_finder_selector_sub_type_pseudo_class_invalid, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INVALID */ + modest_finder_selector_sub_type_pseudo_class_last_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_CHILD */ + modest_finder_selector_sub_type_pseudo_class_last_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_link, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LINK */ + modest_finder_selector_sub_type_pseudo_class_only_child, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_CHILD */ + modest_finder_selector_sub_type_pseudo_class_only_of_type, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_OF_TYPE */ + modest_finder_selector_sub_type_pseudo_class_optional, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OPTIONAL */ + modest_finder_selector_sub_type_pseudo_class_out_of_range, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OUT_OF_RANGE */ + modest_finder_selector_sub_type_pseudo_class_past, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PAST */ + modest_finder_selector_sub_type_pseudo_class_placeholder_shown, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PLACEHOLDER_SHOWN */ + modest_finder_selector_sub_type_pseudo_class_read_only, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_ONLY */ + modest_finder_selector_sub_type_pseudo_class_read_write, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_WRITE */ + modest_finder_selector_sub_type_pseudo_class_required, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_REQUIRED */ + modest_finder_selector_sub_type_pseudo_class_root, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ROOT */ + modest_finder_selector_sub_type_pseudo_class_scope, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_SCOPE */ + modest_finder_selector_sub_type_pseudo_class_target, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_TARGET */ + modest_finder_selector_sub_type_pseudo_class_user_error, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_USER_ERROR */ + modest_finder_selector_sub_type_pseudo_class_valid, /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VALID */ + modest_finder_selector_sub_type_pseudo_class_visited /* MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VISITED */ +}; + +/* see enum mycss_selectors_combinator (mycss_selectors_combinator_t) on mycss/selectors/myosi.h */ +static const modest_finder_selector_combinator_f modest_finder_static_selector_combinator_map[MyCSS_SELECTORS_COMBINATOR_LAST_ENTRY] = +{ + modest_finder_node_combinator_undef, /* MyCSS_SELECTORS_COMBINATOR_UNDEF */ + modest_finder_node_combinator_descendant, /* MyCSS_SELECTORS_COMBINATOR_DESCENDANT */ + modest_finder_node_combinator_child, /* MyCSS_SELECTORS_COMBINATOR_CHILD */ + modest_finder_node_combinator_next_sibling, /* MyCSS_SELECTORS_COMBINATOR_NEXT_SIBLING */ + modest_finder_node_combinator_following_sibling, /* MyCSS_SELECTORS_COMBINATOR_FOLLOWING_SIBLING */ + modest_finder_node_combinator_column /* MyCSS_SELECTORS_COMBINATOR_COLUMN */ +}; + +/* see enum mycss_selectors_match (mycss_selectors_match_t) on mycss/selectors/myosi.h */ +static const modest_finder_match_f modest_finder_static_selector_match_map[MyCSS_SELECTORS_MATCH_LAST_ENTRY] = +{ + modest_finder_match_attribute_eq, /* MyCSS_SELECTORS_MATCH_EQUAL */ + modest_finder_match_attribute_ws, /* MyCSS_SELECTORS_MATCH_INCLUDE */ + modest_finder_match_attribute_hsp, /* MyCSS_SELECTORS_MATCH_DASH */ + modest_finder_match_attribute_begin, /* MyCSS_SELECTORS_MATCH_PREFIX */ + modest_finder_match_attribute_end, /* MyCSS_SELECTORS_MATCH_SUFFIX */ + modest_finder_match_attribute_sub /* MyCSS_SELECTORS_MATCH_SUBSTRING */ +}; + +#endif /* MODEST_FINDER_RESOURCE_H */ diff --git a/source/modest/finder/type.c b/source/modest/finder/type.c new file mode 100644 index 0000000..ad25b9f --- /dev/null +++ b/source/modest/finder/type.c @@ -0,0 +1,126 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "modest/finder/type.h" +#include "modest/finder/resource.h" + +bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + /* namespace */ + if(selector->ns_entry) { + if(selector->ns_entry->ns_id != MyHTML_NAMESPACE_ANY && selector->ns_entry->ns_id != node->ns) + return false; + } + + /* tag match */ + myhtml_string_t *str = selector->key; + if(str->length == 1 && *str->data == '*') + return true; + + myhtml_tag_id_t tag_id = myhtml_tag_id_by_name(finder->tree, str->data, str->length); + + if(tag_id == node->tag_id) + return true; + + return false; +} + +bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + if(node->token == NULL) + return false; + + return modest_finder_match_attribute_eq(node->token->attr_first, + "id", 2, + selector->key->data, selector->key->length, + (finder->tree->compat_mode != MyHTML_TREE_COMPAT_MODE_QUIRKS)); +} + +bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + if(node->token == NULL) + return false; + + return modest_finder_match_attribute_ws(node->token->attr_first, + "class", 5, + selector->key->data, selector->key->length, + (finder->tree->compat_mode != MyHTML_TREE_COMPAT_MODE_QUIRKS)); +} + +bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + /* namespace */ + if(selector->ns_entry) { + if(selector->ns_entry->ns_id != MyHTML_NAMESPACE_ANY && selector->ns_entry->ns_id != node->ns) + return false; + } + + if(node->token == NULL) + return false; + + mycss_selectors_object_attribute_t *sel_attr = mycss_selector_value_attribute(selector->value); + + if(sel_attr) { + if(sel_attr->match < MyCSS_SELECTORS_MATCH_LAST_ENTRY) + return modest_finder_static_selector_match_map[sel_attr->match](node->token->attr_first, + selector->key->data, selector->key->length, + sel_attr->value->data, sel_attr->value->length, + (sel_attr->mod & MyCSS_SELECTORS_MOD_I)); + } + else { + return modest_finder_match_attribute_only_key(node->token->attr_first, + selector->key->data, selector->key->length); + } + + return false; +} + +bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + if(selector->sub_type < MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY) + return modest_finder_static_selector_sub_type_pseudo_class_function_map[selector->sub_type](finder, node, selector); + + return false; +} + +bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + if(selector->sub_type < MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_ENTRY) + return modest_finder_static_selector_sub_type_pseudo_class_map[selector->sub_type](finder, node, selector); + + return false; +} + +bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + return false; +} + +bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +{ + return false; +} + + diff --git a/source/modest/finder/type.h b/source/modest/finder/type.h new file mode 100644 index 0000000..7070dea --- /dev/null +++ b/source/modest/finder/type.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_FINDER_TYPE_H +#define MODEST_FINDER_TYPE_H +#pragma once + +#include "modest/finder/myosi.h" +#include "modest/finder/finder.h" +#include "modest/finder/pseudo_class.h" +#include "modest/finder/match.h" +#include "myhtml/tree.h" +#include "myhtml/utils.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/list.h" +#include "mycss/selectors/value.h" + +#ifdef __cplusplus +//extern "C" { +#endif + +bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_FINDER_TYPE_H */ diff --git a/source/modest/myosi.h b/source/modest/myosi.h new file mode 100644 index 0000000..89c830e --- /dev/null +++ b/source/modest/myosi.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MODEST_MYOSI_H +#define MODEST_MYOSI_H +#pragma once + +#ifdef __cplusplus +//extern "C" { +#endif + +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum modest_status { + MODEST_STATUS_OK = 0x000000, + MODEST_STATUS_ERROR_MEMORY_ALLOCATION = 0x020000 +} +typedef modest_status_t; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MODEST_MYOSI_H */ diff --git a/source/mycss/Makefile.mk b/source/mycss/Makefile.mk new file mode 100644 index 0000000..d1b473f --- /dev/null +++ b/source/mycss/Makefile.mk @@ -0,0 +1,14 @@ +find_files_h = $(wildcard $(SRCDIR)/mycss/$(dir)/*.h) +find_files_c = $(wildcard $(SRCDIR)/mycss/$(dir)/*.c) + +SUBDIRS := . selectors namespace media values property declaration +HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) +SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) + +mycss_clone: MyCSS_DIR_$(SUBDIRS) + mkdir -p $(INCLUDE_TMP)/mycss + cp $(SRCDIR)/mycss/*.h $(INCLUDE_TMP)/mycss + +MyCSS_DIR_$(SUBDIRS): + mkdir -p $(INCLUDE_TMP)/mycss/$(patsubst MyCSS_DIR_%,%,$@) + cp $(SRCDIR)/mycss/$(patsubst MyCSS_DIR_%,%,$@)/*.h $(INCLUDE_TMP)/mycss/$(patsubst MyCSS_DIR_%,%,$@)/ diff --git a/source/mycss/an_plus_b.c b/source/mycss/an_plus_b.c new file mode 100644 index 0000000..269ceb4 --- /dev/null +++ b/source/mycss/an_plus_b.c @@ -0,0 +1,512 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/an_plus_b.h" +#include "myhtml/utils/resources.h" + +mycss_an_plus_b_t * mycss_an_plus_b_create(void) +{ + return (mycss_an_plus_b_t*)myhtml_calloc(1, sizeof(mycss_an_plus_b_t)); +} + +mycss_status_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb) +{ + return MyCSS_STATUS_OK; +} + +mycss_status_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb) +{ + return MyCSS_STATUS_OK; +} + +mycss_an_plus_b_t * mycss_an_plus_b_destroy(mycss_an_plus_b_t* anb, bool self_destroy) +{ + if(anb == NULL) + return NULL; + + if(self_destroy) { + myhtml_free(anb); + return NULL; + } + + return anb; +} + +///////////////////////////////////////////////////////// +//// An+B Entry +//// +///////////////////////////////////////////////////////// +mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_create(mycss_entry_t* entry) +{ + return (mycss_an_plus_b_entry_t*)mchar_async_malloc(entry->mchar, + entry->mchar_value_node_id, + sizeof(mycss_an_plus_b_entry_t)); +} + +void mycss_an_plus_b_entry_clean_all(mycss_an_plus_b_entry_t* anb_entry) +{ + memset(anb_entry, 0, sizeof(mycss_an_plus_b_entry_t)); +} + +mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_destroy(mycss_entry_t* entry, mycss_an_plus_b_entry_t* anb_entry, bool self_destroy) +{ + if(anb_entry == NULL) + return NULL; + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, (char*)anb_entry); + return NULL; + } + + return anb_entry; +} + +///////////////////////////////////////////////////////// +//// An+B Parser +//// +///////////////////////////////////////////////////////// +void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry) +{ + mycss_an_plus_b_current_entry(entry)->is_broken = true; +} + +///////////////////////////////////////////////////////// +//// An+B Print +//// +///////////////////////////////////////////////////////// +void mycss_an_plus_b_print(mycss_an_plus_b_entry_t* anb_entry, FILE* fh) +{ + if(anb_entry->a != 0) { + fprintf(fh, "%ld", anb_entry->a); + } + + fprintf(fh, "n"); + + if(anb_entry->b != 0) { + if(anb_entry->b >= 0) + fprintf(fh, "+%ld", anb_entry->b); + else + fprintf(fh, "%ld", anb_entry->b); + } +} + +///////////////////////////////////////////////////////// +//// An+B State +//// +///////////////////////////////////////////////////////// +bool mycss_an_plus_b_state_anb_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_an_plus_b_entry_t *anb_entry = mycss_an_plus_b_entry_create(entry); + mycss_an_plus_b_entry_clean_all(anb_entry); + + *entry->anb->entry = anb_entry; + + return mycss_an_plus_b_state_anb(entry, token, true); +} + +bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_an_plus_b_entry_t *anb_entry = mycss_an_plus_b_current_entry(entry); + + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: + break; + case MyCSS_TOKEN_TYPE_IDENT: { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + if(myhtml_strncasecmp(str.data, "-n-", 3) == 0) + { + anb_entry->a = -1; + + if(str.length == 3) { + anb_entry->b = -1; + + entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; + + myhtml_string_destroy(&str, false); + return true; + } + /* -n-* */ + size_t len = str.length - 2; + if(mycss_convert_data_to_integer(&str.data[2], len, &anb_entry->b) != len) { + /* parse error */ + anb_entry->is_broken = true; + } + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_hyphen_n_hyphen_asterisk_end"); + entry->parser = entry->parser_switch; + } + else if(myhtml_strncasecmp(str.data, "-n", 2) == 0) { + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_hyphen_n_end") + + anb_entry->a = -1; + + if(str.length == 2) { + entry->parser = mycss_an_plus_b_state_anb_plus_n; + + myhtml_string_destroy(&str, false); + return true; + } + + size_t len = str.length - 2; + if(mycss_convert_data_to_integer(&str.data[2], len, &anb_entry->b) != len) { + /* parse error */ + anb_entry->is_broken = true; + } + + entry->parser = entry->parser_switch; + } + else if(myhtml_strncasecmp(str.data, "n-", 2) == 0) + { + anb_entry->a = 1; + + if(str.length == 2) { + entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; + + myhtml_string_destroy(&str, false); + return true; + } + + size_t len = str.length - 1; + if(mycss_convert_data_to_integer(&str.data[1], len, &anb_entry->b) != len) { + /* parse error */ + anb_entry->is_broken = true; + } + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n"); + entry->parser = entry->parser_switch; + } + else if(myhtml_strncasecmp(str.data, "n", 1) == 0) + { + anb_entry->a = 1; + + if(str.length == 1) { + entry->parser = mycss_an_plus_b_state_anb_plus_n; + + myhtml_string_destroy(&str, false); + return true; + } + + size_t len = str.length - 1; + if(mycss_convert_data_to_integer(&str.data[1], len, &anb_entry->b) != len) { + /* parse error */ + anb_entry->is_broken = true; + } + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n"); + entry->parser = entry->parser_switch; + } + else if(myhtml_strcasecmp(str.data, "even") == 0) { + anb_entry->a = 2; + anb_entry->b = 0; + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_e_v_e_n") + entry->parser = entry->parser_switch; + } + else if(myhtml_strcasecmp(str.data, "odd") == 0) { + anb_entry->a = 2; + anb_entry->b = 1; + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_o_d_d") + entry->parser = entry->parser_switch; + } + else { + myhtml_string_destroy(&str, false); + + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + + myhtml_string_destroy(&str, false); + break; + } + case MyCSS_TOKEN_TYPE_DELIM: { + if(*token->data == '+') { + anb_entry->a = 1; + + entry->parser = mycss_an_plus_b_state_anb_plus; + } + else { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + break; + } + case MyCSS_TOKEN_TYPE_NUMBER: { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + mycss_convert_data_to_integer(str.data, str.length, &anb_entry->b); + + myhtml_string_destroy(&str, false); + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_number") + entry->parser = entry->parser_switch; + break; + } + case MyCSS_TOKEN_TYPE_DIMENSION: { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + size_t consumed_len = mycss_convert_data_to_integer(str.data, str.length, &anb_entry->a); + + if(myhtml_strncasecmp(&str.data[consumed_len], "n-", 2) == 0) + { + size_t rem = str.length - consumed_len; + + if(rem == 2) { + entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; + + myhtml_string_destroy(&str, false); + return true; + } + + rem -= 1; + if(mycss_convert_data_to_integer(&str.data[(consumed_len + 1)], rem, &anb_entry->b) != rem) { + /* parse error */ + anb_entry->is_broken = true; + } + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n_hyphen_asterisk_end") + entry->parser = entry->parser_switch; + } + else if(myhtml_strncasecmp(&str.data[consumed_len], "n", 1) == 0) + { + size_t rem = (str.length - consumed_len) - 1; + + if(rem == 0) { + entry->parser = mycss_an_plus_b_state_anb_plus_n; + + myhtml_string_destroy(&str, false); + return true; + } + + if(mycss_convert_data_to_integer(&str.data[(consumed_len + 1)], rem, &anb_entry->b) != rem) { + /* parse error */ + anb_entry->is_broken = true; + } + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n_end") + entry->parser = entry->parser_switch; + } + else { + myhtml_string_destroy(&str, false); + + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + + myhtml_string_destroy(&str, false); + break; + } + default: { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + } + + return true; +} + +bool mycss_an_plus_b_state_anb_plus(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_an_plus_b_entry_t *anb_entry = mycss_an_plus_b_current_entry(entry); + + switch (token->type) { + case MyCSS_TOKEN_TYPE_IDENT: { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + if(myhtml_strncasecmp(str.data, "n-", 2) == 0) + { + if(str.length == 2) { + entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; + + myhtml_string_destroy(&str, false); + return true; + } + + size_t len = str.length - 1; + if(mycss_convert_data_to_integer(&str.data[1], len, &anb_entry->b) != len) { + /* parse error */ + anb_entry->is_broken = true; + } + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_hyphen_asterisk_end") + entry->parser = entry->parser_switch; + } + else if(myhtml_strncasecmp(str.data, "n", 1) == 0) { + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n") + entry->parser = mycss_an_plus_b_state_anb_plus_n; + } + else { + myhtml_string_destroy(&str, false); + + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + + myhtml_string_destroy(&str, false); + break; + } + default: { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + } + + return true; +} + +bool mycss_an_plus_b_state_anb_plus_n_hyphen(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + mycss_an_plus_b_entry_t *anb_entry = mycss_an_plus_b_current_entry(entry); + + if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { + /* begin from 0-9 */ + if(myhtml_string_chars_num_map[ (const unsigned char)(*token->data) ] != 0xff) + { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + long res; + mycss_convert_data_to_integer(str.data, str.length, &res); + + anb_entry->b = -res; + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_hyphen_zero_hyphen_nine_end") + entry->parser = entry->parser_switch; + + myhtml_string_destroy(&str, false); + } + else { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + } + else { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_an_plus_b_state_anb_plus_n(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + mycss_an_plus_b_entry_t *anb_entry = mycss_an_plus_b_current_entry(entry); + + switch (token->type) { + case MyCSS_TOKEN_TYPE_DELIM: { + if(*token->data == '+') { + entry->parser = mycss_an_plus_b_state_anb_plus_n_plus; + } + else if(*token->data == '-') { + entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; + } + else { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + break; + } + case MyCSS_TOKEN_TYPE_NUMBER: { + if(*token->data == '+' || *token->data == '-') + { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + mycss_convert_data_to_integer(str.data, str.length, &anb_entry->b); + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_begin_plus_vertical_bar_hyphen") + entry->parser = entry->parser_switch; + + myhtml_string_destroy(&str, false); + } + else { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + break; + } + default: { + entry->parser = entry->parser_switch; + return false; + } + } + + return true; +} + +bool mycss_an_plus_b_state_anb_plus_n_plus(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + mycss_an_plus_b_entry_t *anb_entry = mycss_an_plus_b_current_entry(entry); + + if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { + /* begin from 0-9 */ + if(myhtml_string_chars_num_map[ (const unsigned char)(*token->data) ] != 0xff) + { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + mycss_convert_data_to_integer(str.data, str.length, &anb_entry->b); + + MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_plus_zero_hyphen_nine_end") + entry->parser = entry->parser_switch; + + myhtml_string_destroy(&str, false); + } + else { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + } + else { + mycss_an_plus_b_parser_expectations_error(entry); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + + + diff --git a/source/mycss/an_plus_b.h b/source/mycss/an_plus_b.h new file mode 100644 index 0000000..c34fb89 --- /dev/null +++ b/source/mycss/an_plus_b.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_AN_PLUS_B_H +#define MyHTML_MyCSS_AN_PLUS_B_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/list.h" + +#define mycss_an_plus_b_current_entry(entry) (*entry->anb->entry) + +struct mycss_an_plus_b { + mycss_an_plus_b_entry_t** entry; +}; + +struct mycss_an_plus_b_entry { + long a; + long b; + long n; + + bool is_broken; + mycss_selectors_list_t* of; +}; + +mycss_an_plus_b_t * mycss_an_plus_b_create(void); +mycss_status_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb); +mycss_status_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb); +mycss_an_plus_b_t * mycss_an_plus_b_destroy(mycss_an_plus_b_t* anb, bool self_destroy); + +mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_create(mycss_entry_t* entry); +void mycss_an_plus_b_entry_clean_all(mycss_an_plus_b_entry_t* anb_entry); +mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_destroy(mycss_entry_t* entry, mycss_an_plus_b_entry_t* anb_entry, bool self_destroy); + +void mycss_an_plus_b_print(mycss_an_plus_b_entry_t* anb_entry, FILE* fh); + +void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry); + +bool mycss_an_plus_b_state_anb_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus_n_hyphen(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus_n(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_an_plus_b_state_anb_plus_n_plus(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_AN_PLUS_B_H */ diff --git a/source/mycss/api.h b/source/mycss/api.h new file mode 100644 index 0000000..17ae8ac --- /dev/null +++ b/source/mycss/api.h @@ -0,0 +1,524 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCSS_MyCSS_API_H +#define MyCSS_MyCSS_API_H +#pragma once + +/** + * @file mycss/api.h + * + * Fast C/C++ CSS Parser (Cascading Style Sheets). Using threads. + * + * C99 and POSIX Threads! + * This is part of big project. + * All projects (and this too) is based on myhtml (https://github.com/lexborisov/myhtml) + * + * By https://www.w3.org/TR/css-syntax-3/ specification. + * + */ + +#define MyCSS_VERSION_MAJOR 0 +#define MyCSS_VERSION_MINOR 0 +#define MyCSS_VERSION_PATCH 9 + +#include "myhtml/api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @struct mycss statuses + */ +// base +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum mycss_status { + MyCSS_STATUS_OK = 0x000000, + MyCSS_STATUS_ERROR_MEMORY_ALLOCATION = 0x010001, + MyCSS_STATUS_ERROR_TOKENIZER_STATE_ALLOCATION = 0x010020, + MyCSS_STATUS_ERROR_TOKENIZER_INCOMING_BUFFER_ADD = 0x010021, + MyCSS_STATUS_ERROR_TOKENIZER_TOKEN_ALLOCATION = 0x010022, + MyCSS_STATUS_ERROR_INCOMING_BUFFER_INIT = 0x010030, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_CREATE = 0x010039, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_INIT = 0x010040, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_INCOMING_BUFFER_INIT = 0x010041, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_NODE_ADD = 0x010042, + MyCSS_STATUS_ERROR_SELECTORS_CREATE = 0x010100, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_CREATE = 0x010101, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_INIT = 0x010102, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_NODE_ADD = 0x010103, + MyCSS_STATUS_ERROR_SELECTORS_LIST_CREATE = 0x010104, + MyCSS_STATUS_ERROR_SELECTORS_LIST_INIT = 0x010105, + MyCSS_STATUS_ERROR_SELECTORS_LIST_ADD_NODE = 0x010106, + MyCSS_STATUS_ERROR_NAMESPACE_CREATE = 0x010200, + MyCSS_STATUS_ERROR_NAMESPACE_INIT = 0x010201, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_CREATE = 0x010202, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_INIT = 0x010203, + MyCSS_STATUS_ERROR_NAMESPACE_NODE_ADD = 0x010204, + MyCSS_STATUS_ERROR_MEDIA_CREATE = 0x010404, + MyCSS_STATUS_ERROR_STRING_CREATE = 0x010501, + MyCSS_STATUS_ERROR_STRING_INIT = 0x010502, + MyCSS_STATUS_ERROR_STRING_NODE_INIT = 0x010503, + MyCSS_STATUS_ERROR_AN_PLUS_B_CREATE = 0x010600, + MyCSS_STATUS_ERROR_AN_PLUS_B_INIT = 0x010601, + MyCSS_STATUS_ERROR_DECLARATION_CREATE = 0x010700, + MyCSS_STATUS_ERROR_DECLARATION_INIT = 0x010701, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_CREATE = 0x010702, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_INIT = 0x010703, + MyCSS_STATUS_ERROR_PARSER_LIST_CREATE = 0x010800 +} +typedef mycss_status_t; + +#define MyCSS_FAILED(_status_) ((_status_) != MyCSS_STATUS_OK) + +/** + * Tokenizer Token types + */ +enum mycss_token_type { + MyCSS_TOKEN_TYPE_UNDEF = 0x0000, + MyCSS_TOKEN_TYPE_WHITESPACE = 0x0001, + MyCSS_TOKEN_TYPE_IDENT = 0x0002, + MyCSS_TOKEN_TYPE_FUNCTION = 0x0003, + MyCSS_TOKEN_TYPE_AT_KEYWORD = 0x0004, + MyCSS_TOKEN_TYPE_HASH = 0x0005, + MyCSS_TOKEN_TYPE_STRING = 0x0006, + MyCSS_TOKEN_TYPE_URL = 0x0007, + MyCSS_TOKEN_TYPE_NUMBER = 0x0008, + MyCSS_TOKEN_TYPE_DIMENSION = 0x0009, + MyCSS_TOKEN_TYPE_PERCENTAGE = 0x000a, + MyCSS_TOKEN_TYPE_INCLUDE_MATCH = 0x000b, + MyCSS_TOKEN_TYPE_DASH_MATCH = 0x000c, + MyCSS_TOKEN_TYPE_PREFIX_MATCH = 0x000d, + MyCSS_TOKEN_TYPE_SUFFIX_MATCH = 0x000e, + MyCSS_TOKEN_TYPE_SUBSTRING_MATCH = 0x000f, + MyCSS_TOKEN_TYPE_COLUMN = 0x0010, + MyCSS_TOKEN_TYPE_CDO = 0x0011, + MyCSS_TOKEN_TYPE_CDC = 0x0012, + MyCSS_TOKEN_TYPE_BAD_STRING = 0x0013, + MyCSS_TOKEN_TYPE_DELIM = 0x0014, + MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS = 0x0015, + MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS = 0x0016, + MyCSS_TOKEN_TYPE_COMMA = 0x0017, + MyCSS_TOKEN_TYPE_COLON = 0x0018, + MyCSS_TOKEN_TYPE_SEMICOLON = 0x0019, + MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET = 0x001a, + MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET = 0x001b, + MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET = 0x001c, + MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET = 0x001d, + MyCSS_TOKEN_TYPE_BAD_URL = 0x001e, + MyCSS_TOKEN_TYPE_COMMENT = 0x001f, + MyCSS_TOKEN_TYPE_UNICODE_RANGE = 0x0020, + MyCSS_TOKEN_TYPE_EOF = 0x0021, + MyCSS_TOKEN_TYPE_LAST_ENTRY = 0x0022 +} +typedef mycss_token_type_t; + +/** + * @struct mycss_t MyCSS + * + * Basic structure. Create once for using many times. +*/ +typedef struct mycss mycss_t; + +/** + * @struct mycss_entry_t MyCSS_ENTRY + * + * Secondary structure. Create once for using many times. + */ +typedef struct mycss_entry mycss_entry_t; + +/** + * @struct mycss_token_t MyCSS_TOKEN + * + * Tokenizer data structure. + */ +typedef struct mycss_token mycss_token_t; + +/** + * @struct mycss_token_done_callback_f + * + * Callback for token is ready + */ +typedef mycss_token_t* +(*mycss_token_ready_callback_f)(mycss_entry_t* entry, mycss_token_t* token); + +/*********************************************************************************** + * + * MyCSS + * + ***********************************************************************************/ + +/** + * Create a MyCSS structure + * + * @return mycss_t* if successful, otherwise an NULL value. + */ +mycss_t* +mycss_create(void); + +/** + * Allocating and Initialization resources for a MyCSS structure + * + * @param[in] mycss_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status value. + */ +mycss_status_t +mycss_init(mycss_t* mycss); + +/** + * Destroy of a MyCSS structure + * + * @param[in] mycss_t* + * @param[in] call free() function for mycss_t* object? true or false + * + * @return NULL if successful, otherwise an MyCSS structure. + */ +mycss_t* +mycss_destroy(mycss_t* mycss, bool self_destroy); + +/** + * Parsing CSS + * + * @param[in] previously created structure mycss_entry_t* + * @param[in] Now is not working! Coming Soon. Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] CSS data + * @param[in] CSS data size + * + * All input character encoding decode to utf-8 + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status + */ +mycss_status_t +mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); + +/** + * Parsing CSS chunk. For End Parsing call mycss_parse_chunk_end function + * + * @param[in] previously created structure mycss_entry_t* + * @param[in] CSS data + * @param[in] CSS data size + * + * All input character encoding decode to utf-8 + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status + */ +mycss_status_t +mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); + +/** + * End of parsing CSS chunks + * + * @param[in] mycss_entry_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status + */ +mycss_status_t +mycss_parse_chunk_end(mycss_entry_t* entry); + +/*********************************************************************************** + * + * MyCSS_ENTRY + * + ***********************************************************************************/ + +/** + * Create a MyCSS_ENTRY structure + * + * @return mycss_entry_t* if successful, otherwise an NULL value. + */ +mycss_entry_t* +mycss_entry_create(void); + +/** + * Allocating and Initialization resources for a MyCSS_ENTRY structure + * + * @param[in] mycss_t* + * @param[in] mycss_entry_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status value. + */ +mycss_status_t +mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); + +/** + * Clear all structures + * + * @param[in] mycss_entry_t* + * + * @return MyCSS_STATUS_OK if successful, otherwise an error status value. + */ +mycss_status_t +mycss_entry_clean_all(mycss_entry_t* entry); + +/** + * Destroy of a MyCSS_ENTRY structure + * + * @param[in] mycss_entry_t* + * @param[in] call free() function for mycss_entry_t* object? true or false + * + * @return NULL if successful, otherwise an MyCSS_ENTRY structure. + */ +mycss_entry_t* +mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy); + +/** + * Set or Get current callback function for token is ready + * + * @param[in] mycss_entry_t* + * @param[in] mycss_token_ready_callback_f + * function which will be returned when the token is ready + * or NULL for only return current function + * + * @example_function + * mycss_token_t * your_name_callback(mycss_entry_t* entry, mycss_token_t* token) { + * return token; + * } + * + * @example See tokenizer_high_level.c in examples directory + * + * @return mycss_token_ready_callback_f structure + */ +mycss_token_ready_callback_f +mycss_entry_token_ready_callback(mycss_entry_t* entry, + mycss_token_ready_callback_f callback_f); + +/** + * Get tokens count + * + * @param[in] mycss_entry_t* + * + * @return count of token + */ +size_t +mycss_entry_token_count(mycss_entry_t* entry); + +/** + * Get current Incoming Buffer + * See MyHTML_INCOMING in https://github.com/lexborisov/myhtml + * + * @param[in] mycss_entry_t* + * + * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + */ +myhtml_incoming_buffer_t* +mycss_entry_incoming_buffer_current(mycss_entry_t* entry); + +/** + * Get first Incoming Buffer from list + * See MyHTML_INCOMING in https://github.com/lexborisov/myhtml + * + * @param[in] mycss_entry_t* + * + * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + */ +myhtml_incoming_buffer_t* +mycss_entry_incoming_buffer_first(mycss_entry_t* entry); + +/*********************************************************************************** + * + * MyCSS_TOKEN + * + ***********************************************************************************/ + +/** + * Get begin position of Token + * + * @param[in] mycss_token_t* + * + * @return size_t, begin position for token + */ +size_t +mycss_token_begin(mycss_token_t* token); + +/** + * Get length of Token + * + * @param[in] mycss_token_t* + * + * @return size_t, length of token + */ +size_t +mycss_token_length(mycss_token_t* token); + +/** + * Get begin position and length for Token + * + * @param[in] mycss_token_t* + * @param[out] size_t*, optional, token length + * + * @return size_t, begin position for token + */ +size_t +mycss_token_position(mycss_token_t* token, size_t *return_length); + +/** + * Get Token type + * + * @param[in] mycss_token_t* + * + * @return mycss_token_type_t + */ +mycss_token_type_t +mycss_token_type(mycss_token_t* token); + +/** + * Get Token name by Token type + * + * @param[in] mycss_token_type_t + * + * @return token name terminated with a null character ('\0') + */ +const char* +mycss_token_name_by_type(mycss_token_type_t type); + +/** + * Converting raw token data (your input const char*) + * to strict string as required by the specification + * + * @param[in] mycss_entry_t* + * @param[in] mycss_token_t*, token from which data will be obtained + * @param[in] myhtml_string_t*, a pointer to the row in which the data will be written + * @param[in] initialization myhtml_string_t* object + * + * @return length of processed data + */ +size_t +mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, + myhtml_string_t* str, bool init_string); + +/*********************************************************************************** + * + * MyCSS_ENCODING + * + * @description It is inherited from the main project MyHTML + * See https://github.com/lexborisov/myhtml + * + ***********************************************************************************/ + +/** + * Set character encoding for input stream + * + * @param[in] mycss_entry_t* + * @param[in] Input character encoding. + * See https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h + * myhtml_encoding_t + * + */ +void +mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); + +/** + * Get character encoding for current stream + * + * @param[in] mycss_entry_t* + * + * @return myhtml_encoding_t + */ +myhtml_encoding_t +mycss_encoding_get(mycss_entry_t* entry); + +/** + * Get encoding from @charset "..."; + * + * See for information: + * https://www.w3.org/TR/css-syntax-3/#get-an-encoding + * https://www.w3.org/TR/css-syntax-3/#charset-rule + * myhtml_encoding_by_name in https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h + * + * If @charset rule is missing or encoding not found return MyHTML_ENCODING_UTF_8 by default + * + * @param[in] css data stream + * @param[in] css data stream size + * + * @return myhtml_encoding_t + */ +myhtml_encoding_t +mycss_encoding_check_charset_rule(const char* css, size_t size); + +/*********************************************************************************** + * + * MyCSS_CONVERT + * + * @description It is inherited from the main project MyHTML + * See https://github.com/lexborisov/myhtml + * + ***********************************************************************************/ + +/** + * Convert data to double number + * + * @param[in] data to convert + * @param[in] data size + * @param[out] converting result + * @param[out] is integer or float + * + * @return length of data converting + */ +size_t +mycss_convert_data_to_double(const char* data, size_t size, double* return_num, bool* is_float); + +/** + * Convert data to unicode range code point + * See https://www.w3.org/TR/css-syntax-3/#unicode-range-token-diagram + * See https://www.w3.org/TR/css-syntax-3/#consume-a-unicode-range-token + * + * @param[in] data to convert + * @param[in] data size + * @param[out] start range converting result + * @param[out] end range converting result + * + * @return length of data converting + */ +size_t +mycss_convert_unicode_range_to_codepoint(const char *data, size_t size, size_t *start, size_t *end); + +/** + * Convert hex data to code point + * + * @param[in] data to convert + * @param[in] data size + * @param[out] result codepoint + * @param[in] how much length can be consumed + * + * @return length of data converting + */ +size_t +mycss_convert_hex_to_codepoint(const char *data, size_t size, size_t *codepoint, unsigned int max_consumed); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCSS_MyCSS_API_H */ diff --git a/source/mycss/check.c b/source/mycss/check.c new file mode 100644 index 0000000..fb2d051 --- /dev/null +++ b/source/mycss/check.c @@ -0,0 +1,195 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/check.h" +#include "mycss/tokenizer_resource.h" + +#define MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED \ + if(css_offset >= buffer->size) { \ + buffer = buffer->next; \ + css_offset = 0; \ + } + +///////////////////////////////////////////////////////// +//// For chunk +//// +///////////////////////////////////////////////////////// +bool mycss_check_two_code_points_valid_escape_chunk(mycss_entry_t* entry, size_t css_offset) +{ + myhtml_incoming_buffer_t* buffer = entry->current_buffer; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + + if(buffer->data[css_offset] == '\\') { + ++css_offset; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + + if(buffer->data[css_offset] != '\n') + return true; + } + + return false; +} + +bool mycss_check_three_code_points_would_start_identifier_chunk(mycss_entry_t* entry, size_t css_offset) +{ + myhtml_incoming_buffer_t* buffer = entry->current_buffer; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + const unsigned char *u_css = (const unsigned char*)buffer->data; + + if(buffer->data[css_offset] == '-') + { + ++css_offset; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + u_css = (const unsigned char*)buffer->data; + + if(buffer->data[css_offset] == '-' || + mycss_begin_chars_state_map[ u_css[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT || + mycss_check_two_code_points_valid_escape_chunk(entry, css_offset)) + { + return true; + } + } + else if(mycss_begin_chars_state_map[ u_css[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + return true; + } + else if(buffer->data[css_offset] == '\\' && mycss_check_two_code_points_valid_escape_chunk(entry, css_offset)) { + return true; + } + + return false; +} + +bool mycss_check_three_code_points_would_start_number_chunk(mycss_entry_t* entry, size_t css_offset) +{ + myhtml_incoming_buffer_t* buffer = entry->current_buffer; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + + if(buffer->data[css_offset] == '-' || buffer->data[css_offset] == '+') + { + ++css_offset; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + + if(buffer->data[css_offset] >= '0' && buffer->data[css_offset] <= '9') + return true; + + if(buffer->data[css_offset] == '.') { + ++css_offset; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + + if(buffer->data[css_offset] >= '0' && buffer->data[css_offset] <= '9') + return true; + } + } + else if(buffer->data[css_offset] == '.') { + ++css_offset; + + MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED + + if(buffer->data[css_offset] >= '0' && buffer->data[css_offset] <= '9') + return true; + } + else if(buffer->data[css_offset] >= '0' && buffer->data[css_offset] <= '9') + return true; + + return false; +} + +///////////////////////////////////////////////////////// +//// basic checks +//// +///////////////////////////////////////////////////////// +bool mycss_check_three_code_points_would_start_identifier(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css_offset >= css_size) + return mycss_check_three_code_points_would_start_identifier_chunk(entry, css_offset); + + const unsigned char *u_css = (const unsigned char*)css; + + if(css[css_offset] == '-') + { + ++css_offset; + + if(css[css_offset] == '-' || + mycss_begin_chars_state_map[ u_css[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT || + mycss_check_two_code_points_valid_escape(entry, token, css, css_offset, css_size)) + { + return true; + } + } + else if(mycss_begin_chars_state_map[ u_css[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + return true; + } + else if(css[css_offset] == '\\' && mycss_check_two_code_points_valid_escape(entry, token, css, css_offset, css_size)) { + return true; + } + + return false; +} + +bool mycss_check_two_code_points_valid_escape(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css_offset >= css_size) + return mycss_check_two_code_points_valid_escape_chunk(entry, css_offset); + + if(css[css_offset] == '\\' && css[(css_offset + 1)] != '\n') + return true; + + return false; +} + +bool mycss_check_three_code_points_would_start_number(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css_offset >= css_size) + return mycss_check_three_code_points_would_start_number_chunk(entry, css_offset); + + if(css[css_offset] == '-' || css[css_offset] == '+') + { + ++css_offset; + + if(css[css_offset] >= '0' && css[css_offset] <= '9') + return true; + + if(css[css_offset] == '.') { + ++css_offset; + + if(css[css_offset] >= '0' && css[css_offset] <= '9') + return true; + } + } + else if(css[css_offset] == '.') { + ++css_offset; + + if(css[css_offset] >= '0' && css[css_offset] <= '9') + return true; + } + else if(css[css_offset] >= '0' && css[css_offset] <= '9') + return true; + + return false; +} + + diff --git a/source/mycss/check.h b/source/mycss/check.h new file mode 100644 index 0000000..1d0ab5c --- /dev/null +++ b/source/mycss/check.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_CHECK_H +#define MyHTML_MyCSS_CHECK_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "mycss/mycss.h" +#include "mycss/entry.h" + +bool mycss_check_three_code_points_would_start_identifier(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +bool mycss_check_two_code_points_valid_escape(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +bool mycss_check_three_code_points_would_start_number(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_CHECK_H */ diff --git a/source/mycss/convert.c b/source/mycss/convert.c new file mode 100644 index 0000000..1422fd2 --- /dev/null +++ b/source/mycss/convert.c @@ -0,0 +1,258 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "convert.h" +#include "myhtml/utils/resources.h" + +const char * mycss_convert_split_dimension_string(myhtml_string_t* str, double* value, bool* is_float) +{ + size_t length = mycss_convert_data_to_double(str->data, str->length, value, is_float); + return &str->data[length]; +} + +// TODO: float or double??? +size_t mycss_convert_data_to_double(const char *data, size_t size, double *return_num, bool* is_float) +{ + double p10; + bool is_negative = false; + size_t offset = 0; + + *return_num = 0.0f; + + switch (data[offset]) { + case '-': is_negative = true; + case '+': offset++; + } + + double number = 0.; + int num_digits = 0; + int num_decimals = 0; + int exponent = 0; + + // digits + while(offset < size && (data[offset] >= '0' && data[offset] <= '9')) + { + number = (data[offset] - '0') + number * 10; + + ++offset; + ++num_digits; + } + + if(offset == size) { + if(is_negative) number = -number; + + *return_num = number; + + if(is_float) + *is_float = false; + + return offset; + } + + // decimals + if(data[offset] == '.') { + ++offset; + + while (offset < size && (data[offset] >= '0' && data[offset] <= '9')) + { + number = (data[offset] - '0') + number * 10; + + ++offset; + ++num_digits; + ++num_decimals; + } + + exponent -= num_decimals; + } + else { + if(is_negative) number = -number; + + *return_num = number; + + if(is_float) + *is_float = false; + + return offset; + } + + if(num_digits == 0) + return 0; + + if(is_float) + *is_float = true; + + // Correct for sign + if(is_negative) number = -number; + + int n = 0; + + // Process an exponent string + if(offset < size && (data[offset] == 'e' || data[offset] == 'E')) + { + ++offset; + + if(offset >= size || ((data[offset] != '-' || data[offset] != '+') && + (data[offset] < '0' || data[offset] > '9'))) { + offset--; + } + else { + // Handle optional sign + is_negative = false; + + switch(data[offset]) { + case '-': is_negative = true; + case '+': offset++; + } + + // Process string of digits + while(offset < size && (data[offset] >= '0' && data[offset] <= '9')) + { + n = (data[offset] - '0') + n * 10; + ++offset; + } + + if(is_negative) { + exponent -= n; + } else { + exponent += n; + } + } + } + + // Scale the result + p10 = 10.; + n = exponent; + + if (n < 0) n = -n; + + while (n) { + if (n & 1) { + if (exponent < 0) { + number /= p10; + } else { + number *= p10; + } + } + + n >>= 1; + p10 *= p10; + } + + *return_num = number; + + if(is_float) + *is_float = true; + + return offset; +} + +size_t mycss_convert_data_to_integer(const char* data, size_t size, long* return_num) +{ + long res_num = 0; + bool is_negative = false; + size_t offset = 0; + + switch (data[offset]) { + case '-': is_negative = true; + case '+': offset++; + } + + const unsigned char* u_data = (const unsigned char*)data; + + while(offset < size && myhtml_string_chars_num_map[u_data[offset]] != 0xff) + { + res_num = myhtml_string_chars_num_map[ u_data[offset] ] + res_num * 10; + ++offset; + } + + if(is_negative) + res_num = -res_num; + + *return_num = res_num; + + return offset; +} + +size_t mycss_convert_hex_to_codepoint(const char *data, size_t size, size_t *codepoint, unsigned int max_consumed) +{ + const unsigned char *u_data = (const unsigned char*)data; + + size_t length = 0; + *codepoint = 0; + + while(length < size) + { + if(myhtml_string_chars_hex_map[u_data[length]] != 0xff) { + *codepoint <<= 4; + *codepoint |= myhtml_string_chars_hex_map[ u_data[length] ]; + + --max_consumed; + + if(max_consumed == 0) + break; + } + else + break; + + ++length; + } + + return length; +} + +size_t mycss_convert_unicode_range_to_codepoint(const char *data, size_t size, size_t *start, size_t *end) +{ + size_t length = mycss_convert_hex_to_codepoint(data, size, start, 6); + + if(length == size) { + *end = 0; + return length; + } + + if(data[length] == '?') + { + *end = *start; + + do { + *start <<= 4; + *start |= myhtml_string_chars_hex_map[ 0x30 ]; // 0x30 == '0' + + *end <<= 4; + *end |= myhtml_string_chars_hex_map[ 0x46 ]; // 0x46 == 'F' + + ++length; + } + while(length < size && data[length] == '?'); + + return length; + } + + if(data[length] == '-') { + ++length; + + length += mycss_convert_hex_to_codepoint(&data[length], (size - length), end, 6); + } + else + *end = 0; + + return length; +} + + diff --git a/source/mycss/convert.h b/source/mycss/convert.h new file mode 100644 index 0000000..5f89572 --- /dev/null +++ b/source/mycss/convert.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_CONVERT_H +#define MyHTML_MyCSS_CONVERT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "mycss/entry.h" +#include "myhtml/mystring.h" + +const char * mycss_convert_split_dimension_string(myhtml_string_t* str, double* value, bool* is_float); + +size_t mycss_convert_data_to_integer(const char* data, size_t size, long* return_num); +size_t mycss_convert_data_to_double(const char *data, size_t size, double *return_num, bool* is_float); +size_t mycss_convert_unicode_range_to_codepoint(const char *data, size_t size, size_t *start, size_t *end); +size_t mycss_convert_hex_to_codepoint(const char *data, size_t size, size_t *codepoint, unsigned int max_consumed); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_CONVERT_H */ diff --git a/source/mycss/declaration/entry.c b/source/mycss/declaration/entry.c new file mode 100644 index 0000000..6682b66 --- /dev/null +++ b/source/mycss/declaration/entry.c @@ -0,0 +1,117 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/declaration/entry.h" + + +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status) +{ + return mcobject_malloc(declaration->mcobject_entries, status); +} + +void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry) +{ + entry->value = NULL; + entry->value_type = 0; + entry->is_important = false; + entry->type = MyCSS_PROPERTY_TYPE_UNDEF; + entry->flags = MyCSS_DECLARATION_FLAGS_UNDEF; +} + +void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry) +{ + memset(entry, 0, sizeof(mycss_declaration_entry_t)); +} + +void mycss_declaration_entry_destroy(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry) +{ + if(dec_entry->value) + mycss_values_destroy(declaration->ref_entry, dec_entry); + + mcobject_free(declaration->mcobject_entries, dec_entry); +} + +void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry) +{ + if(declaration->entry_last) { + declaration->entry_last->next = dec_entry; + dec_entry->prev = declaration->entry_last; + } + else { + (*declaration->entry) = dec_entry; + } + + declaration->entry_last = dec_entry; +} + +void mycss_declaration_entry_remove(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry) +{ + if(dec_entry->next) { + dec_entry->next->prev = dec_entry->prev; + } + + if(dec_entry->prev) { + dec_entry->prev->next = dec_entry->next; + } + + dec_entry->next = NULL; + dec_entry->prev = NULL; +} + +mycss_declaration_entry_t * mycss_declaration_entry_delete(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry) +{ + mycss_declaration_entry_remove(declaration, dec_entry); + mycss_declaration_entry_destroy(declaration, dec_entry); + + return NULL; +} + +mycss_declaration_entry_t * mycss_declaration_entry(mycss_declaration_t* declaration) +{ + return declaration->entry_last; +} + +mycss_declaration_entry_t * mycss_declaration_entry_last(mycss_declaration_t* declaration) +{ + return declaration->entry_last; +} + +void mycss_declaration_entry_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry, FILE* fh) +{ + mycss_property_print(dec_entry->type, fh); + fprintf(fh, ": "); + mycss_property_value_print(dec_entry->value_type, dec_entry->value, fh); +} + +void mycss_declaration_entries_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* first_dec_entry, FILE* fh) +{ + while(first_dec_entry) { + mycss_declaration_entry_print(declaration, first_dec_entry, fh); + + if(first_dec_entry->next) { + fprintf(fh, "; "); + } else { + fprintf(fh, ";"); + } + + first_dec_entry = first_dec_entry->next; + } +} + diff --git a/source/mycss/declaration/entry.h b/source/mycss/declaration/entry.h new file mode 100644 index 0000000..d791a60 --- /dev/null +++ b/source/mycss/declaration/entry.h @@ -0,0 +1,53 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_ENTRY_H +#define MyHTML_MyCSS_DECLARATION_ENTRY_H +#pragma once + +#include "mycss/declaration/myosi.h" +#include "mycss/values/values.h" +#include "mycss/property/init.h" + +#ifdef __cplusplus +extern "C" { +#endif + +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); +void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); +void mycss_declaration_entry_destroy(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); + +mycss_declaration_entry_t * mycss_declaration_entry(mycss_declaration_t* declaration); +mycss_declaration_entry_t * mycss_declaration_entry_last(mycss_declaration_t* declaration); + +void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); +void mycss_declaration_entry_remove(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); +mycss_declaration_entry_t * mycss_declaration_entry_delete(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); + +void mycss_declaration_entry_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry, FILE* fh); +void mycss_declaration_entries_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* first_dec_entry, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_ENTRY_H */ + diff --git a/source/mycss/declaration/init.c b/source/mycss/declaration/init.c new file mode 100644 index 0000000..c68401e --- /dev/null +++ b/source/mycss/declaration/init.c @@ -0,0 +1,142 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/declaration/init.h" + + +mycss_declaration_t * mycss_declaration_create(void) +{ + return (mycss_declaration_t*)myhtml_calloc(1, sizeof(mycss_declaration_t)); +} + +mycss_status_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration) +{ + declaration->ref_entry = entry; + declaration->entry = NULL; + declaration->ending_token = MyCSS_TOKEN_TYPE_UNDEF; + + /* Objects */ + declaration->mcobject_entries = mcobject_create(); + if(declaration->mcobject_entries == NULL) + return MyCSS_STATUS_ERROR_DECLARATION_ENTRY_CREATE; + + myhtml_status_t myhtml_status = mcobject_init(declaration->mcobject_entries, 256, sizeof(mycss_declaration_entry_t)); + if(myhtml_status) + return MyCSS_STATUS_ERROR_DECLARATION_ENTRY_INIT; + + return MyCSS_STATUS_OK; +} + +void mycss_declaration_clean(mycss_declaration_t* declaration) +{ + declaration->entry = NULL; + declaration->ending_token = MyCSS_TOKEN_TYPE_UNDEF; +} + +void mycss_declaration_clean_all(mycss_declaration_t* declaration) +{ + declaration->entry = NULL; + declaration->ending_token = MyCSS_TOKEN_TYPE_UNDEF; + + mcobject_clean(declaration->mcobject_entries); +} + +mycss_declaration_t * mycss_declaration_destroy(mycss_declaration_t* declaration, bool self_destroy) +{ + if(declaration == NULL) + return NULL; + + declaration->mcobject_entries = mcobject_destroy(declaration->mcobject_entries, true); + + if(self_destroy) { + myhtml_free(declaration); + return NULL; + } + + return declaration; +} + +mycss_token_t * mycss_declaration_parse_token_callback(mycss_entry_t* entry, mycss_token_t* token) +{ + if(token->type == MyCSS_TOKEN_TYPE_COMMENT) + return token; + + bool last_response = true; + while((last_response = entry->parser(entry, token, last_response)) == false) {}; + + return entry->token; +} + +void mycss_declaration_ending_token_type_set(mycss_declaration_t* declaration, mycss_token_type_t ending_token_type) +{ + declaration->ending_token = ending_token_type; +} + +mycss_token_type_t mycss_declaration_ending_token_type(mycss_declaration_t* declaration) +{ + return declaration->ending_token; +} + +mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status) +{ + mycss_declaration_clean(declaration); + + mycss_entry_t *entry = declaration->ref_entry; + + mycss_token_ready_callback_f tmp_token_ready_callback = entry->token_ready_callback; + + entry->token_ready_callback = mycss_declaration_parse_token_callback; + entry->parser = mycss_declaration_state_begin; + entry->parser_original = NULL; + entry->parser_switch = NULL; + entry->state = MyCSS_TOKENIZER_STATE_DATA; + entry->state_back = MyCSS_TOKENIZER_STATE_DATA; + entry->declaration->ending_token = MyCSS_TOKEN_TYPE_UNDEF; + + mycss_declaration_entry_t *dec_entry = NULL; + declaration->entry = &dec_entry; + + /* parsing */ + mycss_encoding_set(entry, encoding); + + mycss_status_t status = mycss_tokenizer_chunk(entry, data, data_size); + if(status != MyCSS_STATUS_OK) { + if(out_status) + *out_status = status; + + return NULL; + } + + status = mycss_tokenizer_end(entry); + + mycss_declaration_parser_end(entry, NULL); + + if(out_status) + *out_status = status; + + entry->token_ready_callback = tmp_token_ready_callback; + + if(dec_entry) + return dec_entry; + + return NULL; +} + + diff --git a/source/mycss/declaration/init.h b/source/mycss/declaration/init.h new file mode 100644 index 0000000..a439e99 --- /dev/null +++ b/source/mycss/declaration/init.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_INIT_H +#define MyHTML_MyCSS_DECLARATION_INIT_H +#pragma once + +#include "mycss/declaration/myosi.h" +#include "mycss/entry.h" + +#ifdef __cplusplus +extern "C" { +#endif + +mycss_declaration_t * mycss_declaration_create(void); +mycss_status_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration); +void mycss_declaration_clean_all(mycss_declaration_t* declaration); +void mycss_declaration_clean(mycss_declaration_t* declaration); +mycss_declaration_t * mycss_declaration_destroy(mycss_declaration_t* declaration, bool self_destroy); + +void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); + +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); +void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); + +mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); + +mycss_token_type_t mycss_declaration_ending_token_type(mycss_declaration_t* declaration); +void mycss_declaration_ending_token_type_set(mycss_declaration_t* declaration, mycss_token_type_t ending_token_type); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_INIT_H */ + diff --git a/source/mycss/declaration/myosi.h b/source/mycss/declaration/myosi.h new file mode 100644 index 0000000..32719ac --- /dev/null +++ b/source/mycss/declaration/myosi.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_MYOSI_H +#define MyHTML_MyCSS_DECLARATION_MYOSI_H +#pragma once + +#include "mycss/myosi.h" +#include "mycss/values/units.h" +#include "mycss/property/myosi.h" +#include "myhtml/utils/mcobject.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycss_declaration_entry mycss_declaration_entry_t; +typedef struct mycss_declaration mycss_declaration_t; + +typedef void (*mycss_callback_declaration_destroy_f)(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry); + +enum mycss_declaration_flags { + MyCSS_DECLARATION_FLAGS_UNDEF = 0x00, + MyCSS_DECLARATION_FLAGS_BAD = 0x01 +} +typedef mycss_declaration_flags_t; + +struct mycss_declaration { + mycss_entry_t* ref_entry; + + mycss_declaration_entry_t** entry; + mycss_declaration_entry_t* entry_last; + + mycss_token_type_t ending_token; + + mcobject_t* mcobject_entries; /* for a dec entries */ + mcobject_t* mcobject_list; /* for a dec list */ +}; + +struct mycss_declaration_entry { + mycss_property_type_t type; + + unsigned int value_type; + void* value; + + bool is_important; + mycss_declaration_flags_t flags; + + mycss_declaration_entry_t* next; + mycss_declaration_entry_t* prev; +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_MYOSI_H */ diff --git a/source/mycss/declaration/parser.c b/source/mycss/declaration/parser.c new file mode 100644 index 0000000..7caebe1 --- /dev/null +++ b/source/mycss/declaration/parser.c @@ -0,0 +1,80 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/declaration/parser.h" + +void mycss_declaration_parser_begin(mycss_entry_t* entry, mycss_token_t* token) +{ + if(entry->declaration->entry == NULL) { + /* some error */ + } +} + +void mycss_declaration_parser_ident(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_declaration_entry_t* dec_entry = mycss_declaration_entry(entry->declaration); + + if(dec_entry == NULL || (dec_entry->flags & MyCSS_DECLARATION_FLAGS_BAD) == 0) { + dec_entry = mycss_declaration_entry_create(entry->declaration, NULL); + mycss_declaration_entry_clean_all(dec_entry); + + mycss_declaration_entry_append_to_current(entry->declaration, dec_entry); + } + else + mycss_declaration_entry_clean(dec_entry); + + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + const mycss_property_index_static_entry_t *prop_entry = mycss_property_index_entry_by_name(str.data, str.length); + + if(prop_entry) { + dec_entry->type = prop_entry->type; + + entry->parser = mycss_declaration_state_ident; + entry->parser_switch = prop_entry->parser; + } + else { + + entry->parser = mycss_declaration_state_parse_error; + } + + myhtml_string_destroy(&str, false); +} + +void mycss_declaration_parser_end(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_declaration_entry_t* dec_entry = mycss_declaration_entry(entry->declaration); + + if(dec_entry && dec_entry->type == MyCSS_PROPERTY_TYPE_UNDEF) { + if(dec_entry->prev) { + entry->declaration->entry_last = dec_entry->prev; + + dec_entry->prev->next = NULL; + dec_entry->prev = NULL; + + mycss_declaration_entry_destroy(entry->declaration, dec_entry); + } + else { + *entry->declaration->entry = NULL; + entry->declaration->entry_last = NULL; + } + } +} diff --git a/source/mycss/declaration/parser.h b/source/mycss/declaration/parser.h new file mode 100644 index 0000000..ee94963 --- /dev/null +++ b/source/mycss/declaration/parser.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_PARSER_H +#define MyHTML_MyCSS_DECLARATION_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/property/init.h" +#include "mycss/declaration/entry.h" + +void mycss_declaration_parser_begin(mycss_entry_t* entry, mycss_token_t* token); +void mycss_declaration_parser_ident(mycss_entry_t* entry, mycss_token_t* token); +void mycss_declaration_parser_end(mycss_entry_t* entry, mycss_token_t* token); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_PARSER_H */ diff --git a/source/mycss/declaration/state.c b/source/mycss/declaration/state.c new file mode 100644 index 0000000..b90ba70 --- /dev/null +++ b/source/mycss/declaration/state.c @@ -0,0 +1,227 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/declaration/state.h" + +bool mycss_declaration_state_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_declaration_parser_begin(entry, token); + + return mycss_declaration_state_data(entry, token, last_response); +} + +bool mycss_declaration_state_data(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: + case MyCSS_TOKEN_TYPE_SEMICOLON:{ + break; + } + case MyCSS_TOKEN_TYPE_IDENT: { + mycss_declaration_parser_ident(entry, token); + break; + } + case MyCSS_TOKEN_TYPE_AT_KEYWORD: { + break; + } + default: { + /* parse error */ + entry->parser = mycss_declaration_state_find_ending; + return false; + } + } + + return true; +} + +bool mycss_declaration_state_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: { + break; + } + case MyCSS_TOKEN_TYPE_COLON: { + entry->parser = entry->parser_switch; + break; + } + default: { + /* parse error */ + entry->parser = mycss_declaration_state_parse_error; + return false; + } + } + + return true; +} + +bool mycss_declaration_state_colon_before_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return token; + + if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { + entry->parser = mycss_declaration_state_data; + return true; + } + + if(token->type == MyCSS_TOKEN_TYPE_DELIM && *token->data == '!') { + entry->parser = mycss_declaration_state_colon_important; + return true; + + } + + /* parse error */ + entry->parser = mycss_declaration_state_parse_error; + + return false; +} + +bool mycss_declaration_state_colon_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, true); + + if(myhtml_strcmp(str.data, "important") == 0) { + myhtml_string_destroy(&str, false); + + entry->parser = mycss_declaration_state_colon_delim_after_important; + (entry->declaration->entry_last)->is_important = true; + + return true; + } + + myhtml_string_destroy(&str, false); + + /* parse error */ + entry->parser = mycss_declaration_state_parse_error; + return false; + } + + /* parse error */ + entry->parser = mycss_declaration_state_parse_error; + + return false; +} + +bool mycss_declaration_state_colon_delim_after_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: { + break; + } + case MyCSS_TOKEN_TYPE_SEMICOLON:{ + entry->parser = mycss_declaration_state_data; + break; + } + default: { + if(token->type == entry->declaration->ending_token) { + entry->parser = entry->parser_original; + return true; + } + + /* parse error */ + entry->parser = mycss_declaration_state_parse_error; + return false; + } + } + + return true; +} + +bool mycss_declaration_state_find_ending(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { + entry->parser = mycss_declaration_state_data; + return true; + } + else if(token->type == entry->declaration->ending_token) { + mycss_entry_parser_list_pop(entry); + mycss_declaration_parser_end(entry, token); + + return true; + } + + entry->parser = mycss_declaration_state_drop_component_value; + return false; +} + +bool mycss_declaration_state_parse_error(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + (entry->declaration->entry_last)->flags = MyCSS_DECLARATION_FLAGS_BAD; + + entry->parser = mycss_declaration_state_find_ending; + return false; +} + +bool mycss_declaration_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_FUNCTION: { + mycss_entry_parser_list_push(entry, mycss_declaration_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_declaration_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_declaration_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS: { + mycss_entry_parser_list_push(entry, mycss_declaration_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + case MyCSS_TOKEN_TYPE_SEMICOLON: { + if(mycss_entry_parser_list_current_is_local(entry) == false) + entry->parser = mycss_declaration_state_data; + + break; + } + default: { + if(mycss_entry_parser_list_current_is_local(entry) == false) { + if(token->type == entry->declaration->ending_token) { + mycss_entry_parser_list_pop(entry); + mycss_declaration_parser_end(entry, token); + } + } + else { + if(token->type == entry->parser_ending_token) + mycss_entry_parser_list_pop(entry); + } + } + } + + return true; +} + + diff --git a/source/mycss/declaration/state.h b/source/mycss/declaration/state.h new file mode 100644 index 0000000..0884a21 --- /dev/null +++ b/source/mycss/declaration/state.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_DECLARATION_DECLARATION_H +#define MyHTML_MyCSS_DECLARATION_DECLARATION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/declaration/parser.h" + +bool mycss_declaration_state_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_declaration_state_data(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_colon_before_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_colon_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_colon_delim_after_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_find_ending(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_parse_error(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_declaration_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_DECLARATION_DECLARATION_H */ diff --git a/source/mycss/entry.c b/source/mycss/entry.c new file mode 100644 index 0000000..e06bef9 --- /dev/null +++ b/source/mycss/entry.c @@ -0,0 +1,383 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/entry.h" +#include "mycss/selectors/function_resource.h" + +mycss_entry_t * mycss_entry_create(void) +{ + return (mycss_entry_t*)myhtml_calloc(1, sizeof(mycss_entry_t)); +} + +mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) +{ + entry->mycss = mycss; + entry->parser = NULL; + entry->parser_switch = NULL; + entry->parser_original = NULL; + entry->parser_ending_token = MyCSS_TOKEN_TYPE_UNDEF; + + // Other init + entry->mchar = mchar_async_create(128, (4096 * 5)); + entry->mchar_node_id = mchar_async_node_add(entry->mchar); + entry->mchar_value_node_id = mchar_async_node_add(entry->mchar); + + entry->parser_list = mycss_entry_parser_list_create_and_init(128); + + if(entry->parser_list == NULL) + return MyCSS_STATUS_ERROR_PARSER_LIST_CREATE; + + /* String Entries */ + entry->mcobject_string_entries = mcobject_create(); + if(entry->mcobject_string_entries == NULL) + return MyCSS_STATUS_ERROR_STRING_CREATE; + + myhtml_status_t myhtml_status = mcobject_init(entry->mcobject_string_entries, 256, sizeof(myhtml_string_t)); + if(myhtml_status) + return MyCSS_STATUS_ERROR_STRING_INIT; + + /* Selectors */ + entry->selectors = mycss_selectors_create(); + if(entry->selectors == NULL) + return MyCSS_STATUS_ERROR_SELECTORS_CREATE; + + mycss_status_t status = mycss_selectors_init(entry, entry->selectors); + if(status != MyCSS_STATUS_OK) + return status; + + /* Namespace */ + entry->ns = mycss_namespace_create(); + if(entry->ns == NULL) + return MyCSS_STATUS_ERROR_NAMESPACE_CREATE; + + status = mycss_namespace_init(entry, entry->ns); + if(status != MyCSS_STATUS_OK) + return status; + + /* An+B */ + entry->anb = mycss_an_plus_b_create(); + if(entry->ns == NULL) + return MyCSS_STATUS_ERROR_AN_PLUS_B_CREATE; + + status = mycss_an_plus_b_init(entry, entry->anb); + if(status != MyCSS_STATUS_OK) + return status; + + /* Media */ + entry->media = mycss_media_create(); + if(entry->media == NULL) + return MyCSS_STATUS_ERROR_MEDIA_CREATE; + + status = mycss_media_init(entry, entry->media); + if(status != MyCSS_STATUS_OK) + return status; + + /* Declaration */ + entry->declaration = mycss_declaration_create(); + if(entry->declaration == NULL) + return MyCSS_STATUS_ERROR_DECLARATION_CREATE; + + status = mycss_declaration_init(entry, entry->declaration); + if(status != MyCSS_STATUS_OK) + return status; + + /* Incoming Buffer */ + entry->mcobject_incoming_buffer = mcobject_create(); + if(entry->mcobject_incoming_buffer == NULL) + return MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_CREATE; + + myhtml_status = mcobject_init(entry->mcobject_incoming_buffer, 256, sizeof(myhtml_incoming_buffer_t)); + if(myhtml_status) + return MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_INIT; + + /* callbacks */ + entry->token_ready_callback = mycss_parser_token_ready_callback_function; + + return MyCSS_STATUS_OK; +} + +mycss_status_t mycss_entry_clean(mycss_entry_t* entry) +{ + mcobject_clean(entry->mcobject_incoming_buffer); + mycss_entry_parser_list_clean(entry->parser_list); + + /* CSS Modules */ + mycss_selectors_clean(entry->selectors); + mycss_namespace_clean(entry->ns); + mycss_declaration_clean(entry->declaration); + + entry->parser = NULL; + entry->parser_switch = NULL; + entry->parser_original = NULL; + entry->parser_ending_token = MyCSS_TOKEN_TYPE_UNDEF; + entry->state = MyCSS_TOKENIZER_STATE_DATA; + entry->state_back = MyCSS_TOKENIZER_STATE_DATA; + entry->first_buffer = NULL; + entry->current_buffer = NULL; + entry->token_counter = 0; + entry->help_counter = 0; + entry->type = MyCSS_ENTRY_TYPE_CLEAN; + + return MyCSS_STATUS_OK; +} + +mycss_status_t mycss_entry_clean_all(mycss_entry_t* entry) +{ + mcobject_clean(entry->mcobject_incoming_buffer); + mchar_async_node_clean(entry->mchar, entry->mchar_node_id); + mchar_async_node_clean(entry->mchar, entry->mchar_value_node_id); + + mycss_entry_parser_list_clean(entry->parser_list); + + mcobject_clean(entry->mcobject_string_entries); + + /* CSS Modules */ + mycss_selectors_clean_all(entry->selectors); + mycss_namespace_clean_all(entry->ns); + mycss_an_plus_b_clean_all(entry->anb); + mycss_media_clean_all(entry->media); + mycss_declaration_clean_all(entry->declaration); + + entry->parser = NULL; + entry->parser_switch = NULL; + entry->parser_original = NULL; + entry->parser_ending_token = MyCSS_TOKEN_TYPE_UNDEF; + entry->state = MyCSS_TOKENIZER_STATE_DATA; + entry->state_back = MyCSS_TOKENIZER_STATE_DATA; + entry->first_buffer = NULL; + entry->current_buffer = NULL; + entry->token_counter = 0; + entry->help_counter = 0; + entry->type = MyCSS_ENTRY_TYPE_CLEAN; + + return MyCSS_STATUS_OK; +} + +mycss_entry_t * mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy) +{ + if(entry == NULL) + return NULL; + + entry->mchar = mchar_async_destroy(entry->mchar, 1); + entry->mcobject_string_entries = mcobject_destroy(entry->mcobject_string_entries, true); + entry->parser_list = mycss_entry_parser_list_destroy(entry->parser_list, true); + + /* CSS Modules */ + entry->selectors = mycss_selectors_destroy(entry->selectors, true); + entry->ns = mycss_namespace_destroy(entry->ns, true); + entry->anb = mycss_an_plus_b_destroy(entry->anb, true); + entry->media = mycss_media_destroy(entry->media, true); + entry->declaration = mycss_declaration_destroy(entry->declaration, true); + + entry->mcobject_incoming_buffer = mcobject_destroy(entry->mcobject_incoming_buffer, true); + + if(entry->token) { + myhtml_free(entry->token); + entry->token = NULL; + } + + if(self_destroy) { + myhtml_free(entry); + return NULL; + } + + return entry; +} + +void mycss_entry_end(mycss_entry_t* entry) +{ + /* need some code */ +} + +myhtml_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size) +{ + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + + if(str == NULL) + return NULL; + + myhtml_string_init(entry->mchar, entry->mchar_node_id, str, (string_size + 1)); + + return str; +} + +mycss_token_ready_callback_f mycss_entry_token_ready_callback(mycss_entry_t* entry, mycss_token_ready_callback_f callback_f) +{ + if(callback_f) + entry->token_ready_callback = callback_f; + + return entry->token_ready_callback; +} + +size_t mycss_entry_token_count(mycss_entry_t* entry) +{ + return entry->token_counter; +} + +myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry) +{ + return entry->current_buffer; +} + +myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry) +{ + return entry->first_buffer; +} + +mycss_stylesheet_t * mycss_entry_stylesheet(mycss_entry_t* entry) +{ + return entry->stylesheet; +} + +mycss_selectors_list_t * mycss_entry_current_selectors_list(mycss_entry_t* entry) +{ + return entry->selectors->list_last; +} + +void mycss_entry_parser_set(mycss_entry_t* entry, mycss_parser_token_f parser) +{ + entry->parser = parser; +} + +void mycss_entry_parser_switch_set(mycss_entry_t* entry, mycss_parser_token_f parser_switch) +{ + entry->parser_switch = parser_switch; +} + +void mycss_entry_parser_original_set(mycss_entry_t* entry, mycss_parser_token_f parser_original) +{ + entry->parser_original = parser_original; +} + +/* parser list */ +mycss_entry_parser_list_t * mycss_entry_parser_list_create_and_init(size_t size) +{ + mycss_entry_parser_list_t* parser_list = myhtml_malloc(sizeof(mycss_entry_parser_list_t)); + + if(parser_list == NULL) + return NULL; + + parser_list->length = 0; + parser_list->size = size; + parser_list->list = myhtml_malloc(parser_list->size * sizeof(mycss_entry_parser_list_entry_t)); + + if(parser_list->list == NULL) { + myhtml_free(parser_list); + return NULL; + } + + return parser_list; +} + +void mycss_entry_parser_list_clean(mycss_entry_parser_list_t* parser_list) +{ + parser_list->length = 0; +} + +mycss_entry_parser_list_t * mycss_entry_parser_list_destroy(mycss_entry_parser_list_t* parser_list, bool self_destroy) +{ + if(parser_list == NULL) + return NULL; + + if(parser_list->list) { + myhtml_free(parser_list->list); + parser_list->list = NULL; + } + + if(self_destroy) { + myhtml_free(parser_list); + return NULL; + } + + return parser_list; +} + +mycss_status_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, + mycss_parser_token_f parser_switch, mycss_token_type_t ending_token, + bool is_local) +{ + mycss_entry_parser_list_t *parser_list = entry->parser_list; + + if(parser_list->length >= parser_list->size) { + size_t new_size = parser_list->length + 1024; + + mycss_entry_parser_list_entry_t *new_list = myhtml_realloc(parser_list->list, new_size * sizeof(mycss_entry_parser_list_entry_t)); + + if(new_list) { + parser_list->size = new_size; + parser_list->list = new_list; + } + else + return MyCSS_STATUS_ERROR_MEMORY_ALLOCATION; + } + + mycss_entry_parser_list_entry_t *parser_list_entry = &parser_list->list[ parser_list->length ]; + + parser_list_entry->parser = parser_func; + parser_list_entry->parser_switch = parser_switch; + parser_list_entry->ending_token = ending_token; + parser_list_entry->is_local = is_local; + parser_list->length++; + + return MyCSS_STATUS_OK; +} + +void mycss_entry_parser_list_pop(mycss_entry_t* entry) +{ + if(entry->parser_list->length == 0) + return; + + mycss_entry_parser_list_t *parser_list = entry->parser_list; + parser_list->length--; + + mycss_entry_parser_list_entry_t *list_entery = &parser_list->list[ parser_list->length ]; + + if(entry->parser_ending_token != list_entery->ending_token) + entry->parser_ending_token = list_entery->ending_token; + + entry->parser = list_entery->parser; + entry->parser_switch = list_entery->parser_switch; +} + +size_t mycss_entry_parser_list_length(mycss_entry_t* entry) +{ + return entry->parser_list->length; +} + +mycss_token_type_t mycss_entry_parser_list_current_ending_token_type(mycss_entry_t* entry) +{ + return entry->parser_list->list[ (entry->parser_list->length - 1) ].ending_token; +} + +mycss_parser_token_f mycss_entry_parser_list_current_parser(mycss_entry_t* entry) +{ + return entry->parser_list->list[ (entry->parser_list->length - 1) ].parser; +} + +mycss_parser_token_f mycss_entry_parser_list_current_parser_switch(mycss_entry_t* entry) +{ + return entry->parser_list->list[ (entry->parser_list->length - 1) ].parser_switch; +} + +bool mycss_entry_parser_list_current_is_local(mycss_entry_t* entry) +{ + return entry->parser_list->list[ (entry->parser_list->length - 1) ].is_local; +} + diff --git a/source/mycss/entry.h b/source/mycss/entry.h new file mode 100644 index 0000000..df03f53 --- /dev/null +++ b/source/mycss/entry.h @@ -0,0 +1,157 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_ENTRY_H +#define MyHTML_MyCSS_ENTRY_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "mycss/mycss.h" +#include "mycss/parser.h" +#include "mycss/stylesheet.h" +#include "mycss/namespace/myosi.h" +#include "mycss/namespace/init.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/init.h" +#include "mycss/an_plus_b.h" +#include "mycss/declaration/myosi.h" +#include "mycss/declaration/init.h" +#include "mycss/declaration/entry.h" +#include "mycss/media/myosi.h" +#include "mycss/media/init.h" +#include "myhtml/utils/mcobject.h" +#include "myhtml/utils/mchar_async.h" + +struct mycss_entry_parser_list_entry { + mycss_parser_token_f parser; + mycss_parser_token_f parser_switch; + mycss_token_type_t ending_token; + + bool is_local; +} +typedef mycss_entry_parser_list_entry_t; + +struct mycss_entry_parser_list { + mycss_entry_parser_list_entry_t* list; + size_t size; + size_t length; +} +typedef mycss_entry_parser_list_t; + +struct mycss_entry { + /* refs */ + mycss_t* mycss; + mycss_token_t* token; + mycss_stylesheet_t* stylesheet; + + /* objects and memory for css modules */ + mchar_async_t* mchar; + size_t mchar_node_id; + size_t mchar_value_node_id; + + mcobject_t* mcobject_string_entries; + + /* css modules */ + mycss_namespace_t* ns; + mycss_selectors_t* selectors; + mycss_an_plus_b_t* anb; + mycss_media_t* media; +// mycss_rules_t* rules; + mycss_declaration_t* declaration; + void** values; + + /* incoming buffer */ + mcobject_t* mcobject_incoming_buffer; + myhtml_incoming_buffer_t* first_buffer; + myhtml_incoming_buffer_t* current_buffer; + + /* options */ + mycss_entry_type_t type; + myhtml_encoding_t encoding; + + /* tokenizer */ + mycss_tokenizer_state_t state; + mycss_tokenizer_state_t state_back; + + /* parser */ + mycss_entry_parser_list_t* parser_list; + mycss_parser_token_f parser; + mycss_parser_token_f parser_switch; + mycss_parser_token_f parser_error; + mycss_parser_token_f parser_original; + mycss_token_type_t parser_ending_token; + + /* callbacks */ + mycss_token_ready_callback_f token_ready_callback; + mycss_callback_selector_done_f callback_selector_done; + + /* helpers */ + size_t token_counter; + size_t help_counter; +}; + +mycss_entry_t * mycss_entry_create(void); +mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); +mycss_status_t mycss_entry_clean(mycss_entry_t* entry); +mycss_status_t mycss_entry_clean_all(mycss_entry_t* entry); +mycss_entry_t * mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy); + +void mycss_entry_end(mycss_entry_t* entry); + +mycss_token_ready_callback_f mycss_entry_token_ready_callback(mycss_entry_t* entry, mycss_token_ready_callback_f callback_f); + +size_t mycss_entry_token_count(mycss_entry_t* entry); +myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry); +myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry); + +myhtml_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size); + +mycss_stylesheet_t * mycss_entry_stylesheet(mycss_entry_t* entry); +mycss_selectors_list_t * mycss_entry_current_selectors_list(mycss_entry_t* entry); + +void mycss_entry_parser_set(mycss_entry_t* entry, mycss_parser_token_f parser); +void mycss_entry_parser_switch_set(mycss_entry_t* entry, mycss_parser_token_f parser_switch); +void mycss_entry_parser_original_set(mycss_entry_t* entry, mycss_parser_token_f parser_original); + +/* parser list */ +mycss_entry_parser_list_t * mycss_entry_parser_list_create_and_init(size_t size); +void mycss_entry_parser_list_clean(mycss_entry_parser_list_t* parser_list); +mycss_entry_parser_list_t * mycss_entry_parser_list_destroy(mycss_entry_parser_list_t* parser_list, bool self_destroy); + +mycss_status_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, + mycss_parser_token_f parser_switch, mycss_token_type_t ending_token, + bool is_local); + +void mycss_entry_parser_list_pop(mycss_entry_t* entry); +size_t mycss_entry_parser_list_length(mycss_entry_t* entry); +mycss_token_type_t mycss_entry_parser_list_current_ending_token_type(mycss_entry_t* entry); +mycss_parser_token_f mycss_entry_parser_list_current_parser(mycss_entry_t* entry); +mycss_parser_token_f mycss_entry_parser_list_current_parser_switch(mycss_entry_t* entry); +bool mycss_entry_parser_list_current_is_local(mycss_entry_t* entry); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_ENTRY_H */ diff --git a/source/mycss/media/init.c b/source/mycss/media/init.c new file mode 100644 index 0000000..eb82b9a --- /dev/null +++ b/source/mycss/media/init.c @@ -0,0 +1,51 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/media/init.h" + +mycss_media_t * mycss_media_create(void) +{ + return (mycss_media_t*)myhtml_calloc(1, sizeof(mycss_media_t)); +} + +mycss_status_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media) +{ + return MyCSS_STATUS_OK; +} + +mycss_status_t mycss_media_clean_all(mycss_media_t* media) +{ + return MyCSS_STATUS_OK; +} + +mycss_media_t * mycss_media_destroy(mycss_media_t* media, bool self_destroy) +{ + if(media == NULL) + return NULL; + + if(self_destroy) { + myhtml_free(media); + return NULL; + } + + return media; +} + + diff --git a/source/mycss/media/init.h b/source/mycss/media/init.h new file mode 100644 index 0000000..01f1d48 --- /dev/null +++ b/source/mycss/media/init.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MEDIA_INIT_H +#define MyHTML_MyCSS_MEDIA_INIT_H +#pragma once + +#include "mycss/media/myosi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +mycss_media_t * mycss_media_create(void); +mycss_status_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media); +mycss_status_t mycss_media_clean_all(mycss_media_t* media); +mycss_media_t * mycss_media_destroy(mycss_media_t* media, bool self_destroy); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MEDIA_INIT_H */ diff --git a/source/mycss/media/myosi.h b/source/mycss/media/myosi.h new file mode 100644 index 0000000..10a55af --- /dev/null +++ b/source/mycss/media/myosi.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MEDIA_MYOSI_H +#define MyHTML_MyCSS_MEDIA_MYOSI_H +#pragma once + +#include "mycss/myosi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycss_media mycss_media_t; + + +struct mycss_media { +}; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MEDIA_MYOSI_H */ diff --git a/source/mycss/media/state.c b/source/mycss/media/state.c new file mode 100644 index 0000000..866c110 --- /dev/null +++ b/source/mycss/media/state.c @@ -0,0 +1,29 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/media/state.h" + + +bool mycss_media_state_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + return true; +} + + diff --git a/source/mycss/media/state.h b/source/mycss/media/state.h new file mode 100644 index 0000000..aeda0e4 --- /dev/null +++ b/source/mycss/media/state.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MEDIA_STATE_H +#define MyHTML_MyCSS_MEDIA_STATE_H +#pragma once + +#include "mycss/media/myosi.h" +#include "mycss/entry.h" + +#ifdef __cplusplus +extern "C" { +#endif + +bool mycss_media_state_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MEDIA_STATE_H */ diff --git a/source/mycss/mycss.c b/source/mycss/mycss.c new file mode 100644 index 0000000..04613f2 --- /dev/null +++ b/source/mycss/mycss.c @@ -0,0 +1,234 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/mycss.h" +#include "mycss/tokenizer_resource.h" + +mycss_t * mycss_create(void) +{ + return (mycss_t*)myhtml_calloc(1, sizeof(mycss_t)); +} + +mycss_status_t mycss_init(mycss_t* mycss) +{ + mycss_status_t status = mycss_tokenizer_state_init(mycss); + + if(status != MyCSS_STATUS_OK) + return status; + + return MyCSS_STATUS_OK; +} + +mycss_t * mycss_destroy(mycss_t* mycss, bool self_destroy) +{ + if(mycss == NULL) + return NULL; + + mycss_tokenizer_state_destroy(mycss); + + if(self_destroy) { + myhtml_free(mycss); + return NULL; + } + + return mycss; +} + +mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size) +{ + if(entry->type & MyCSS_ENTRY_TYPE_END) { + mycss_entry_clean_all(entry); + } + + /* set parser */ + entry->parser = mycss_parser_token; + + /* stylesheet */ + entry->stylesheet = mycss_stylesheet_create(); + mycss_stylesheet_init(entry->stylesheet, entry); + + /* and parse css */ + mycss_encoding_set(entry, encoding); + + mycss_status_t status = mycss_tokenizer_chunk(entry, css, css_size); + if(status != MyCSS_STATUS_OK) + return status; + + status = mycss_tokenizer_end(entry); + + return status; +} + +mycss_status_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size) +{ + if(entry->type & MyCSS_ENTRY_TYPE_END) { + mycss_entry_clean_all(entry); + } + + /* create and init new Result */ + if(entry->stylesheet == NULL) { + entry->stylesheet = mycss_stylesheet_create(); + mycss_stylesheet_init(entry->stylesheet, entry); + } + + return mycss_tokenizer_chunk(entry, css, css_size); +} + +mycss_status_t mycss_parse_chunk_end(mycss_entry_t* entry) +{ + mycss_status_t status = mycss_tokenizer_end(entry); + mycss_entry_end(entry); + + return status; +} + +// token +size_t mycss_token_position(mycss_token_t* token, size_t *return_length) +{ + if(return_length) + *return_length = token->length; + + return token->begin; +} + +size_t mycss_token_begin(mycss_token_t* token) +{ + return token->begin; +} + +size_t mycss_token_length(mycss_token_t* token) +{ + return token->length; +} + +mycss_token_type_t mycss_token_type(mycss_token_t* token) +{ + return token->type; +} + +const char * mycss_token_name_by_type(mycss_token_type_t type) +{ + if(type >= MyCSS_TOKEN_TYPE_LAST_ENTRY) + return mycss_token_type_description[MyCSS_TOKEN_TYPE_LAST_ENTRY]; + + return mycss_token_type_description[type]; +} + +size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str, bool init_string, bool case_insensitive) +{ + if(init_string) + myhtml_string_init(entry->mchar, entry->mchar_node_id, str, (token->length + 4)); + + mycss_string_res_t out_res; + mycss_string_res_clean(&out_res); + + out_res.encoding = entry->encoding; + out_res.case_insensitive = case_insensitive; + + myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(entry->current_buffer, token->begin); + size_t relative_begin = token->begin - buffer->offset; + + // if token data length in one buffer then print them all at once + if((relative_begin + token->length) <= buffer->size) { + mycss_string_data_process(str, &buffer->data[relative_begin], 0, token->length, &out_res); + mycss_string_data_process_end(str, &out_res); + + return token->length; + } + + // if the data are spread across multiple buffers that join them + size_t length = token->length; + while(buffer) { + if((relative_begin + length) > buffer->size) + { + size_t relative_end = (buffer->size - relative_begin); + length -= relative_end; + + mycss_string_data_process(str, buffer->data, relative_begin, relative_end, &out_res); + + relative_begin = 0; + buffer = buffer->next; + } + else { + mycss_string_data_process(str, &buffer->data[relative_begin], 0, length, &out_res); + break; + } + } + + mycss_string_data_process_end(str, &out_res); + + return token->length; +} + +myhtml_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token) +{ + return myhtml_incoming_buffer_find_by_position(entry->current_buffer, token->begin); +} + +// encoding + +void mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding) +{ + entry->encoding = encoding; +} + +myhtml_encoding_t mycss_encoding_get(mycss_entry_t* entry) +{ + return entry->encoding; +} + +myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size) +{ + if(size < 15) + return MyHTML_ENCODING_UTF_8; + + if(strncmp("@charset \"", css, 10)) + return MyHTML_ENCODING_UTF_8; + + size_t begin = 10; + size_t length = begin; + + if(begin >= size) + return MyHTML_ENCODING_UTF_8; + + while(length < size) { + if(css[length] == '"') + { + ++length; + + if(length >= size || css[length] != ';') + return MyHTML_ENCODING_UTF_8; + + size_t name_len = (length - begin) - 1; + + myhtml_encoding_t encoding; + if(myhtml_encoding_by_name(&css[begin], name_len, &encoding)) + return encoding; + + break; + } + + ++length; + } + + return MyHTML_ENCODING_UTF_8; +} + + diff --git a/source/mycss/mycss.h b/source/mycss/mycss.h new file mode 100644 index 0000000..167af74 --- /dev/null +++ b/source/mycss/mycss.h @@ -0,0 +1,79 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MYCSS_H +#define MyHTML_MyCSS_MYCSS_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef MyCSS_DEBUG + #define MyCSS_DEBUG_MESSAGE(format, ...) \ + myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) +#else + #define MyCSS_DEBUG_MESSAGE(format, ...) +#endif + +#ifdef DEBUG_MODE +#define MyHTML_DEBUG_ERROR(format, ...) \ +myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) +#else +#define MyHTML_DEBUG_ERROR(format, ...) +#endif + +#include "mycss/myosi.h" +#include "mycss/entry.h" +#include "mycss/tokenizer.h" +#include "myhtml/myhtml.h" +#include "myhtml/utils/mcobject_async.h" + +struct mycss { + mycss_tokenizer_state_f* parse_state_func; +}; + +mycss_t * mycss_create(void); +mycss_status_t mycss_init(mycss_t* mycss); +mycss_t * mycss_destroy(mycss_t* mycss, bool self_destroy); + +mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); +mycss_status_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); +mycss_status_t mycss_parse_chunk_end(mycss_entry_t* entry); + +size_t mycss_token_begin(mycss_token_t* token); +size_t mycss_token_length(mycss_token_t* token); +size_t mycss_token_position(mycss_token_t* token, size_t *return_length); +mycss_token_type_t mycss_token_type(mycss_token_t* token); +const char * mycss_token_name_by_type(mycss_token_type_t type); +size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str, bool init_string, bool case_insensitive); + +myhtml_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token); + +// encoding +void mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); +myhtml_encoding_t mycss_encoding_get(mycss_entry_t* entry); +myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/source/mycss/myosi.h b/source/mycss/myosi.h new file mode 100644 index 0000000..1a01cdd --- /dev/null +++ b/source/mycss/myosi.h @@ -0,0 +1,281 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MYOSI_H +#define MyHTML_MyCSS_MYOSI_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" + + +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum mycss_status { + MyCSS_STATUS_OK = 0x000000, + MyCSS_STATUS_ERROR_MEMORY_ALLOCATION = 0x010001, + MyCSS_STATUS_ERROR_TOKENIZER_STATE_ALLOCATION = 0x010020, + MyCSS_STATUS_ERROR_TOKENIZER_INCOMING_BUFFER_ADD = 0x010021, + MyCSS_STATUS_ERROR_TOKENIZER_TOKEN_ALLOCATION = 0x010022, + MyCSS_STATUS_ERROR_INCOMING_BUFFER_INIT = 0x010030, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_CREATE = 0x010039, + MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_INIT = 0x010040, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_INCOMING_BUFFER_INIT = 0x010041, + MyCSS_STATUS_ERROR_ENTRY_TOKEN_NODE_ADD = 0x010042, + MyCSS_STATUS_ERROR_SELECTORS_CREATE = 0x010100, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_CREATE = 0x010101, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_INIT = 0x010102, + MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_NODE_ADD = 0x010103, + MyCSS_STATUS_ERROR_SELECTORS_LIST_CREATE = 0x010104, + MyCSS_STATUS_ERROR_SELECTORS_LIST_INIT = 0x010105, + MyCSS_STATUS_ERROR_SELECTORS_LIST_ADD_NODE = 0x010106, + MyCSS_STATUS_ERROR_NAMESPACE_CREATE = 0x010200, + MyCSS_STATUS_ERROR_NAMESPACE_INIT = 0x010201, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_CREATE = 0x010202, + MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_INIT = 0x010203, + MyCSS_STATUS_ERROR_NAMESPACE_NODE_ADD = 0x010204, + MyCSS_STATUS_ERROR_MEDIA_CREATE = 0x010404, + MyCSS_STATUS_ERROR_STRING_CREATE = 0x010501, + MyCSS_STATUS_ERROR_STRING_INIT = 0x010502, + MyCSS_STATUS_ERROR_STRING_NODE_INIT = 0x010503, + MyCSS_STATUS_ERROR_AN_PLUS_B_CREATE = 0x010600, + MyCSS_STATUS_ERROR_AN_PLUS_B_INIT = 0x010601, + MyCSS_STATUS_ERROR_DECLARATION_CREATE = 0x010700, + MyCSS_STATUS_ERROR_DECLARATION_INIT = 0x010701, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_CREATE = 0x010702, + MyCSS_STATUS_ERROR_DECLARATION_ENTRY_INIT = 0x010703, + MyCSS_STATUS_ERROR_PARSER_LIST_CREATE = 0x010800 +} +typedef mycss_status_t; + +#define MyCSS_FAILED(_status_) ((_status_) != MyCSS_STATUS_OK) + +// entry +typedef struct mycss_entry mycss_entry_t; + +enum mycss_entry_type { + MyCSS_ENTRY_TYPE_CLEAN = 0x0000, + MyCSS_ENTRY_TYPE_END = 0x0001 +} +typedef mycss_entry_type_t; + +// mycss +typedef struct mycss mycss_t; + +// mycss_tokenizer +typedef struct mycss_token mycss_token_t; + +enum mycss_tokenizer_state { + MyCSS_TOKENIZER_STATE_DATA = 0x000, + // + // generated by Perl script utils/mycss_first_char.pl + MyCSS_TOKENIZER_STATE_APOSTROPHE = 0x001, + MyCSS_TOKENIZER_STATE_ASTERISK = 0x002, + MyCSS_TOKENIZER_STATE_CIRCUMFLEX_ACCENT = 0x003, + MyCSS_TOKENIZER_STATE_COLON = 0x004, + MyCSS_TOKENIZER_STATE_COMMA = 0x005, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT = 0x006, + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT = 0x007, + MyCSS_TOKENIZER_STATE_DIGIT = 0x008, + MyCSS_TOKENIZER_STATE_DOLLAR_SIGN = 0x009, + MyCSS_TOKENIZER_STATE_FULL_STOP = 0x00a, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS = 0x00b, + MyCSS_TOKENIZER_STATE_LEFT_CURLY_BRACKET = 0x00c, + MyCSS_TOKENIZER_STATE_LEFT_PARENTHESIS = 0x00d, + MyCSS_TOKENIZER_STATE_LEFT_SQUARE_BRACKET = 0x00e, + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN = 0x00f, + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT = 0x010, + MyCSS_TOKENIZER_STATE_NUMBER_SIGN = 0x011, + MyCSS_TOKENIZER_STATE_PLUS_SIGN = 0x012, + MyCSS_TOKENIZER_STATE_QUOTATION_MARK = 0x013, + MyCSS_TOKENIZER_STATE_REVERSE_SOLIDUS = 0x014, + MyCSS_TOKENIZER_STATE_RIGHT_CURLY_BRACKET = 0x015, + MyCSS_TOKENIZER_STATE_RIGHT_PARENTHESIS = 0x016, + MyCSS_TOKENIZER_STATE_RIGHT_SQUARE_BRACKET = 0x017, + MyCSS_TOKENIZER_STATE_SEMICOLON = 0x018, + MyCSS_TOKENIZER_STATE_SOLIDUS = 0x019, + MyCSS_TOKENIZER_STATE_TILDE = 0x01a, + MyCSS_TOKENIZER_STATE_VERTICAL_LINE = 0x01b, + MyCSS_TOKENIZER_STATE_WHITESPACE = 0x01c, + // end generated code + // + + MyCSS_TOKENIZER_STATE_QUOTATION_MARK_BACK = 0x01d, + + MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_BACK = 0x01e, + MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_RSOLIDUS = 0x01f, + + MyCSS_TOKENIZER_STATE_APOSTROPHE_BACK = 0x020, + + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_RSOLIDUS = 0x021, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS = 0x022, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS_RSOLIDUS = 0x023, + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_FULL_STOP = 0x024, + + MyCSS_TOKENIZER_STATE_SOLIDUS_COMMENT_END = 0x025, + + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_RSOLIDUS = 0x026, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK = 0x027, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS = 0x028, + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS_RSOLIDUS = 0x029, + + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS = 0x02a, + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS_MINUS = 0x02b, + + MyCSS_TOKENIZER_STATE_PLUS_SIGN_FULL_STOP = 0x02c, + + MyCSS_TOKENIZER_STATE_LETTER_U = 0x02d, + MyCSS_TOKENIZER_STATE_LETTER_U_NEXT = 0x02e, + + // global + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DIGIT = 0x050, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL = 0x051, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DOT = 0x052, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E = 0x053, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_PLUS_MINUS = 0x054, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_DECIMAL = 0x055, + + // Consume a numeric token + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC = 0x056, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_RSOLIDUS = 0x057, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS = 0x058, + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS_RSOLIDUS = 0x059, + + // Consume an ident-like token + MyCSS_TOKENIZER_GLOBAL_STATE_IDENT = 0x05a, + + // Consume a url token + MyCSS_TOKENIZER_GLOBAL_STATE_URL = 0x05b, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_STRING_BACK = 0x05c, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER = 0x05d, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER_WHITESPACE = 0x05e, + MyCSS_TOKENIZER_GLOBAL_STATE_URL_RSOLIDUS = 0x05f, + MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL = 0x060, + + // Consume a string token + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED = 0x061, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS = 0x062, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS_R = 0x063, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED = 0x064, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS = 0x065, + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS_R = 0x066, + + // Consume a name + MyCSS_TOKENIZER_GLOBAL_STATE_NAME = 0x067, + MyCSS_TOKENIZER_GLOBAL_STATE_NAME_RSOLIDUS = 0x068, + + // Consume a unicode-range token + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_BEFORE = 0x069, + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE = 0x06a, + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_QUESTION = 0x06b, + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_MINUS = 0x06c, + + // back + MyCSS_TOKENIZER_GLOBAL_BACK = 0x080, + + MyCSS_TOKENIZER_STATE_FIRST_ENTRY = MyCSS_TOKENIZER_STATE_DATA, + MyCSS_TOKENIZER_STATE_LAST_ENTRY = 0x100 +} +typedef mycss_tokenizer_state_t; + +enum mycss_token_type { + MyCSS_TOKEN_TYPE_UNDEF = 0x0000, + MyCSS_TOKEN_TYPE_WHITESPACE = 0x0001, + MyCSS_TOKEN_TYPE_IDENT = 0x0002, + MyCSS_TOKEN_TYPE_FUNCTION = 0x0003, + MyCSS_TOKEN_TYPE_AT_KEYWORD = 0x0004, + MyCSS_TOKEN_TYPE_HASH = 0x0005, + MyCSS_TOKEN_TYPE_STRING = 0x0006, + MyCSS_TOKEN_TYPE_URL = 0x0007, + MyCSS_TOKEN_TYPE_NUMBER = 0x0008, + MyCSS_TOKEN_TYPE_DIMENSION = 0x0009, + MyCSS_TOKEN_TYPE_PERCENTAGE = 0x000a, + MyCSS_TOKEN_TYPE_INCLUDE_MATCH = 0x000b, + MyCSS_TOKEN_TYPE_DASH_MATCH = 0x000c, + MyCSS_TOKEN_TYPE_PREFIX_MATCH = 0x000d, + MyCSS_TOKEN_TYPE_SUFFIX_MATCH = 0x000e, + MyCSS_TOKEN_TYPE_SUBSTRING_MATCH = 0x000f, + MyCSS_TOKEN_TYPE_COLUMN = 0x0010, + MyCSS_TOKEN_TYPE_CDO = 0x0011, + MyCSS_TOKEN_TYPE_CDC = 0x0012, + MyCSS_TOKEN_TYPE_BAD_STRING = 0x0013, + MyCSS_TOKEN_TYPE_DELIM = 0x0014, + MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS = 0x0015, + MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS = 0x0016, + MyCSS_TOKEN_TYPE_COMMA = 0x0017, + MyCSS_TOKEN_TYPE_COLON = 0x0018, + MyCSS_TOKEN_TYPE_SEMICOLON = 0x0019, + MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET = 0x001a, + MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET = 0x001b, + MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET = 0x001c, + MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET = 0x001d, + MyCSS_TOKEN_TYPE_BAD_URL = 0x001e, + MyCSS_TOKEN_TYPE_COMMENT = 0x001f, + MyCSS_TOKEN_TYPE_UNICODE_RANGE = 0x0020, + MyCSS_TOKEN_TYPE_EOF = 0x0021, + MyCSS_TOKEN_TYPE_LAST_ENTRY = 0x0022 +} +typedef mycss_token_type_t; + +// an+b +typedef struct mycss_an_plus_b mycss_an_plus_b_t; +typedef struct mycss_an_plus_b_entry mycss_an_plus_b_entry_t; + +// result +enum mycss_stylesheet_entry_type { + MyCSS_RESULT_ENTRY_TYPE_UNDEF = 0x00, + MyCSS_RESULT_ENTRY_TYPE_GOOD = 0x01, + MyCSS_RESULT_ENTRY_TYPE_BAD = 0x02 +} +typedef mycss_stylesheet_entry_type_t; + +// stylesheet +typedef struct mycss_stylesheet mycss_stylesheet_t; + +// mystring +typedef struct mycss_string_escaped_res mycss_string_escaped_res_t; +typedef struct mycss_string_res mycss_string_res_t; + +typedef size_t (*mycss_tokenizer_state_f)(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +typedef mycss_token_t * (*mycss_token_ready_callback_f)(mycss_entry_t* entry, mycss_token_t* token); +typedef size_t (*mycss_string_process_state_f)(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +typedef bool (*mycss_parser_token_f)(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +typedef bool (*mycss_an_plus_b_state_f)(mycss_entry_t* entry, mycss_an_plus_b_t* anb, mycss_an_plus_b_entry_t* anb_entry, mycss_token_t* token); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/source/mycss/mystring.c b/source/mycss/mystring.c new file mode 100644 index 0000000..3dac2e0 --- /dev/null +++ b/source/mycss/mystring.c @@ -0,0 +1,279 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/mystring.h" +#include "mycss/tokenizer_resource.h" +#include "myhtml/utils/resources.h" +#include "myhtml/encoding.h" + +static const mycss_string_process_state_f mycss_string_state_list_map[] = { + mycss_string_process_state_data, mycss_string_process_state_escaped +}; + +static const mycss_string_process_state_f mycss_string_state_list_map_utf_8[] = { + mycss_string_process_state_data_utf_8, mycss_string_process_state_escaped_utf_8 +}; + +void mycss_string_append_codepoint_to_string(myhtml_string_t* str, size_t code_point) +{ + if((str->length + 4) >= str->size) { + myhtml_string_realloc(str, (str->size + 8)); + } + + // If this number is zero + if(code_point == 0) { + str->length += myhtml_string_raw_set_replacement_character(str, str->length); + } + else if(code_point >= 0xD800 && code_point <= 0xDFFF) { + str->length += myhtml_string_raw_set_replacement_character(str, str->length); + } + // maximum allowed code point + else if(code_point > 0x10FFFF) { + str->length += myhtml_string_raw_set_replacement_character(str, str->length); + } + else + str->length += myhtml_encoding_codepoint_to_ascii_utf_8(code_point, &str->data[str->length]); +} + +size_t mycss_string_process_state_escaped(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +{ + const unsigned char *u_data = (const unsigned char*)data; + + myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(out_res->encoding); + myhtml_encoding_result_t *encoding_res = &out_res->encoding_res; + + char convert_data[4] = {0}; + + while(length < size) + { + enum myhtml_encoding_status encoding_status = func(u_data[length], encoding_res); + + if(encoding_status == MyHTML_ENCODING_STATUS_OK) + { + myhtml_encoding_codepoint_to_ascii_utf_8(encoding_res->result, convert_data); + + if(myhtml_string_chars_hex_map[(unsigned char)convert_data[0]] != 0xff) { + out_res->escaped.code_point <<= 4; + out_res->escaped.code_point |= myhtml_string_chars_hex_map[ (unsigned char)convert_data[0] ]; + + ++out_res->escaped.consumed; + + if(out_res->escaped.consumed == 6) { + mycss_string_append_codepoint_to_string(str, out_res->escaped.code_point); + + out_res->state = MyCSS_STRING_PROCESS_STATE_DATA; + break; + } + } + else { + mycss_string_append_codepoint_to_string(str, out_res->escaped.code_point); + + out_res->state = MyCSS_STRING_PROCESS_STATE_DATA; + break; + } + } + + ++length; + } + + return length; +} + +size_t mycss_string_process_state_escaped_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +{ + const unsigned char *u_data = (const unsigned char*)data; + + while(length < size) + { + if(myhtml_string_chars_hex_map[u_data[length]] != 0xff) { + out_res->escaped.code_point <<= 4; + out_res->escaped.code_point |= myhtml_string_chars_hex_map[ u_data[length] ]; + + ++out_res->escaped.consumed; + + if(out_res->escaped.consumed == 6) { + mycss_string_append_codepoint_to_string(str, out_res->escaped.code_point); + + out_res->state = MyCSS_STRING_PROCESS_STATE_DATA; + break; + } + } + else { + mycss_string_append_codepoint_to_string(str, out_res->escaped.code_point); + + out_res->state = MyCSS_STRING_PROCESS_STATE_DATA; + break; + } + + ++length; + } + + return length; +} + + +void mycss_string_escaped_res_clean(mycss_string_escaped_res_t* res) +{ + memset(res, 0, sizeof(mycss_string_escaped_res_t)); +} + +void mycss_string_res_clean(mycss_string_res_t* res) +{ + memset(res, 0, sizeof(mycss_string_res_t)); + memset(&res->encoding_res, 0, sizeof(myhtml_encoding_result_t)); +} + +size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +{ + char *str_data = str->data; + unsigned const char* u_str_data = (unsigned const char*)data; + + myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(out_res->encoding); + myhtml_encoding_result_t *encoding_res = &out_res->encoding_res; + + while(length < size) + { + enum myhtml_encoding_status encoding_status = func(u_str_data[length], encoding_res); + + if(encoding_status == MyHTML_ENCODING_STATUS_OK) + { + if((str->length + 4) >= str->size) { + myhtml_string_realloc(str, (str->size + 16)); + + str_data = str->data; + } + + size_t len = myhtml_encoding_codepoint_to_ascii_utf_8(encoding_res->result, &str_data[str->length]); + + if(len == 1) { + if(str_data[str->length] == '\\') { + ++length; + + out_res->state = MyCSS_STRING_PROCESS_STATE_ESCAPED; + break; + } + else if(str_data[str->length] == '\n' && + str->length > 0 && + str_data[(str->length - 1)] == '\r') + { + --str->length; + str_data[str->length] = '\n'; + } + else if(str_data[str->length] == 0x0C) { + str_data[str->length] = '\n'; + } + else if(str_data[str->length] == '\0') { + myhtml_string_raw_set_replacement_character(str, str->length); + str->length += 2; + } + } + + str->length += len; + } + + ++length; + } + + return length; +} + +size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +{ + char *str_data = str->data; + + while(length < size) + { + if(data[length] == '\\') { + ++length; + + out_res->state = MyCSS_STRING_PROCESS_STATE_ESCAPED; + break; + } + + if(str->length >= str->size) { + myhtml_string_realloc(str, (str->size + 16)); + + str_data = str->data; + } + + if(data[length] == '\n' && + str->length > 0 && + str_data[(str->length - 1)] == '\r') + { + --str->length; + str_data[str->length] = '\n'; + } + else if(data[length] == 0x0C) { + str_data[str->length] = '\n'; + } + else if(data[length] == '\0') { + myhtml_string_raw_set_replacement_character(str, str->length); + str->length += 2; + } + else + str_data[str->length] = data[length]; + + ++str->length; + ++length; + } + + return length; +} + +size_t mycss_string_data_process(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +{ + if(out_res->encoding == MyHTML_ENCODING_UTF_8) { + while(length < size) { + length = mycss_string_state_list_map_utf_8[ out_res->state ](str, data, length, size, out_res); + } + } + else { + while(length < size) { + length = mycss_string_state_list_map[ out_res->state ](str, data, length, size, out_res); + } + } + + return length; +} + +void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out_res) +{ + if(out_res->state == MyCSS_STRING_PROCESS_STATE_ESCAPED) { + mycss_string_append_codepoint_to_string(str, out_res->escaped.code_point); + } + else if(str->length > 0) { + if(str->data[(str->length - 1)] == '\r') + str->data[(str->length - 1)] = '\n'; + } + + if(str->length >= str->size) + myhtml_string_realloc(str, (str->size + 2)); + + str->data[str->length] = '\0'; + + if(out_res->case_insensitive) { + unsigned char *u_data = (unsigned char*)str->data; + + for(size_t i = 0; i < str->length; i++) + u_data[i] = myhtml_string_chars_lowercase_map[u_data[i]]; + } +} + + diff --git a/source/mycss/mystring.h b/source/mycss/mystring.h new file mode 100644 index 0000000..883b080 --- /dev/null +++ b/source/mycss/mystring.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_MYSTRING_H +#define MyHTML_MyCSS_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "myhtml/incoming.h" +#include "myhtml/mystring.h" + +enum mycss_string_process_state { + MyCSS_STRING_PROCESS_STATE_DATA = 0x00, + MyCSS_STRING_PROCESS_STATE_ESCAPED = 0x01, + MyCSS_STRING_PROCESS_STATE_LAST_ENTRY = 0x02 +} +typedef mycss_string_process_state_t; + +struct mycss_string_escaped_res { + unsigned short consumed; + size_t code_point; +}; + +struct mycss_string_res { + mycss_string_escaped_res_t escaped; + mycss_string_process_state_t state; + + myhtml_encoding_t encoding; + myhtml_encoding_result_t encoding_res; + bool case_insensitive; +}; + +size_t mycss_string_data_process(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out_res); + +size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); + +void mycss_string_res_clean(mycss_string_res_t* res); +void mycss_string_escaped_res_clean(mycss_string_escaped_res_t* res); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_MYSTRING_H */ diff --git a/source/mycss/namespace/init.c b/source/mycss/namespace/init.c new file mode 100644 index 0000000..060daf9 --- /dev/null +++ b/source/mycss/namespace/init.c @@ -0,0 +1,338 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/namespace/init.h" + +mycss_namespace_t * mycss_namespace_create(void) +{ + return (mycss_namespace_t*)myhtml_calloc(1, sizeof(mycss_namespace_t)); +} + +mycss_status_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns) +{ + /* Objects Namespace */ + ns->mcobject_entries = mcobject_create(); + if(ns->mcobject_entries == NULL) + return MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_CREATE; + + myhtml_status_t myhtml_status = mcobject_init(ns->mcobject_entries, 256, sizeof(mycss_namespace_entry_t)); + if(myhtml_status) + return MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_INIT; + + return MyCSS_STATUS_OK; +} + +void mycss_namespace_clean(mycss_namespace_t* ns) +{ + ns->entry = NULL; +} + +mycss_status_t mycss_namespace_clean_all(mycss_namespace_t* ns) +{ + mcobject_clean(ns->mcobject_entries); + ns->entry = NULL; + + return MyCSS_STATUS_OK; +} + +mycss_namespace_t * mycss_namespace_destroy(mycss_namespace_t* ns, bool self_destroy) +{ + if(ns == NULL) + return NULL; + + ns->mcobject_entries = mcobject_destroy(ns->mcobject_entries, true); + + if(self_destroy) { + myhtml_free(ns); + return NULL; + } + + return ns; +} + +mycss_namespace_entry_t * mycss_namespace_entry_create(mycss_namespace_t* ns) +{ + return mcobject_malloc(ns->mcobject_entries, NULL); +} + +void mycss_namespace_entry_clean(mycss_namespace_entry_t* ns_entry) +{ + memset(ns_entry, 0, sizeof(mycss_namespace_entry_t)); +} + +mycss_namespace_entry_t * mycss_namespace_entry_destroy(mycss_namespace_entry_t* ns_entry, mycss_entry_t* entry, bool self_destroy) +{ + if(ns_entry->name) { + myhtml_string_destroy(ns_entry->name, false); + mcobject_free(entry->mcobject_string_entries, ns_entry->name); + } + + if(ns_entry->url) { + myhtml_string_destroy(ns_entry->url, false); + mcobject_free(entry->mcobject_string_entries, ns_entry->url); + } + + if(self_destroy) { + myhtml_free(ns_entry); + return NULL; + } + + return ns_entry; +} + +void mycss_namespace_entry_append_to_current(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry) +{ + if(ns->entry_last) { + ns->entry_last->next = ns_entry; + ns_entry->prev = ns->entry_last; + } + else { + (*ns->entry) = ns_entry; + } + + ns->entry_last = ns_entry; +} + +mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) +{ + ns_stylesheet->name_tree = mctree_create(14); + ns_stylesheet->ns_id_counter = 0; + ns_stylesheet->entry_default = mycss_namespace_entry_create(entry->ns); + + mycss_namespace_entry_clean(ns_stylesheet->entry_default); + mycss_namespace_entry_clean(&ns_stylesheet->entry_undef); + mycss_namespace_entry_clean(&ns_stylesheet->entry_any); + + /* init name for basic namespace entry; for default namespace entry name = NULL */ + ns_stylesheet->entry_undef.name = mycss_entry_string_create_and_init(entry, 2); + if(ns_stylesheet->entry_undef.name == NULL) + return MyCSS_STATUS_ERROR_STRING_CREATE; + + ns_stylesheet->entry_any.name = mycss_entry_string_create_and_init(entry, 2); + if(ns_stylesheet->entry_any.name == NULL) + return MyCSS_STATUS_ERROR_STRING_CREATE; + + myhtml_string_append(ns_stylesheet->entry_any.name, "*", 1); + ns_stylesheet->entry_any.ns_id = MyHTML_NAMESPACE_ANY; + + if(ns_stylesheet->entry_default == NULL) + return MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_CREATE; + + mycss_namespace_stylesheet_init_default(ns_stylesheet, entry, NULL, 0, MyHTML_NAMESPACE_ANY); + + return MyCSS_STATUS_OK; +} + +mycss_status_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) +{ + mctree_clean(ns_stylesheet->name_tree); + ns_stylesheet->ns_id_counter = 0; + + mycss_namespace_stylesheet_init_default(ns_stylesheet, entry, NULL, 0, MyHTML_NAMESPACE_ANY); + + return MyCSS_STATUS_OK; +} + +mycss_namespace_stylesheet_t * mycss_namespace_stylesheet_destroy(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, bool self_destroy) +{ + mycss_namespace_entry_t* ns_entry = ns_stylesheet->entry_default; + + while(ns_entry) { + mycss_namespace_entry_t* ns_entry_next = ns_entry->next; + + mycss_namespace_entry_destroy(ns_entry, entry, false); + mcobject_free(entry->ns->mcobject_entries, ns_entry); + + ns_entry = ns_entry_next; + } + + ns_stylesheet->name_tree = mctree_destroy(ns_stylesheet->name_tree); + ns_stylesheet->entry_undef.name = myhtml_string_destroy(ns_stylesheet->entry_undef.name, false); + ns_stylesheet->entry_any.name = myhtml_string_destroy(ns_stylesheet->entry_any.name, false); + + if(self_destroy) { + myhtml_free(ns_stylesheet); + return NULL; + } + + return ns_stylesheet; +} + +mycss_status_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns) +{ + myhtml_string_t *str = ns_stylesheet->entry_default->url; + + if(str == NULL) { + str = mcobject_malloc(entry->mcobject_string_entries, NULL); + myhtml_string_init(entry->mchar, entry->mchar_node_id, str, (url_length + 1)); + + ns_stylesheet->entry_default->url = str; + } + else + myhtml_string_clean(str); + + if(url && url_length) { + myhtml_string_append(str, url, url_length); + ns_stylesheet->entry_default->ns_id = myhtml_namespace_id_by_url(url, url_length); + } + else + ns_stylesheet->entry_default->ns_id = def_ns; + + ns_stylesheet->entry_default->mctree_id = 0; + ns_stylesheet->entry_default->name = NULL; + ns_stylesheet->entry_default->next = NULL; + ns_stylesheet->entry_default->prev = NULL; + + return MyCSS_STATUS_OK; +} + +void mycss_namespace_stylesheet_append_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_namespace_entry_t* ns_entry) +{ + if(ns_stylesheet->entry_default == NULL) { + ns_stylesheet->entry_default = ns_entry; + return; + } + + mycss_namespace_entry_t* ns_entry_cur = ns_stylesheet->entry_default; + + while(ns_entry_cur->next) + ns_entry_cur = ns_entry_cur->next; + + ns_entry_cur->next = ns_entry; + ns_entry->prev = ns_entry_cur; + + ns_stylesheet->entry_default = ns_entry; +} + +void mycss_namespace_stylesheet_destroy_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) +{ + myhtml_string_t *str = ns_stylesheet->entry_default->url; + + if(str) { + myhtml_string_destroy(str, false); + mcobject_free(entry->mcobject_string_entries, str); + + ns_stylesheet->entry_default->url = NULL; + } +} + +const char * mycss_namespace_name_by_id(mycss_namespace_t* ns, mctree_t* name_tree, size_t ns_id, size_t* length) +{ + if(ns_id < MyHTML_NAMESPACE_LAST_ENTRY) + return myhtml_namespace_name_by_id((myhtml_namespace_t)ns_id, length); + + ns_id -= MyHTML_NAMESPACE_LAST_ENTRY; + + mycss_namespace_entry_t *entry = (mycss_namespace_entry_t*)(name_tree->nodes[ ns_id ].value); + + if(length) + *length = entry->name->length; + + return entry->name->data; +} + +const char * mycss_namespace_name_by_entry(mycss_namespace_entry_t* ns_entry, mctree_t* name_tree, size_t* length, bool* is_default) +{ + if(ns_entry->name == NULL) { + if(is_default) + *is_default = true; + + if(length) + *length = 0; + + if(ns_entry->ns_id <= MyHTML_NAMESPACE_LAST_ENTRY) + return myhtml_namespace_name_by_id(ns_entry->ns_id, length); + + return NULL; + } + + if(is_default) + *is_default = false; + + if(length) + *length = ns_entry->name->length; + + return ns_entry->name->data; +} + +mycss_namespace_entry_t * mycss_namespace_entry_by_name(mycss_namespace_t *ns, mctree_t* name_tree, const char* ns_name, size_t length, bool case_insensitive) +{ + if(ns == NULL) + return NULL; + + mctree_index_t idx; + if(case_insensitive) + idx = mctree_search_lowercase(name_tree, ns_name, length); + else + idx = mctree_search(name_tree, ns_name, length); + + if(idx == 0) + return 0; + + return (mycss_namespace_entry_t*)(name_tree->nodes[ idx ].value); +} + +void mycss_namespace_print_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, FILE* fh) +{ + mycss_namespace_entry_t* ns_entry = ns_stylesheet->entry_first; + + while(ns_entry) { + fprintf(fh, "@namespace"); + + if(ns_entry->name && ns_entry->name->length) { + fprintf(fh, " %s", ns_entry->name->data); + } + + if(ns_entry->url && ns_entry->url->length) { + fprintf(fh, " \"%s\"", ns_entry->url->data); + } + + fprintf(fh, ";\n"); + + ns_entry = ns_entry->next; + } +} + +void mycss_namespace_print(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, FILE* fh, bool with_vbar) +{ + if(ns_entry->name && ns_entry->name->length) { + const char *ns_name = ns_entry->name->data; + + fprintf(fh, "%s", ns_name); + } + else if(ns_entry->ns_id == MyHTML_NAMESPACE_ANY) + return; //fprintf(fh, "*"); + else if(ns_entry->ns_id == MyHTML_NAMESPACE_UNDEF) + fprintf(fh, ""); + else { + if(ns_entry->ns_id < MyHTML_NAMESPACE_LAST_ENTRY) { + const char *ns_name = myhtml_namespace_name_by_id(ns_entry->ns_id, NULL); + fprintf(fh, "", ns_name); + } + else { + fprintf(fh, ""); + } + } + + if(with_vbar) + fprintf(fh, "|"); +} + + diff --git a/source/mycss/namespace/init.h b/source/mycss/namespace/init.h new file mode 100644 index 0000000..0ade454 --- /dev/null +++ b/source/mycss/namespace/init.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_INIT_H +#define MyHTML_MyCSS_NAMESPACE_INIT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/namespace/myosi.h" +#include "mycss/entry.h" +#include "myhtml/mynamespace.h" + +mycss_namespace_t * mycss_namespace_create(void); +mycss_status_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns); +void mycss_namespace_clean(mycss_namespace_t* ns); +mycss_status_t mycss_namespace_clean_all(mycss_namespace_t* ns); +mycss_namespace_t * mycss_namespace_destroy(mycss_namespace_t* ns, bool self_destroy); + +mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mycss_status_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mycss_namespace_stylesheet_t * mycss_namespace_stylesheet_destroy(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, bool self_destroy); + +mycss_status_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns); +void mycss_namespace_stylesheet_append_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_namespace_entry_t* ns_entry); +void mycss_namespace_stylesheet_destroy_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); + +mycss_namespace_entry_t * mycss_namespace_entry_create(mycss_namespace_t* ns); +void mycss_namespace_entry_clean(mycss_namespace_entry_t* ns_entry); +mycss_namespace_entry_t * mycss_namespace_entry_destroy(mycss_namespace_entry_t* ns_entry, mycss_entry_t* entry, bool self_destroy); + +void mycss_namespace_entry_append_to_current(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry); + +const char * mycss_namespace_name_by_id(mycss_namespace_t* ns, mctree_t* name_tree, size_t ns_id, size_t* length); +mycss_namespace_entry_t * mycss_namespace_entry_by_name(mycss_namespace_t *ns, mctree_t* name_tree, const char* ns_name, size_t length, bool case_insensitive); +const char * mycss_namespace_name_by_entry(mycss_namespace_entry_t* ns_entry, mctree_t* name_tree, size_t* length, bool* is_default); + +void mycss_namespace_print(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, FILE* fh, bool with_vbar); +void mycss_namespace_print_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_INIT_H */ diff --git a/source/mycss/namespace/myosi.h b/source/mycss/namespace/myosi.h new file mode 100644 index 0000000..884605f --- /dev/null +++ b/source/mycss/namespace/myosi.h @@ -0,0 +1,74 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_MYOSI_H +#define MyHTML_MyCSS_NAMESPACE_MYOSI_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "myhtml/mystring.h" +#include "myhtml/utils/mctree.h" +#include "myhtml/utils/mcobject.h" + +typedef struct mycss_namespace mycss_namespace_t; +typedef struct mycss_namespace_entry mycss_namespace_entry_t; +typedef struct mycss_namespace_stylesheet mycss_namespace_stylesheet_t; + +struct mycss_namespace_entry { + myhtml_string_t* name; + myhtml_string_t* url; + + myhtml_namespace_t ns_id; + size_t mctree_id; + + mycss_namespace_entry_t* next; + mycss_namespace_entry_t* prev; +}; + +struct mycss_namespace_stylesheet { + mctree_t* name_tree; // tree for namespace names + + mycss_namespace_entry_t* entry_first; + + mycss_namespace_entry_t* entry_default; + mycss_namespace_entry_t entry_undef; + mycss_namespace_entry_t entry_any; + + size_t ns_id_counter; +}; + +struct mycss_namespace { + mycss_namespace_entry_t** entry; + mycss_namespace_entry_t* entry_last; + + mycss_namespace_stylesheet_t* ns_stylesheet; + + mcobject_t* mcobject_entries; +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_MYOSI_H */ diff --git a/source/mycss/namespace/parser.c b/source/mycss/namespace/parser.c new file mode 100644 index 0000000..f00f88e --- /dev/null +++ b/source/mycss/namespace/parser.c @@ -0,0 +1,92 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/namespace/parser.h" + + +void mycss_namespace_parser_begin(mycss_entry_t* entry) +{ + mycss_namespace_entry_t *ns_entry = mycss_namespace_entry_create(entry->ns); + mycss_namespace_entry_clean(ns_entry); + + mycss_namespace_entry_append_to_current(entry->ns, ns_entry); +} + +void mycss_namespace_parser_name(mycss_entry_t* entry, mycss_token_t* token) +{ + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, false); + + entry->ns->entry_last->name = str; +} + +void mycss_namespace_parser_url(mycss_entry_t* entry, mycss_token_t* token) +{ + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, false); + + entry->ns->entry_last->url = str; +} + +void mycss_namespace_parser_end(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_namespace_entry_t *ns_entry = entry->ns->entry_last; + + myhtml_string_t *str_url = entry->ns->entry_last->url; + ns_entry->ns_id = myhtml_namespace_id_by_url(str_url->data, str_url->length); + + if(ns_entry->name) { + myhtml_string_t *str = ns_entry->name; + + ns_entry->mctree_id = mctree_insert(entry->ns->ns_stylesheet->name_tree, str->data, str->length, (void*)ns_entry, NULL); + + if(str_url->length && ns_entry->ns_id == MyHTML_NAMESPACE_UNDEF) + ns_entry->ns_id = MyHTML_NAMESPACE_LAST_ENTRY + (myhtml_namespace_t)ns_entry->mctree_id; + + return; + } + + mycss_namespace_stylesheet_append_default(entry->ns->ns_stylesheet, ns_entry); + ns_entry->mctree_id = mctree_insert(entry->ns->ns_stylesheet->name_tree, " ", 1, (void*)ns_entry, NULL); + + if(str_url->length && ns_entry->ns_id == MyHTML_NAMESPACE_UNDEF) + ns_entry->ns_id = MyHTML_NAMESPACE_LAST_ENTRY + (myhtml_namespace_t)ns_entry->mctree_id; +} + +void mycss_namespace_parser_expectations_error(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_namespace_entry_t *ns_entry = entry->ns->entry_last; + mycss_namespace_entry_destroy(ns_entry, entry, false); + + if(ns_entry->prev) { + entry->ns->entry_last = ns_entry->prev; + entry->ns->entry_last->next = NULL; + } + else { + entry->ns->entry_last = NULL; + } + + if(ns_entry) + mcobject_free(entry->ns->mcobject_entries, ns_entry); + + printf("Expectations error: Namespace!\n"); +} + + diff --git a/source/mycss/namespace/parser.h b/source/mycss/namespace/parser.h new file mode 100644 index 0000000..630e39a --- /dev/null +++ b/source/mycss/namespace/parser.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_PARSER_H +#define MyHTML_MyCSS_NAMESPACE_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/namespace/myosi.h" +#include "myhtml/mynamespace.h" +#include "myhtml/utils/mctree.h" + +void mycss_namespace_parser_begin(mycss_entry_t* entry); + +void mycss_namespace_parser_name(mycss_entry_t* entry, mycss_token_t* token); +void mycss_namespace_parser_url(mycss_entry_t* entry, mycss_token_t* token); +void mycss_namespace_parser_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_namespace_parser_expectations_error(mycss_entry_t* entry, mycss_token_t* token); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_PARSER_H */ diff --git a/source/mycss/namespace/state.c b/source/mycss/namespace/state.c new file mode 100644 index 0000000..9cf7208 --- /dev/null +++ b/source/mycss/namespace/state.c @@ -0,0 +1,182 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/namespace/state.h" + +bool mycss_namespace_state_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_AT_KEYWORD) { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, true); + + if(myhtml_strcmp(str.data, "namespace") == 0) { + entry->parser = mycss_namespace_state_namespace_namespace; + } + else { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token; + } + + myhtml_string_destroy(&str, false); + } + else { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token_drop_at_rule; + } + + return true; +} + +bool mycss_namespace_state_namespace_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: + break; + + case MyCSS_TOKEN_TYPE_IDENT: { + mycss_namespace_parser_begin(entry); + mycss_namespace_parser_name(entry, token); + entry->parser = mycss_namespace_state_namespace_namespace_ident; + + break; + } + case MyCSS_TOKEN_TYPE_STRING: { + mycss_namespace_parser_begin(entry); + mycss_namespace_parser_url(entry, token); + entry->parser = mycss_namespace_state_namespace_namespace_string; + + break; + } + case MyCSS_TOKEN_TYPE_URL: { + mycss_namespace_parser_begin(entry); + mycss_namespace_parser_url(entry, token); + entry->parser = mycss_namespace_state_namespace_namespace_url; + + break; + } + default: { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token_drop_at_rule; + return false; + } + } + + return true; +} + +bool mycss_namespace_state_namespace_namespace_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_STRING) { + mycss_namespace_parser_url(entry, token); + entry->parser = mycss_namespace_state_namespace_namespace_ident_string; + } + else if(token->type == MyCSS_TOKEN_TYPE_URL) { + mycss_namespace_parser_url(entry, token); + entry->parser = mycss_namespace_state_namespace_namespace_ident_url; + } + else { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token_drop_at_rule; + return false; + } + + return true; +} + +bool mycss_namespace_state_namespace_namespace_ident_string(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { + mycss_namespace_parser_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_ident_string_semicolon") + entry->parser = mycss_parser_token; + } + else { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token_drop_at_rule; + return false; + } + + return true; +} + +bool mycss_namespace_state_namespace_namespace_ident_url(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { + mycss_namespace_parser_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_ident_url_semicolon") + entry->parser = mycss_parser_token; + } + else { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token_drop_at_rule; + return false; + } + + return true; +} + +bool mycss_namespace_state_namespace_namespace_string(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { + mycss_namespace_parser_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_string_semicolon") + entry->parser = mycss_parser_token; + } + else { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token_drop_at_rule; + return false; + } + + return true; +} + +bool mycss_namespace_state_namespace_namespace_url(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { + mycss_namespace_parser_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_url_semicolon") + entry->parser = mycss_parser_token; + } + else { + mycss_namespace_parser_expectations_error(entry, token); + entry->parser = mycss_parser_token_drop_at_rule; + return false; + } + + return true; +} + + diff --git a/source/mycss/namespace/state.h b/source/mycss/namespace/state.h new file mode 100644 index 0000000..ec7f031 --- /dev/null +++ b/source/mycss/namespace/state.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_NAMESPACE_STATE_H +#define MyHTML_MyCSS_NAMESPACE_STATE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/namespace/myosi.h" +#include "mycss/namespace/parser.h" +#include "myhtml/utils.h" + +bool mycss_namespace_state_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_ident_string(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_ident_url(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_string(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_namespace_state_namespace_namespace_url(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_NAMESPACE_STATE_H */ diff --git a/source/mycss/parser.c b/source/mycss/parser.c new file mode 100644 index 0000000..9cef73b --- /dev/null +++ b/source/mycss/parser.c @@ -0,0 +1,248 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/parser.h" +#include "mycss/tokenizer_resource.h" + +mycss_token_t * mycss_parser_token_ready_callback_function(mycss_entry_t* entry, mycss_token_t* token) +{ + if(token->type == MyCSS_TOKEN_TYPE_COMMENT) + return token; + + bool last_response = true; + while((last_response = entry->parser(entry, token, last_response)) == false) {}; + + return entry->token; +} + +bool mycss_parser_token(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: + break; + + case MyCSS_TOKEN_TYPE_CDC: + case MyCSS_TOKEN_TYPE_CDO: + break; + + case MyCSS_TOKEN_TYPE_AT_KEYWORD: { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, true); + + if(myhtml_strcmp(str.data, "namespace") == 0) { + mycss_namespace_t *ns = entry->ns; + + ns->ns_stylesheet = &entry->stylesheet->ns_stylesheet; + ns->entry = &ns->ns_stylesheet->entry_first; + + entry->parser = mycss_namespace_state_namespace_namespace; + } + else { + entry->parser = mycss_parser_token_drop_at_rule; + } + + myhtml_string_destroy(&str, false); + + mycss_entry_parser_list_push(entry, mycss_parser_token, entry->parser_switch, MyCSS_TOKEN_TYPE_UNDEF, false); + break; + } + + default: { + /* see selectors */ + entry->parser = mycss_selectors_state_complex_selector_list; + + entry->selectors->list = &entry->stylesheet->sel_list_first; + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET; + + mycss_entry_parser_list_push(entry, mycss_parser_token_selector_list_end, entry->parser_switch, MyCSS_TOKEN_TYPE_UNDEF, false); + return false; + } + } + + return true; +} + +bool mycss_parser_token_selector_list_end(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: { + entry->declaration->entry = &entry->selectors->list_last->declaration_entry; + entry->declaration->entry_last = NULL; + + entry->parser = mycss_declaration_state_begin; + entry->declaration->ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + mycss_entry_parser_list_push(entry, mycss_parser_token, entry->parser_switch, MyCSS_TOKEN_TYPE_UNDEF, false); + break; + } + default: + mycss_entry_parser_list_push(entry, mycss_parser_token_selector_list_end, NULL, entry->parser_ending_token, false); + + entry->parser = mycss_parser_token_drop_component_value; + entry->parser_ending_token = MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET; + + return false; + } + + return true; +} + +bool mycss_parser_token_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == entry->parser_ending_token) { + if(mycss_entry_parser_list_current_is_local(entry) == false) { + mycss_entry_parser_list_pop(entry); + return false; + } + } + + switch (token->type) { + case MyCSS_TOKEN_TYPE_FUNCTION: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + default: { + if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + return true; + } + } + } + + return true; +} + +// +// +//bool mycss_parser_token_drop_qualified_rule(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +//{ +// switch (token->type) { +// case MyCSS_TOKEN_TYPE_SEMICOLON: +// mycss_entry_parser_list_pop(entry); +// break; +// +// case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: +// entry->parser = mycss_parser_token_drop_at_rule_component_value; +// +// mycss_entry_parser_list_push(entry, NULL, NULL, entry->parser_ending_token, false); +// entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; +// +// break; +// +// default: +// entry->parser = mycss_parser_token_drop_at_rule_component_value; +// return false; +// } +// +// return true; +//} + + +bool mycss_parser_token_drop_at_rule(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_SEMICOLON: + mycss_entry_parser_list_pop(entry); + break; + + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: + entry->parser = mycss_parser_token_drop_at_rule_component_value; + + mycss_entry_parser_list_push(entry, NULL, NULL, entry->parser_ending_token, false); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + break; + + default: + entry->parser = mycss_parser_token_drop_at_rule_component_value; + return false; + } + + return true; +} + +bool mycss_parser_token_drop_at_rule_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_FUNCTION: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_at_rule_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_at_rule_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_at_rule_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS: { + mycss_entry_parser_list_push(entry, mycss_parser_token_drop_at_rule_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + case MyCSS_TOKEN_TYPE_SEMICOLON: { + if(mycss_entry_parser_list_current_parser(entry)) + mycss_entry_parser_list_pop(entry); + + break; + } + default: { + if(mycss_entry_parser_list_current_is_local(entry) && + token->type == entry->parser_ending_token) + { + mycss_entry_parser_list_pop(entry); + } + + break; + } + } + + return true; +} + + diff --git a/source/mycss/parser.h b/source/mycss/parser.h new file mode 100644 index 0000000..bec7eb5 --- /dev/null +++ b/source/mycss/parser.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PARSER_H +#define MyHTML_MyCSS_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "mycss/mycss.h" +#include "mycss/entry.h" +#include "mycss/mystring.h" +#include "mycss/convert.h" +#include "mycss/namespace/state.h" +#include "mycss/selectors/state.h" +#include "mycss/selectors/parser.h" +#include "mycss/declaration/state.h" +#include "myhtml/incoming.h" + +mycss_token_t * mycss_parser_token_ready_callback_function(mycss_entry_t* entry, mycss_token_t* token); + +bool mycss_parser_token(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_parser_token_selector_list_end(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_parser_token_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_parser_token_drop_at_rule(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_parser_token_drop_at_rule_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PARSER_H */ diff --git a/source/mycss/property/const.h b/source/mycss/property/const.h new file mode 100644 index 0000000..7efc6b3 --- /dev/null +++ b/source/mycss/property/const.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_CONST_H +#define MyHTML_MyCSS_PROPERTY_CONST_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +enum mycss_property_type { + MyCSS_PROPERTY_TYPE_UNDEF = 0x0000, + MyCSS_PROPERTY_TYPE_HEIGHT = 0x0001, + MyCSS_PROPERTY_TYPE_WIDTH = 0x0002, + MyCSS_PROPERTY_TYPE_LAST_ENTRY = 0x0003 +} +typedef mycss_property_type_t; + +enum mycss_property_value { + MyCSS_PROPERTY_VALUE_UNDEF = 0x0000, + MyCSS_PROPERTY_VALUE_AUTO = 0x0001, + MyCSS_PROPERTY_VALUE_INHERIT = 0x0002, + MyCSS_PROPERTY_VALUE_LENGTH = 0x0003, + MyCSS_PROPERTY_VALUE_PERCENTAGE = 0x0004, + MyCSS_PROPERTY_VALUE_LAST_ENTRY = 0x0005 +} +typedef mycss_property_value_t; + +enum mycss_property_height { + MyCSS_PROPERTY_HEIGHT_AUTO = 0x0001, + MyCSS_PROPERTY_HEIGHT_INHERIT = 0x0002, + MyCSS_PROPERTY_HEIGHT_LENGTH = 0x0003, + MyCSS_PROPERTY_HEIGHT_PERCENTAGE = 0x0004 +} +typedef mycss_property_height_t; + +enum mycss_property_width { + MyCSS_PROPERTY_WIDTH_AUTO = 0x0001, + MyCSS_PROPERTY_WIDTH_INHERIT = 0x0002, + MyCSS_PROPERTY_WIDTH_LENGTH = 0x0003, + MyCSS_PROPERTY_WIDTH_PERCENTAGE = 0x0004 +} +typedef mycss_property_width_t; + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_CONST_H */ + + diff --git a/source/mycss/property/init.c b/source/mycss/property/init.c new file mode 100644 index 0000000..56fb165 --- /dev/null +++ b/source/mycss/property/init.c @@ -0,0 +1,140 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/property/init.h" +#include "mycss/property/resources.h" +#include "myhtml/utils/resources.h" + +const mycss_property_index_static_entry_t * mycss_property_index_entry_by_name(const char* name, size_t length) +{ + if(length == 0) + return NULL; + + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyCSS_PROPERTY_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; + + while (mycss_property_index_static_for_search[idx].name) + { + if(mycss_property_index_static_for_search[idx].name_length == length) { + if(myhtml_strncasecmp(mycss_property_index_static_for_search[idx].name, name, length) == 0) + return &mycss_property_index_static_for_search[idx]; + + if(mycss_property_index_static_for_search[idx].next) + idx = mycss_property_index_static_for_search[idx].next; + else + return NULL; + } + else if(mycss_property_index_static_for_search[idx].name_length > length) { + return NULL; + } + else { + idx = mycss_property_index_static_for_search[idx].next; + } + } + + return NULL; +} + +mycss_property_type_t mycss_property_type_by_name(const char *name, size_t length) +{ + const mycss_property_index_static_entry_t *entry = mycss_property_index_entry_by_name(name, length); + + if(entry) + return entry->type; + + return MyCSS_PROPERTY_TYPE_UNDEF; +} + +const mycss_property_value_index_static_entry_t * mycss_property_value_index_entry_by_name(const char* name, size_t length) +{ + if(length == 0) + return NULL; + + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyCSS_PROPERTY_VALUE_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; + + while (mycss_property_value_index_static_for_search[idx].name) + { + if(mycss_property_value_index_static_for_search[idx].name_length == length) { + if(myhtml_strncasecmp(mycss_property_value_index_static_for_search[idx].name, name, length) == 0) + return &mycss_property_value_index_static_for_search[idx]; + + if(mycss_property_value_index_static_for_search[idx].next) + idx = mycss_property_value_index_static_for_search[idx].next; + else + return NULL; + } + else if(mycss_property_value_index_static_for_search[idx].name_length > length) { + return NULL; + } + else { + idx = mycss_property_value_index_static_for_search[idx].next; + } + } + + return NULL; +} + +mycss_property_value_t mycss_property_value_type_by_name(const char *name, size_t length) +{ + const mycss_property_value_index_static_entry_t *entry = mycss_property_value_index_entry_by_name(name, length); + + if(entry) + return entry->type; + + return MyCSS_PROPERTY_VALUE_UNDEF; +} + +void mycss_property_print(mycss_property_type_t prop_type, FILE* fh) +{ + if(prop_type >= MyCSS_PROPERTY_TYPE_LAST_ENTRY) + return; + + fprintf(fh, "%s", mycss_property_index_type_name[prop_type]); +} + +void mycss_property_value_print(unsigned int value_type, void* value, FILE* fh) +{ + switch (value_type) { + case MyCSS_PROPERTY_VALUE_LENGTH: + mycss_serialization_length(value, fh); + break; + + case MyCSS_PROPERTY_VALUE_PERCENTAGE: + mycss_serialization_percentage(value, fh); + break; + + default: + { + if(value_type >= MyCSS_PROPERTY_VALUE_LAST_ENTRY) + break; + + fprintf(fh, "%s", mycss_property_index_type_value[value_type]); + + break; + } + } +} + + diff --git a/source/mycss/property/init.h b/source/mycss/property/init.h new file mode 100644 index 0000000..f63d37d --- /dev/null +++ b/source/mycss/property/init.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_INIT_H +#define MyHTML_MyCSS_PROPERTY_INIT_H +#pragma once + +#include "mycss/property/myosi.h" +#include "mycss/property/parser.h" +#include "mycss/values/serialization.h" +#include "myhtml/utils.h" + +#ifdef __cplusplus +extern "C" { +#endif + +const mycss_property_index_static_entry_t * mycss_property_index_entry_by_name(const char* name, size_t length); +mycss_property_type_t mycss_property_type_by_name(const char *name, size_t length); + +const mycss_property_value_index_static_entry_t * mycss_property_value_index_entry_by_name(const char* name, size_t length); +mycss_property_value_t mycss_property_value_type_by_name(const char *name, size_t length); + +void mycss_property_print(mycss_property_type_t prop_type, FILE* fh); +void mycss_property_value_print(unsigned int value_type, void* value, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_INIT_H */ diff --git a/source/mycss/property/myosi.h b/source/mycss/property/myosi.h new file mode 100644 index 0000000..f1e50e3 --- /dev/null +++ b/source/mycss/property/myosi.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_MYOSI_H +#define MyHTML_MyCSS_PROPERTY_MYOSI_H +#pragma once + +#include "mycss/myosi.h" +#include "mycss/property/const.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct mycss_property_index_static_entry { + const char* name; + size_t name_length; + + mycss_property_type_t type; + mycss_parser_token_f parser; + + size_t next; + size_t curr; +} +typedef mycss_property_index_static_entry_t; + +struct mycss_property_value_index_static_entry { + const char* name; + size_t name_length; + + mycss_property_value_t type; + + size_t next; + size_t curr; +} +typedef mycss_property_value_index_static_entry_t; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_MYOSI_H */ diff --git a/source/mycss/property/parser.c b/source/mycss/property/parser.c new file mode 100644 index 0000000..be81f88 --- /dev/null +++ b/source/mycss/property/parser.c @@ -0,0 +1,88 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/property/parser.h" + +bool mycss_property_parser_switch_to_find_important(mycss_entry_t* entry) +{ + entry->parser = mycss_declaration_state_colon_before_important; + return true; +} + +bool mycss_property_parser_switch_to_parse_error(mycss_entry_t* entry) +{ + entry->parser = mycss_declaration_state_parse_error; + return false; +} + +bool mycss_property_parser_shared_wh(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; + + void *value = NULL; + mycss_values_entry_set(entry, &value); + + if(mycss_values_consume_length(entry, token)) { + dec_entry->value = value; + dec_entry->value_type = MyCSS_PROPERTY_WIDTH_LENGTH; + } + else if(mycss_values_consume_percentage(entry, token)) { + dec_entry->value = value; + dec_entry->value_type = MyCSS_PROPERTY_WIDTH_PERCENTAGE; + } + else if(token->type == MyCSS_TOKEN_TYPE_IDENT) + { + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + dec_entry->value_type = mycss_property_value_type_by_name(str.data, str.length); + myhtml_string_destroy(&str, false); + + if(dec_entry->value_type != MyCSS_PROPERTY_WIDTH_AUTO && + dec_entry->value_type != MyCSS_PROPERTY_WIDTH_INHERIT) + { + return mycss_property_parser_switch_to_parse_error(entry); + } + } + else { + return mycss_property_parser_switch_to_parse_error(entry); + } + + return mycss_property_parser_switch_to_find_important(entry); +} + +///////////////////////////////////////////////////////// +//// CSS Property +//// +///////////////////////////////////////////////////////// +bool mycss_property_parser_width(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + return mycss_property_parser_shared_wh(entry, token, last_response); +} + +bool mycss_property_parser_height(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + return mycss_property_parser_shared_wh(entry, token, last_response); +} + + diff --git a/source/mycss/property/parser.h b/source/mycss/property/parser.h new file mode 100644 index 0000000..ab69c3a --- /dev/null +++ b/source/mycss/property/parser.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_PARSER_H +#define MyHTML_MyCSS_PROPERTY_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/property/myosi.h" +#include "mycss/values/consume.h" +#include "mycss/values/values.h" + +bool mycss_property_parser_width(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_property_parser_height(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_PROPERTY_PARSER_H */ diff --git a/source/mycss/property/resources.h b/source/mycss/property/resources.h new file mode 100644 index 0000000..37cb6db --- /dev/null +++ b/source/mycss/property/resources.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_PROPERTY_RESOURCES_H +#define MyHTML_MyCSS_PROPERTY_RESOURCES_H +#pragma once + +#define MyCSS_PROPERTY_STATIC_INDEX_FOR_SEARCH_SIZE 3 +#define MyCSS_PROPERTY_VALUE_STATIC_INDEX_FOR_SEARCH_SIZE 5 + +static const mycss_property_index_static_entry_t mycss_property_index_static_for_search[] = +{ + {NULL, 0, MyCSS_PROPERTY_TYPE_UNDEF, NULL, 0, 0}, + {"height", 6, MyCSS_PROPERTY_TYPE_HEIGHT, mycss_property_parser_height, 0, 1}, + {NULL, 0, MyCSS_PROPERTY_TYPE_UNDEF, NULL, 0, 0}, + {"width", 5, MyCSS_PROPERTY_TYPE_WIDTH, mycss_property_parser_width, 0, 3}, +}; + +static const mycss_property_value_index_static_entry_t mycss_property_value_index_static_for_search[] = +{ + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, + {"inherit", 7, MyCSS_PROPERTY_VALUE_INHERIT, 0, 1}, + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, + {"auto", 4, MyCSS_PROPERTY_VALUE_AUTO, 0, 4}, + {NULL, 0, MyCSS_PROPERTY_VALUE_UNDEF, 0, 0}, +}; + +static const char * mycss_property_index_type_name[] = +{ + "", + "height", + "width", + "" +}; + +static const char * mycss_property_index_type_value[] = +{ + "", + "auto", + "inherit", + "length", + "percentage", + "" +}; + + +#endif /* MyHTML_MyCSS_PROPERTY_RESOURCES_H */ diff --git a/source/mycss/selectors/function.c b/source/mycss/selectors/function.c new file mode 100644 index 0000000..3da0d5b --- /dev/null +++ b/source/mycss/selectors/function.c @@ -0,0 +1,244 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/function.h" +#include "mycss/selectors/function_resource.h" +#include "myhtml/utils/resources.h" + +///////////////////////////////////////////////////////// +//// Functions for a find Begin Function +//// +///////////////////////////////////////////////////////// +const mycss_selectots_function_begin_entry_t * mycss_function_begin_entry_by_name(const char* name, size_t length) +{ + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyCSS_SELECTORS_FUNCTION_NAME_STATIC_SIZE) + 1; + + while (mycss_selectors_function_begin_map_index[idx].name) + { + if(mycss_selectors_function_begin_map_index[idx].length == length) { + if(myhtml_strncasecmp(mycss_selectors_function_begin_map_index[idx].name, name, length) == 0) + return &mycss_selectors_function_begin_map_index[idx]; + + if(mycss_selectors_function_begin_map_index[idx].next) + idx = mycss_selectors_function_begin_map_index[idx].next; + else + return NULL; + } + else if(mycss_selectors_function_begin_map_index[idx].length > length) { + return NULL; + } + else { + idx = mycss_selectors_function_begin_map_index[idx].next; + } + } + + return NULL; +} + +mycss_selectors_function_begin_f mycss_function_begin_by_name(const char *name, size_t length) +{ + const mycss_selectots_function_begin_entry_t *entry = mycss_function_begin_entry_by_name(name, length); + + if(entry) { + return entry->func; + } + + return NULL; +} + +///////////////////////////////////////////////////////// +//// Unknown, for not exists function +//// +///////////////////////////////////////////////////////// +void mycss_selectors_begin_unknown(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_UNKNOWN; + + entry->parser = mycss_selectors_unknown_parser; +} + +/////////////////////////////////////////////////////////// +////// Begin functions +////// +/////////////////////////////////////////////////////////// +void mycss_selectors_function_begin_nth_child(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD; + + entry->anb->entry = (mycss_an_plus_b_entry_t**)(&selector->value); + + entry->parser = mycss_an_plus_b_state_anb_begin; + entry->parser_switch = mycss_selectors_function_parser_nth_with_selectors; +} + +void mycss_selectors_function_begin_has(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS; + + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_list_t **new_list = (mycss_selectors_list_t**)(&selectors->entry_last->value); + mycss_selectors_list_t *current_list = selectors->list_last; + + selectors->list = new_list; + selectors->list_last = NULL; + selectors->ending_token = entry->parser_ending_token; + + mycss_selectors_state_relative_selector_list(entry, NULL, true); + + (*new_list)->parent = current_list; + + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_has, entry->parser_switch, entry->parser_ending_token, false); +} + +void mycss_selectors_function_begin_nth_last_child(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD; + + entry->anb->entry = (mycss_an_plus_b_entry_t**)(&selector->value); + + entry->parser = mycss_an_plus_b_state_anb_begin; + entry->parser_switch = mycss_selectors_function_parser_nth_with_selectors; +} + +void mycss_selectors_function_begin_drop(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP; + + selector->value = NULL; + entry->parser = mycss_selectors_function_parser_drop; +} + +void mycss_selectors_function_begin_nth_last_of_type(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE; + + entry->anb->entry = (mycss_an_plus_b_entry_t**)(&selector->value); + + entry->parser = mycss_an_plus_b_state_anb_begin; + entry->parser_switch = mycss_selectors_function_parser_nth_without_selectors; +} + +void mycss_selectors_function_begin_not(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT; + + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_list_t **new_list = (mycss_selectors_list_t**)(&selectors->entry_last->value); + mycss_selectors_list_t *current_list = selectors->list_last; + + selectors->list = new_list; + selectors->list_last = NULL; + selectors->ending_token = entry->parser_ending_token; + + mycss_selectors_state_compound_selector_list(entry, NULL, true); + + (*new_list)->parent = current_list; + + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_not_or_matches_or_current_parser, entry->parser_switch, entry->parser_ending_token, false); +} + +void mycss_selectors_function_begin_current(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT; + + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_list_t **new_list = (mycss_selectors_list_t**)(&selectors->entry_last->value); + mycss_selectors_list_t *current_list = selectors->list_last; + + selectors->list = new_list; + selectors->list_last = NULL; + selectors->ending_token = entry->parser_ending_token; + + mycss_selectors_state_compound_selector_list(entry, NULL, true); + + (*new_list)->parent = current_list; + + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_not_or_matches_or_current_parser, entry->parser_switch, entry->parser_ending_token, false); +} + +void mycss_selectors_function_begin_nth_of_type(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE; + + entry->anb->entry = (mycss_an_plus_b_entry_t**)(&selector->value); + + entry->parser = mycss_an_plus_b_state_anb_begin; + entry->parser_switch = mycss_selectors_function_parser_nth_without_selectors; +} + +void mycss_selectors_function_begin_nth_last_column(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN; + + entry->anb->entry = (mycss_an_plus_b_entry_t**)(&selector->value); + + entry->parser = mycss_an_plus_b_state_anb_begin; + entry->parser_switch = mycss_selectors_function_parser_nth_without_selectors; +} + +void mycss_selectors_function_begin_dir(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR; + selector->value = NULL; + + entry->parser = mycss_selectors_function_parser_dir; +} + +void mycss_selectors_function_begin_matches(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES; + + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_list_t **new_list = (mycss_selectors_list_t**)(&selectors->entry_last->value); + mycss_selectors_list_t *current_list = selectors->list_last; + + selectors->list = new_list; + selectors->list_last = NULL; + selectors->ending_token = entry->parser_ending_token; + + mycss_selectors_state_compound_selector_list(entry, NULL, true); + + (*new_list)->parent = current_list; + + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_not_or_matches_or_current_parser, entry->parser_switch, entry->parser_ending_token, false); +} + +void mycss_selectors_function_begin_nth_column(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN; + + entry->anb->entry = (mycss_an_plus_b_entry_t**)(&selector->value); + + entry->parser = mycss_an_plus_b_state_anb_begin; + entry->parser_switch = mycss_selectors_function_parser_nth_without_selectors; +} + +void mycss_selectors_function_begin_lang(mycss_entry_t* entry, mycss_selectors_entry_t* selector) +{ + selector->sub_type = MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG; + selector->value = NULL; + + entry->parser = mycss_selectors_function_parser_lang; +} + + diff --git a/source/mycss/selectors/function.h b/source/mycss/selectors/function.h new file mode 100644 index 0000000..beea322 --- /dev/null +++ b/source/mycss/selectors/function.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_FUNCTION_H +#define MyHTML_MyCSS_SELECTORS_FUNCTION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/function_parser.h" + +typedef void (*mycss_selectors_function_begin_f)(mycss_entry_t* entry, mycss_selectors_entry_t* selector); + +struct mycss_selectors_function_index { + mycss_parser_token_f parser; + mycss_parser_token_f switch_parser; +} +typedef mycss_selectors_function_index_t; + +struct mycss_selectots_function_begin_entry { + const char* name; + size_t length; + + mycss_selectors_function_begin_f func; + + size_t next; + size_t curr; +} +typedef mycss_selectots_function_begin_entry_t; + +mycss_selectors_function_begin_f mycss_function_begin_by_name(const char *name, size_t length); +const mycss_selectots_function_begin_entry_t * mycss_function_begin_entry_by_name(const char* name, size_t length); + +void mycss_selectors_function_begin_nth_child(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_not(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_dir(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_matches(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_lang(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_drop(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_of_type(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_last_column(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_current(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_last_child(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_last_of_type(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_has(mycss_entry_t* entry, mycss_selectors_entry_t* selector); +void mycss_selectors_function_begin_nth_column(mycss_entry_t* entry, mycss_selectors_entry_t* selector); + +void mycss_selectors_begin_unknown(mycss_entry_t* entry, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_FUNCTION_H */ diff --git a/source/mycss/selectors/function_parser.c b/source/mycss/selectors/function_parser.c new file mode 100644 index 0000000..d9bb2fe --- /dev/null +++ b/source/mycss/selectors/function_parser.c @@ -0,0 +1,675 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/function_parser.h" + +/* */ +bool mycss_selectors_function_parser_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == entry->parser_ending_token) { + if(mycss_entry_parser_list_current_is_local(entry) == false) { + mycss_entry_parser_list_pop(entry); + return false; + } + } + + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: + break; + + case MyCSS_TOKEN_TYPE_FUNCTION: { + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS: { + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + default: { + if(mycss_entry_parser_list_current_is_local(entry) && + token->type == entry->parser_ending_token) + { + mycss_entry_parser_list_pop(entry); + } + + break; + } + } + + return true; +} + +bool mycss_selectors_unknown_parser(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; +} + +mycss_selectors_list_t * mycss_selectors_parser_check_selector_list(mycss_selectors_t* selectors, mycss_selectors_list_t *list) +{ + if(list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) + mycss_selectors_list_destroy_last_empty_selector(selectors, list, true); + + if(list->selector_list_length == 0 || list->selector_list[0] == NULL) { + return mycss_selectors_list_destroy(selectors, list, true); + } + + return list; +} + +/////////////////////////////////////////////////////////// +////// NOT AND MATCHES AND CURRENT +////// +/////////////////////////////////////////////////////////// +void mycss_selectors_function_parser_not_or_matches_or_current_find_bad_selector(mycss_selectors_list_t* selectors_list) +{ + for(size_t i = 0; i < selectors_list->selector_list_length; i++) { + mycss_selectors_entry_t* selector = selectors_list->selector_list[i]; + + while(selector) { + if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES || + selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT || + selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT || + selector->type == MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT) + { + if((selectors_list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selectors_list->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + return; + } + + selector = selector->next; + } + } +} + +bool mycss_selectors_function_parser_not_or_matches_or_current_parser(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_list_t *selectors_list = selectors->list_last; + mycss_selectors_list_t *parent_list = selectors->list_last->parent; + + selectors->entry_last = mycss_selectors_list_last_entry(parent_list); + selectors->list_last = parent_list; + + mycss_selectors_function_parser_not_or_matches_or_current_find_bad_selector(selectors_list); + selectors_list = mycss_selectors_parser_check_selector_list(selectors, selectors_list); + + if(selectors_list == NULL) { + if(selectors->entry_last) + selectors->entry_last->value = NULL; + + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + else if((selectors_list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) && selectors->entry_last) { + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + + if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + if(selectors_list) + selectors_list->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + if(selectors->entry_last) + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + + return false; +} + +/////////////////////////////////////////////////////////// +////// HAS +////// +/////////////////////////////////////////////////////////// +void mycss_selectors_function_parser_has_find_bad_selector(mycss_selectors_list_t* selectors_list) +{ + for(size_t i = 0; i < selectors_list->selector_list_length; i++) { + mycss_selectors_entry_t* selector = selectors_list->selector_list[i]; + + while(selector) { + if(selector->type == MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT) { + if((selectors_list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selectors_list->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + return; + } + + selector = selector->next; + } + } +} + +bool mycss_selectors_function_parser_has(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_list_t *selectors_list = selectors->list_last; + mycss_selectors_list_t *parent_list = selectors->list_last->parent; + + selectors->entry_last = mycss_selectors_list_last_entry(parent_list); + selectors->list_last = parent_list; + + mycss_selectors_function_parser_has_find_bad_selector(selectors_list); + selectors_list = mycss_selectors_parser_check_selector_list(selectors, selectors_list); + + if(selectors_list == NULL) { + if(selectors->entry_last) + selectors->entry_last->value = NULL; + + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + else if((selectors_list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) && selectors->entry_last) { + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + + if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + if(selectors_list) + selectors_list->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + if(selectors->entry_last) + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + + return false; +} + +/////////////////////////////////////////////////////////// +////// NTH OF SELECTORS +////// +/////////////////////////////////////////////////////////// +bool mycss_selectors_function_parser_nth_with_selectors(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_entry_t *selector = selectors->entry_last; + + if(mycss_selector_value_an_plus_b(selector->value)->is_broken) + { + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + selector->value = mycss_selectors_value_pseudo_class_function_nth_child_destroy(entry, selector->value, true); + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + entry->parser = mycss_selectors_function_parser_nth_with_selectors_need_of; + + return false; +} + +bool mycss_selectors_function_parser_nth_with_selectors_need_of(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_entry_t *selector = selectors->entry_last; + + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); + + if(myhtml_strcasecmp(str.data, "of") != 0) { + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + anb->of = NULL; + + myhtml_string_destroy(&str, false); + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return true; + } + + myhtml_string_destroy(&str, false); + + /* create and switch entry, and create selector */ + mycss_selectors_list_t *current_list = selectors->list_last; + + selectors->list = &anb->of; + selectors->list_last = NULL; + selectors->ending_token = entry->parser_ending_token; + + mycss_selectors_state_compound_selector_list(entry, token, true); + + anb->of->parent = current_list; + + mycss_entry_parser_list_push(entry, mycss_selectors_function_parser_nth_with_selectors_need_of_after, entry->parser_switch, entry->parser_ending_token, false); + } + else if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + return true; +} + +bool mycss_selectors_function_parser_nth_with_selectors_need_of_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_list_t *parent_list = selectors->list_last->parent; + mycss_selectors_list_t *selectors_list = mycss_selectors_parser_check_selector_list(selectors, selectors->list_last); + + selectors->list_last = parent_list; + selectors->entry_last = mycss_selectors_list_last_entry(parent_list); + + if(selectors_list == NULL) { + if(selectors->entry_last) { + mycss_selector_value_an_plus_b(selectors->entry_last->value)->of = NULL; + } + + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + else if((selectors_list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) && selectors->entry_last) { + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + + if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + if(selectors_list) + selectors_list->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + if(selectors->entry_last) + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + + return false; +} + +/////////////////////////////////////////////////////////// +////// NTH +////// +/////////////////////////////////////////////////////////// +bool mycss_selectors_function_parser_nth_without_selectors(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_t *selectors = entry->selectors; + mycss_selectors_entry_t *selector = selectors->entry_last; + + if(mycss_selector_value_an_plus_b(selector->value)->is_broken) + { + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + selector->value = mycss_selectors_value_pseudo_class_function_nth_child_destroy(entry, selector->value, true); + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + entry->parser = mycss_selectors_function_parser_nth_without_selectors_after; + + return false; +} + +bool mycss_selectors_function_parser_nth_without_selectors_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + + mycss_selectors_t *selectors = entry->selectors; + + if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + if((selectors->entry_last->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + + return false; +} + +/////////////////////////////////////////////////////////// +////// DROP +////// +/////////////////////////////////////////////////////////// +bool mycss_selectors_function_parser_drop(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + mycss_selectors_function_drop_type_t drop_val = mycss_selector_value_drop(selector->value); + + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + if(myhtml_strcasecmp(str.data ,"active") == 0) { + drop_val |= MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE; + } + else if(myhtml_strcasecmp(str.data ,"valid") == 0) { + drop_val |= MyCSS_SELECTORS_FUNCTION_DROP_TYPE_VALID; + } + else if(myhtml_strcasecmp(str.data ,"invalid") == 0) { + drop_val |= MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID; + } + else { + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + + selector->value = (void*)drop_val; + + myhtml_string_destroy(&str, false); + + entry->parser = mycss_selectors_function_parser_drop_after; + } + else if(token->type == entry->parser_ending_token) { + /* it may be empty? */ +// mycss_selectors_t *selectors = entry->selectors; +// mycss_selectors_entry_t *selector = selectors->entry_last; +// +// mycss_selectors_function_drop_type_t drop_val = mycss_selector_value_drop(selector->value); +// +// if(drop_val == MyCSS_SELECTORS_FUNCTION_DROP_TYPE_UNDEF && +// (selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) +// { +// selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; +// } + + mycss_entry_parser_list_pop(entry); + return false; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + return true; +} + +bool mycss_selectors_function_parser_drop_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_COLUMN) { + entry->parser = mycss_selectors_function_parser_drop_after_column; + } + else if(token->type == entry->parser_ending_token) { + entry->parser = mycss_selectors_function_parser_drop; + return false; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + return true; +} + +bool mycss_selectors_function_parser_drop_after_column(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + entry->parser = mycss_selectors_function_parser_drop; + } + else if(token->type == entry->parser_ending_token) { + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_drop; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + } + + return false; +} + +/////////////////////////////////////////////////////////// +////// DIR +////// +/////////////////////////////////////////////////////////// +bool mycss_selectors_function_parser_dir(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + selector->value = mycss_selectors_value_pseudo_class_function_dir_create(entry, true); + mycss_token_data_to_string(entry, token, selector->value, true, false); + + entry->parser = mycss_selectors_function_parser_dir_after; + } + else if(token->type == entry->parser_ending_token) { + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_drop; + return false; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + return true; +} + +bool mycss_selectors_function_parser_dir_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + } + else { + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + } + + return false; +} + +/////////////////////////////////////////////////////////// +////// LANG +////// +/////////////////////////////////////////////////////////// +bool mycss_selectors_function_parser_lang(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_IDENT || + token->type == MyCSS_TOKEN_TYPE_STRING) + { + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + mycss_selectors_value_lang_t *lang; + + if(selector->value) { + lang = mycss_selector_value_lang(selector->value); + + while(lang->next) + lang = lang->next; + + lang->next = mycss_selectors_value_pseudo_class_function_lang_create(entry, true); + mycss_token_data_to_string(entry, token, &lang->next->str, true, false); + } + else { + lang = mycss_selectors_value_pseudo_class_function_lang_create(entry, true); + mycss_token_data_to_string(entry, token, &lang->str, true, false); + + selector->value = lang; + } + + entry->parser = mycss_selectors_function_parser_lang_after; + } + else if(token->type == entry->parser_ending_token) { + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + mycss_entry_parser_list_pop(entry); + return false; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + return true; +} + +bool mycss_selectors_function_parser_lang_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_COMMA) { + entry->parser = mycss_selectors_function_parser_lang_comma; + } + else if(token->type == entry->parser_ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } + + return true; +} + +bool mycss_selectors_function_parser_lang_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_IDENT || + token->type == MyCSS_TOKEN_TYPE_STRING) + { + entry->parser = mycss_selectors_function_parser_lang; + return false; + } + else { + /* parse error */ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_function_parser_state_drop_component_value; + return false; + } +} + + + diff --git a/source/mycss/selectors/function_parser.h b/source/mycss/selectors/function_parser.h new file mode 100644 index 0000000..a0e67c2 --- /dev/null +++ b/source/mycss/selectors/function_parser.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_FUNCTION_PARSER_H +#define MyHTML_MyCSS_SELECTORS_FUNCTION_PARSER_H +#pragma once + +#define MyCSS_SELECTORS_FUNCTION_NAME_STATIC_SIZE 57 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/myosi.h" + +bool mycss_selectors_function_parser_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_unknown_parser(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_not_or_matches_or_current_parser(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_has(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_nth_with_selectors(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_nth_with_selectors_need_of(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_nth_with_selectors_need_of_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_nth_without_selectors(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_nth_without_selectors_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_drop(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_drop_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_drop_after_column(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_dir(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_dir_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +bool mycss_selectors_function_parser_lang(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_lang_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_function_parser_lang_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_FUNCTION_PARSER_H */ diff --git a/source/mycss/selectors/function_resource.h b/source/mycss/selectors/function_resource.h new file mode 100644 index 0000000..a3a369e --- /dev/null +++ b/source/mycss/selectors/function_resource.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_FUNCTION_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_FUNCTION_RESOURCE_H +#pragma once + +#define MyCSS_SELECTORS_FUNCTION_NAME_STATIC_SIZE 57 + +static const mycss_selectots_function_begin_entry_t mycss_selectors_function_begin_map_index[] = +{ + {NULL, 0, NULL, 0, 0}, + {"dir", 3, mycss_selectors_function_begin_dir, 0, 1}, + {NULL, 0, NULL, 0, 0}, + {"nth-of-type", 11, mycss_selectors_function_begin_nth_of_type, 0, 3}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"nth-last-column", 15, mycss_selectors_function_begin_nth_last_column, 0, 13}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"current", 7, mycss_selectors_function_begin_current, 0, 19}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"matches", 7, mycss_selectors_function_begin_matches, 0, 23}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"has", 3, mycss_selectors_function_begin_has, 0, 28}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"not", 3, mycss_selectors_function_begin_not, 0, 34}, + {"nth-last-of-type", 16, mycss_selectors_function_begin_nth_last_of_type, 0, 35}, + {NULL, 0, NULL, 0, 0}, + {"lang", 4, mycss_selectors_function_begin_lang, 0, 37}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"nth-last-child", 14, mycss_selectors_function_begin_nth_last_child, 0, 44}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"nth-column", 10, mycss_selectors_function_begin_nth_column, 0, 47}, + {NULL, 0, NULL, 0, 0}, + {"nth-child", 9, mycss_selectors_function_begin_nth_child, 0, 49}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {NULL, 0, NULL, 0, 0}, + {"drop", 4, mycss_selectors_function_begin_drop, 0, 56}, + {NULL, 0, NULL, 0, 0}, +}; + +#endif /* MyHTML_MyCSS_SELECTORS_FUNCTION_RESOURCE_H */ + diff --git a/source/mycss/selectors/init.c b/source/mycss/selectors/init.c new file mode 100644 index 0000000..40665e8 --- /dev/null +++ b/source/mycss/selectors/init.c @@ -0,0 +1,466 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/init.h" +#include "mycss/selectors/myosi_resource.h" +#include "mycss/selectors/value_resource.h" + +mycss_selectors_t * mycss_selectors_create(void) +{ + return (mycss_selectors_t*)myhtml_calloc(1, sizeof(mycss_selectors_t)); +} + +mycss_status_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors) +{ + selectors->ref_entry = entry; + selectors->entry = NULL; + selectors->entry_last = NULL; + selectors->list = NULL; + selectors->list_last = NULL; + selectors->combinator = NULL; + + /* Objects Selector */ + selectors->mcobject_entries = mcobject_create(); + if(selectors->mcobject_entries == NULL) + return MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_CREATE; + + myhtml_status_t myhtml_status = mcobject_init(selectors->mcobject_entries, 256, sizeof(mycss_selectors_entry_t)); + if(myhtml_status) + return MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_INIT; + + /* Selectors List Entries */ + selectors->mcobject_list_entries = mcobject_create(); + if(selectors->mcobject_list_entries == NULL) + return MyCSS_STATUS_ERROR_SELECTORS_LIST_CREATE; + + myhtml_status = mcobject_init(selectors->mcobject_list_entries, 256, sizeof(mycss_selectors_list_t)); + if(myhtml_status) + return MyCSS_STATUS_ERROR_SELECTORS_LIST_INIT; + + return MyCSS_STATUS_OK; +} + +void mycss_selectors_clean(mycss_selectors_t* selectors) +{ + selectors->entry = NULL; + selectors->entry_last = NULL; + selectors->list = NULL; + selectors->list_last = NULL; + selectors->combinator = NULL; +} + +mycss_status_t mycss_selectors_clean_all(mycss_selectors_t* selectors) +{ + selectors->entry = NULL; + selectors->entry_last = NULL; + selectors->list = NULL; + selectors->list_last = NULL; + selectors->combinator = NULL; + + mcobject_clean(selectors->mcobject_entries); + mcobject_clean(selectors->mcobject_list_entries); + + return MyCSS_STATUS_OK; +} + +mycss_selectors_t * mycss_selectors_destroy(mycss_selectors_t* selectors, bool self_destroy) +{ + if(selectors == NULL) + return NULL; + + selectors->mcobject_entries = mcobject_destroy(selectors->mcobject_entries, true); + selectors->mcobject_list_entries = mcobject_destroy(selectors->mcobject_list_entries, true); + + if(self_destroy) { + myhtml_free(selectors); + return NULL; + } + + return selectors; +} + +void mycss_selectors_entry_clean(mycss_selectors_entry_t* sel_entry) +{ + memset(sel_entry, 0, sizeof(mycss_selectors_entry_t)); +} + +mycss_token_t * mycss_selectors_parse_token_callback(mycss_entry_t* entry, mycss_token_t* token) +{ + if(token->type == MyCSS_TOKEN_TYPE_COMMENT) + return token; + + bool last_response = true; + while((last_response = entry->parser(entry, token, last_response)) == false) {}; + + return entry->token; +} + +mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status) +{ + mycss_entry_t *entry = selectors->ref_entry; + + mycss_entry_clean(entry); + + entry->token_ready_callback = mycss_selectors_parse_token_callback; + entry->parser = func; + entry->parser_original = NULL; + entry->parser_switch = NULL; + entry->state = MyCSS_TOKENIZER_STATE_DATA; + entry->state_back = MyCSS_TOKENIZER_STATE_DATA; + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_UNDEF; + + mycss_selectors_list_t *list = NULL; + selectors->list = &list; + + /* parsing */ + mycss_encoding_set(entry, encoding); + + mycss_status_t status = mycss_tokenizer_chunk(entry, data, data_size); + if(status != MyCSS_STATUS_OK) { + if(out_status) + *out_status = status; + + return NULL; + } + + status = mycss_tokenizer_end(entry); + + if(out_status) + *out_status = status; + + if(list) + return list; + + return NULL; +} + +mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status) +{ + return mycss_selectors_parse_by_function(selectors, mycss_selectors_state_complex_selector_list, encoding, data, data_size, out_status); +} + +mycss_selectors_entry_t * mycss_selectors_entry_find_first(mycss_selectors_entry_t* selector) +{ + while(selector->prev) + selector = selector->prev; + + return selector; +} + +mycss_selectors_entry_t * mycss_selectors_entry_create(mycss_selectors_t* selectors) +{ + mycss_selectors_entry_t* selector = mcobject_malloc(selectors->mcobject_entries, NULL); + mycss_selectors_entry_clean(selector); + + return selector; +} + +mycss_selectors_entry_t * mycss_selectors_entry_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, bool self_destroy) +{ + if(selector == NULL) + return NULL; + + if(selector->key) { + myhtml_string_destroy(selector->key, false); + mcobject_free(selectors->ref_entry->mcobject_string_entries, selector->key); + } + + if(selector->value) { + selector->value = mycss_selector_value_destroy(selectors->ref_entry, selector->type, selector->sub_type, selector->value, true); + } + + if(self_destroy) { + mcobject_free(selectors->mcobject_entries, selector); + return NULL; + } + + return selector; +} + +void * mycss_selectors_entry_value_destroy(mycss_entry_t* entry, mycss_selectors_entry_t* selector_entry, bool destroy_self) +{ + return mycss_selector_value_destroy(entry, selector_entry->type, selector_entry->sub_type, selector_entry->value, destroy_self); +} + +mycss_selectors_entry_t ** mycss_selectors_entry_list_create(mycss_selectors_t* selectors) +{ + mycss_entry_t* entry = selectors->ref_entry; + + return (mycss_selectors_entry_t**) mchar_async_malloc(entry->mchar, + entry->mchar_value_node_id, + sizeof(mycss_selectors_entry_t*)); +} + +mycss_selectors_entry_t ** mycss_selectors_entry_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entry_t** list, size_t current_size) +{ + mycss_entry_t* entry = selectors->ref_entry; + size_t current_size_char = current_size * sizeof(mycss_selectors_entry_t *); + + return (mycss_selectors_entry_t**) + mchar_async_realloc(entry->mchar, entry->mchar_value_node_id, + (char*)list, current_size_char, (current_size_char + sizeof(mycss_selectors_entry_t*))); +} + +mycss_selectors_entry_t ** mycss_selectors_entry_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t** list) +{ + mycss_entry_t* entry = selectors->ref_entry; + mchar_async_free(entry->mchar, entry->mchar_value_node_id, (char*)list); + + return NULL; +} + +mycss_selectors_entry_t * mycss_selectors_entry(mycss_selectors_t* selectors) +{ + if(selectors->entry == NULL) + return NULL; + + return *selectors->entry; +} + +void mycss_selectors_entry_append_to_current(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector) +{ + if(selectors->entry_last) { + selectors->entry_last->next = selector; + selector->prev = selectors->entry_last; + } + else { + (*selectors->entry) = selector; + } + + selectors->entry_last = selector; +} + +void mycss_selectors_print_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh) +{ + switch(selector->type) { + case MyCSS_SELECTORS_TYPE_ELEMENT: { + if(selector->ns_entry) + mycss_namespace_print(selectors->ref_entry->ns, selector->ns_entry, fh, true); + + if(selector->key) + fprintf(fh, "%s", selector->key->data); + break; + } + case MyCSS_SELECTORS_TYPE_ATTRIBUTE: { + fprintf(fh, "["); + + if(selector->ns_entry) + mycss_namespace_print(selectors->ref_entry->ns, selector->ns_entry, fh, true); + + if(selector->key) + fprintf(fh, "%s", selector->key->data); + + if(selector->value == NULL) { + fprintf(fh, "]"); + break; + } + + fprintf(fh, " %s ", mycss_selectors_resource_matcher_names_map[ mycss_selector_value_attribute(selector->value)->match ]); + + if(mycss_selector_value_attribute(selector->value)->value) { + fprintf(fh, "%s", mycss_selector_value_attribute(selector->value)->value->data); + } + + if(mycss_selector_value_attribute(selector->value)->mod & MyCSS_SELECTORS_MOD_I) { + fprintf(fh, " i"); + } + + fprintf(fh, "]"); + + break; + } + case MyCSS_SELECTORS_TYPE_ID: { + if(selector->key) + fprintf(fh, "#%s", selector->key->data); + break; + } + case MyCSS_SELECTORS_TYPE_CLASS: { + if(selector->key) + fprintf(fh, ".%s", selector->key->data); + break; + } + case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION: { + if(selector->key) + fprintf(fh, ":%s", selector->key->data); + + fprintf(fh, "("); + + switch (selector->sub_type) { + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT: + if(selector->value) + mycss_selectors_print_list(selectors, selector->value, fh); + break; + + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE: + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE: + if(selector->value) { + mycss_an_plus_b_print(selector->value, fh); + + if(mycss_selector_value_an_plus_b(selector->value)->of) { + fprintf(fh, " of "); + mycss_selectors_print_list(selectors, mycss_selector_value_an_plus_b(selector->value)->of, fh); + } + } + + break; + + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP: { + mycss_selectors_function_drop_type_t drop_val = mycss_selector_value_drop(selector->value); + + if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE) { + fprintf(fh, "active"); + + if(drop_val != MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE) + fprintf(fh, " || "); + } + + if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_VALID) { + fprintf(fh, "valid"); + + if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID) + fprintf(fh, " || "); + } + + if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID) { + fprintf(fh, "invalid"); + } + + break; + } + + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR: { + if(selector->value) + fprintf(fh, "%s", mycss_selector_value_string(selector->value)->data); + + break; + } + + case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG: { + if(selector->value) { + mycss_selectors_value_lang_t *lang = mycss_selector_value_lang(selector->value); + + while(lang) { + fprintf(fh, "%s", lang->str.data); + + if(lang->next) + fprintf(fh, ", "); + + lang = lang->next; + } + + } + + break; + } + + default: + break; + } + + fprintf(fh, ")"); + + break; + } + + case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS: { + fprintf(fh, ":"); + + if(selector->key) + fprintf(fh, "%s", selector->key->data); + + break; + } + + case MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT: { + fprintf(fh, "::"); + + if(selector->key) + fprintf(fh, "%s", selector->key->data); + + break; + } + + default: { + if(selector->key) + fprintf(fh, "%s", selector->key->data); + + fprintf(fh, "^U"); + break; + } + }; + + if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_UNKNOWN) + fprintf(fh, "^UST"); + + if(selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) + fprintf(fh, "^B"); +} + +void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh) +{ + while(selector) { + if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_DESCENDANT) + fprintf(fh, " "); + else if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_UNDEF) + fprintf(fh, ""); + else + fprintf(fh, " %s ", mycss_selectors_resource_combinator_names_map[ selector->combinator ]); + + mycss_selectors_print_selector(selectors, selector, fh); + + selector = selector->next; + } +} + +void mycss_selectors_print_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, FILE* fh) +{ + while(selectors_list) { + for(size_t i = 0; i < selectors_list->selector_list_length; i++) { + mycss_selectors_print_chain(selectors, selectors_list->selector_list[i], fh); + + if((i + 1) != selectors_list->selector_list_length) + fprintf(fh, ", "); + } + + if(selectors_list->declaration_entry) { + fprintf(fh, " {"); + mycss_declaration_entries_print(selectors->ref_entry->declaration, selectors_list->declaration_entry, fh); + fprintf(fh, "}"); + } + + if(selectors_list->flags == MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) { + fprintf(fh, "^BAD_SELECTOR_LIST"); + } + + if(selectors_list->next) { + fprintf(fh, "\n"); + } + + selectors_list = selectors_list->next; + } +} + diff --git a/source/mycss/selectors/init.h b/source/mycss/selectors/init.h new file mode 100644 index 0000000..deee757 --- /dev/null +++ b/source/mycss/selectors/init.h @@ -0,0 +1,66 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_INIT_H +#define MyHTML_MyCSS_SELECTORS_INIT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/list.h" + +mycss_selectors_t * mycss_selectors_create(void); +mycss_status_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors); +void mycss_selectors_clean(mycss_selectors_t* selectors); +mycss_status_t mycss_selectors_clean_all(mycss_selectors_t* selectors); +mycss_selectors_t * mycss_selectors_destroy(mycss_selectors_t* selectors, bool self_destroy); + +void mycss_selectors_entry_clean(mycss_selectors_entry_t* sel_entry); +mycss_selectors_entry_t * mycss_selectors_entry_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, bool self_destroy); + +void * mycss_selectors_entry_value_destroy(mycss_entry_t* entry, mycss_selectors_entry_t* selector_entry, bool destroy_self); + +mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); +mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); + +mycss_selectors_entry_t * mycss_selectors_entry_find_first(mycss_selectors_entry_t* selector); + +void mycss_selectors_print_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, FILE* fh); +void mycss_selectors_print_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh); +void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh); + +mycss_selectors_entry_t * mycss_selectors_entry_create(mycss_selectors_t* selectors); + +mycss_selectors_entry_t ** mycss_selectors_entry_list_create(mycss_selectors_t* selectors); +mycss_selectors_entry_t ** mycss_selectors_entry_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entry_t** list, size_t current_size); +mycss_selectors_entry_t ** mycss_selectors_entry_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t** list); + +mycss_selectors_entry_t * mycss_selectors_entry(mycss_selectors_t* selectors); +void mycss_selectors_entry_append_to_current(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_INIT_H */ diff --git a/source/mycss/selectors/list.c b/source/mycss/selectors/list.c new file mode 100644 index 0000000..32c2b35 --- /dev/null +++ b/source/mycss/selectors/list.c @@ -0,0 +1,155 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/list.h" + + +mycss_selectors_list_t * mycss_selectors_list_create(mycss_selectors_t* selectors) +{ + mycss_selectors_list_t* selectors_list = mcobject_malloc(selectors->mcobject_list_entries, NULL); + mycss_selectors_list_clean(selectors_list); + return selectors_list; +} + +void mycss_selectors_list_clean(mycss_selectors_list_t* selectors_list) +{ + memset(selectors_list, 0, sizeof(mycss_selectors_list_t)); +} + +mycss_selectors_list_t * mycss_selectors_list_destroy(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, bool self_destroy) +{ + if(selectors_list == NULL) + return NULL; + + mycss_entry_t *entry = selectors->ref_entry; + + if(selectors_list->selector_list) + { + for(size_t i = 0; i < selectors_list->selector_list_length; i++) + mycss_selectors_entry_destroy(entry->selectors, selectors_list->selector_list[i], true); + + mycss_selectors_entry_list_destroy(entry->selectors, selectors_list->selector_list); + } + + if(self_destroy) { + mcobject_free(selectors->mcobject_list_entries, selectors_list); + return NULL; + } + + return selectors_list; +} + +mycss_selectors_list_t * mycss_selectors_list_append_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* current_list, mycss_selectors_entry_t* selector) +{ + if(current_list->selector_list == NULL) { + current_list->selector_list = mycss_selectors_entry_list_create(selectors); + } + else { + current_list->selector_list = mycss_selectors_entry_list_add_one(selectors, current_list->selector_list, current_list->selector_list_length); + } + + current_list->selector_list[current_list->selector_list_length] = selector; + current_list->selector_list_length++; + + return current_list; +} + +mycss_selectors_entry_t * mycss_selectors_list_last_entry(mycss_selectors_list_t* list) +{ + size_t i = list->selector_list_length; + + while(i) { + i--; + + mycss_selectors_entry_t *entry = list->selector_list[i]; + + while(entry) { + if(entry->next == NULL) + return entry; + + entry = entry->next; + } + } + + return NULL; +} + +void mycss_selectors_list_append_to_current(mycss_selectors_t* selectors, mycss_selectors_list_t* current_list) +{ + if(selectors->list_last) { + selectors->list_last->next = current_list; + current_list->prev = selectors->list_last; + } + else { + (*selectors->list) = current_list; + } + + selectors->list_last = current_list; +} + +mycss_selectors_entry_t ** mycss_selectors_list_current_chain(mycss_selectors_list_t* list) +{ + if(list->selector_list_length) + return NULL; + + return &list->selector_list[ list->selector_list_length - 1 ]; +} + +bool mycss_selectors_list_destroy_last_empty_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* list, bool destroy_found) +{ + if(list->selector_list_length == 0) + return false; + + size_t idx = list->selector_list_length - 1; + + mycss_selectors_entry_t *entry = list->selector_list[idx]; + + if(entry == NULL) { + mycss_selectors_entry_destroy(selectors, entry, destroy_found); + list->selector_list_length--; + + return true; + } + + while(entry) { + if(entry->next == NULL) { + if(entry->key == NULL) + { + if(entry->prev) + entry->prev->next = NULL; + else { + list->selector_list[idx] = NULL; + list->selector_list_length--; + } + + mycss_selectors_entry_destroy(selectors, entry, destroy_found); + + return true; + } + + return false; + } + + entry = entry->next; + } + + return false; +} + diff --git a/source/mycss/selectors/list.h b/source/mycss/selectors/list.h new file mode 100644 index 0000000..aa6ebd8 --- /dev/null +++ b/source/mycss/selectors/list.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_LIST_H +#define MyHTML_MyCSS_SELECTORS_LIST_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/myosi.h" +#include "mycss/declaration/myosi.h" + +struct mycss_selectors_list { + mycss_selectors_entry_t** selector_list; + size_t selector_list_length; + + mycss_declaration_entry_t* declaration_entry; + + mycss_selectors_flags_t flags; + + mycss_selectors_list_t* parent; + mycss_selectors_list_t* next; + mycss_selectors_list_t* prev; +}; + +mycss_selectors_list_t * mycss_selectors_list_create(mycss_selectors_t* selectors); +void mycss_selectors_list_clean(mycss_selectors_list_t* selector_list); +mycss_selectors_list_t * mycss_selectors_list_destroy(mycss_selectors_t* selectors, mycss_selectors_list_t* selector_list, bool self_destroy); + +mycss_selectors_list_t * mycss_selectors_list_append_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector); +mycss_selectors_entry_t * mycss_selectors_list_last_entry(mycss_selectors_list_t* list); +mycss_selectors_entry_t ** mycss_selectors_list_current_chain(mycss_selectors_list_t* list); + +void mycss_selectors_list_append_to_current(mycss_selectors_t* selectors, mycss_selectors_list_t* current_list); + +bool mycss_selectors_list_destroy_last_empty_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* list, bool destroy_found); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_LIST_H */ diff --git a/source/mycss/selectors/myosi.h b/source/mycss/selectors/myosi.h new file mode 100644 index 0000000..2368e0d --- /dev/null +++ b/source/mycss/selectors/myosi.h @@ -0,0 +1,228 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_MYOSI_H +#define MyHTML_MyCSS_SELECTORS_MYOSI_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycss_selectors mycss_selectors_t; +typedef struct mycss_selectors_entry mycss_selectors_entry_t; +typedef struct mycss_selectors_list mycss_selectors_list_t; + +#include "mycss/myosi.h" +#include "mycss/mystring.h" +#include "mycss/namespace/myosi.h" +#include "mycss/declaration/myosi.h" +#include "myhtml/utils/mcobject.h" + +typedef bool (*mycss_selectors_state_f)(mycss_entry_t* entry, mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_token_t* token); +typedef void (*mycss_callback_selector_done_f)(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); + +enum mycss_selectors_match { + MyCSS_SELECTORS_MATCH_EQUAL = 0x00, // = + MyCSS_SELECTORS_MATCH_INCLUDE = 0x01, // ~= + MyCSS_SELECTORS_MATCH_DASH = 0x02, // |= + MyCSS_SELECTORS_MATCH_PREFIX = 0x03, // ^= + MyCSS_SELECTORS_MATCH_SUFFIX = 0x04, // $= + MyCSS_SELECTORS_MATCH_SUBSTRING = 0x05, // *= + MyCSS_SELECTORS_MATCH_LAST_ENTRY = 0x06 +} +typedef mycss_selectors_match_t; + +enum mycss_selectors_combinator { + MyCSS_SELECTORS_COMBINATOR_UNDEF = 0x00, // two compound selectors [key=val].foo + MyCSS_SELECTORS_COMBINATOR_DESCENDANT = 0x01, // '>>' or WHITESPACE + MyCSS_SELECTORS_COMBINATOR_CHILD = 0x02, // '>' + MyCSS_SELECTORS_COMBINATOR_NEXT_SIBLING = 0x03, // '+' + MyCSS_SELECTORS_COMBINATOR_FOLLOWING_SIBLING = 0x04, // '~' + MyCSS_SELECTORS_COMBINATOR_COLUMN = 0x05, // '||' + MyCSS_SELECTORS_COMBINATOR_LAST_ENTRY = 0x06 +} +typedef mycss_selectors_combinator_t; + +enum mycss_selectors_mod { + MyCSS_SELECTORS_MOD_UNDEF = 0x00, + MyCSS_SELECTORS_MOD_I = 0x01 +} +typedef mycss_selectors_mod_t; + +enum mycss_selectors_flags { + MyCSS_SELECTORS_FLAGS_UNDEF = 0x00, + MyCSS_SELECTORS_FLAGS_SELECTOR_BAD = 0x01 +} +typedef mycss_selectors_flags_t; + +enum mycss_selectors_type { + MyCSS_SELECTORS_TYPE_UNDEF = 0x000, // tag name
= div in css + MyCSS_SELECTORS_TYPE_ELEMENT = 0x001, // tag name
= div in css + MyCSS_SELECTORS_TYPE_ID = 0x002, // #hash + MyCSS_SELECTORS_TYPE_CLASS = 0x003, // .class + MyCSS_SELECTORS_TYPE_ATTRIBUTE = 0x004, // [key=val], in html
+ MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION = 0x005, // :function(...) + MyCSS_SELECTORS_TYPE_PSEUDO_CLASS = 0x006, // :pseudo + MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION = 0x007, // ::function(...) + MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT = 0x008, // ::pseudo + MyCSS_SELECTORS_TYPE_LAST_ENTRY = 0x009 +} +typedef mycss_selectors_type_t; + +enum mycss_selectors_sub_type { + MyCSS_SELECTORS_SUB_TYPE_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_UNKNOWN = 0x01 +} +typedef mycss_selectors_sub_type_t; + +/* pseudo classes functions */ +enum mycss_selectors_sub_type_pseudo_class_function { + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_UNKNOWN = 0x01, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT = 0x02, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR = 0x03, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP = 0x04, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS = 0x05, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG = 0x06, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES = 0x07, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT = 0x08, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD = 0x09, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN = 0x0a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD = 0x0b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN = 0x0c, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE = 0x0d, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE = 0x0e, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY = 0x0f +} +typedef mycss_selectors_sub_type_pseudo_class_function_t; + +/* pseudo classes */ +enum mycss_selectors_sub_type_pseudo_class { + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNKNOWN = 0x01, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ACTIVE = 0x02, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ANY_LINK = 0x03, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_BLANK = 0x04, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CHECKED = 0x05, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CURRENT = 0x06, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DEFAULT = 0x07, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DISABLED = 0x08, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DROP = 0x09, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_EMPTY = 0x0a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ENABLED = 0x0b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_CHILD = 0x0c, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_OF_TYPE = 0x0d, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FOCUS = 0x0e, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUTURE = 0x0f, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_HOVER = 0x10, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_IN_RANGE = 0x11, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INDETERMINATE = 0x12, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INVALID = 0x13, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_CHILD = 0x14, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_OF_TYPE = 0x15, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LINK = 0x16, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_CHILD = 0x17, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_OF_TYPE = 0x18, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OPTIONAL = 0x19, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OUT_OF_RANGE = 0x1a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PAST = 0x1b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PLACEHOLDER_SHOWN = 0x1c, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_ONLY = 0x1d, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_WRITE = 0x1e, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_REQUIRED = 0x1f, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ROOT = 0x20, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_SCOPE = 0x21, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_TARGET = 0x22, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_USER_ERROR = 0x23, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VALID = 0x24, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VISITED = 0x25, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_ENTRY = 0x26 +} +typedef mycss_selectors_sub_type_pseudo_class_t; + +/* pseudo element */ +enum mycss_selectors_sub_type_pseudo_element { + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF = 0x00, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNKNOWN = 0x01, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_AFTER = 0x02, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BACKDROP = 0x03, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BEFORE = 0x04, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LETTER = 0x05, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LINE = 0x06, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_GRAMMAR_ERROR = 0x07, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_MARKER = 0x08, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_PLACEHOLDER = 0x09, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SELECTION = 0x0a, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SPELLING_ERROR = 0x0b, + MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_LAST_ENTRY = 0x0c +} +typedef mycss_selectors_sub_type_pseudo_element_t; + +enum mycss_selectors_function_drop_type { + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_UNDEF = 0x000, + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE = 0x001, + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_VALID = 0x002, + MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID = 0x004, +} +typedef mycss_selectors_function_drop_type_t; + +struct mycss_selectors { + // refs + mycss_entry_t* ref_entry; + + mycss_selectors_entry_t** entry; + mycss_selectors_entry_t* entry_last; + + mycss_selectors_list_t** list; + mycss_selectors_list_t* list_last; + + mycss_selectors_combinator_t* combinator; + + mycss_token_type_t ending_token; + + mcobject_t* mcobject_entries; + mcobject_t* mcobject_list_entries; +}; + +struct mycss_selectors_entry { + mycss_selectors_type_t type; + int sub_type; + mycss_selectors_flags_t flags; + + mycss_namespace_entry_t* ns_entry; + + myhtml_string_t* key; + void* value; + + mycss_selectors_combinator_t combinator; + + /* TODO: experimental */ + void* node; + + mycss_selectors_entry_t* next; + mycss_selectors_entry_t* prev; +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_MYOSI_H */ diff --git a/source/mycss/selectors/myosi_resource.h b/source/mycss/selectors/myosi_resource.h new file mode 100644 index 0000000..70a0b6a --- /dev/null +++ b/source/mycss/selectors/myosi_resource.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_MYOSI_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_MYOSI_RESOURCE_H +#pragma once + +static const char mycss_selectors_resource_matcher_names_map[][3] = { + "=", "~=", "|=", "^=", "$=", "*=" +}; + +static const char mycss_selectors_resource_combinator_names_map[][3] = { + "", " ", ">", "+", "~", "||" +}; + +#endif /* MyHTML_MyCSS_SELECTORS_MYOSI_RESOURCE_H */ diff --git a/source/mycss/selectors/parser.c b/source/mycss/selectors/parser.c new file mode 100644 index 0000000..f31acf6 --- /dev/null +++ b/source/mycss/selectors/parser.c @@ -0,0 +1,359 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/parser.h" +#include "mycss/selectors/value_resource.h" + +///////////////////////////////////////////////////////// +//// Selectors Begin +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_selector_begin(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = mycss_selectors_entry_create(entry->selectors); + mycss_selectors_entry_append_to_current(entry->selectors, selector); +} + +///////////////////////////////////////////////////////// +//// Selector type +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_selector_ident_type(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, false); + + /* set default namespace */ + if(entry->stylesheet) + selector->ns_entry = entry->stylesheet->ns_stylesheet.entry_default; + + selector->type = MyCSS_SELECTORS_TYPE_ELEMENT; + selector->key = str; +} + +void mycss_selectors_parser_selector_ident_attr(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, false); + + /* set default namespace */ + if(entry->stylesheet) + selector->ns_entry = entry->stylesheet->ns_stylesheet.entry_default; + + selector->type = MyCSS_SELECTORS_TYPE_ATTRIBUTE; + selector->key = str; +} + +void mycss_selectors_parser_selector_id(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, false); + + /* set default namespace */ + if(entry->stylesheet) + selector->ns_entry = entry->stylesheet->ns_stylesheet.entry_default; + + selector->type = MyCSS_SELECTORS_TYPE_ID; + selector->key = str; + + mycss_selectors_parser_selector_end(entry, token); +} + +void mycss_selectors_parser_selector_class(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, false); + + /* set default namespace */ + if(entry->stylesheet) + selector->ns_entry = entry->stylesheet->ns_stylesheet.entry_default; + + selector->type = MyCSS_SELECTORS_TYPE_CLASS; + selector->key = str; + + mycss_selectors_parser_selector_end(entry, token); +} + +///////////////////////////////////////////////////////// +//// Namespace +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_selector_namespace(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + myhtml_string_t *str = selector->key; + + if(str == NULL || str->length == 0) { + myhtml_string_destroy(str, 0); + + selector->key = NULL; + + if(entry->stylesheet) + selector->ns_entry = &entry->stylesheet->ns_stylesheet.entry_undef; + + return; + } + + if(str->length == 1 && *str->data == '*') { + myhtml_string_destroy(str, 0); + + selector->key = NULL; + + if(entry->stylesheet) + selector->ns_entry = &entry->stylesheet->ns_stylesheet.entry_any; + + return; + } + + if(entry->stylesheet) + selector->ns_entry = mycss_namespace_entry_by_name(entry->ns, entry->stylesheet->ns_stylesheet.name_tree, str->data, str->length, false); + + if(selector->ns_entry == NULL) + mycss_selectors_parser_expectations_error(entry, token); + + myhtml_string_destroy(str, 0); + selector->key = NULL; +} + +void mycss_selectors_parser_selector_namespace_ident(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + mycss_selectors_parser_selector_namespace(entry, token); + + if(selector->type == MyCSS_SELECTORS_TYPE_UNDEF) + selector->type = MyCSS_SELECTORS_TYPE_ELEMENT; +} + +void mycss_selectors_parser_selector_namespace_attr(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + mycss_selectors_parser_selector_namespace(entry, token); + + if(selector->type == MyCSS_SELECTORS_TYPE_UNDEF) + selector->type = MyCSS_SELECTORS_TYPE_ATTRIBUTE; +} + +void mycss_selectors_parser_selector_after_namespace(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, true); + + selector->key = str; +} + +///////////////////////////////////////////////////////// +//// Value and Modifier +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_selector_value(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + mycss_selectors_object_attribute_t *attr = selector->value; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, false); + + attr->value = str; +} + +void mycss_selectors_parser_selector_modifier(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + mycss_selector_value_attribute(selector->value)->mod = MyCSS_SELECTORS_MOD_I; +} + +///////////////////////////////////////////////////////// +//// Pseudo Class +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_selector_pseudo_class(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, true); + + selector->sub_type = mycss_pseudo_class_by_name(str->data, str->length); + selector->key = str; + selector->type = MyCSS_SELECTORS_TYPE_PSEUDO_CLASS; + + /* hack for elements */ + if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNKNOWN) { + selector->sub_type = mycss_pseudo_element_by_name(str->data, str->length); + + if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNKNOWN) { + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } + else { + selector->type = MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT; + } + } + + mycss_selectors_parser_check_and_set_bad_parent_selector(entry, entry->selectors->list_last); + mycss_selectors_parser_selector_end(entry, token); +} + +void mycss_selectors_parser_selector_pseudo_class_function(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, true); + + selector->key = str; + selector->type = MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION; + + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + mycss_entry_parser_list_push(entry, mycss_selectors_state_simple_selector_colon_function, entry->parser_switch, entry->selectors->ending_token, false); + + mycss_selectors_function_begin_f to_func = mycss_function_begin_by_name(str->data, str->length); + + if(to_func) { + to_func(entry, selector); + } + else { + /* skip and set bad type for current selector */ + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + if(entry->selectors->list_last) + entry->selectors->list_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + mycss_selectors_begin_unknown(entry, selector); + } +} + +void mycss_selectors_parser_selector_pseudo_class_function_end(mycss_entry_t* entry, mycss_token_t* token) +{ + entry->selectors->ending_token = entry->parser_ending_token; + + mycss_selectors_parser_check_and_set_bad_parent_selector(entry, entry->selectors->list_last); + mycss_selectors_parser_selector_end(entry, token); +} + +///////////////////////////////////////////////////////// +//// Pseudo Element +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_selector_pseudo_element(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, true); + + selector->key = str; + selector->type = MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT; + + selector->sub_type = mycss_pseudo_element_by_name(str->data, str->length); + + if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNKNOWN) + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + mycss_selectors_parser_check_and_set_bad_parent_selector(entry, entry->selectors->list_last); + mycss_selectors_parser_selector_end(entry, token); +} + +void mycss_selectors_parser_selector_pseudo_element_function(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycss_token_data_to_string(entry, token, str, true, true); + + selector->key = str; + selector->type = MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION; + + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + mycss_selectors_begin_unknown(entry, selector); +} + +void mycss_selectors_parser_selector_pseudo_element_function_end(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_parser_check_and_set_bad_parent_selector(entry, entry->selectors->list_last); + mycss_selectors_parser_selector_end(entry, token); +} + +///////////////////////////////////////////////////////// +//// End and bad selectors +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_selector_end(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if(entry->callback_selector_done) + entry->callback_selector_done(entry->selectors, selector); +} + +void mycss_selectors_parser_expectations_error(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_t *selectors = entry->selectors; + + selectors->entry_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + if(entry->selectors->list_last) + entry->selectors->list_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; +} + +void mycss_selectors_parser_bad_token(mycss_entry_t* entry, mycss_token_t* token) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) { + selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + selector->key = str; + + mycss_token_data_to_string(entry, token, selector->key, true, false); + return; + } + + mycss_token_data_to_string(entry, token, selector->key, false, false); +} + +///////////////////////////////////////////////////////// +//// Set bad +//// +///////////////////////////////////////////////////////// +void mycss_selectors_parser_check_and_set_bad_parent_selector(mycss_entry_t* entry, mycss_selectors_list_t* selectors_list) +{ + mycss_selectors_list_t *list = entry->selectors->list_last; + + if(list && entry->selectors->entry_last->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) + { + if((list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) + list->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + } +} + + diff --git a/source/mycss/selectors/parser.h b/source/mycss/selectors/parser.h new file mode 100644 index 0000000..78b7898 --- /dev/null +++ b/source/mycss/selectors/parser.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_PARSER_H +#define MyHTML_MyCSS_SELECTORS_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/namespace/myosi.h" +#include "mycss/namespace/init.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/value.h" +#include "mycss/selectors/function.h" +#include "mycss/selectors/pseudo.h" + +void mycss_selectors_parser_selector_begin(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_ident_type(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_ident_attr(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_namespace_ident(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_namespace_attr(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_after_namespace(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_id(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_class(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_value(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_modifier(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_class(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_class_function(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_class_function_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_element(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_element_function(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_selector_pseudo_element_function_end(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_expectations_error(mycss_entry_t* entry, mycss_token_t* token); +void mycss_selectors_parser_bad_token(mycss_entry_t* entry, mycss_token_t* token); + +/* for set parent selector bad status if child selector is bad*/ +void mycss_selectors_parser_check_and_set_bad_parent_selector(mycss_entry_t* entry, mycss_selectors_list_t* selectors_list); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_PARSER_H */ diff --git a/source/mycss/selectors/pseudo.c b/source/mycss/selectors/pseudo.c new file mode 100644 index 0000000..4488a4d --- /dev/null +++ b/source/mycss/selectors/pseudo.c @@ -0,0 +1,78 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/pseudo.h" +#include "mycss/selectors/pseudo_resource.h" +#include "myhtml/utils/resources.h" + +///////////////////////////////////////////////////////// +//// Functions for a find Begin Function +//// +///////////////////////////////////////////////////////// +const mycss_selectots_pseudo_begin_entry_t * mycss_pseudo_begin_entry_by_name(const char* name, size_t length, size_t static_size, const mycss_selectots_pseudo_begin_entry_t* pseudo) +{ + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % static_size) + 1; + + while (pseudo[idx].name) + { + if(pseudo[idx].length == length) { + if(myhtml_strncasecmp(pseudo[idx].name, name, length) == 0) + return &pseudo[idx]; + + if(pseudo[idx].next) + idx = pseudo[idx].next; + else + return NULL; + } + else if(pseudo[idx].length > length) { + return NULL; + } + else { + idx = pseudo[idx].next; + } + } + + return NULL; +} + +mycss_selectors_sub_type_pseudo_class_t mycss_pseudo_class_by_name(const char *name, size_t length) +{ + const mycss_selectots_pseudo_begin_entry_t *entry = mycss_pseudo_begin_entry_by_name(name, length, MyCSS_SELECTORS_PSEUDO_CLASS_NAME_STATIC_SIZE, mycss_selectors_pseudo_class_begin_map_index); + + if(entry) + return entry->sub_type; + + return MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNKNOWN; +} + +mycss_selectors_sub_type_pseudo_element_t mycss_pseudo_element_by_name(const char *name, size_t length) +{ + const mycss_selectots_pseudo_begin_entry_t *entry = mycss_pseudo_begin_entry_by_name(name, length, MyCSS_SELECTORS_PSEUDO_ELEMENT_NAME_STATIC_SIZE, mycss_selectors_pseudo_element_begin_map_index); + + if(entry) + return entry->sub_type; + + return MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNKNOWN; +} + + diff --git a/source/mycss/selectors/pseudo.h b/source/mycss/selectors/pseudo.h new file mode 100644 index 0000000..84f3e83 --- /dev/null +++ b/source/mycss/selectors/pseudo.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_PSEUDO_H +#define MyHTML_MyCSS_SELECTORS_PSEUDO_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/myosi.h" + +struct mycss_selectots_pseudo_begin_entry { + const char* name; + size_t length; + + int sub_type; + + size_t next; + size_t curr; +} +typedef mycss_selectots_pseudo_begin_entry_t; + + +mycss_selectors_sub_type_pseudo_class_t mycss_pseudo_class_by_name(const char *name, size_t length); +mycss_selectors_sub_type_pseudo_element_t mycss_pseudo_element_by_name(const char *name, size_t length); +const mycss_selectots_pseudo_begin_entry_t * mycss_pseudo_begin_entry_by_name(const char* name, size_t length, size_t static_size, const mycss_selectots_pseudo_begin_entry_t* pseudo); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_PSEUDO_H */ diff --git a/source/mycss/selectors/pseudo_resource.h b/source/mycss/selectors/pseudo_resource.h new file mode 100644 index 0000000..4bb9994 --- /dev/null +++ b/source/mycss/selectors/pseudo_resource.h @@ -0,0 +1,161 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + */ + +#ifndef MyHTML_MyCSS_SELECTORS_PSEUDO_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_PSEUDO_RESOURCE_H +#pragma once + +#define MyCSS_SELECTORS_PSEUDO_CLASS_NAME_STATIC_SIZE 73 +#define MyCSS_SELECTORS_PSEUDO_ELEMENT_NAME_STATIC_SIZE 41 + +static const mycss_selectots_pseudo_begin_entry_t mycss_selectors_pseudo_class_begin_map_index[] = +{ + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"placeholder-shown", 17, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PLACEHOLDER_SHOWN, 0, 4}, + {"empty", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_EMPTY, 74, 5}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"last-of-type", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_OF_TYPE, 0, 8}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"user-error", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_USER_ERROR, 0, 10}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"in-range", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_IN_RANGE, 0, 15}, + {"link", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LINK, 75, 16}, + {"blank", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_BLANK, 76, 17}, + {"active", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ACTIVE, 0, 18}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"read-write", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_WRITE, 0, 20}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"checked", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CHECKED, 77, 24}, + {"default", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DEFAULT, 0, 25}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"focus", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FOCUS, 78, 32}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"last-child", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_CHILD, 0, 34}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"enabled", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ENABLED, 0, 37}, + {"visited", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VISITED, 0, 38}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"scope", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_SCOPE, 79, 41}, + {"indeterminate", 13, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INDETERMINATE, 0, 42}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"root", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ROOT, 80, 45}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"read-only", 9, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_READ_ONLY, 0, 47}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"drop", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DROP, 0, 52}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"future", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUTURE, 0, 55}, + {"optional", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OPTIONAL, 0, 56}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"invalid", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_INVALID, 0, 63}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"past", 4, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_PAST, 81, 66}, + {"only-of-type", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_OF_TYPE, 82, 67}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_UNDEF, 0, 0}, + {"target", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_TARGET, 0, 72}, + {"first-child", 11, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_CHILD, 0, 73}, + {"hover", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_HOVER, 0, 74}, + {"current", 7, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_CURRENT, 0, 75}, + {"valid", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_VALID, 0, 76}, + {"required", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_REQUIRED, 0, 77}, + {"any-link", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ANY_LINK, 0, 78}, + {"only-child", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_ONLY_CHILD, 0, 79}, + {"first-of-type", 13, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FIRST_OF_TYPE, 0, 80}, + {"disabled", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_DISABLED, 0, 81}, + {"out-of-range", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_OUT_OF_RANGE, 0, 82}, +}; + +static const mycss_selectots_pseudo_begin_entry_t mycss_selectors_pseudo_element_begin_map_index[] = +{ + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"grammar-error", 13, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_GRAMMAR_ERROR, 0, 4}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"first-letter", 12, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LETTER, 0, 14}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"marker", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_MARKER, 0, 19}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"before", 6, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BEFORE, 0, 21}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"after", 5, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_AFTER, 0, 23}, + {"placeholder", 11, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_PLACEHOLDER, 0, 24}, + {"spelling-error", 14, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SPELLING_ERROR, 0, 25}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"backdrop", 8, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_BACKDROP, 0, 28}, + {"first-line", 10, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_FIRST_LINE, 0, 29}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {"selection", 9, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_SELECTION, 0, 35}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, + {NULL, 0, MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNDEF, 0, 0}, +}; + +#endif /* MyHTML_MyCSS_SELECTORS_PSEUDO_RESOURCE_H */ diff --git a/source/mycss/selectors/state.c b/source/mycss/selectors/state.c new file mode 100644 index 0000000..a29a2e0 --- /dev/null +++ b/source/mycss/selectors/state.c @@ -0,0 +1,1156 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/state.h" + +void mycss_selectors_state_end(mycss_entry_t* entry) +{ + mycss_selectors_entry_t* selector = entry->selectors->entry_last; + + if(selector == NULL) + return; + + if(selector->type == MyCSS_SELECTORS_TYPE_ATTRIBUTE || + selector->type == MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION || + (selector->key == NULL && selector->value == NULL)) + { + mycss_selectors_entry_clean(selector); + } + else { + mycss_selectors_parser_selector_end(entry, NULL); + } +} + +/* for unknown functions */ +bool mycss_selectors_state_function_skip_all(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ +// if(token->type == MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS) +// return entry->parser_switch(entry, token); + + return true; +} + +/* */ +bool mycss_selectors_state_drop(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: + break; + + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: { + if(mycss_entry_parser_list_length(entry) == 0) { + entry->parser = mycss_selectors_state_drop_component_value; + } + else if(mycss_entry_parser_list_length(entry) <= 1) { + mycss_entry_parser_list_pop(entry); + + } + return false; + } + default: + if(entry->selectors->list_last) + entry->selectors->list_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + entry->parser = mycss_selectors_state_drop_component_value; + return false; + } + + return true; +} + +bool mycss_selectors_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == entry->selectors->ending_token) { + if(mycss_entry_parser_list_current_is_local(entry) == false) { + mycss_entry_parser_list_pop(entry); + return false; + } + } + + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: + break; + + case MyCSS_TOKEN_TYPE_FUNCTION: { + mycss_entry_parser_list_push(entry, mycss_selectors_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_selectors_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET: { + mycss_entry_parser_list_push(entry, mycss_selectors_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + break; + } + case MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS: { + mycss_entry_parser_list_push(entry, mycss_selectors_state_drop_component_value, NULL, entry->parser_ending_token, true); + entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + break; + } + default: { + if(mycss_entry_parser_list_current_is_local(entry) && + token->type == entry->parser_ending_token) + { + mycss_entry_parser_list_pop(entry); + } + + break; + } + } + + return true; +} + +/* */ +bool mycss_selectors_state_combinator(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_COLUMN: { + *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_COLUMN; + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_column") + entry->parser = entry->parser_switch; + break; + } + case MyCSS_TOKEN_TYPE_DELIM: { + if(*token->data == '+') { + *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_NEXT_SIBLING; + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_plus") + entry->parser = entry->parser_switch; + } + else if(*token->data == '>') { + *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_CHILD; + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_greater_than") + entry->parser = mycss_selectors_state_combinator_greater_than; + } + else if(*token->data == '~') { + *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_FOLLOWING_SIBLING; + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_tilde") + entry->parser = entry->parser_switch; + } + else { + *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_UNDEF; + entry->parser = entry->parser_switch; + return false; + } + + break; + } + default: { + *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_UNDEF; + entry->parser = entry->parser_switch; + return false; + } + } + + return true; +} + +bool mycss_selectors_state_combinator_greater_than(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_DELIM) { + if(*token->data == '>') { + *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_DESCENDANT; + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_greater_than_greater_than") + entry->parser = entry->parser_switch; + } + else { + entry->parser = entry->parser_switch; + return false; + } + } + else { + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +/* */ +bool mycss_selectors_state_complex_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_t *sel_list = mycss_selectors_list_create(entry->selectors); + mycss_selectors_list_append_to_current(entry->selectors, sel_list); + + mycss_selectors_list_append_selector(selectors, sel_list, NULL); + selectors->entry = &sel_list->selector_list[0]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_complex_selector_list_need_selector; + return false; +} + +bool mycss_selectors_state_complex_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == entry->selectors->ending_token) { + if(entry->selectors->list_last) + entry->selectors->list_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_complex_selector_list_need_combinator_or_selector; + + if(entry->selectors->entry_last && entry->selectors->entry_last->key == NULL) { + if(mycss_selectors_state_simple_selector(entry, token, true)) + return true; + } + else { + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) + return true; + } + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + entry->parser = mycss_selectors_state_complex_selector_list_need_combinator_or_selector_ws; + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_COMMA) { + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); + + selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_complex_selector_list_need_selector; + return true; + } + else if(token->type == entry->selectors->ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_complex_selector_list_need_combinator_or_selector; + + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) + return true; + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_COMMA) { + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); + + selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_complex_selector_list_need_selector; + return true; + } + else if(token->type == entry->selectors->ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_complex_selector_list_need_combinator_or_selector; + + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) { + entry->selectors->entry_last->combinator = MyCSS_SELECTORS_COMBINATOR_DESCENDANT; + return true; + } + + entry->parser_switch = mycss_selectors_state_complex_selector_list_need_selector; + entry->selectors->combinator = &entry->selectors->entry_last->combinator; + + if(mycss_selectors_state_combinator(entry, token, true)) + return true; + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +/* */ +bool mycss_selectors_state_compound_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_t *sel_list = mycss_selectors_list_create(entry->selectors); + mycss_selectors_list_append_to_current(entry->selectors, sel_list); + + mycss_selectors_list_append_selector(selectors, sel_list, NULL); + selectors->entry = &sel_list->selector_list[0]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_compound_selector_list_comma_ws; + return false; +} + +bool mycss_selectors_state_compound_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == entry->selectors->ending_token) { + if(entry->selectors->list_last) + entry->selectors->list_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_compound_selector_list_need_selector_or_comma; + + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) + return true; + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +bool mycss_selectors_state_compound_selector_list_need_selector_or_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_COMMA) { + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); + + selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_compound_selector_list_comma_ws; + return true; + } + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + entry->parser = mycss_selectors_state_compound_selector_list_need_ending_or_comma; + return true; + } + else if(token->type == entry->selectors->ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) + return true; + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +bool mycss_selectors_state_compound_selector_list_comma_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + entry->parser = mycss_selectors_state_compound_selector_list_need_selector; + + return false; +} + +bool mycss_selectors_state_compound_selector_list_need_ending_or_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + if(token->type == MyCSS_TOKEN_TYPE_COMMA) { + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); + + selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_compound_selector_list_comma_ws; + return true; + } + else if(token->type == entry->selectors->ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +/* */ +bool mycss_selectors_state_relative_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_t *sel_list = mycss_selectors_list_create(entry->selectors); + mycss_selectors_list_append_to_current(entry->selectors, sel_list); + + mycss_selectors_list_append_selector(selectors, sel_list, NULL); + selectors->entry = &sel_list->selector_list[0]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin; + return false; +} + +bool mycss_selectors_state_relative_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + if(token->type == entry->selectors->ending_token) { + if(entry->selectors->list_last) + entry->selectors->list_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_relative_selector_list_need_combinator_or_selector; + + if(entry->selectors->entry_last && entry->selectors->entry_last->key == NULL) { + if(mycss_selectors_state_simple_selector(entry, token, true)) + return true; + } + else { + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) + return true; + } + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == entry->selectors->ending_token) { + if(entry->selectors->list_last) + entry->selectors->list_last->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_relative_selector_list_need_combinator_or_selector; + + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) + return true; + + entry->parser_switch = mycss_selectors_state_relative_selector_list_need_selector; + entry->selectors->combinator = &entry->selectors->entry_last->combinator; + + if(mycss_selectors_state_combinator(entry, token, true)) + return true; + + entry->parser = mycss_selectors_state_drop; + + return false; +} + + +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + entry->parser = mycss_selectors_state_relative_selector_list_need_combinator_or_selector_ws; + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_COMMA) { + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); + + selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin; + return true; + } + else if(token->type == entry->selectors->ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_relative_selector_list_need_combinator_or_selector; + + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) + return true; + + entry->parser_switch = mycss_selectors_state_relative_selector_list_need_selector; + entry->selectors->combinator = &entry->selectors->entry_last->combinator; + + if(mycss_selectors_state_combinator(entry, token, true)) + return true; + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) { + return true; + } + else if(token->type == MyCSS_TOKEN_TYPE_COMMA) { + mycss_selectors_t *selectors = entry->selectors; + + mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); + + selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry_last = NULL; + + entry->parser = mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin; + return true; + } + else if(token->type == entry->selectors->ending_token) { + mycss_entry_parser_list_pop(entry); + return false; + } + + entry->parser_switch = mycss_selectors_state_relative_selector_list_need_combinator_or_selector; + + if(mycss_selectors_state_simple_selector_begin(entry, token, true)) { + entry->selectors->entry_last->combinator = MyCSS_SELECTORS_COMBINATOR_DESCENDANT; + return true; + } + + entry->parser_switch = mycss_selectors_state_relative_selector_list_need_selector; + entry->selectors->combinator = &entry->selectors->entry_last->combinator; + + if(mycss_selectors_state_combinator(entry, token, true)) + return true; + + entry->parser = mycss_selectors_state_drop; + + return false; +} + +/* */ +bool mycss_selectors_state_simple_selector_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_parser_selector_begin(entry, token); + return mycss_selectors_state_simple_selector(entry, token, last_response); +} + +bool mycss_selectors_state_simple_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_IDENT: { + mycss_selectors_parser_selector_ident_type(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_ident") + + entry->parser = mycss_selectors_state_simple_selector_ident; + break; + } + case MyCSS_TOKEN_TYPE_DELIM: { + // HAND_EDIT_BEGIN + if(*token->data == '*') { + mycss_selectors_parser_selector_ident_type(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_asterisk") + + entry->parser = mycss_selectors_state_simple_selector_ident; + } + // HAND_EDIT_END + else if(*token->data == '.') { + entry->parser = mycss_selectors_state_simple_selector_full_stop; + } + else if(*token->data == '|') { + // HAND_EDIT_BEGIN + mycss_selectors_parser_selector_namespace_ident(entry, token); + // HAND_EDIT_END + entry->parser = mycss_selectors_state_simple_selector_vertical_bar; + } + else { + entry->parser = entry->parser_switch; + return false; + } + + break; + } + case MyCSS_TOKEN_TYPE_COLON: { + entry->parser = mycss_selectors_state_simple_selector_colon; + break; + } + case MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET: { + entry->parser = mycss_selectors_state_simple_selector_left_bracket; + break; + } + case MyCSS_TOKEN_TYPE_HASH: { + mycss_selectors_parser_selector_id(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_hash") + entry->parser = entry->parser_switch; + break; + } + default: { + entry->parser = entry->parser_switch; + return false; + } + } + + return true; +} + +bool mycss_selectors_state_simple_selector_left_bracket(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: { + break; + } + case MyCSS_TOKEN_TYPE_IDENT: { + mycss_selectors_parser_selector_ident_attr(entry, token); + entry->parser = mycss_selectors_state_simple_selector_left_bracket_ident; + + break; + } + case MyCSS_TOKEN_TYPE_DELIM: { + if(*token->data == '*') { + // HAND_EDIT_BEGIN + mycss_selectors_parser_selector_ident_attr(entry, token); + // HAND_EDIT_END + entry->parser = mycss_selectors_state_simple_selector_left_bracket_ident; + } + else if(*token->data == '|') { + // HAND_EDIT_BEGIN + mycss_selectors_parser_selector_namespace_attr(entry, token); + // HAND_EDIT_END + entry->parser = mycss_selectors_state_simple_selector_left_bracket_vertical_bar; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + + break; + } + default: { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + } + + return true; +} + +bool mycss_selectors_state_simple_selector_left_bracket_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_parser_selector_after_namespace(entry, token); + entry->parser = mycss_selectors_state_left_bracket_after_wq_name_attr; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + + return true; +} + +bool mycss_selectors_state_simple_selector_left_bracket_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: { + entry->parser = mycss_selectors_state_left_bracket_after_wq_name_attr; + break; + } + case MyCSS_TOKEN_TYPE_INCLUDE_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_INCLUDE; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + break; + } + case MyCSS_TOKEN_TYPE_DASH_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_DASH; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + break; + } + case MyCSS_TOKEN_TYPE_PREFIX_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_PREFIX; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + break; + } + case MyCSS_TOKEN_TYPE_SUFFIX_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_SUFFIX; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + break; + } + case MyCSS_TOKEN_TYPE_SUBSTRING_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_SUBSTRING; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + break; + } + case MyCSS_TOKEN_TYPE_DELIM: { + if(*token->data == '=') { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_EQUAL; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + } + else if(*token->data == '|') { + // HAND_EDIT_BEGIN + mycss_selectors_parser_selector_namespace_attr(entry, token); + // HAND_EDIT_END + entry->parser = mycss_selectors_state_simple_selector_left_bracket_ident_vertical_bar; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + break; + } + case MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET: { + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_left_bracket_ident_right_bracket") + entry->parser = entry->parser_switch; + break; + } + default: { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + } + + return true; +} + +bool mycss_selectors_state_simple_selector_left_bracket_ident_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_parser_selector_after_namespace(entry, token); + entry->parser = mycss_selectors_state_left_bracket_after_wq_name_attr; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + + return true; +} + +// HAND_EDIT_BEGIN +bool mycss_selectors_state_simple_selector_colon(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + switch (token->type) { + case MyCSS_TOKEN_TYPE_IDENT: { + mycss_selectors_parser_selector_pseudo_class(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_ident") + entry->parser = entry->parser_switch; + break; + } + case MyCSS_TOKEN_TYPE_COLON: { + entry->parser = mycss_selectors_state_simple_selector_colon_colon; + break; + } + case MyCSS_TOKEN_TYPE_FUNCTION: { + mycss_selectors_parser_selector_pseudo_class_function(entry, token); + break; + } + default: { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + } + + return true; +} + +bool mycss_selectors_state_simple_selector_colon_colon(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_parser_selector_pseudo_element(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_colon_ident") + entry->parser = entry->parser_switch; + } + else if(token->type == MyCSS_TOKEN_TYPE_FUNCTION) { + mycss_selectors_parser_selector_pseudo_element_function(entry, token); + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_simple_selector_colon_colon_function(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS) { + mycss_selectors_parser_selector_pseudo_element_function_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_colon_function_right_parenthesis") + entry->parser = entry->parser_switch; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_simple_selector_colon_function(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS) { + mycss_selectors_parser_selector_pseudo_class_function_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_function_right_parenthesis") + entry->parser = entry->parser_switch; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} +// HAND_EDIT_END + +bool mycss_selectors_state_simple_selector_full_stop(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_parser_selector_class(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_full_stop_ident") + entry->parser = entry->parser_switch; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_simple_selector_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_parser_selector_after_namespace(entry, token); + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_vertical_bar_ident") + entry->parser = entry->parser_switch; + } + else if(token->type == MyCSS_TOKEN_TYPE_DELIM) { + if(*token->data == '*') { + mycss_selectors_parser_selector_after_namespace(entry, token); + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_vertical_bar_asterisk") + entry->parser = entry->parser_switch; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_simple_selector_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_DELIM) { + if(*token->data == '|') { + // HAND_EDIT_BEGIN + mycss_selectors_parser_selector_namespace_ident(entry, token); + // HAND_EDIT_END + entry->parser = mycss_selectors_state_simple_selector_ident_vertical_bar; + } + else { + mycss_selectors_parser_selector_end(entry, token); + entry->parser = entry->parser_switch; + return false; + } + } + else { + mycss_selectors_parser_selector_end(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_simple_selector_ident_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_parser_selector_after_namespace(entry, token); + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_ident_vertical_bar_ident") + entry->parser = entry->parser_switch; + } + else if(token->type == MyCSS_TOKEN_TYPE_DELIM) { + if(*token->data == '*') { + mycss_selectors_parser_selector_after_namespace(entry, token); + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_ident_vertical_bar_asterisk") + entry->parser = entry->parser_switch; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_left_bracket_after_wq_name_attr(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + mycss_selectors_entry_t *selector = entry->selectors->entry_last; + + switch (token->type) { + case MyCSS_TOKEN_TYPE_WHITESPACE: { + break; + } + case MyCSS_TOKEN_TYPE_INCLUDE_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_INCLUDE; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + + break; + } + case MyCSS_TOKEN_TYPE_DASH_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_DASH; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + + break; + } + case MyCSS_TOKEN_TYPE_PREFIX_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_PREFIX; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + + break; + } + case MyCSS_TOKEN_TYPE_SUFFIX_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_SUFFIX; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + + break; + } + case MyCSS_TOKEN_TYPE_SUBSTRING_MATCH: { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_SUBSTRING; + + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + + break; + } + case MyCSS_TOKEN_TYPE_DELIM: { + if(*token->data == '=') { + if(selector->value == NULL) + selector->value = mycss_selectors_value_attribute_create(entry, true); + + mycss_selector_value_attribute(selector->value)->match = MyCSS_SELECTORS_MATCH_EQUAL; + entry->parser = mycss_selectors_state_shared_after_attr_matcher; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + break; + } + case MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET: { + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_shared_after_wq_name_attr_right_bracket") + entry->parser = entry->parser_switch; + break; + } + default: { + mycss_selectors_parser_expectations_error(entry, token); + + mycss_entry_parser_list_push(entry, entry->parser_switch, NULL, entry->selectors->ending_token, false); + entry->selectors->ending_token = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + entry->parser = mycss_selectors_state_drop; + return false; + } + } + + return true; +} + +bool mycss_selectors_state_shared_after_attr_modifier(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET) { + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_shared_after_attr_modifier_right_bracket") + entry->parser = entry->parser_switch; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_shared_after_attribute_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + if(*token->data == 'i') { + mycss_selectors_parser_selector_modifier(entry, token); + entry->parser = mycss_selectors_state_shared_after_attr_modifier; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + } + else if(token->type == MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET) { + mycss_selectors_parser_selector_end(entry, token); + MyCSS_DEBUG_MESSAGE("mycss_selectors_state_shared_after_attribute_value_right_bracket") + entry->parser = entry->parser_switch; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + +bool mycss_selectors_state_shared_after_attr_matcher(mycss_entry_t* entry, mycss_token_t* token, bool last_response) +{ + if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) + return true; + + if(token->type == MyCSS_TOKEN_TYPE_IDENT) { + mycss_selectors_parser_selector_value(entry, token); + entry->parser = mycss_selectors_state_shared_after_attribute_value; + } + else if(token->type == MyCSS_TOKEN_TYPE_STRING) { + mycss_selectors_parser_selector_value(entry, token); + entry->parser = mycss_selectors_state_shared_after_attribute_value; + } + else { + mycss_selectors_parser_expectations_error(entry, token); + entry->parser = entry->parser_switch; + return false; + } + + return true; +} + + diff --git a/source/mycss/selectors/state.h b/source/mycss/selectors/state.h new file mode 100644 index 0000000..2cea842 --- /dev/null +++ b/source/mycss/selectors/state.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_STATE_H +#define MyHTML_MyCSS_SELECTORS_STATE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/parser.h" +#include "myhtml/utils.h" + +void mycss_selectors_state_end(mycss_entry_t* entry); +bool mycss_selectors_state_function_skip_all(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_drop(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_drop_component_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_combinator(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_combinator_greater_than(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_complex_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_complex_selector_list_need_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_compound_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_need_selector_or_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_comma_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_compound_selector_list_need_ending_or_comma(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_relative_selector_list(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector_ws(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +/* */ +bool mycss_selectors_state_simple_selector_begin(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_left_bracket_ident_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon_colon(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon_colon_function(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_colon_function(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_full_stop(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_ident(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_simple_selector_ident_vertical_bar(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_shared_after_attr_modifier(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_shared_after_attribute_value(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_left_bracket_after_wq_name_attr(mycss_entry_t* entry, mycss_token_t* token, bool last_response); +bool mycss_selectors_state_shared_after_attr_matcher(mycss_entry_t* entry, mycss_token_t* token, bool last_response); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_STATE_H */ diff --git a/source/mycss/selectors/value.c b/source/mycss/selectors/value.c new file mode 100644 index 0000000..f72c101 --- /dev/null +++ b/source/mycss/selectors/value.c @@ -0,0 +1,368 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/selectors/value.h" +#include "mycss/selectors/value_resource.h" + +///////////////////////////////////////////////////////// +//// Create +//// +///////////////////////////////////////////////////////// +void * mycss_selectors_value_undef_create(mycss_entry_t* entry, bool set_clean) +{ + return NULL; +} + +mycss_selectors_object_attribute_t * mycss_selectors_value_attribute_create(mycss_entry_t* entry, bool set_clean) +{ + mycss_selectors_object_attribute_t* attr = (mycss_selectors_object_attribute_t*) + mchar_async_malloc(entry->mchar, entry->mchar_value_node_id, sizeof(mycss_selectors_object_attribute_t)); + + if(set_clean) + memset(attr, 0, sizeof(mycss_selectors_object_attribute_t)); + + return attr; +} + +///////////////////////////////////////////////////////// +//// Destroy +//// +///////////////////////////////////////////////////////// +void * mycss_selectors_value_undef_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) +{ + myhtml_string_destroy(mycss_selector_value_string(value), false); + mcobject_free(entry->mcobject_string_entries, value); + + return NULL; +} + +void * mycss_selectors_value_id_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) +{ + myhtml_string_destroy(mycss_selector_value_string(value), false); + + if(self_destroy) { + mcobject_free(entry->mcobject_string_entries, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_class_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) +{ + myhtml_string_destroy(mycss_selector_value_string(value), false); + + if(self_destroy) { + mcobject_free(entry->mcobject_string_entries, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_element_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) +{ + myhtml_string_destroy(mycss_selector_value_string(value), false); + + if(self_destroy) { + mcobject_free(entry->mcobject_string_entries, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_attribute_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) +{ + if(mycss_selector_value_attribute(value)->value) { + myhtml_string_destroy(mycss_selector_value_attribute(value)->value, false); + mcobject_free(entry->mcobject_string_entries, mycss_selector_value_attribute(value)->value); + } + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) +{ + if(sub_type < MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY) + return (mycss_selectors_value_function_destroy_map[sub_type](entry, value, self_destroy)); + + return value; +} + +///////////////////////////////////////////////////////// +//// Pseudo Class Function Create +//// +///////////////////////////////////////////////////////// +void * mycss_selectors_value_pseudo_class_function_undef_create(mycss_entry_t* entry, bool set_clean) +{ + return NULL; +} + +void * mycss_selectors_value_pseudo_class_function_current_create(mycss_entry_t* entry, bool set_clean) +{ + return mycss_selectors_list_create(entry->selectors); +} + +void * mycss_selectors_value_pseudo_class_function_dir_create(mycss_entry_t* entry, bool set_clean) +{ + myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + + if(set_clean) + myhtml_string_clean_all(str); + + return str; +} + +void * mycss_selectors_value_pseudo_class_function_drop_create(mycss_entry_t* entry, bool set_clean) +{ + /* not need create */ + return NULL; +} + +void * mycss_selectors_value_pseudo_class_function_has_create(mycss_entry_t* entry, bool set_clean) +{ + return mycss_selectors_list_create(entry->selectors); +} + +void * mycss_selectors_value_pseudo_class_function_lang_create(mycss_entry_t* entry, bool set_clean) +{ + mycss_selectors_value_lang_t* lang = (mycss_selectors_value_lang_t*) + mchar_async_malloc(entry->mchar, entry->mchar_value_node_id, sizeof(mycss_selectors_value_lang_t)); + + if(set_clean) { + lang->next = NULL; + myhtml_string_clean_all(&lang->str); + } + + return lang; +} + +void * mycss_selectors_value_pseudo_class_function_matches_create(mycss_entry_t* entry, bool set_clean) +{ + return mycss_selectors_list_create(entry->selectors); +} + +void * mycss_selectors_value_pseudo_class_function_not_create(mycss_entry_t* entry, bool set_clean) +{ + return mycss_selectors_list_create(entry->selectors); +} + +void * mycss_selectors_value_pseudo_class_function_nth_child_create(mycss_entry_t* entry, bool set_clean) +{ + mycss_an_plus_b_entry_t* anb_entry = (mycss_an_plus_b_entry_t*) + mchar_async_malloc(entry->mchar, entry->mchar_value_node_id, sizeof(mycss_an_plus_b_entry_t)); + + if(set_clean) + memset(anb_entry, 0, sizeof(mycss_an_plus_b_entry_t)); + + return NULL; +} + +void * mycss_selectors_value_pseudo_class_function_nth_column_create(mycss_entry_t* entry, bool set_clean) +{ + return NULL; +} + +void * mycss_selectors_value_pseudo_class_function_nth_last_child_create(mycss_entry_t* entry, bool set_clean) +{ + return NULL; +} + +void * mycss_selectors_value_pseudo_class_function_nth_last_column_create(mycss_entry_t* entry, bool set_clean) +{ + return NULL; +} + +void * mycss_selectors_value_pseudo_class_function_nth_last_of_type_create(mycss_entry_t* entry, bool set_clean) +{ + return NULL; +} + +void * mycss_selectors_value_pseudo_class_function_nth_of_type_create(mycss_entry_t* entry, bool set_clean) +{ + return NULL; +} + +///////////////////////////////////////////////////////// +//// Pseudo Class Function Destroy +//// +///////////////////////////////////////////////////////// +void * mycss_selectors_value_pseudo_class_function_undef_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + /* not need destroy */ + if(self_destroy) { + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_current_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + return mycss_selectors_list_destroy(entry->selectors, value, self_destroy); +} + +void * mycss_selectors_value_pseudo_class_function_dir_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + return myhtml_string_destroy(value, self_destroy); +} + +void * mycss_selectors_value_pseudo_class_function_drop_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + /* not need destroy */ + if(self_destroy) { + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_has_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + return mycss_selectors_list_destroy(entry->selectors, value, self_destroy); +} + +void * mycss_selectors_value_pseudo_class_function_lang_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + if(value == NULL) + return NULL; + + mycss_selectors_value_lang_t *lang_entry = mycss_selector_value_lang(value); + + while(lang_entry) { + myhtml_string_destroy(&lang_entry->str, false); + lang_entry = lang_entry->next; + } + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + mycss_selector_value_lang(value)->next = NULL; + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_matches_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + return mycss_selectors_list_destroy(entry->selectors, value, self_destroy); +} + +void * mycss_selectors_value_pseudo_class_function_not_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + return mycss_selectors_list_destroy(entry->selectors, value, self_destroy); +} + +void * mycss_selectors_value_pseudo_class_function_nth_child_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + if(value == NULL) + return NULL; + + mycss_an_plus_b_entry_t *anb = value; + + if(anb->of) + anb->of = mycss_selectors_list_destroy(entry->selectors, anb->of, true); + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_nth_column_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + if(value == NULL) + return NULL; + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_nth_last_child_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + if(value == NULL) + return NULL; + + mycss_an_plus_b_entry_t *anb = value; + + if(anb->of) + anb->of = mycss_selectors_list_destroy(entry->selectors, anb->of, true); + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_nth_last_column_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + if(value == NULL) + return NULL; + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_nth_last_of_type_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + if(value == NULL) + return NULL; + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + return value; +} + +void * mycss_selectors_value_pseudo_class_function_nth_of_type_destroy(mycss_entry_t* entry, void* value, bool self_destroy) +{ + if(value == NULL) + return NULL; + + if(self_destroy) { + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; + } + + return value; +} + + diff --git a/source/mycss/selectors/value.h b/source/mycss/selectors/value.h new file mode 100644 index 0000000..cd71770 --- /dev/null +++ b/source/mycss/selectors/value.h @@ -0,0 +1,107 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_VALUE_H +#define MyHTML_MyCSS_SELECTORS_VALUE_H +#pragma once + +#define mycss_selector_value_attribute(obj) ((mycss_selectors_object_attribute_t*)(obj)) +#define mycss_selector_value_string(obj) ((myhtml_string_t*)(obj)) +#define mycss_selector_value_an_plus_b(obj) ((mycss_an_plus_b_entry_t*)(obj)) +#define mycss_selector_value_drop(obj) ((mycss_selectors_function_drop_type_t)(obj)) +#define mycss_selector_value_lang(obj) ((mycss_selectors_value_lang_t*)(obj)) +#define mycss_selector_value_function(obj) ((mycss_result_entry_t*)(obj)) +#define mycss_selector_value_destroy(entry, type, sub_type, value, self_destroy) (mycss_selectors_value_destroy_map[type](entry, type, sub_type, value, self_destroy)) + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/entry.h" +#include "mycss/selectors/myosi.h" +#include "myhtml/utils/mchar_async.h" + +typedef void * (*mycss_selectors_value_destroy_f)(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +typedef void * (*mycss_selectors_value_function_destroy_f)(mycss_entry_t* entry, void* value, bool self_destroy); + +struct mycss_selectors_value_attribute { + myhtml_string_t* value; + + mycss_selectors_match_t match; + mycss_selectors_mod_t mod; +} +typedef mycss_selectors_object_attribute_t; + +struct mycss_selectors_value_lang { + myhtml_string_t str; + struct mycss_selectors_value_lang* next; +} +typedef mycss_selectors_value_lang_t; + + +/* create */ +void * mycss_selectors_value_undef_create(mycss_entry_t* entry, bool set_clean); +mycss_selectors_object_attribute_t * mycss_selectors_value_attribute_create(mycss_entry_t* entry, bool set_clean); + +/* destroy */ +void * mycss_selectors_value_undef_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_id_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_class_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_element_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_attribute_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); + +/* pseudo class function create */ +void * mycss_selectors_value_pseudo_class_function_undef_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_current_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_dir_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_drop_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_has_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_lang_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_matches_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_not_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_child_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_column_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_last_child_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_last_column_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_last_of_type_create(mycss_entry_t* entry, bool set_clean); +void * mycss_selectors_value_pseudo_class_function_nth_of_type_create(mycss_entry_t* entry, bool set_clean); + +/* pseudo class function destroy */ +void * mycss_selectors_value_pseudo_class_function_undef_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_current_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_dir_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_drop_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_has_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_lang_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_matches_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_not_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_child_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_column_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_last_child_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_last_column_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_last_of_type_destroy(mycss_entry_t* entry, void* value, bool self_destroy); +void * mycss_selectors_value_pseudo_class_function_nth_of_type_destroy(mycss_entry_t* entry, void* value, bool self_destroy); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_SELECTORS_VALUE_H */ diff --git a/source/mycss/selectors/value_resource.h b/source/mycss/selectors/value_resource.h new file mode 100644 index 0000000..328fd62 --- /dev/null +++ b/source/mycss/selectors/value_resource.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_SELECTORS_VALUE_RESOURCE_H +#define MyHTML_MyCSS_SELECTORS_VALUE_RESOURCE_H +#pragma once + +#include "mycss/selectors/myosi.h" + +static const mycss_selectors_value_destroy_f mycss_selectors_value_destroy_map[MyCSS_SELECTORS_TYPE_LAST_ENTRY] = { + mycss_selectors_value_undef_destroy, /* MyCSS_SELECTORS_TYPE_UNDEF */ + mycss_selectors_value_element_destroy, /* MyCSS_SELECTORS_TYPE_ELEMENT */ + mycss_selectors_value_id_destroy, /* MyCSS_SELECTORS_TYPE_ID */ + mycss_selectors_value_class_destroy, /* MyCSS_SELECTORS_TYPE_CLASS */ + mycss_selectors_value_attribute_destroy, /* MyCSS_SELECTORS_TYPE_ATTRIBUTE */ + mycss_selectors_value_pseudo_class_function_destroy, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION */ + mycss_selectors_value_undef_destroy, /* MyCSS_SELECTORS_TYPE_PSEUDO_CLASS */ + mycss_selectors_value_undef_destroy, /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION */ + mycss_selectors_value_undef_destroy /* MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT */ +}; + +static const mycss_selectors_value_function_destroy_f mycss_selectors_value_function_destroy_map[MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY] = { + mycss_selectors_value_pseudo_class_function_undef_destroy, + mycss_selectors_value_pseudo_class_function_undef_destroy, + mycss_selectors_value_pseudo_class_function_current_destroy, + mycss_selectors_value_pseudo_class_function_dir_destroy, + mycss_selectors_value_pseudo_class_function_drop_destroy, + mycss_selectors_value_pseudo_class_function_has_destroy, + mycss_selectors_value_pseudo_class_function_lang_destroy, + mycss_selectors_value_pseudo_class_function_matches_destroy, + mycss_selectors_value_pseudo_class_function_not_destroy, + mycss_selectors_value_pseudo_class_function_nth_child_destroy, + mycss_selectors_value_pseudo_class_function_nth_column_destroy, + mycss_selectors_value_pseudo_class_function_nth_last_child_destroy, + mycss_selectors_value_pseudo_class_function_nth_last_column_destroy, + mycss_selectors_value_pseudo_class_function_nth_last_of_type_destroy, + mycss_selectors_value_pseudo_class_function_nth_of_type_destroy, +}; + +#endif /* MyHTML_MyCSS_SELECTORS_VALUE_RESOURCE_H */ diff --git a/source/mycss/stylesheet.c b/source/mycss/stylesheet.c new file mode 100644 index 0000000..0f8a5c9 --- /dev/null +++ b/source/mycss/stylesheet.c @@ -0,0 +1,68 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/stylesheet.h" + +mycss_stylesheet_t * mycss_stylesheet_create(void) +{ + return (mycss_stylesheet_t*)myhtml_calloc(1, sizeof(mycss_stylesheet_t)); +} + +mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry) +{ + stylesheet->entry = entry; + + mycss_status_t status = mycss_namespace_stylesheet_init(&stylesheet->ns_stylesheet, entry); + if(status != MyCSS_STATUS_OK) + return status; + + return MyCSS_STATUS_OK; +} + +mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet) +{ + mycss_status_t status = mycss_namespace_stylesheet_clean(&stylesheet->ns_stylesheet, stylesheet->entry); + if(status != MyCSS_STATUS_OK) + return status; + + memset(stylesheet, 0, sizeof(mycss_stylesheet_t)); + + return MyCSS_STATUS_OK; +} + +mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bool self_destroy) +{ + mycss_namespace_stylesheet_destroy(&stylesheet->ns_stylesheet, stylesheet->entry, false); + + if(self_destroy) { + myhtml_free(stylesheet); + return NULL; + } + + return stylesheet; +} + +/* print */ +void mycss_stylesheet_print(mycss_stylesheet_t* stylesheet, FILE* fh) +{ + mycss_selectors_print_list(stylesheet->entry->selectors, stylesheet->sel_list_first, fh); +} + + diff --git a/source/mycss/stylesheet.h b/source/mycss/stylesheet.h new file mode 100644 index 0000000..b3d0209 --- /dev/null +++ b/source/mycss/stylesheet.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_STYLESHEET_H +#define MyHTML_MyCSS_STYLESHEET_H +#pragma once + +#include "mycss/myosi.h" +#include "mycss/entry.h" +#include "mycss/namespace/myosi.h" +#include "mycss/selectors/myosi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct mycss_stylesheet { + mycss_entry_t* entry; /* refs */ + + mycss_namespace_stylesheet_t ns_stylesheet; + mycss_selectors_list_t* sel_list_first; + + mycss_stylesheet_t* child; + mycss_stylesheet_t* parent; + mycss_stylesheet_t* next; + mycss_stylesheet_t* prev; +}; + +mycss_stylesheet_t * mycss_stylesheet_create(void); +mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry); +mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet); +mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bool self_destroy); + +void mycss_stylesheet_print(mycss_stylesheet_t* stylesheet, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* MyHTML_MyCSS_STYLESHEET_H */ diff --git a/source/mycss/tokenizer.c b/source/mycss/tokenizer.c new file mode 100644 index 0000000..2fcd8ca --- /dev/null +++ b/source/mycss/tokenizer.c @@ -0,0 +1,1366 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/tokenizer.h" +#include "mycss/tokenizer_resource.h" +#include "myhtml/utils/resources.h" + +mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length) +{ + entry->current_buffer = myhtml_incomming_buffer_add(entry->current_buffer, entry->mcobject_incoming_buffer, + css, css_length); + + if(entry->current_buffer == NULL) + return MyCSS_STATUS_ERROR_TOKENIZER_INCOMING_BUFFER_ADD; + + // first init + if(entry->first_buffer == NULL) + entry->first_buffer = entry->current_buffer; + + if(entry->token == NULL) { + entry->token = (mycss_token_t*)myhtml_calloc(1, sizeof(mycss_token_t)); + + if(entry->token == NULL) + return MyCSS_STATUS_ERROR_TOKENIZER_TOKEN_ALLOCATION; + } + + return mycss_tokenizer_process(entry, css, css_length); +} + +mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length) +{ + /* + Why use utf-8 when the declaration says utf-16? + The bytes of the encoding declaration spell out “@charset "…";” in ASCII, + but UTF-16 is not ASCII-compatible. Either you’ve typed in complete gibberish (like 䁣桡牳整•utf-16be∻) + to get the right bytes in the document, which we don’t want to encourage, + or your document is actually in an ASCII-compatible encoding and your encoding declaration is lying. + + Either way, defaulting to UTF-8 is a decent answer. + + As well, this mimics the behavior of HTML’s attribute. + */ + if(entry->encoding == MyHTML_ENCODING_UTF_16LE || entry->encoding == MyHTML_ENCODING_UTF_16BE) + entry->encoding = MyHTML_ENCODING_UTF_8; + + mycss_t* mycss = entry->mycss; + mycss_tokenizer_state_f* state_f = mycss->parse_state_func; + + myhtml_incoming_buffer_t *current = entry->current_buffer; + + do { + myhtml_incoming_buffer_t *mt = entry->current_buffer; + mt->length = 0; + + while (mt->length < mt->size) { + mt->length = state_f[entry->state](entry, entry->token, mt->data, mt->length, mt->size); + } + + entry->current_buffer = mt->next; + } + while(entry->current_buffer); + + entry->current_buffer = current; + + return MyCSS_STATUS_OK; +} + +mycss_status_t mycss_tokenizer_end(mycss_entry_t* entry) +{ + mycss_t* mycss = entry->mycss; + mycss_tokenizer_state_f* state_f = mycss->parse_state_func; + + if(entry->state != MyCSS_TOKENIZER_STATE_DATA) + { + myhtml_incoming_buffer_t *mt = entry->current_buffer; + size_t end_state = (MyCSS_TOKENIZER_STATE_LAST_ENTRY + entry->state); + + mt->length = state_f[end_state](entry, entry->token, mt->data, mt->length, mt->size); + } + + entry->type |= MyCSS_ENTRY_TYPE_END; + + return MyCSS_STATUS_OK; +} + +size_t mycss_tokenizer_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size) +{ + mycss_t* mycss = entry->mycss; + mycss_tokenizer_state_f* state_f = mycss->parse_state_func; + + return state_f[state](entry, entry->token, css, css_offset, css_size); +} + +size_t mycss_tokenizer_state_set_current_buffer_for_continue(mycss_entry_t* entry, size_t css_offset, size_t css_minus_offset) +{ + if(css_minus_offset == 0) + return css_offset; + + if(css_offset >= css_minus_offset) + return css_offset; + + myhtml_incoming_buffer_t *buffer = entry->current_buffer; + + size_t need = (css_minus_offset - css_offset); + size_t position = buffer->offset - need; + + while(buffer && buffer->offset > position) + buffer = buffer->prev; + + entry->current_buffer = buffer; + + return (position - buffer->offset); +} + +size_t mycss_tokenizer_token_strcasecmp(mycss_entry_t* entry, mycss_token_t* token, const char* to, size_t to_length) +{ + myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(entry->current_buffer, token->begin); + + size_t token_offset = token->begin - buffer->offset; + + return myhtml_incoming_buffer_escaped_case_cmp(&buffer, to, to_length, &token_offset); +} + +////////////////////// +// Begin All State +// +size_t mycss_tokenizer_state_data(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->begin = entry->current_buffer->offset + css_offset; + token->data = &css[css_offset]; + + entry->state = mycss_begin_chars_state_map[ (const unsigned char)css[css_offset] ]; + + css_offset++; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// whitespace +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + while(css_offset < css_size) + { + if(mycss_begin_chars_state_map[ u_css[css_offset] ] != MyCSS_TOKENIZER_STATE_WHITESPACE) + { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_WHITESPACE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + + css_offset++; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0022 QUOTATION MARK (") +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_quotation_mark(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + // skip QUOTATION MARK (") + token->begin += 1; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED; + entry->state_back = MyCSS_TOKENIZER_STATE_QUOTATION_MARK_BACK; + + return css_offset; +} + +size_t mycss_tokenizer_state_quotation_mark_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0023 NUMBER SIGN (#) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_number_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + if(mycss_chars_name_code_point_map[ u_css[css_offset] ] != 0xff) + { + token->begin++; + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_BACK; + } + else if(css[css_offset] == '\\') { + css_offset++; + + if(css_offset >= css_size) { + entry->state = MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_RSOLIDUS; + return css_offset; + } + + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + css_offset--; + + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + else { + token->begin++; + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_BACK; + } + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_number_sign_name_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->type = MyCSS_TOKEN_TYPE_HASH; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +size_t mycss_tokenizer_state_number_sign_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_BACK; + + token->begin++; + css_offset++; + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0024 DOLLAR SIGN ($) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_dollar_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '=') { + css_offset++; + + token->length = 2; + token->type = MyCSS_TOKEN_TYPE_SUFFIX_MATCH; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + } + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0027 APOSTROPHE (') +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_apostrophe(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + // skip APOSTROPHE (') + token->begin += 1; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED; + entry->state_back = MyCSS_TOKENIZER_STATE_QUOTATION_MARK_BACK; + + return css_offset; +} + +size_t mycss_tokenizer_state_apostrophe_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0028 LEFT PARENTHESIS (() +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_left_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0029 RIGHT PARENTHESIS ()) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_right_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+002A ASTERISK (*) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_asterisk(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '=') { + css_offset++; + + token->length = 2; + token->type = MyCSS_TOKEN_TYPE_SUBSTRING_MATCH; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + } + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+002B PLUS SIGN (+) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_plus_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] >= '0' && css[css_offset] <= '9') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DIGIT; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC; + } + else if(css[css_offset] == '.') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_PLUS_SIGN_FULL_STOP; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_plus_sign_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] >= '0' && css[css_offset] <= '9') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+002C COMMA (,) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_comma(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_COMMA; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+002D HYPHEN-MINUS (-) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_hyphen_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + // If the input stream starts with a number, reconsume the current input code point, + // consume a numeric token, and return it. + if(css[css_offset] >= '0' && css[css_offset] <= '9') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DIGIT; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC; + } + else if(css[css_offset] == '.') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_FULL_STOP; + } + + // Otherwise, if the input stream starts with an identifier, + // reconsume the current input code point, consume an ident-like token, and return it. + // and check + // Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS + // U+003E GREATER-THAN SIGN (->), consume them and return a . + else if(css[css_offset] == '-') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS; + } + + // Otherwise, if the input stream starts with an identifier, + // reconsume the current input code point, consume an ident-like token, and return it. + else if(mycss_begin_chars_state_map[ u_css[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_RSOLIDUS; + } + + // Otherwise, return a with its value set to the current input code point. + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_hyphen_minus_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] >= '0' && css[css_offset] <= '9') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + + return css_offset; +} + +size_t mycss_tokenizer_state_hyphen_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '>') { + css_offset++; + + token->length = 3; + token->type = MyCSS_TOKEN_TYPE_CDC; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + else if(mycss_begin_chars_state_map[ ((const unsigned char *)css)[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS_RSOLIDUS; + } + else { + token->length = 1; // only '-' + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + + return css_offset; +} + +size_t mycss_tokenizer_state_hyphen_minus_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 2); + } + else { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_hyphen_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = 1; // only '-' + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + else { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+002E FULL STOP (.) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] >= '0' && css[css_offset] <= '9') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+002F SOLIDUS (/) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '*') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_SOLIDUS_COMMENT_END; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + + return css_offset; +} + +size_t mycss_tokenizer_state_solidus_comment_end(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] == '/') { + if(css_offset == 0) + { + myhtml_incoming_buffer_t *buffer = entry->current_buffer->prev; + + while(buffer && buffer->size == 0) + buffer = buffer->prev; + + if(buffer == NULL) { + // panic!, this in not normal, something is very wrong + entry->state = MyCSS_TOKENIZER_STATE_SOLIDUS; + break; + } + + if(buffer->data[ (buffer->size - 1) ] == '*') { + css_offset++; + + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_COMMENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + } + else if(css[ (css_offset - 1) ] == '*') { + css_offset++; + + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_COMMENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + } + + ++css_offset; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+003A COLON (:) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_colon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_COLON; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+003B SEMICOLON (;) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_semicolon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_SEMICOLON; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+003C LESS-THAN SIGN (<) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_less_than_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '!') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_less_than_sign_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '-') { + css_offset++; + entry->state = MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS_MINUS; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + + return css_offset; +} + +size_t mycss_tokenizer_state_less_than_sign_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '-') { + css_offset++; + + token->length = 3; + token->type = MyCSS_TOKEN_TYPE_CDO; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 2); + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0040 COMMERCIAL AT (@) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_commercial_at(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '-') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_RSOLIDUS; + } + else if(mycss_begin_chars_state_map[ ((const unsigned char *)css)[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_commercial_at_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(mycss_begin_chars_state_map[ ((const unsigned char *)css)[css_offset] ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS_RSOLIDUS; + } + else { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + + return css_offset; +} + +size_t mycss_tokenizer_state_commercial_at_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 2; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 2); + } + else { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_commercial_at_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + else { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_commercial_at_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->type = MyCSS_TOKEN_TYPE_AT_KEYWORD; + token->begin += 1; + token->length -= 1; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+005B LEFT SQUARE BRACKET ([) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_left_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+005C REVERSE SOLIDUS (\) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_reverse_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + else { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+005D RIGHT SQUARE BRACKET (]) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_right_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+005E CIRCUMFLEX ACCENT (^) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_circumflex_accent(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '=') { + css_offset++; + + token->length = 2; + token->type = MyCSS_TOKEN_TYPE_PREFIX_MATCH; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + } + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+007B LEFT CURLY BRACKET ({) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_left_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+007D RIGHT CURLY BRACKET (}) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_right_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Digit +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DIGIT; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC; + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+0055 LATIN CAPITAL LETTER U (U) || U+0075 LATIN SMALL LETTER U (u) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_letter_u(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '+') { + ++css_offset; + + if(css_offset >= css_size) { + entry->state = MyCSS_TOKENIZER_STATE_LETTER_U_NEXT; + return css_offset; + } + + if(myhtml_string_chars_hex_map[ (const unsigned char)(css[css_offset]) ] != 0xff || + css[css_offset] == '?') + { + token->begin += 2; + + ++css_offset; + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_BEFORE; + } + else { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + } + else { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + + return css_offset; +} + +size_t mycss_tokenizer_state_letter_u_next(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(myhtml_string_chars_hex_map[ (const unsigned char)(css[css_offset]) ] != 0xff || + css[css_offset] == '?') + { + token->begin += 2; + + ++css_offset; + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_BEFORE; + } + else { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// name-start code point +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_name_start_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_IDENT; + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+007C VERTICAL LINE (|) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_vertical_line(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '=') { + css_offset++; + + token->length = 2; + token->type = MyCSS_TOKEN_TYPE_DASH_MATCH; + } + else if(css[css_offset] == '|') { + css_offset++; + + token->length = 2; + token->type = MyCSS_TOKEN_TYPE_COLUMN; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + } + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// U+007E TILDE (~) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_tilde(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '=') { + css_offset++; + + token->length = 2; + token->type = MyCSS_TOKEN_TYPE_INCLUDE_MATCH; + } + else { + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + } + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// anything else +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_state_delim_single_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + while (css_offset < css_size) + { + if(u_css[css_offset] < 128) + { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + + css_offset++; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// init tokenizer +//// +///////////////////////////////////////////////////////// +mycss_status_t mycss_tokenizer_state_init(mycss_t* mycss) +{ + mycss->parse_state_func = (mycss_tokenizer_state_f*)myhtml_calloc((MyCSS_TOKENIZER_STATE_LAST_ENTRY * 2), sizeof(mycss_tokenizer_state_f)); + + if(mycss->parse_state_func == NULL) + return MyCSS_STATUS_ERROR_TOKENIZER_STATE_ALLOCATION; + + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_DATA] = mycss_tokenizer_state_data; + + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_WHITESPACE] = mycss_tokenizer_state_whitespace; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_QUOTATION_MARK] = mycss_tokenizer_state_quotation_mark; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_QUOTATION_MARK_BACK] = mycss_tokenizer_state_quotation_mark_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_NUMBER_SIGN] = mycss_tokenizer_state_number_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_BACK] = mycss_tokenizer_state_number_sign_name_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_RSOLIDUS] = mycss_tokenizer_state_number_sign_name_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_DOLLAR_SIGN] = mycss_tokenizer_state_dollar_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_APOSTROPHE] = mycss_tokenizer_state_apostrophe; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_APOSTROPHE_BACK] = mycss_tokenizer_state_apostrophe_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LEFT_PARENTHESIS] = mycss_tokenizer_state_left_parenthesis; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_RIGHT_PARENTHESIS] = mycss_tokenizer_state_right_parenthesis; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_ASTERISK] = mycss_tokenizer_state_asterisk; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_PLUS_SIGN] = mycss_tokenizer_state_plus_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_PLUS_SIGN_FULL_STOP] = mycss_tokenizer_state_plus_sign_full_stop; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_COMMA] = mycss_tokenizer_state_comma; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_HYPHEN_MINUS] = mycss_tokenizer_state_hyphen_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_FULL_STOP] = mycss_tokenizer_state_hyphen_minus_full_stop; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS] = mycss_tokenizer_state_hyphen_minus_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS_RSOLIDUS] = mycss_tokenizer_state_hyphen_minus_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_RSOLIDUS] = mycss_tokenizer_state_hyphen_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_FULL_STOP] = mycss_tokenizer_state_full_stop; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_SOLIDUS] = mycss_tokenizer_state_solidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_SOLIDUS_COMMENT_END] = mycss_tokenizer_state_solidus_comment_end; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_COLON] = mycss_tokenizer_state_colon; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_SEMICOLON] = mycss_tokenizer_state_semicolon; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN] = mycss_tokenizer_state_less_than_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS] = mycss_tokenizer_state_less_than_sign_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS_MINUS] = mycss_tokenizer_state_less_than_sign_minus_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_COMMERCIAL_AT] = mycss_tokenizer_state_commercial_at; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS] = mycss_tokenizer_state_commercial_at_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS_RSOLIDUS] = mycss_tokenizer_state_commercial_at_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_RSOLIDUS] = mycss_tokenizer_state_commercial_at_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK] = mycss_tokenizer_state_commercial_at_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LEFT_SQUARE_BRACKET] = mycss_tokenizer_state_left_square_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_REVERSE_SOLIDUS] = mycss_tokenizer_state_reverse_solidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_RIGHT_SQUARE_BRACKET] = mycss_tokenizer_state_right_square_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_CIRCUMFLEX_ACCENT] = mycss_tokenizer_state_circumflex_accent; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LEFT_CURLY_BRACKET] = mycss_tokenizer_state_left_curly_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_RIGHT_CURLY_BRACKET] = mycss_tokenizer_state_right_curly_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_DIGIT] = mycss_tokenizer_state_digit; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LETTER_U] = mycss_tokenizer_state_letter_u; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LETTER_U_NEXT] = mycss_tokenizer_state_letter_u_next; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT] = mycss_tokenizer_state_name_start_code_point; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_VERTICAL_LINE] = mycss_tokenizer_state_vertical_line; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_TILDE] = mycss_tokenizer_state_tilde; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT] = mycss_tokenizer_state_delim_single_code_point; + + // global + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_BACK] = mycss_tokenizer_global_back; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC] = mycss_tokenizer_global_state_numeric; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS] = mycss_tokenizer_global_state_numeric_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS_RSOLIDUS] = mycss_tokenizer_global_state_numeric_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_RSOLIDUS] = mycss_tokenizer_global_state_numeric_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DIGIT] = mycss_tokenizer_global_state_number_digit; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DOT] = mycss_tokenizer_global_state_number_dot; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL] = mycss_tokenizer_global_state_number_decimal; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E] = mycss_tokenizer_global_state_number_e; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_PLUS_MINUS] = mycss_tokenizer_global_state_number_e_plus_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_DECIMAL] = mycss_tokenizer_global_state_number_e_decimal; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_IDENT] = mycss_tokenizer_global_state_ident; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_URL] = mycss_tokenizer_global_state_url; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_URL_STRING_BACK] = mycss_tokenizer_global_state_url_string_back; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER] = mycss_tokenizer_global_state_url_after; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER_WHITESPACE] = mycss_tokenizer_global_state_url_after_whitespace; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_URL_RSOLIDUS] = mycss_tokenizer_global_state_url_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL] = mycss_tokenizer_global_state_bad_url; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NAME] = mycss_tokenizer_global_state_name; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_NAME_RSOLIDUS] = mycss_tokenizer_global_state_name_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED] = mycss_tokenizer_global_state_string_double_quoted; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS] = mycss_tokenizer_global_state_string_double_quoted_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS_R] = mycss_tokenizer_global_state_string_double_quoted_rsolidus_r; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED] = mycss_tokenizer_global_state_string_single_quoted; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS] = mycss_tokenizer_global_state_string_single_quoted_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS_R] = mycss_tokenizer_global_state_string_single_quoted_rsolidus_r; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_BEFORE] = mycss_tokenizer_global_state_unicode_range_before; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE] = mycss_tokenizer_global_state_unicode_range; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_QUESTION] = mycss_tokenizer_global_state_unicode_range_question; + mycss->parse_state_func[MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_MINUS] = mycss_tokenizer_global_state_unicode_range_minus; + + // end + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_WHITESPACE] = mycss_tokenizer_end_state_whitespace; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_QUOTATION_MARK] = mycss_tokenizer_end_state_quotation_mark; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_QUOTATION_MARK_BACK] = mycss_tokenizer_end_state_quotation_mark_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_NUMBER_SIGN] = mycss_tokenizer_end_state_number_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_BACK] = mycss_tokenizer_end_state_number_sign_name_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_NUMBER_SIGN_NAME_RSOLIDUS] = mycss_tokenizer_end_state_number_sign_name_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_DOLLAR_SIGN] = mycss_tokenizer_end_state_dollar_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_APOSTROPHE] = mycss_tokenizer_end_state_apostrophe; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_APOSTROPHE_BACK] = mycss_tokenizer_end_state_apostrophe_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LEFT_PARENTHESIS] = mycss_tokenizer_end_state_left_parenthesis; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_RIGHT_PARENTHESIS] = mycss_tokenizer_end_state_right_parenthesis; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_ASTERISK] = mycss_tokenizer_end_state_asterisk; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_PLUS_SIGN] = mycss_tokenizer_end_state_plus_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_PLUS_SIGN_FULL_STOP] = mycss_tokenizer_end_state_plus_sign_full_stop; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_COMMA] = mycss_tokenizer_end_state_comma; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS] = mycss_tokenizer_end_state_hyphen_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_FULL_STOP] = mycss_tokenizer_end_state_hyphen_minus_full_stop; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS] = mycss_tokenizer_end_state_hyphen_minus_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_MINUS_RSOLIDUS] = mycss_tokenizer_end_state_hyphen_minus_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS_RSOLIDUS] = mycss_tokenizer_end_state_hyphen_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_FULL_STOP] = mycss_tokenizer_end_state_full_stop; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_SOLIDUS] = mycss_tokenizer_end_state_solidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_SOLIDUS_COMMENT_END] = mycss_tokenizer_end_state_solidus_comment_end; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_COLON] = mycss_tokenizer_end_state_colon; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_SEMICOLON] = mycss_tokenizer_end_state_semicolon; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN] = mycss_tokenizer_end_state_less_than_sign; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS] = mycss_tokenizer_end_state_less_than_sign_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN_MINUS_MINUS] = mycss_tokenizer_end_state_less_than_sign_minus_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT] = mycss_tokenizer_end_state_commercial_at; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS] = mycss_tokenizer_end_state_commercial_at_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_MINUS_RSOLIDUS] = mycss_tokenizer_end_state_commercial_at_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_RSOLIDUS] = mycss_tokenizer_end_state_commercial_at_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT_BACK] = mycss_tokenizer_end_state_commercial_at_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LEFT_SQUARE_BRACKET] = mycss_tokenizer_end_state_left_square_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_REVERSE_SOLIDUS] = mycss_tokenizer_end_state_reverse_solidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_RIGHT_SQUARE_BRACKET] = mycss_tokenizer_end_state_right_square_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_CIRCUMFLEX_ACCENT] = mycss_tokenizer_end_state_circumflex_accent; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LEFT_CURLY_BRACKET] = mycss_tokenizer_end_state_left_curly_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_RIGHT_CURLY_BRACKET] = mycss_tokenizer_end_state_right_curly_bracket; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_DIGIT] = mycss_tokenizer_end_state_digit; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LETTER_U] = mycss_tokenizer_end_state_letter_u; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_LETTER_U_NEXT] = mycss_tokenizer_end_state_letter_u_next; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT] = mycss_tokenizer_end_state_name_start_code_point; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_VERTICAL_LINE] = mycss_tokenizer_end_state_vertical_line; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_TILDE] = mycss_tokenizer_end_state_tilde; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT] = mycss_tokenizer_end_state_delim_single_code_point; + + // global end + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_BACK] = mycss_tokenizer_end_global_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC] = mycss_tokenizer_end_global_state_numeric; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS] = mycss_tokenizer_end_global_state_numeric_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS_RSOLIDUS] = mycss_tokenizer_end_global_state_numeric_minus_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_RSOLIDUS] = mycss_tokenizer_end_global_state_numeric_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DIGIT] = mycss_tokenizer_end_global_state_number_digit; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DOT] = mycss_tokenizer_end_global_state_number_dot; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL] = mycss_tokenizer_end_global_state_number_decimal; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E] = mycss_tokenizer_end_global_state_number_e; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_PLUS_MINUS] = mycss_tokenizer_end_global_state_number_e_plus_minus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_DECIMAL] = mycss_tokenizer_end_global_state_number_e_decimal; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_IDENT] = mycss_tokenizer_end_global_state_ident; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_URL] = mycss_tokenizer_end_global_state_url; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_URL_STRING_BACK] = mycss_tokenizer_end_global_state_url_string_back; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER] = mycss_tokenizer_end_global_state_url_after; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER_WHITESPACE] = mycss_tokenizer_end_global_state_url_after_whitespace; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_URL_RSOLIDUS] = mycss_tokenizer_end_global_state_url_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL] = mycss_tokenizer_end_global_state_bad_url; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NAME] = mycss_tokenizer_end_global_state_name; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_NAME_RSOLIDUS] = mycss_tokenizer_end_global_state_name_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED] = mycss_tokenizer_end_global_state_string_double_quoted; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS] = mycss_tokenizer_end_global_state_string_double_quoted_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS_R] = mycss_tokenizer_end_global_state_string_double_quoted_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED] = mycss_tokenizer_end_global_state_string_single_quoted; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS] = mycss_tokenizer_end_global_state_string_single_quoted_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS_R] = mycss_tokenizer_end_global_state_string_single_quoted_rsolidus; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_BEFORE] = mycss_tokenizer_end_global_state_unicode_range_before; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE] = mycss_tokenizer_end_global_state_unicode_range; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_QUESTION] = mycss_tokenizer_end_global_state_unicode_range_question; + mycss->parse_state_func[MyCSS_TOKENIZER_STATE_LAST_ENTRY + MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_MINUS] = mycss_tokenizer_end_global_state_unicode_range_minus; + + + return MyCSS_STATUS_OK; +} + +void mycss_tokenizer_state_destroy(mycss_t* mycss) +{ + if(mycss->parse_state_func) { + free(mycss->parse_state_func); + mycss->parse_state_func = NULL; + } +} + + diff --git a/source/mycss/tokenizer.h b/source/mycss/tokenizer.h new file mode 100644 index 0000000..a712ad3 --- /dev/null +++ b/source/mycss/tokenizer.h @@ -0,0 +1,140 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_H +#define MyHTML_MyCSS_TOKENIZER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "mycss/mycss.h" +#include "mycss/entry.h" +#include "mycss/check.h" +#include "mycss/tokenizer_global.h" +#include "mycss/tokenizer_end.h" + +#include "myhtml/incoming.h" + +#define MyCSS_TOKEN_READY_CALLBACK_FUNCTION(ENTRY, TOKEN) \ + ++ENTRY->token_counter; \ + if(ENTRY->token_ready_callback) \ + (void)ENTRY->token_ready_callback(ENTRY, TOKEN) + +#define MyCSS_TOKEN_READY_CALLBACK_FUNCTION_WITH_REPLACE(ENTRY, TOKEN) \ + ++ENTRY->token_counter; \ + if(ENTRY->token_ready_callback) \ + TOKEN = ENTRY->token_ready_callback(ENTRY, TOKEN) + +struct mycss_token { + mycss_token_type_t type; + size_t begin; + size_t length; + + const char* data; +}; + +mycss_status_t mycss_tokenizer_state_init(mycss_t* mycss); +void mycss_tokenizer_state_destroy(mycss_t* mycss); + +mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length); +mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length); +mycss_status_t mycss_tokenizer_end(mycss_entry_t* entry); + +size_t mycss_tokenizer_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_set_current_buffer_for_continue(mycss_entry_t* entry, size_t css_offset, size_t css_minus_offset); +size_t mycss_tokenizer_token_strcasecmp(mycss_entry_t* entry, mycss_token_t* token, const char* to, size_t to_length); + + +size_t mycss_tokenizer_state_quotation_mark(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_quotation_mark_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_number_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_number_sign_name_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_number_sign_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_dollar_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_apostrophe(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_apostrophe_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_left_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_right_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_asterisk(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_plus_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_plus_sign_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_comma(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_hyphen_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_hyphen_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_solidus_comment_end(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_colon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_semicolon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_less_than_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_less_than_sign_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_less_than_sign_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_commercial_at(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_commercial_at_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_left_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_reverse_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_right_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_circumflex_accent(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_left_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_right_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_letter_u(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_letter_u_next(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_name_start_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_vertical_line(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_state_tilde(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_state_delim_single_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/source/mycss/tokenizer_end.c b/source/mycss/tokenizer_end.c new file mode 100644 index 0000000..ba5c1f2 --- /dev/null +++ b/source/mycss/tokenizer_end.c @@ -0,0 +1,1093 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/tokenizer_end.h" + +size_t mycss_tokenizer_end_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size) +{ + mycss_t* mycss = entry->mycss; + mycss_tokenizer_state_f* state_f = mycss->parse_state_func; + + return state_f[state + MyCSS_TOKENIZER_STATE_LAST_ENTRY](entry, entry->token, css, css_offset, css_size); +} + +///////////////////////////////////////////////////////// +//// whitespace +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + if(token->length) { + token->type = MyCSS_TOKEN_TYPE_WHITESPACE; + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + } + + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0022 QUOTATION MARK (") +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_quotation_mark(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_quotation_mark_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0023 NUMBER SIGN (#) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_number_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_number_sign_name_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->type = MyCSS_TOKEN_TYPE_HASH; + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_number_sign_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // and '#' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '\' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0024 DOLLAR SIGN ($) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_dollar_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0027 APOSTROPHE (') +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_apostrophe(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_apostrophe_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0028 LEFT PARENTHESIS (() +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_left_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_LEFT_PARENTHESIS; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0029 RIGHT PARENTHESIS ()) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_right_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+002A ASTERISK (*) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_asterisk(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+002B PLUS SIGN (+) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_plus_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_plus_sign_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '+' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '.' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+002C COMMA (,) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_comma(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_COMMA; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+002D HYPHEN-MINUS (-) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_hyphen_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_hyphen_minus_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '-' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '.' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_hyphen_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '-' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_hyphen_minus_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '-' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '\' character + token->length = 1; + token->begin = begin + 2; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_hyphen_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '-' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '\' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+002E FULL STOP (.) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+002F SOLIDUS (/) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_solidus_comment_end(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_COMMENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+003A COLON (:) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_colon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_COLON; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+003B SEMICOLON (;) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_semicolon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_SEMICOLON; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+003C LESS-THAN SIGN (<) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_less_than_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_less_than_sign_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '<' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + return css_size; +} + +size_t mycss_tokenizer_end_state_less_than_sign_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '<' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin + 2; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0040 COMMERCIAL AT (@) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_commercial_at(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_commercial_at_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '@' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_commercial_at_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '@' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '\' character + token->length = 1; + token->begin = begin + 2; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_commercial_at_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // '@' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '\' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_commercial_at_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->type = MyCSS_TOKEN_TYPE_AT_KEYWORD; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+005B LEFT SQUARE BRACKET ([) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_left_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_LEFT_SQUARE_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+005C REVERSE SOLIDUS (\) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_reverse_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+005D RIGHT SQUARE BRACKET (]) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_right_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+005E CIRCUMFLEX ACCENT (^) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_circumflex_accent(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+007B LEFT CURLY BRACKET ({) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_left_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_LEFT_CURLY_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+007D RIGHT CURLY BRACKET (}) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_right_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_RIGHT_CURLY_BRACKET; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// Digit +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+0055 LATIN CAPITAL LETTER U (U) || U+0075 LATIN SMALL LETTER U (u) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_letter_u(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_IDENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_state_letter_u_next(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + size_t begin = token->begin; + + // 'u' or 'U' character + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_IDENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '+' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// name-start code point +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_name_start_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_IDENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+007C VERTICAL LINE (|) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_vertical_line(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// U+007E TILDE (~) +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_tilde(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// anything else +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_state_delim_single_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = css_offset - token->begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + + +///////////////////////////////////////////////////////// +//// Global + +///////////////////////////////////////////////////////// +//// Global back +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// Consume a numeric +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_state_numeric(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_numeric_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + // numbers + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + size_t begin = token->begin + token->length; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_numeric_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + // numbers + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 2; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + size_t begin = token->begin + token->length; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '-' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '\' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_numeric_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + // numbers + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + size_t begin = token->begin + token->length; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '\' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// Consume a number +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_state_number_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +size_t mycss_tokenizer_end_global_state_number_dot(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + size_t begin = token->begin + token->length; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + // '.' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_number_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +size_t mycss_tokenizer_end_global_state_number_e(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + size_t begin = token->begin + token->length; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + // 'e' or 'E' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_IDENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_number_e_plus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 2; + size_t begin = token->begin + token->length; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + // 'e' or 'E' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_IDENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // and '+' or '-' character + token->length = 1; + token->begin = begin + 1; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_number_e_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +///////////////////////////////////////////////////////// +//// Consume a url token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_state_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_BAD_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_url_string_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + if(token->type == MyCSS_TOKEN_TYPE_BAD_STRING) + token->type = MyCSS_TOKEN_TYPE_BAD_URL; + else + token->type = MyCSS_TOKEN_TYPE_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_url_after(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_url_after_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_url_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + token->type = MyCSS_TOKEN_TYPE_BAD_URL; + + size_t begin = token->begin + token->length; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // '\' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_bad_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_BAD_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// Consume a string token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_state_string_double_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +size_t mycss_tokenizer_end_global_state_string_double_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +size_t mycss_tokenizer_end_global_state_string_single_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +size_t mycss_tokenizer_end_global_state_string_single_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +///////////////////////////////////////////////////////// +//// Consume an ident-like token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_state_ident(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->type = MyCSS_TOKEN_TYPE_IDENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// Consume a name +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_state_name(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + return css_size; +} + +size_t mycss_tokenizer_end_global_state_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + size_t begin = token->begin + token->length; + + mycss_tokenizer_end_run_state_single(entry, entry->state_back, css, css_offset, css_size); + + // '\' character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +///////////////////////////////////////////////////////// +//// Consume a unicode-range token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_end_global_state_unicode_range_before(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_unicode_range(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_unicode_range_question(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_size; +} + +size_t mycss_tokenizer_end_global_state_unicode_range_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(entry->help_counter == 0) { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + } + else { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + } + + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + size_t begin = token->begin + token->length; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + // character + token->length = 1; + token->begin = begin; + token->type = MyCSS_TOKEN_TYPE_DELIM; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + return css_offset; +} + + + diff --git a/source/mycss/tokenizer_end.h b/source/mycss/tokenizer_end.h new file mode 100644 index 0000000..590f1e0 --- /dev/null +++ b/source/mycss/tokenizer_end.h @@ -0,0 +1,125 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_END_H +#define MyHTML_MyCSS_TOKENIZER_END_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "mycss/mycss.h" +#include "mycss/entry.h" + +size_t mycss_tokenizer_end_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_state_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_quotation_mark(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_quotation_mark_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_number_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_number_sign_name_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_number_sign_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_dollar_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_apostrophe(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_apostrophe_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_left_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_right_parenthesis(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_asterisk(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_plus_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_plus_sign_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_comma(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_hyphen_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_full_stop(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_solidus_comment_end(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_colon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_semicolon(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_less_than_sign(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_less_than_sign_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_less_than_sign_minus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_commercial_at_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_left_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_reverse_solidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_right_square_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_circumflex_accent(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_left_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_right_curly_bracket(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_letter_u(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_letter_u_next(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_name_start_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_vertical_line(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_tilde(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_state_delim_single_code_point(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +// Global +size_t mycss_tokenizer_end_global_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_numeric(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_numeric_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_numeric_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_numeric_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_number_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_dot(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_e(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_e_plus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_number_e_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_ident(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_url_string_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_url_after(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_url_after_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_url_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_bad_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_name(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_string_double_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_string_double_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_string_single_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_string_single_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_end_global_state_unicode_range_before(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_unicode_range(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_unicode_range_question(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_end_global_state_unicode_range_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_TOKENIZER_END_H */ diff --git a/source/mycss/tokenizer_global.c b/source/mycss/tokenizer_global.c new file mode 100644 index 0000000..f9dcfa4 --- /dev/null +++ b/source/mycss/tokenizer_global.c @@ -0,0 +1,794 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/tokenizer_global.h" +#include "mycss/tokenizer_resource.h" +#include "myhtml/utils/resources.h" + +///////////////////////////////////////////////////////// +//// Global back +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Consume a numeric +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_state_numeric(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '%') + { + css_offset++; + + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_PERCENTAGE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + return css_offset; + } + else if(css[css_offset] == '-') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_RSOLIDUS; + } + else if(mycss_begin_chars_state_map[ (const unsigned char)(css[css_offset]) ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + css_offset++; + + token->type = MyCSS_TOKEN_TYPE_DIMENSION; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_BACK; + } + else + { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_numeric_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(mycss_begin_chars_state_map[ (const unsigned char)(css[css_offset]) ] == MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT) { + css_offset++; + + token->type = MyCSS_TOKEN_TYPE_DIMENSION; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_BACK; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMERIC_MINUS_RSOLIDUS; + } + else { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_numeric_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 2; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 2); + } + else { + css_offset++; + + token->type = MyCSS_TOKEN_TYPE_DIMENSION; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_BACK; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_numeric_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + token->type = MyCSS_TOKEN_TYPE_NUMBER; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + else { + css_offset++; + + token->type = MyCSS_TOKEN_TYPE_DIMENSION; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_BACK; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Consume a number +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_state_number_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] < '0' || css[css_offset] > '9') + { + if(css[css_offset] == '.') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DOT; + + css_offset++; + break; + } + else if(css[css_offset] == 'E' || css[css_offset] == 'e') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E; + + css_offset++; + break; + } + else { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + entry->state = entry->state_back; + break; + } + } + + css_offset++; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_number_dot(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] >= '0' && css[css_offset] <= '9') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_DECIMAL; + css_offset++; + } + else { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + entry->state = entry->state_back; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_number_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] < '0' || css[css_offset] > '9') + { + if(css[css_offset] == 'E' || css[css_offset] == 'e') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E; + + css_offset++; + break; + } + else { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + entry->state = entry->state_back; + break; + } + } + + css_offset++; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_number_e(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '+' || css[css_offset] == '-') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_PLUS_MINUS; + css_offset++; + } + else if(css[css_offset] >= '0' && css[css_offset] <= '9') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_DECIMAL; + css_offset++; + } + else { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + entry->state = entry->state_back; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_number_e_plus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] >= '0' && css[css_offset] <= '9') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NUMBER_E_DECIMAL; + css_offset++; + } + else { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 2; + entry->state = entry->state_back; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_number_e_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] < '0' || css[css_offset] > '9') + { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + entry->state = entry->state_back; + break; + } + + css_offset++; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Consume a url token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_state_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] != '\r' && css[css_offset] != 0x0C && + css[css_offset] != '\n' && css[css_offset] != '\t' && css[css_offset] != ' ') + { + if(css[css_offset] == '"') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_URL_STRING_BACK; + + token->begin = entry->current_buffer->offset + css_offset; + break; + } + else if(css[css_offset] == '\'') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED; + entry->state_back = MyCSS_TOKENIZER_GLOBAL_STATE_URL_STRING_BACK; + + token->begin = entry->current_buffer->offset + css_offset; + break; + } + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER; + + token->begin = entry->current_buffer->offset + css_offset; + break; + } + + ++css_offset; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_url_string_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(token->type == MyCSS_TOKEN_TYPE_BAD_STRING) + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL; + else + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER_WHITESPACE; + + return css_offset; +} + +size_t mycss_tokenizer_global_state_url_after(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + while(css_offset < css_size) + { + if(css[css_offset] == ')') { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + + css_offset++; + break; + } + else if(css[css_offset] == '\r' || css[css_offset] == 0x0C || + css[css_offset] == '\n' || css[css_offset] == '\t' || css[css_offset] == ' ') + { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER_WHITESPACE; + + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + css_offset++; + break; + } + else if(css[css_offset] == '"' || css[css_offset] == '\'' || css[css_offset] == '(' || + // non-printable code point + u_css[css_offset] == 0x00 || u_css[css_offset] == 0x08 || u_css[css_offset] == 0x0B || + u_css[css_offset] == 0x7F || (u_css[css_offset] >= 0x0E && u_css[css_offset] <= 0x1F)) + { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL; + + css_offset++; + break; + } + else if(css[css_offset] == '\\') { + css_offset++; + + break; + } + + ++css_offset; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_url_after_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] != '\r' && css[css_offset] != 0x0C && + css[css_offset] != '\n' && css[css_offset] != '\t' && css[css_offset] != ' ') + { + if(css[css_offset] == ')') { + token->type = MyCSS_TOKEN_TYPE_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + + css_offset++; + break; + } + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL; + break; + } + + ++css_offset; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_url_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] != '\n' && css[css_offset] != '\r' && css[css_offset] != 0x0C) { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_URL_AFTER; + return (css_offset + 1); + } + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_BAD_URL; + + return css_offset; +} + +size_t mycss_tokenizer_global_state_bad_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] == ')') { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_BAD_URL; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + + css_offset++; + break; + } +// else if(css[css_offset] == '\\') { +// css_offset++; +// break; +// } + + ++css_offset; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Consume a string token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_state_string_double_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] == '"') + { + token->type = MyCSS_TOKEN_TYPE_STRING; + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + // skip QUOTATION MARK (") + ++css_offset; + entry->state = entry->state_back; + break; + } + else if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + entry->state = entry->state_back; + break; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS; + break; + } + + ++css_offset; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_string_double_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\r') + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED_RSOLIDUS_R; + else + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED; + + css_offset++; + return css_offset; +} + +size_t mycss_tokenizer_global_state_string_double_quoted_rsolidus_r(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n') + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_DOUBLE_QUOTED; + + return css_offset; +} + +size_t mycss_tokenizer_global_state_string_single_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] == '\'') + { + token->type = MyCSS_TOKEN_TYPE_STRING; + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + // skip APOSTROPHE (') + ++css_offset; + + entry->state = entry->state_back; + break; + } + else if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->type = MyCSS_TOKEN_TYPE_BAD_STRING; + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + + entry->state = entry->state_back; + break; + } + else if(css[css_offset] == '\\') { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS; + break; + } + + ++css_offset; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_string_single_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\r') + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED_RSOLIDUS_R; + else + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED; + + css_offset++; + return css_offset; +} + +size_t mycss_tokenizer_global_state_string_single_quoted_rsolidus_r(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n') + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_STRING_SINGLE_QUOTED; + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Consume an ident-like token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_state_ident(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '(') + { + if(mycss_tokenizer_token_strcasecmp(entry, token, "url", 3) == 0) { + css_offset++; + + token->type = MyCSS_TOKEN_TYPE_URL; + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_URL; + } + else { + css_offset++; + + token->type = MyCSS_TOKEN_TYPE_FUNCTION; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + } + else { + token->type = MyCSS_TOKEN_TYPE_IDENT; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Consume a name +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_state_name(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + while(css_offset < css_size) + { + if(mycss_chars_name_code_point_map[ u_css[css_offset] ] == 0xff) + { + if(css[css_offset] == '\\') { + ++css_offset; + + if(css_offset >= css_size) { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME_RSOLIDUS; + break; + } + + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + --css_offset; + + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + entry->state = entry->state_back; + + break; + } + } + + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + entry->state = entry->state_back; + + break; + } + + css_offset++; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + if(css[css_offset] == '\n' || css[css_offset] == '\r' || css[css_offset] == 0x0C) { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + entry->state = entry->state_back; + + return mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + else { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_NAME; + css_offset++; + } + + return css_offset; +} + +///////////////////////////////////////////////////////// +//// Consume a unicode-range token +//// +///////////////////////////////////////////////////////// +size_t mycss_tokenizer_global_state_unicode_range_before(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + entry->help_counter = 0; + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE; + + return css_offset; +} + +size_t mycss_tokenizer_global_state_unicode_range(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + while(css_offset < css_size) + { + if(myhtml_string_chars_hex_map[ u_css[css_offset] ] != 0xff) + { + entry->help_counter++; + + if(entry->help_counter == 6) { + css_offset++; + + entry->help_counter = 0; + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_MINUS; + + break; + } + } + else if(css[css_offset] == '?') { + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_QUESTION; + break; + } + else if(css[css_offset] == '-') { + css_offset++; + + entry->help_counter = 0; + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_MINUS; + break; + } + else { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + + // TODO + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + + css_offset++; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_unicode_range_question(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + while(css_offset < css_size) + { + if(css[css_offset] == '?') { + entry->help_counter++; + + if(entry->help_counter == 6) { + css_offset++; + + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + } + else { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + + css_offset++; + } + + return css_offset; +} + +size_t mycss_tokenizer_global_state_unicode_range_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) +{ + const unsigned char *u_css = (const unsigned char*)css; + + while(css_offset < css_size) + { + if(myhtml_string_chars_hex_map[ u_css[css_offset] ] != 0xff) + { + entry->help_counter++; + + if(entry->help_counter == 6) { + css_offset++; + + entry->state = MyCSS_TOKENIZER_GLOBAL_STATE_UNICODE_RANGE_MINUS; + break; + } + } + else { + if(entry->help_counter == 0) { + token->length = ((entry->current_buffer->offset + css_offset) - token->begin) - 1; + css_offset = mycss_tokenizer_state_set_current_buffer_for_continue(entry, css_offset, 1); + } + else { + token->length = (entry->current_buffer->offset + css_offset) - token->begin; + } + + token->type = MyCSS_TOKEN_TYPE_UNICODE_RANGE; + + MyCSS_TOKEN_READY_CALLBACK_FUNCTION(entry, token); + + entry->state = MyCSS_TOKENIZER_STATE_DATA; + break; + } + + css_offset++; + } + + return css_offset; +} + + + diff --git a/source/mycss/tokenizer_global.h b/source/mycss/tokenizer_global.h new file mode 100644 index 0000000..37327d6 --- /dev/null +++ b/source/mycss/tokenizer_global.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_GLOBAL_H +#define MyHTML_MyCSS_TOKENIZER_GLOBAL_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/myosi.h" +#include "mycss/mycss.h" +#include "mycss/entry.h" +#include "mycss/check.h" + +size_t mycss_tokenizer_global_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_numeric(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_numeric_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_numeric_minus_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_numeric_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_number_digit(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_dot(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_e(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_e_plus_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_number_e_decimal(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_ident(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_url_string_back(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_url_after(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_url_after_whitespace(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_url_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_bad_url(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_name(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_name_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_string_double_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_double_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_double_quoted_rsolidus_r(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_single_quoted(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_single_quoted_rsolidus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_string_single_quoted_rsolidus_r(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + +size_t mycss_tokenizer_global_state_unicode_range_before(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_unicode_range(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_unicode_range_question(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); +size_t mycss_tokenizer_global_state_unicode_range_minus(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_TOKENIZER_GLOBAL_H */ diff --git a/source/mycss/tokenizer_resource.h b/source/mycss/tokenizer_resource.h new file mode 100644 index 0000000..623a904 --- /dev/null +++ b/source/mycss/tokenizer_resource.h @@ -0,0 +1,362 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_TOKENIZER_RESOURCE_H +#define MyHTML_MyCSS_TOKENIZER_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +// +// generated by Perl script utils/mycss_first_char.pl +static const mycss_tokenizer_state_t mycss_begin_chars_state_map[] = { + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_WHITESPACE, // whitespace + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_QUOTATION_MARK, // U+0022 QUOTATION MARK (") + MyCSS_TOKENIZER_STATE_NUMBER_SIGN, // U+0023 NUMBER SIGN (#) + MyCSS_TOKENIZER_STATE_DOLLAR_SIGN, // U+0024 DOLLAR SIGN ($) + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_APOSTROPHE, // U+0027 APOSTROPHE (') + MyCSS_TOKENIZER_STATE_LEFT_PARENTHESIS, // U+0028 LEFT PARENTHESIS (() + MyCSS_TOKENIZER_STATE_RIGHT_PARENTHESIS, // U+0029 RIGHT PARENTHESIS ()) + MyCSS_TOKENIZER_STATE_ASTERISK, // U+002A ASTERISK (*) + MyCSS_TOKENIZER_STATE_PLUS_SIGN, // U+002B PLUS SIGN (+) + MyCSS_TOKENIZER_STATE_COMMA, // U+002C COMMA (,) + MyCSS_TOKENIZER_STATE_HYPHEN_MINUS, // U+002D HYPHEN-MINUS (-) + MyCSS_TOKENIZER_STATE_FULL_STOP, // U+002E FULL STOP (.) + MyCSS_TOKENIZER_STATE_SOLIDUS, // U+002F SOLIDUS (/) + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_DIGIT, // digit + MyCSS_TOKENIZER_STATE_COLON, // U+003A COLON (:) + MyCSS_TOKENIZER_STATE_SEMICOLON, // U+003B SEMICOLON (;) + MyCSS_TOKENIZER_STATE_LESS_THAN_SIGN, // U+003C LESS-THAN SIGN (<) + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_COMMERCIAL_AT, // U+0040 COMMERCIAL AT (@) + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LETTER_U, // name-start code point and LATIN CAPITAL AND SMALL LETTER U + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LEFT_SQUARE_BRACKET, // U+005B LEFT SQUARE BRACKET ([) + MyCSS_TOKENIZER_STATE_REVERSE_SOLIDUS, // U+005C REVERSE SOLIDUS () + MyCSS_TOKENIZER_STATE_RIGHT_SQUARE_BRACKET, // U+005D RIGHT SQUARE BRACKET (]) + MyCSS_TOKENIZER_STATE_CIRCUMFLEX_ACCENT, // U+005E CIRCUMFLEX ACCENT (^) + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LETTER_U, // name-start code point and LATIN CAPITAL AND SMALL LETTER U + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_LEFT_CURLY_BRACKET, // U+007B LEFT CURLY BRACKET ({) + MyCSS_TOKENIZER_STATE_VERTICAL_LINE, // U+007C VERTICAL LINE (|) + MyCSS_TOKENIZER_STATE_RIGHT_CURLY_BRACKET, // U+007D RIGHT CURLY BRACKET (}) + MyCSS_TOKENIZER_STATE_TILDE, // U+007E TILDE (~) + MyCSS_TOKENIZER_STATE_DELIM_SINGLE_CODE_POINT, // + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT, // name-start code point + MyCSS_TOKENIZER_STATE_NAME_START_CODE_POINT // name-start code point +}; + +static const unsigned char mycss_chars_name_code_point_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, + 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, + 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, + 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +}; + +static const char mycss_token_type_description[][32] = +{ + "UNDEF", + "WHITESPACE", + "IDENT", + "FUNCTION", + "AT_KEYWORD", + "HASH", + "STRING", + "URL", + "NUMBER", + "DIMENSION", + "PERCENTAGE", + "INCLUDE_MATCH", + "DASH_MATCH", + "PREFIX_MATCH", + "SUFFIX_MATCH", + "SUBSTRING_MATCH", + "COLUMN", + "CDO", + "CDC", + "BAD_STRING", + "DELIM", + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + "COMMA", + "COLON", + "SEMICOLON", + "LEFT_SQUARE_BRACKET", + "RIGHT_SQUARE_BRACKET", + "LEFT_CURLY_BRACKET", + "RIGHT_CURLY_BRACKET", + "BAD_URL", + "COMMENT", + "UNICODE_RANGE", + "END_OF_FILE", + "" +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_TOKENIZER_RESOURCE_H */ diff --git a/source/mycss/values/consume.c b/source/mycss/values/consume.c new file mode 100644 index 0000000..7c6bfa0 --- /dev/null +++ b/source/mycss/values/consume.c @@ -0,0 +1,91 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/values/consume.h" + + +bool mycss_values_consume_length(mycss_entry_t* entry, mycss_token_t* token) +{ + if(token->type == MyCSS_TOKEN_TYPE_DIMENSION || token->type == MyCSS_TOKEN_TYPE_NUMBER) + { + mycss_values_length_t *value = mycss_values_create(entry, sizeof(mycss_values_length_t)); + + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + double return_num; + size_t consume_length = mycss_convert_data_to_double(str.data, str.length, &return_num, &value->is_float); + + if(token->type == MyCSS_TOKEN_TYPE_DIMENSION) { + value->type = mycss_units_type_by_name(&str.data[consume_length], (str.length - consume_length)); + myhtml_string_destroy(&str, false); + + if(value->type == MyCSS_UNIT_TYPE_UNDEF) { + mycss_values_destroy(entry, value); + return false; + } + } + else { + value->type = MyCSS_UNIT_TYPE_UNDEF; + myhtml_string_destroy(&str, false); + } + + if(value->is_float) + value->f = (float)return_num; + else + value->i = (int)return_num; + + *entry->values = value; + } + else + return false; + + return true; +} + +bool mycss_values_consume_percentage(mycss_entry_t* entry, mycss_token_t* token) +{ + if(token->type == MyCSS_TOKEN_TYPE_PERCENTAGE) + { + mycss_values_percentage_t *value = mycss_values_create(entry, sizeof(mycss_values_length_t)); + + myhtml_string_t str; + mycss_token_data_to_string(entry, token, &str, true, false); + + double return_num; + mycss_convert_data_to_double(str.data, str.length, &return_num, &value->is_float); + + myhtml_string_destroy(&str, false); + + if(value->is_float) + value->f = (float)return_num; + else + value->i = (int)return_num; + + *entry->values = value; + + return true; + } + + return false; +} + + + diff --git a/source/mycss/values/consume.h b/source/mycss/values/consume.h new file mode 100644 index 0000000..1999c9d --- /dev/null +++ b/source/mycss/values/consume.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_CONSUME_H +#define MyHTML_MyCSS_VALUES_CONSUME_H +#pragma once + +#include "mycss/myosi.h" +#include "mycss/entry.h" +#include "mycss/values/values.h" +#include "mycss/values/units.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +bool mycss_values_consume_length(mycss_entry_t* entry, mycss_token_t* token); +bool mycss_values_consume_percentage(mycss_entry_t* entry, mycss_token_t* token); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_CONSUME_H */ diff --git a/source/mycss/values/resources.h b/source/mycss/values/resources.h new file mode 100644 index 0000000..1c7efd4 --- /dev/null +++ b/source/mycss/values/resources.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_RESOURCES_H +#define MyHTML_MyCSS_VALUES_RESOURCES_H +#pragma once + + + +#endif /* MyHTML_MyCSS_VALUES_RESOURCES_H */ diff --git a/source/mycss/values/serialization.c b/source/mycss/values/serialization.c new file mode 100644 index 0000000..fa995ec --- /dev/null +++ b/source/mycss/values/serialization.c @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/values/serialization.h" +#include "mycss/values/units_resources.h" + +void mycss_serialization_length(mycss_values_length_t* value, FILE* fh) +{ + if(value->is_float) { + fprintf(fh, "%0.4f", value->f); + } + else { + fprintf(fh, "%d", value->i); + } + + if(value->type < MyCSS_UNIT_TYPE_LAST_ENTRY) { + fprintf(fh, "%s", mycss_units_index_name[ value->type ]); + } +} + +void mycss_serialization_percentage(mycss_values_percentage_t* value, FILE* fh) +{ + if(value->is_float) { + fprintf(fh, "%0.4f%%", value->f); + } + else { + fprintf(fh, "%d%%", value->i); + } +} + diff --git a/source/mycss/values/serialization.h b/source/mycss/values/serialization.h new file mode 100644 index 0000000..5398142 --- /dev/null +++ b/source/mycss/values/serialization.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_SERIALIZATION_H +#define MyHTML_MyCSS_VALUES_SERIALIZATION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycss/values/values.h" + +void mycss_serialization_length(mycss_values_length_t* value, FILE* fh); +void mycss_serialization_percentage(mycss_values_percentage_t* value, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_SERIALIZATION_H */ diff --git a/source/mycss/values/units.c b/source/mycss/values/units.c new file mode 100644 index 0000000..7a66557 --- /dev/null +++ b/source/mycss/values/units.c @@ -0,0 +1,67 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/values/units.h" +#include "mycss/values/units_resources.h" +#include "myhtml/utils/resources.h" + +const mycss_units_index_static_entry_t * mycss_units_index_entry_by_name(const char* name, size_t length) +{ + if(length == 0) + return NULL; + + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyCSS_UNITS_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; + + while (mycss_units_index_static_for_search[idx].name) + { + if(mycss_units_index_static_for_search[idx].name_length == length) { + if(myhtml_strncasecmp(mycss_units_index_static_for_search[idx].name, name, length) == 0) + return &mycss_units_index_static_for_search[idx]; + + if(mycss_units_index_static_for_search[idx].next) + idx = mycss_units_index_static_for_search[idx].next; + else + return NULL; + } + else if(mycss_units_index_static_for_search[idx].name_length > length) { + return NULL; + } + else { + idx = mycss_units_index_static_for_search[idx].next; + } + } + + return NULL; +} + +mycss_units_type_t mycss_units_type_by_name(const char *name, size_t length) +{ + const mycss_units_index_static_entry_t *entry = mycss_units_index_entry_by_name(name, length); + + if(entry) + return entry->unit_type; + + return MyCSS_UNIT_TYPE_UNDEF; +} + + diff --git a/source/mycss/values/units.h b/source/mycss/values/units.h new file mode 100644 index 0000000..eddf9b0 --- /dev/null +++ b/source/mycss/values/units.h @@ -0,0 +1,94 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_UNITS_H +#define MyHTML_MyCSS_VALUES_UNITS_H +#pragma once + +#include "mycss/myosi.h" +#include "myhtml/utils.h" + +#define mycss_units_is_angel_type(type) (type >= 1 && type <= 4) +#define mycss_units_is_frequency_type(type) (type >= 5 && type <= 6) +#define mycss_units_is_length_type(type) (type >= 7 && type <= 24) +#define mycss_units_is_length_absolute_type(type) (type >= 7 && type <= 13) +#define mycss_units_is_length_relative_type(type) (type >= 14 && type <= 24) +#define mycss_units_is_resolution_type(type) (type >= 25 && type <= 27) +#define mycss_units_is_time_type(type) (type >= 28 && type <= 29) + +#ifdef __cplusplus +extern "C" { +#endif + +enum mycss_units_type { + MyCSS_UNIT_TYPE_UNDEF = 0x00, + MyCSS_UNIT_TYPE_DEG = 0x01, + MyCSS_UNIT_TYPE_GRAD = 0x02, + MyCSS_UNIT_TYPE_RAD = 0x03, + MyCSS_UNIT_TYPE_TURN = 0x04, + MyCSS_UNIT_TYPE_HZ = 0x05, + MyCSS_UNIT_TYPE_KHZ = 0x06, + MyCSS_UNIT_TYPE_CM = 0x07, + MyCSS_UNIT_TYPE_IN = 0x08, + MyCSS_UNIT_TYPE_MM = 0x09, + MyCSS_UNIT_TYPE_PC = 0x0a, + MyCSS_UNIT_TYPE_PT = 0x0b, + MyCSS_UNIT_TYPE_PX = 0x0c, + MyCSS_UNIT_TYPE_Q = 0x0d, + MyCSS_UNIT_TYPE_CH = 0x0e, + MyCSS_UNIT_TYPE_EM = 0x0f, + MyCSS_UNIT_TYPE_EX = 0x10, + MyCSS_UNIT_TYPE_IC = 0x11, + MyCSS_UNIT_TYPE_REM = 0x12, + MyCSS_UNIT_TYPE_VB = 0x13, + MyCSS_UNIT_TYPE_VH = 0x14, + MyCSS_UNIT_TYPE_VI = 0x15, + MyCSS_UNIT_TYPE_VMAX = 0x16, + MyCSS_UNIT_TYPE_VMIN = 0x17, + MyCSS_UNIT_TYPE_VW = 0x18, + MyCSS_UNIT_TYPE_DPCM = 0x19, + MyCSS_UNIT_TYPE_DPI = 0x1a, + MyCSS_UNIT_TYPE_DPPX = 0x1b, + MyCSS_UNIT_TYPE_MS = 0x1c, + MyCSS_UNIT_TYPE_S = 0x1d, + MyCSS_UNIT_TYPE_LAST_ENTRY = 0x1e, +} +typedef mycss_units_type_t; + +struct mycss_units_index_static_entry { + const char* name; + size_t name_length; + + mycss_units_type_t unit_type; + + size_t next; + size_t curr; +} +typedef mycss_units_index_static_entry_t; + + +mycss_units_type_t mycss_units_type_by_name(const char *name, size_t length); +const mycss_units_index_static_entry_t * mycss_units_index_entry_by_name(const char* name, size_t length); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_UNITS_H */ diff --git a/source/mycss/values/units_resources.h b/source/mycss/values/units_resources.h new file mode 100644 index 0000000..7d7c8e1 --- /dev/null +++ b/source/mycss/values/units_resources.h @@ -0,0 +1,237 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_UNITS_RESOURCES_H +#define MyHTML_MyCSS_VALUES_UNITS_RESOURCES_H +#pragma once + +#define MyCSS_UNITS_STATIC_INDEX_FOR_SEARCH_SIZE 199 + +static const char * mycss_units_index_name[31] = { + "", "deg", "grad", "rad", "turn", "Hz", "kHz", "cm", "in", "mm", "pc", + "pt", "px", "q", "ch", "em", "ex", "ic", "rem", "vb", "vh", + "vi", "vmax", "vmin", "vw", "dpcm", "dpi", "dppx", "ms", "s", NULL +}; + +static const mycss_units_index_static_entry_t mycss_units_index_static_for_search[] = +{ + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"grad", 4, MyCSS_UNIT_TYPE_GRAD, 0, 8}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"px", 2, MyCSS_UNIT_TYPE_PX, 0, 16}, + {"in", 2, MyCSS_UNIT_TYPE_IN, 0, 17}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"dpcm", 4, MyCSS_UNIT_TYPE_DPCM, 0, 20}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vw", 2, MyCSS_UNIT_TYPE_VW, 0, 26}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"q", 1, MyCSS_UNIT_TYPE_Q, 0, 34}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"dppx", 4, MyCSS_UNIT_TYPE_DPPX, 0, 42}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vb", 2, MyCSS_UNIT_TYPE_VB, 0, 45}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"deg", 3, MyCSS_UNIT_TYPE_DEG, 0, 56}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"dpi", 3, MyCSS_UNIT_TYPE_DPI, 0, 59}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"rem", 3, MyCSS_UNIT_TYPE_REM, 0, 66}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vh", 2, MyCSS_UNIT_TYPE_VH, 0, 68}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"mm", 2, MyCSS_UNIT_TYPE_MM, 0, 82}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"pc", 2, MyCSS_UNIT_TYPE_PC, 0, 88}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"cm", 2, MyCSS_UNIT_TYPE_CM, 0, 91}, + {"s", 1, MyCSS_UNIT_TYPE_S, 0, 92}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"ic", 2, MyCSS_UNIT_TYPE_IC, 0, 95}, + {"ch", 2, MyCSS_UNIT_TYPE_CH, 0, 96}, + {"turn", 4, MyCSS_UNIT_TYPE_TURN, 0, 97}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"Hz", 2, MyCSS_UNIT_TYPE_HZ, 0, 104}, + {"vi", 2, MyCSS_UNIT_TYPE_VI, 0, 105}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"pt", 2, MyCSS_UNIT_TYPE_PT, 0, 115}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vmax", 4, MyCSS_UNIT_TYPE_VMAX, 0, 125}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"em", 2, MyCSS_UNIT_TYPE_EM, 0, 129}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"kHz", 3, MyCSS_UNIT_TYPE_KHZ, 0, 159}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"ex", 2, MyCSS_UNIT_TYPE_EX, 0, 162}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"rad", 3, MyCSS_UNIT_TYPE_RAD, 0, 172}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"vmin", 4, MyCSS_UNIT_TYPE_VMIN, 0, 181}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {"ms", 2, MyCSS_UNIT_TYPE_MS, 0, 196}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyCSS_UNIT_TYPE_UNDEF, 0, 0}, +}; + +#endif /* MyHTML_MyCSS_VALUES_UNITS_RESOURCES_H */ diff --git a/source/mycss/values/values.c b/source/mycss/values/values.c new file mode 100644 index 0000000..8009298 --- /dev/null +++ b/source/mycss/values/values.c @@ -0,0 +1,48 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycss/values/values.h" +#include "mycss/entry.h" + +void * mycss_values_create(mycss_entry_t* entry, size_t size) +{ + void *value = mchar_async_malloc(entry->mchar, entry->mchar_value_node_id, size); + memset(value, 0, size); + + return value; +} + +void * mycss_values_destroy(mycss_entry_t* entry, void* value) +{ + mchar_async_free(entry->mchar, entry->mchar_value_node_id, value); + return NULL; +} + +void mycss_values_entry_set(mycss_entry_t* entry, void** value) +{ + entry->values = value; +} + + +void * mycss_values_entry(mycss_entry_t* entry) +{ + return (*entry->values); +} + diff --git a/source/mycss/values/values.h b/source/mycss/values/values.h new file mode 100644 index 0000000..2d74db5 --- /dev/null +++ b/source/mycss/values/values.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyCSS_VALUES_VALUES_H +#define MyHTML_MyCSS_VALUES_VALUES_H +#pragma once + +#include "mycss/myosi.h" +#include "mycss/values/units.h" +#include "myhtml/utils/mchar_async.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct mycss_values_length { + union { + int i; + float f; + }; + + bool is_float; + mycss_units_type_t type; +} +typedef mycss_values_length_t; + +struct mycss_values_percentage { + union { + int i; + float f; + }; + + bool is_float; +} +typedef mycss_values_percentage_t; + + +void * mycss_values_create(mycss_entry_t* entry, size_t size); +void * mycss_values_destroy(mycss_entry_t* entry, void* value); + +void * mycss_values_entry(mycss_entry_t* entry); +void mycss_values_entry_set(mycss_entry_t* entry, void** value); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MyCSS_VALUES_VALUES_H */ diff --git a/source/myhtml/Makefile.mk b/source/myhtml/Makefile.mk new file mode 100644 index 0000000..7b2eaf1 --- /dev/null +++ b/source/myhtml/Makefile.mk @@ -0,0 +1,14 @@ +find_files_h = $(wildcard $(SRCDIR)/myhtml/$(dir)/*.h) +find_files_c = $(wildcard $(SRCDIR)/myhtml/$(dir)/*.c) + +SUBDIRS := . utils +HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) +SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) + +myhtml_clone: MyHTML_DIR_$(SUBDIRS) + mkdir -p $(INCLUDE_TMP)/myhtml + cp $(SRCDIR)/myhtml/*.h $(INCLUDE_TMP)/myhtml + +MyHTML_DIR_$(SUBDIRS): + mkdir -p $(INCLUDE_TMP)/myhtml/$(patsubst MyHTML_DIR_%,%,$@) + cp $(SRCDIR)/myhtml/$(patsubst MyHTML_DIR_%,%,$@)/*.h $(INCLUDE_TMP)/myhtml/$(patsubst MyHTML_DIR_%,%,$@)/ diff --git a/source/myhtml/api.h b/source/myhtml/api.h new file mode 100644 index 0000000..9bbe049 --- /dev/null +++ b/source/myhtml/api.h @@ -0,0 +1,2648 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MyHTML_API_H +#define MyHTML_MyHTML_API_H +#pragma once + +/** + * @file myhtml/api.h + * + * Fast C/C++ HTML 5 Parser. Using threads. + * With possibility of a Single Mode. + * + * C99 and POSIX Threads! No dependencies! + * + * By https://html.spec.whatwg.org/ specification. + * + */ + +#define MyHTML_VERSION_MAJOR 1 +#define MyHTML_VERSION_MINOR 0 +#define MyHTML_VERSION_PATCH 3 + +#include +#include +#include + +#if defined(_MSC_VER) +# define MyHTML_DEPRECATED(func, message) __declspec(deprecated(message)) func +#elif defined(__GNUC__) || defined(__INTEL_COMPILER) +# define MyHTML_DEPRECATED(func, message) func __attribute__((deprecated(message))) +#else +# define MyHTML_DEPRECATED(func, message) func +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * encodings type + */ +enum myhtml_encoding_list { + MyHTML_ENCODING_DEFAULT = 0x00, +// MyHTML_ENCODING_AUTO = 0x01, // future +// MyHTML_ENCODING_CUSTOM = 0x02, // future + MyHTML_ENCODING_UTF_8 = 0x00, // default encoding + MyHTML_ENCODING_UTF_16LE = 0x04, + MyHTML_ENCODING_UTF_16BE = 0x05, + MyHTML_ENCODING_X_USER_DEFINED = 0x06, + MyHTML_ENCODING_BIG5 = 0x07, + MyHTML_ENCODING_EUC_KR = 0x08, + MyHTML_ENCODING_GB18030 = 0x09, + MyHTML_ENCODING_IBM866 = 0x0a, + MyHTML_ENCODING_ISO_8859_10 = 0x0b, + MyHTML_ENCODING_ISO_8859_13 = 0x0c, + MyHTML_ENCODING_ISO_8859_14 = 0x0d, + MyHTML_ENCODING_ISO_8859_15 = 0x0e, + MyHTML_ENCODING_ISO_8859_16 = 0x0f, + MyHTML_ENCODING_ISO_8859_2 = 0x10, + MyHTML_ENCODING_ISO_8859_3 = 0x11, + MyHTML_ENCODING_ISO_8859_4 = 0x12, + MyHTML_ENCODING_ISO_8859_5 = 0x13, + MyHTML_ENCODING_ISO_8859_6 = 0x14, + MyHTML_ENCODING_ISO_8859_7 = 0x15, + MyHTML_ENCODING_ISO_8859_8 = 0x16, + MyHTML_ENCODING_KOI8_R = 0x17, + MyHTML_ENCODING_KOI8_U = 0x18, + MyHTML_ENCODING_MACINTOSH = 0x19, + MyHTML_ENCODING_WINDOWS_1250 = 0x1a, + MyHTML_ENCODING_WINDOWS_1251 = 0x1b, + MyHTML_ENCODING_WINDOWS_1252 = 0x1c, + MyHTML_ENCODING_WINDOWS_1253 = 0x1d, + MyHTML_ENCODING_WINDOWS_1254 = 0x1e, + MyHTML_ENCODING_WINDOWS_1255 = 0x1f, + MyHTML_ENCODING_WINDOWS_1256 = 0x20, + MyHTML_ENCODING_WINDOWS_1257 = 0x21, + MyHTML_ENCODING_WINDOWS_1258 = 0x22, + MyHTML_ENCODING_WINDOWS_874 = 0x23, + MyHTML_ENCODING_X_MAC_CYRILLIC = 0x24, + MyHTML_ENCODING_ISO_2022_JP = 0x25, + MyHTML_ENCODING_GBK = 0x26, + MyHTML_ENCODING_SHIFT_JIS = 0x27, + MyHTML_ENCODING_EUC_JP = 0x28, + MyHTML_ENCODING_ISO_8859_8_I = 0x29, + MyHTML_ENCODING_LAST_ENTRY = 0x2a +} +typedef myhtml_encoding_t; + +/** + * @struct basic tag ids + */ +enum myhtml_tags { + MyHTML_TAG__UNDEF = 0x000, + MyHTML_TAG__TEXT = 0x001, + MyHTML_TAG__COMMENT = 0x002, + MyHTML_TAG__DOCTYPE = 0x003, + MyHTML_TAG_A = 0x004, + MyHTML_TAG_ABBR = 0x005, + MyHTML_TAG_ACRONYM = 0x006, + MyHTML_TAG_ADDRESS = 0x007, + MyHTML_TAG_ANNOTATION_XML = 0x008, + MyHTML_TAG_APPLET = 0x009, + MyHTML_TAG_AREA = 0x00a, + MyHTML_TAG_ARTICLE = 0x00b, + MyHTML_TAG_ASIDE = 0x00c, + MyHTML_TAG_AUDIO = 0x00d, + MyHTML_TAG_B = 0x00e, + MyHTML_TAG_BASE = 0x00f, + MyHTML_TAG_BASEFONT = 0x010, + MyHTML_TAG_BDI = 0x011, + MyHTML_TAG_BDO = 0x012, + MyHTML_TAG_BGSOUND = 0x013, + MyHTML_TAG_BIG = 0x014, + MyHTML_TAG_BLINK = 0x015, + MyHTML_TAG_BLOCKQUOTE = 0x016, + MyHTML_TAG_BODY = 0x017, + MyHTML_TAG_BR = 0x018, + MyHTML_TAG_BUTTON = 0x019, + MyHTML_TAG_CANVAS = 0x01a, + MyHTML_TAG_CAPTION = 0x01b, + MyHTML_TAG_CENTER = 0x01c, + MyHTML_TAG_CITE = 0x01d, + MyHTML_TAG_CODE = 0x01e, + MyHTML_TAG_COL = 0x01f, + MyHTML_TAG_COLGROUP = 0x020, + MyHTML_TAG_COMMAND = 0x021, + MyHTML_TAG_COMMENT = 0x022, + MyHTML_TAG_DATALIST = 0x023, + MyHTML_TAG_DD = 0x024, + MyHTML_TAG_DEL = 0x025, + MyHTML_TAG_DETAILS = 0x026, + MyHTML_TAG_DFN = 0x027, + MyHTML_TAG_DIALOG = 0x028, + MyHTML_TAG_DIR = 0x029, + MyHTML_TAG_DIV = 0x02a, + MyHTML_TAG_DL = 0x02b, + MyHTML_TAG_DT = 0x02c, + MyHTML_TAG_EM = 0x02d, + MyHTML_TAG_EMBED = 0x02e, + MyHTML_TAG_FIELDSET = 0x02f, + MyHTML_TAG_FIGCAPTION = 0x030, + MyHTML_TAG_FIGURE = 0x031, + MyHTML_TAG_FONT = 0x032, + MyHTML_TAG_FOOTER = 0x033, + MyHTML_TAG_FORM = 0x034, + MyHTML_TAG_FRAME = 0x035, + MyHTML_TAG_FRAMESET = 0x036, + MyHTML_TAG_H1 = 0x037, + MyHTML_TAG_H2 = 0x038, + MyHTML_TAG_H3 = 0x039, + MyHTML_TAG_H4 = 0x03a, + MyHTML_TAG_H5 = 0x03b, + MyHTML_TAG_H6 = 0x03c, + MyHTML_TAG_HEAD = 0x03d, + MyHTML_TAG_HEADER = 0x03e, + MyHTML_TAG_HGROUP = 0x03f, + MyHTML_TAG_HR = 0x040, + MyHTML_TAG_HTML = 0x041, + MyHTML_TAG_I = 0x042, + MyHTML_TAG_IFRAME = 0x043, + MyHTML_TAG_IMAGE = 0x044, + MyHTML_TAG_IMG = 0x045, + MyHTML_TAG_INPUT = 0x046, + MyHTML_TAG_INS = 0x047, + MyHTML_TAG_ISINDEX = 0x048, + MyHTML_TAG_KBD = 0x049, + MyHTML_TAG_KEYGEN = 0x04a, + MyHTML_TAG_LABEL = 0x04b, + MyHTML_TAG_LEGEND = 0x04c, + MyHTML_TAG_LI = 0x04d, + MyHTML_TAG_LINK = 0x04e, + MyHTML_TAG_LISTING = 0x04f, + MyHTML_TAG_MAIN = 0x050, + MyHTML_TAG_MAP = 0x051, + MyHTML_TAG_MARK = 0x052, + MyHTML_TAG_MARQUEE = 0x053, + MyHTML_TAG_MENU = 0x054, + MyHTML_TAG_MENUITEM = 0x055, + MyHTML_TAG_META = 0x056, + MyHTML_TAG_METER = 0x057, + MyHTML_TAG_MTEXT = 0x058, + MyHTML_TAG_NAV = 0x059, + MyHTML_TAG_NOBR = 0x05a, + MyHTML_TAG_NOEMBED = 0x05b, + MyHTML_TAG_NOFRAMES = 0x05c, + MyHTML_TAG_NOSCRIPT = 0x05d, + MyHTML_TAG_OBJECT = 0x05e, + MyHTML_TAG_OL = 0x05f, + MyHTML_TAG_OPTGROUP = 0x060, + MyHTML_TAG_OPTION = 0x061, + MyHTML_TAG_OUTPUT = 0x062, + MyHTML_TAG_P = 0x063, + MyHTML_TAG_PARAM = 0x064, + MyHTML_TAG_PLAINTEXT = 0x065, + MyHTML_TAG_PRE = 0x066, + MyHTML_TAG_PROGRESS = 0x067, + MyHTML_TAG_Q = 0x068, + MyHTML_TAG_RB = 0x069, + MyHTML_TAG_RP = 0x06a, + MyHTML_TAG_RT = 0x06b, + MyHTML_TAG_RTC = 0x06c, + MyHTML_TAG_RUBY = 0x06d, + MyHTML_TAG_S = 0x06e, + MyHTML_TAG_SAMP = 0x06f, + MyHTML_TAG_SCRIPT = 0x070, + MyHTML_TAG_SECTION = 0x071, + MyHTML_TAG_SELECT = 0x072, + MyHTML_TAG_SMALL = 0x073, + MyHTML_TAG_SOURCE = 0x074, + MyHTML_TAG_SPAN = 0x075, + MyHTML_TAG_STRIKE = 0x076, + MyHTML_TAG_STRONG = 0x077, + MyHTML_TAG_STYLE = 0x078, + MyHTML_TAG_SUB = 0x079, + MyHTML_TAG_SUMMARY = 0x07a, + MyHTML_TAG_SUP = 0x07b, + MyHTML_TAG_SVG = 0x07c, + MyHTML_TAG_TABLE = 0x07d, + MyHTML_TAG_TBODY = 0x07e, + MyHTML_TAG_TD = 0x07f, + MyHTML_TAG_TEMPLATE = 0x080, + MyHTML_TAG_TEXTAREA = 0x081, + MyHTML_TAG_TFOOT = 0x082, + MyHTML_TAG_TH = 0x083, + MyHTML_TAG_THEAD = 0x084, + MyHTML_TAG_TIME = 0x085, + MyHTML_TAG_TITLE = 0x086, + MyHTML_TAG_TR = 0x087, + MyHTML_TAG_TRACK = 0x088, + MyHTML_TAG_TT = 0x089, + MyHTML_TAG_U = 0x08a, + MyHTML_TAG_UL = 0x08b, + MyHTML_TAG_VAR = 0x08c, + MyHTML_TAG_VIDEO = 0x08d, + MyHTML_TAG_WBR = 0x08e, + MyHTML_TAG_XMP = 0x08f, + MyHTML_TAG_ALTGLYPH = 0x090, + MyHTML_TAG_ALTGLYPHDEF = 0x091, + MyHTML_TAG_ALTGLYPHITEM = 0x092, + MyHTML_TAG_ANIMATE = 0x093, + MyHTML_TAG_ANIMATECOLOR = 0x094, + MyHTML_TAG_ANIMATEMOTION = 0x095, + MyHTML_TAG_ANIMATETRANSFORM = 0x096, + MyHTML_TAG_CIRCLE = 0x097, + MyHTML_TAG_CLIPPATH = 0x098, + MyHTML_TAG_COLOR_PROFILE = 0x099, + MyHTML_TAG_CURSOR = 0x09a, + MyHTML_TAG_DEFS = 0x09b, + MyHTML_TAG_DESC = 0x09c, + MyHTML_TAG_ELLIPSE = 0x09d, + MyHTML_TAG_FEBLEND = 0x09e, + MyHTML_TAG_FECOLORMATRIX = 0x09f, + MyHTML_TAG_FECOMPONENTTRANSFER = 0x0a0, + MyHTML_TAG_FECOMPOSITE = 0x0a1, + MyHTML_TAG_FECONVOLVEMATRIX = 0x0a2, + MyHTML_TAG_FEDIFFUSELIGHTING = 0x0a3, + MyHTML_TAG_FEDISPLACEMENTMAP = 0x0a4, + MyHTML_TAG_FEDISTANTLIGHT = 0x0a5, + MyHTML_TAG_FEDROPSHADOW = 0x0a6, + MyHTML_TAG_FEFLOOD = 0x0a7, + MyHTML_TAG_FEFUNCA = 0x0a8, + MyHTML_TAG_FEFUNCB = 0x0a9, + MyHTML_TAG_FEFUNCG = 0x0aa, + MyHTML_TAG_FEFUNCR = 0x0ab, + MyHTML_TAG_FEGAUSSIANBLUR = 0x0ac, + MyHTML_TAG_FEIMAGE = 0x0ad, + MyHTML_TAG_FEMERGE = 0x0ae, + MyHTML_TAG_FEMERGENODE = 0x0af, + MyHTML_TAG_FEMORPHOLOGY = 0x0b0, + MyHTML_TAG_FEOFFSET = 0x0b1, + MyHTML_TAG_FEPOINTLIGHT = 0x0b2, + MyHTML_TAG_FESPECULARLIGHTING = 0x0b3, + MyHTML_TAG_FESPOTLIGHT = 0x0b4, + MyHTML_TAG_FETILE = 0x0b5, + MyHTML_TAG_FETURBULENCE = 0x0b6, + MyHTML_TAG_FILTER = 0x0b7, + MyHTML_TAG_FONT_FACE = 0x0b8, + MyHTML_TAG_FONT_FACE_FORMAT = 0x0b9, + MyHTML_TAG_FONT_FACE_NAME = 0x0ba, + MyHTML_TAG_FONT_FACE_SRC = 0x0bb, + MyHTML_TAG_FONT_FACE_URI = 0x0bc, + MyHTML_TAG_FOREIGNOBJECT = 0x0bd, + MyHTML_TAG_G = 0x0be, + MyHTML_TAG_GLYPH = 0x0bf, + MyHTML_TAG_GLYPHREF = 0x0c0, + MyHTML_TAG_HKERN = 0x0c1, + MyHTML_TAG_LINE = 0x0c2, + MyHTML_TAG_LINEARGRADIENT = 0x0c3, + MyHTML_TAG_MARKER = 0x0c4, + MyHTML_TAG_MASK = 0x0c5, + MyHTML_TAG_METADATA = 0x0c6, + MyHTML_TAG_MISSING_GLYPH = 0x0c7, + MyHTML_TAG_MPATH = 0x0c8, + MyHTML_TAG_PATH = 0x0c9, + MyHTML_TAG_PATTERN = 0x0ca, + MyHTML_TAG_POLYGON = 0x0cb, + MyHTML_TAG_POLYLINE = 0x0cc, + MyHTML_TAG_RADIALGRADIENT = 0x0cd, + MyHTML_TAG_RECT = 0x0ce, + MyHTML_TAG_SET = 0x0cf, + MyHTML_TAG_STOP = 0x0d0, + MyHTML_TAG_SWITCH = 0x0d1, + MyHTML_TAG_SYMBOL = 0x0d2, + MyHTML_TAG_TEXT = 0x0d3, + MyHTML_TAG_TEXTPATH = 0x0d4, + MyHTML_TAG_TREF = 0x0d5, + MyHTML_TAG_TSPAN = 0x0d6, + MyHTML_TAG_USE = 0x0d7, + MyHTML_TAG_VIEW = 0x0d8, + MyHTML_TAG_VKERN = 0x0d9, + MyHTML_TAG_MATH = 0x0da, + MyHTML_TAG_MACTION = 0x0db, + MyHTML_TAG_MALIGNGROUP = 0x0dc, + MyHTML_TAG_MALIGNMARK = 0x0dd, + MyHTML_TAG_MENCLOSE = 0x0de, + MyHTML_TAG_MERROR = 0x0df, + MyHTML_TAG_MFENCED = 0x0e0, + MyHTML_TAG_MFRAC = 0x0e1, + MyHTML_TAG_MGLYPH = 0x0e2, + MyHTML_TAG_MI = 0x0e3, + MyHTML_TAG_MLABELEDTR = 0x0e4, + MyHTML_TAG_MLONGDIV = 0x0e5, + MyHTML_TAG_MMULTISCRIPTS = 0x0e6, + MyHTML_TAG_MN = 0x0e7, + MyHTML_TAG_MO = 0x0e8, + MyHTML_TAG_MOVER = 0x0e9, + MyHTML_TAG_MPADDED = 0x0ea, + MyHTML_TAG_MPHANTOM = 0x0eb, + MyHTML_TAG_MROOT = 0x0ec, + MyHTML_TAG_MROW = 0x0ed, + MyHTML_TAG_MS = 0x0ee, + MyHTML_TAG_MSCARRIES = 0x0ef, + MyHTML_TAG_MSCARRY = 0x0f0, + MyHTML_TAG_MSGROUP = 0x0f1, + MyHTML_TAG_MSLINE = 0x0f2, + MyHTML_TAG_MSPACE = 0x0f3, + MyHTML_TAG_MSQRT = 0x0f4, + MyHTML_TAG_MSROW = 0x0f5, + MyHTML_TAG_MSTACK = 0x0f6, + MyHTML_TAG_MSTYLE = 0x0f7, + MyHTML_TAG_MSUB = 0x0f8, + MyHTML_TAG_MSUP = 0x0f9, + MyHTML_TAG_MSUBSUP = 0x0fa, + MyHTML_TAG__END_OF_FILE = 0x0fb, + MyHTML_TAG_FIRST_ENTRY = MyHTML_TAG__TEXT, + MyHTML_TAG_LAST_ENTRY = 0x0fc +}; + +/** + * @struct myhtml statuses + */ +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum myhtml_status { + MyHTML_STATUS_OK = 0x0000, + MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0001, + MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, + MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, + MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, + MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, + MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, + MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, + MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, + MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, + MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, + MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, + MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, + MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, + MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, + MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, + MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, + MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, + MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, + MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, + MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, + MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, + MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 +} +typedef myhtml_status_t; + +#define MYHTML_FAILED(_status_) ((_status_) != MyHTML_STATUS_OK) + +/** + * @struct myhtml namespace + */ +enum myhtml_namespace { + MyHTML_NAMESPACE_UNDEF = 0x00, + MyHTML_NAMESPACE_HTML = 0x01, + MyHTML_NAMESPACE_MATHML = 0x02, + MyHTML_NAMESPACE_SVG = 0x03, + MyHTML_NAMESPACE_XLINK = 0x04, + MyHTML_NAMESPACE_XML = 0x05, + MyHTML_NAMESPACE_XMLNS = 0x06, + + /* MyHTML_NAMESPACE_ANY == MyHTML_NAMESPACE_LAST_ENTRY */ + MyHTML_NAMESPACE_ANY = 0x07, + MyHTML_NAMESPACE_LAST_ENTRY = 0x07 +} +typedef myhtml_namespace_t; + +/** + * @struct myhtml options + */ +enum myhtml_options { + MyHTML_OPTIONS_DEFAULT = 0x00, + MyHTML_OPTIONS_PARSE_MODE_SINGLE = 0x01, + MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE = 0x02, + MyHTML_OPTIONS_PARSE_MODE_SEPARATELY = 0x04 +}; + +/** + * @struct myhtml_tree parse flags + */ +enum myhtml_tree_parse_flags { + MyHTML_TREE_PARSE_FLAGS_CLEAN = 0x000, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE = 0x001, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_PROCESS_TOKEN = 0x003, + MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN = 0x004, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE = 0x008, +} +typedef myhtml_tree_parse_flags_t; + +/** + * @struct myhtml_t MyHTML + * + * Basic structure. Create once for using many times. +*/ +typedef struct myhtml myhtml_t; + +/** + * @struct myhtml_tree_t MyHTML_TREE + * + * Secondary structure. Create once for using many times. + */ +typedef struct myhtml_tree myhtml_tree_t; + +typedef struct myhtml_token_attr myhtml_tree_attr_t; +typedef struct myhtml_tree_node myhtml_tree_node_t; + +/** + * MyHTML_TAG + * + */ +typedef size_t myhtml_tag_id_t; + +typedef struct myhtml_tag_index_node myhtml_tag_index_node_t; +typedef struct myhtml_tag_index_entry myhtml_tag_index_entry_t; +typedef struct myhtml_tag_index myhtml_tag_index_t; + +typedef struct myhtml_tag myhtml_tag_t; + +/** + * MCHAR_ASYNC structures + * + */ +typedef struct mchar_async mchar_async_t; + +/** + * MyHTML_INCOMING structures + * + */ +typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; + +/** + * MyHTML_STRING structures + * + */ +struct myhtml_string { + char* data; + size_t size; + size_t length; + + mchar_async_t *mchar; + size_t node_idx; +} +typedef myhtml_string_t; + +/** + * @struct myhtml_collection_t + */ +struct myhtml_collection { + myhtml_tree_node_t **list; + size_t size; + size_t length; +} +typedef myhtml_collection_t; + +/** + * @struct myhtml_position_t + */ +struct myhtml_position { + size_t begin; + size_t length; +} +typedef myhtml_position_t; + +/** + * @struct myhtml_token_node_t + */ +typedef struct myhtml_token_node myhtml_token_node_t; + +/** + * @struct myhtml_version_t + */ +struct myhtml_version { + int major; + int minor; + int patch; +} +typedef myhtml_version_t; + +// callback functions +typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); +typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); + +/*********************************************************************************** + * + * MyHTML + * + ***********************************************************************************/ + +/** + * Create a MyHTML structure + * + * @return myhtml_t* if successful, otherwise an NULL value. + */ +myhtml_t* +myhtml_create(void); + +/** + * Allocating and Initialization resources for a MyHTML structure + * + * @param[in] myhtml_t* + * @param[in] work options, how many threads will be. + * Default: MyHTML_OPTIONS_PARSE_MODE_SEPARATELY + * + * @param[in] thread count, it depends on the choice of work options + * Default: 1 + * + * @param[in] queue size for a tokens. Dynamically increasing the specified number here. Default: 4096 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status value. + */ +myhtml_status_t +myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, + size_t thread_count, size_t queue_size); + +/** + * Clears queue and threads resources + * + * @param[in] myhtml_t* + */ +void +myhtml_clean(myhtml_t* myhtml); + +/** + * Destroy of a MyHTML structure + * + * @param[in] myhtml_t* + * @return NULL if successful, otherwise an MyHTML structure. + */ +myhtml_t* +myhtml_destroy(myhtml_t* myhtml); + +/** + * Parsing HTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size); + +/** + * Parsing fragment of HTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * Parsing HTML in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size); + +/** + * Parsing fragment of HTML in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] previously created structure myhtml_tree_t* + * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * All input character encoding decode to utf-8 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, + const char* html, size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * Parsing HTML chunk. For end parsing call myhtml_parse_chunk_end function + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); + +/** + * Parsing chunk of fragment HTML. For end parsing call myhtml_parse_chunk_end function + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html,size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * Parsing HTML chunk in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); + +/** + * Parsing chunk of fragment of HTML in Single Mode. + * No matter what was said during initialization MyHTML + * + * @param[in] myhtml_tree_t* + * @param[in] HTML + * @param[in] HTML size + * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 + * @param[in] fragment NAMESPACE. Default: MyHTML_NAMESPACE_HTML if set 0 + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, + myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +/** + * End of parsing HTML chunks + * + * @param[in] myhtml_tree_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_parse_chunk_end(myhtml_tree_t* tree); + +/*********************************************************************************** + * + * MyHTML_TREE + * + ***********************************************************************************/ + +/** + * Create a MyHTML_TREE structure + * + * @return myhtml_tree_t* if successful, otherwise an NULL value. + */ +myhtml_tree_t* +myhtml_tree_create(void); + +/** + * Allocating and Initialization resources for a MyHTML_TREE structure + * + * @param[in] myhtml_tree_t* + * @param[in] workmyhtml_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status + */ +myhtml_status_t +myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); + +/** + * Get Parse Flags of Tree + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_parse_flags_t + */ +myhtml_tree_parse_flags_t +myhtml_tree_parse_flags(myhtml_tree_t* tree); + +/** + * Set Parse Flags for Tree + * See enum myhtml_tree_parse_flags in this file + * + * @example myhtml_tree_parse_flags_set(tree, MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE| + * MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE| + * MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN); + * + * @param[in] myhtml_tree_t* + * @param[in] parse flags. You can combine their + */ +void +myhtml_tree_parse_flags_set(myhtml_tree_t* tree, myhtml_tree_parse_flags_t parse_flags); + +/** + * Clears resources before new parsing + * + * @param[in] myhtml_tree_t* + */ +void +myhtml_tree_clean(myhtml_tree_t* tree); + +/** + * Add child node to node. If children already exists it will be added to the last + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* The node to which we add child node + * @param[in] myhtml_tree_node_t* The node which adds + */ +void +myhtml_tree_node_add_child(myhtml_tree_t* tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); + +/** + * Add a node immediately before the existing node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* add for this node + * @param[in] myhtml_tree_node_t* add this node + */ +void +myhtml_tree_node_insert_before(myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); + +/** + * Add a node immediately after the existing node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* add for this node + * @param[in] myhtml_tree_node_t* add this node + */ +void +myhtml_tree_node_insert_after(myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* root, myhtml_tree_node_t* node); + +/** + * Destroy of a MyHTML_TREE structure + * + * @param[in] myhtml_tree_t* + * + * @return NULL if successful, otherwise an MyHTML_TREE structure + */ +myhtml_tree_t* +myhtml_tree_destroy(myhtml_tree_t* tree); + +/** + * Get myhtml_t* from a myhtml_tree_t* + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_t* if exists, otherwise a NULL value + */ +myhtml_t* +myhtml_tree_get_myhtml(myhtml_tree_t* tree); + +/** + * Get myhtml_tag_t* from a myhtml_tree_t* + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tag_t* if exists, otherwise a NULL value + */ +myhtml_tag_t* +myhtml_tree_get_tag(myhtml_tree_t* tree); + +/** + * Get myhtml_tag_index_t* from a myhtml_tree_t* + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tag_index_t* if exists, otherwise a NULL value + */ +myhtml_tag_index_t* +myhtml_tree_get_tag_index(myhtml_tree_t* tree); + +/** + * Get Tree Document (Root of Tree) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_document(myhtml_tree_t* tree); + +/** + * Get node HTML (Document -> HTML, Root of HTML Document) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_node_html(myhtml_tree_t* tree); + +/** + * Get node HEAD (Document -> HTML -> HEAD) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_node_head(myhtml_tree_t* tree); + +/** + * Get node BODY (Document -> HTML -> BODY) + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_tree_get_node_body(myhtml_tree_t* tree); + +/** + * Get mchar_async_t object + * + * @param[in] myhtml_tree_t* + * + * @return mchar_async_t* if exists, otherwise a NULL value + */ +mchar_async_t* +myhtml_tree_get_mchar(myhtml_tree_t* tree); + +/** + * Get node_id from main thread for mchar_async_t object + * + * @param[in] myhtml_tree_t* + * + * @return size_t, node id + */ +size_t +myhtml_tree_get_mchar_node_id(myhtml_tree_t* tree); + +/** + * Print tree of a node. Print including current node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] file handle, for example use stdout + * @param[in] tab (\t) increment for pretty print, set 0 + */ +void +myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, + FILE* out, size_t inc); + +/** + * Print tree of a node. Print excluding current node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] file handle, for example use stdout + * @param[in] tab (\t) increment for pretty print, set 0 + */ +void +myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, + FILE* out, size_t inc); + +/** + * Print a node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] file handle, for example use stdout + */ +void +myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out); + +/** + * Get first Incoming Buffer + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_incoming_buffer_t* if successful, otherwise a NULL value + */ +myhtml_incoming_buffer_t* +myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); + +/*********************************************************************************** + * + * MyHTML_NODE + * + ***********************************************************************************/ + +/** + * Get first (begin) node of tree + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_first(myhtml_tree_t* tree); + +/** + * Get nodes by tag id + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] tag id + * @param[out] status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, + myhtml_tag_id_t tag_id, myhtml_status_t *status); + +/** + * Get nodes by tag name + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] tag name + * @param[in] tag name length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, + const char* name, size_t length, myhtml_status_t *status); + +/** + * Get nodes by attribute key + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] find key + * @param[in] find key length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, + myhtml_tree_node_t* scope_node, + const char* key, size_t key_len, myhtml_status_t* status); + +/** + * Get nodes by attribute value; exactly equal; like a [foo="bar"] + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; whitespace separated; like a [foo~="bar"] + * + * @example if value="bar" and node attr value="lalala bar bebebe", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; value begins exactly with the string; like a [foo^="bar"] + * + * @example if value="bar" and node attr value="barmumumu", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + + +/** + * Get nodes by attribute value; value ends exactly with the string; like a [foo$="bar"] + * + * @example if value="bar" and node attr value="mumumubar", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; value contains the substring; like a [foo*="bar"] + * + * @example if value="bar" and node attr value="bububarmumu", then this node is found + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] status of this operation, optional + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by attribute value; attribute value is a hyphen-separated list of values beginning; + * like a [foo|="bar"] + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, optional; creates new collection if NULL + * @param[in] myhtml_tree_node_t*, optional; scope node; html if NULL + * @param[in] case-insensitive if true + * @param[in] find in key; if NULL find in all attributes + * @param[in] find in key length; if 0 find in all attributes + * @param[in] find value + * @param[in] find value length + * @param[out] optional; status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, + myhtml_collection_t* collection, + myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +/** + * Get nodes by tag id in node scope + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] node for search tag_id in children nodes + * @param[in] tag_id for search + * @param[out] status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, + myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, + myhtml_status_t *status); + +/** + * Get nodes by tag name in node scope + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_collection_t*, creates new collection if NULL + * @param[in] node for search tag_id in children nodes + * @param[in] tag name + * @param[in] tag name length + * @param[out] status of this operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, + myhtml_tree_node_t *node, const char* html, size_t length, + myhtml_status_t *status); + +/** + * Get next sibling node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_next(myhtml_tree_node_t *node); + +/** + * Get previous sibling node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_prev(myhtml_tree_node_t *node); + +/** + * Get parent node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_parent(myhtml_tree_node_t *node); + +/** + * Get child (first child) of node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_child(myhtml_tree_node_t *node); + +/** + * Get last child of node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise an NULL value + */ +myhtml_tree_node_t* +myhtml_node_last_child(myhtml_tree_node_t *node); + +/** + * Create new node + * + * @param[in] myhtml_tree_t* + * @param[in] tag id, see enum myhtml_tags + * @param[in] enum myhtml_namespace + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_create(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, + enum myhtml_namespace ns); + +/** + * Release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + */ +void +myhtml_node_free(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +/** + * Remove node of tree + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t* if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_remove(myhtml_tree_node_t *node); + +/** + * Remove node of tree and release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + */ +void +myhtml_node_delete(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +/** + * Remove nodes of tree recursively and release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + */ +void +myhtml_node_delete_recursive(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +/** + * The appropriate place for inserting a node. Insertion with validation. + * If try insert node to
node, then node inserted before
node + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_insert_to_appropriate_place(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Append to target node as last child. Insertion without validation. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_append_child(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Append sibling node after target node. Insertion without validation. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_insert_after(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Append sibling node before target node. Insertion without validation. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] insertion node + * + * @return insertion node if successful, otherwise a NULL value + */ +myhtml_tree_node_t* +myhtml_node_insert_before(myhtml_tree_t* tree, myhtml_tree_node_t *target, + myhtml_tree_node_t *node); + +/** + * Add text for a node with convert character encoding. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] text + * @param[in] text length + * @param[in] character encoding + * + * @return myhtml_string_t* if successful, otherwise a NULL value + */ +myhtml_string_t* +myhtml_node_text_set(myhtml_tree_t* tree, myhtml_tree_node_t *node, + const char* text, size_t length, myhtml_encoding_t encoding); + +/** + * Add text for a node with convert character encoding. + * + * @param[in] myhtml_tree_t* + * @param[in] target node + * @param[in] text + * @param[in] text length + * @param[in] character encoding + * + * @return myhtml_string_t* if successful, otherwise a NULL value + */ +myhtml_string_t* +myhtml_node_text_set_with_charef(myhtml_tree_t* tree, myhtml_tree_node_t *node, + const char* text, size_t length, myhtml_encoding_t encoding); + +/** + * Get token node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_token_node_t* + */ +myhtml_token_node_t* +myhtml_node_token(myhtml_tree_node_t *node); + +/** + * Get node namespace + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_namespace_t + */ +myhtml_namespace_t +myhtml_node_namespace(myhtml_tree_node_t *node); + +/** + * Set node namespace + * + * @param[in] myhtml_tree_node_t* + * @param[in] myhtml_namespace_t + */ +void +myhtml_node_namespace_set(myhtml_tree_node_t *node, myhtml_namespace_t ns); + +/** + * Get node tag id + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tag_id_t + */ +myhtml_tag_id_t +myhtml_node_tag_id(myhtml_tree_node_t *node); + +/** + * Node has self-closing flag? + * + * @param[in] myhtml_tree_node_t* + * + * @return true or false (1 or 0) + */ +bool +myhtml_node_is_close_self(myhtml_tree_node_t *node); + +/** + * Get first attribute of a node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_node_attribute_first(myhtml_tree_node_t *node); + +/** + * Get last attribute of a node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_node_attribute_last(myhtml_tree_node_t *node); + +/** + * Get text of a node. Only for a MyHTML_TAG__TEXT or MyHTML_TAG__COMMENT tags + * + * @param[in] myhtml_tree_node_t* + * @param[out] optional, text length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_node_text(myhtml_tree_node_t *node, size_t *length); + +/** + * Get myhtml_string_t object by Tree node + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_node_string(myhtml_tree_node_t *node); + +/** + * Get raw position for Tree Node in Incoming Buffer + * + * @example <[BEGIN]div[LENGTH] attr=lalala> + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t + */ +myhtml_position_t +myhtml_node_raw_pasition(myhtml_tree_node_t *node); + +/** + * Get element position for Tree Node in Incoming Buffer + * + * @example [BEGIN]
[LENGTH] + * + * @param[in] myhtml_tree_node_t* + * + * @return myhtml_tree_node_t + */ +myhtml_position_t +myhtml_node_element_pasition(myhtml_tree_node_t *node); + +/*********************************************************************************** + * + * MyHTML_ATTRIBUTE + * + ***********************************************************************************/ + +/** + * Get next sibling attribute of one node + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_next(myhtml_tree_attr_t *attr); + +/** + * Get previous sibling attribute of one node + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_prev(myhtml_tree_attr_t *attr); + +/** + * Get attribute namespace + * + * @param[in] myhtml_tree_attr_t* + * + * @return enum myhtml_namespace + */ +myhtml_namespace_t +myhtml_attribute_namespace(myhtml_tree_attr_t *attr); + +/** + * Set attribute namespace + * + * @param[in] myhtml_tree_attr_t* + * @param[in] myhtml_namespace_t + */ +void +myhtml_attribute_namespace_set(myhtml_tree_attr_t *attr, myhtml_namespace_t ns); + +/** + * Get attribute key + * + * @param[in] myhtml_tree_attr_t* + * @param[out] optional, name length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_attribute_key(myhtml_tree_attr_t *attr, size_t *length); + +/** + * Get attribute value + * + * @param[in] myhtml_tree_attr_t* + * @param[out] optional, value length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); + +/** + * Get attribute key string + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_attribute_key_string(myhtml_tree_attr_t* attr); + +/** + * Get attribute value string + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_attribute_value_string(myhtml_tree_attr_t* attr); + +/** + * Get attribute by key + * + * @param[in] myhtml_tree_node_t* + * @param[in] attr key name + * @param[in] attr key name length + * + * @return myhtml_tree_attr_t* if exists, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_by_key(myhtml_tree_node_t *node, + const char *key, size_t key_len); + +/** + * Added attribute to tree node + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] attr key name + * @param[in] attr key name length + * @param[in] attr value name + * @param[in] attr value name length + * @param[in] character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * + * @return created myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_add(myhtml_tree_t *tree, myhtml_tree_node_t *node, + const char *key, size_t key_len, + const char *value, size_t value_len, + myhtml_encoding_t encoding); + +/** + * Remove attribute reference. Not release the resources + * + * @param[in] myhtml_tree_node_t* + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_remove(myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); + +/** + * Remove attribute by key reference. Not release the resources + * + * @param[in] myhtml_tree_node_t* + * @param[in] attr key name + * @param[in] attr key name length + * + * @return myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +myhtml_tree_attr_t* +myhtml_attribute_remove_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); + +/** + * Remove attribute and release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_node_t* + * @param[in] myhtml_tree_attr_t* + * + */ +void +myhtml_attribute_delete(myhtml_tree_t *tree, myhtml_tree_node_t *node, + myhtml_tree_attr_t *attr); + +/** + * Release allocated resources + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_tree_attr_t* if successful, otherwise a NULL value + */ +void +myhtml_attribute_free(myhtml_tree_t *tree, myhtml_tree_attr_t *attr); + +/** + * Get raw position for Attribute Key in Incoming Buffer + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_attribute_key_raw_position(myhtml_tree_attr_t *attr); + +/** + * Get raw position for Attribute Value in Incoming Buffer + * + * @param[in] myhtml_tree_attr_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr); + +/*********************************************************************************** + * + * MyHTML_TOKEN_NODE + * + ***********************************************************************************/ + +/** + * Get token node tag id + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_tag_id_t + */ +myhtml_tag_id_t +myhtml_token_node_tag_id(myhtml_token_node_t *token_node); + +/** + * Get raw position for Token Node in Incoming Buffer + * + * @example <[BEGIN]div[LENGTH] attr=lalala> + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_token_node_raw_pasition(myhtml_token_node_t *token_node); + +/** + * Get element position for Token Node in Incoming Buffer + * + * @example [BEGIN]
[LENGTH] + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_position_t + */ +myhtml_position_t +myhtml_token_node_element_pasition(myhtml_token_node_t *token_node); + +/** + * Get first attribute of a token node + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_token_node_attribute_first(myhtml_token_node_t *token_node); + +/** + * Get last attribute of a token node + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_tree_attr_t* if exists, otherwise an NULL value + */ +myhtml_tree_attr_t* +myhtml_token_node_attribute_last(myhtml_token_node_t *token_node); + +/** + * Get text of a token node. Only for a MyHTML_TAG__TEXT or MyHTML_TAG__COMMENT tags + * + * @param[in] myhtml_token_node_t* + * @param[out] optional, text length + * + * @return const char* if exists, otherwise an NULL value + */ +const char* +myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); + +/** + * Get myhtml_string_t object by token node + * + * @param[in] myhtml_token_node_t* + * + * @return myhtml_string_t* if exists, otherwise an NULL value + */ +myhtml_string_t* +myhtml_token_node_string(myhtml_token_node_t *token_node); + +/** + * Token node has self-closing flag? + * + * @param[in] myhtml_tree_node_t* + * + * @return true or false (1 or 0) + */ +bool +myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); + +/** + * Wait for process token all parsing stage. Need if you use thread mode + * + * @param[in] myhtml_token_node_t* + */ +void +myhtml_token_node_wait_for_done(myhtml_token_node_t* node); + +/*********************************************************************************** + * + * MyHTML_TAG + * + ***********************************************************************************/ + +/** + * Get tag name by tag id + * + * @param[in] myhtml_tree_t* + * @param[in] tag id + * @param[out] optional, name length + * + * @return const char* if exists, otherwise a NULL value + */ +const char* +myhtml_tag_name_by_id(myhtml_tree_t* tree, + myhtml_tag_id_t tag_id, size_t *length); + +/** + * Get tag id by name + * + * @param[in] myhtml_tree_t* + * @param[in] tag name + * @param[in] tag name length + * + * @return tag id + */ +myhtml_tag_id_t +myhtml_tag_id_by_name(myhtml_tree_t* tree, + const char *tag_name, size_t length); + +/*********************************************************************************** + * + * MyHTML_TAG_INDEX + * + ***********************************************************************************/ + +/** + * Create tag index structure + * + * @return myhtml_tag_index_t* if successful, otherwise a NULL value + */ +myhtml_tag_index_t* +myhtml_tag_index_create(void); + +/** + * Allocating and Initialization resources for a tag index structure + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status. + */ +myhtml_status_t +myhtml_tag_index_init(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index); + +/** + * Clears tag index + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * + */ +void +myhtml_tag_index_clean(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index); + +/** + * Free allocated resources + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * + * @return NULL if successful, otherwise an myhtml_tag_index_t* structure + */ +myhtml_tag_index_t* +myhtml_tag_index_destroy(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index); + +/** + * Adds myhtml_tree_node_t* to tag index + * + * @param[in] myhtml_tag_t* + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tree_node_t* + * + * @return MyHTML_STATUS_OK if successful, otherwise an error status. + */ +myhtml_status_t +myhtml_tag_index_add(myhtml_tag_t* tag, myhtml_tag_index_t* tag_index, myhtml_tree_node_t* node); + +/** + * Get root tag index. Is the initial entry for a tag. It contains statistics and other items by tag + * + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tag_id_t + * + * @return myhtml_tag_index_entry_t* if successful, otherwise a NULL value. + */ +myhtml_tag_index_entry_t* +myhtml_tag_index_entry(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/** + * Get first index node for tag + * + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tag_id_t + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_first(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/** + * Get last index node for tag + * + * @param[in] myhtml_tag_index_t* + * @param[in] myhtml_tag_id_t + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_last(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/** + * Get next index node for tag, by index node + * + * @param[in] myhtml_tag_index_node_t* + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_next(myhtml_tag_index_node_t *index_node); + +/** + * Get previous index node for tag, by index node + * + * @param[in] myhtml_tag_index_node_t* + * + * @return myhtml_tag_index_node_t* if exists, otherwise a NULL value. + */ +myhtml_tag_index_node_t* +myhtml_tag_index_prev(myhtml_tag_index_node_t *index_node); + +/** + * Get myhtml_tree_node_t* by myhtml_tag_index_node_t* + * + * @param[in] myhtml_tag_index_node_t* + * + * @return myhtml_tree_node_t* if exists, otherwise a NULL value. + */ +myhtml_tree_node_t* +myhtml_tag_index_tree_node(myhtml_tag_index_node_t *index_node); + +/** + * Get count of elements in index by tag id + * + * @param[in] myhtml_tag_index_t* + * @param[in] tag id + * + * @return count of elements + */ +size_t +myhtml_tag_index_entry_count(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +/*********************************************************************************** + * + * MyHTML_COLLECTION + * + ***********************************************************************************/ + +/** + * Create collection + * + * @param[in] list size + * @param[out] optional, status of operation + * + * @return myhtml_collection_t* if successful, otherwise an NULL value + */ +myhtml_collection_t* +myhtml_collection_create(size_t size, myhtml_status_t *status); + +/** + * Clears collection + * + * @param[in] myhtml_collection_t* + */ +void +myhtml_collection_clean(myhtml_collection_t *collection); + +/** + * Destroy allocated resources + * + * @param[in] myhtml_collection_t* + * + * @return NULL if successful, otherwise an myhtml_collection_t* structure + */ +myhtml_collection_t* +myhtml_collection_destroy(myhtml_collection_t *collection); + +/** + * Check size by length and increase if necessary + * + * @param[in] myhtml_collection_t* + * @param[in] need nodes + * @param[in] upto_length: count for up if nodes not exists + * (current length + need + upto_length + 1) + * + * @return NULL if successful, otherwise an myhtml_collection_t* structure + */ +myhtml_status_t +myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); + +/*********************************************************************************** + * + * MyHTML_ENCODING + * + ***********************************************************************************/ + +/** + * Set character encoding for input stream + * + * @param[in] myhtml_tree_t* + * @param[in] Input character encoding + * + */ +void +myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); + +/** + * Get character encoding for current stream + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_encoding_t + */ +myhtml_encoding_t +myhtml_encoding_get(myhtml_tree_t* tree); + +/** + * Convert Unicode Codepoint to UTF-8 + * + * @param[in] Codepoint + * @param[in] Data to set characters. Minimum data length is 1 bytes, maximum is 4 byte + * data length must be always available 4 bytes + * + * @return size character set + */ +size_t +myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); + +/** + * Convert Unicode Codepoint to UTF-16LE + * + * I advise not to use UTF-16! Use UTF-8 and be happy! + * + * @param[in] Codepoint + * @param[in] Data to set characters. Data length is 2 or 4 bytes + * data length must be always available 4 bytes + * + * @return size character set + */ +size_t +myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); + +/** + * Detect character encoding + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * and Russians: windows-1251, koi8-r, iso-8859-5, x-mac-cyrillic, ibm866 + * Other in progress + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Russian character encoding + * + * Now available for detect windows-1251, koi8-r, iso-8859-5, x-mac-cyrillic, ibm866 + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Unicode character encoding + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Unicode character encoding by BOM + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); + +/** + * Detect Unicode character encoding by BOM. Cut BOM if will be found + * + * Now available for detect UTF-8, UTF-16LE, UTF-16BE + * + * @param[in] text + * @param[in] text length + * @param[out] detected encoding + * @param[out] new text position + * @param[out] new size position + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, + const char **new_text, size_t *new_size); + +/** + * Detect encoding by name + * Names like: windows-1258 return MyHTML_ENCODING_WINDOWS_1258 + * cp1251 or windows-1251 return MyHTML_ENCODING_WINDOWS_1251 + * + * See https://encoding.spec.whatwg.org/#names-and-labels + * + * @param[in] name + * @param[in] name length + * @param[out] detected encoding + * + * @return true if encoding found, otherwise false + */ +bool +myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); + +/*********************************************************************************** + * + * MyHTML_STRING + * + ***********************************************************************************/ + +/** + * Init myhtml_string_t structure + * + * @param[in] mchar_async_t*. It can be obtained from myhtml_tree_t object + * (see myhtml_tree_get_mchar function) or create manualy + * For each Tree creates its object, I recommend to use it (myhtml_tree_get_mchar). + * + * @param[in] node_id. For all threads (and Main thread) identifier that is unique. + * if created mchar_async_t object manually you know it, if not then take from the Tree + * (see myhtml_tree_get_mchar_node_id) + * + * @param[in] myhtml_string_t*. It can be obtained from myhtml_tree_node_t object + * (see myhtml_node_string function) or create manualy + * + * @param[in] data size. Set the size you want for char* + * + * @return char* of the size if successful, otherwise a NULL value + */ +char* +myhtml_string_init(mchar_async_t *mchar, size_t node_id, + myhtml_string_t* str, size_t size); + +/** + * Increase the current size for myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] data size. Set the new size you want for myhtml_string_t object + * + * @return char* of the size if successful, otherwise a NULL value + */ +char* +myhtml_string_realloc(myhtml_string_t *str, size_t new_size); + +/** + * Clean myhtml_string_t object. In reality, data length set to 0 + * Equivalently: myhtml_string_length_set(str, 0); + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + */ +void +myhtml_string_clean(myhtml_string_t* str); + +/** + * Clean myhtml_string_t object. Equivalently: memset(str, 0, sizeof(myhtml_string_t)) + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + */ +void +myhtml_string_clean_all(myhtml_string_t* str); + +/** + * Release all resources for myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] call free function for current object or not + * + * @return NULL if destroy_obj set true, otherwise a current myhtml_string_t object + */ +myhtml_string_t* +myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); + +/** + * Get data (char*) from a myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * + * @return char* if exists, otherwise a NULL value + */ +char* +myhtml_string_data(myhtml_string_t *str); + +/** + * Get data length from a myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * + * @return data length + */ +size_t +myhtml_string_length(myhtml_string_t *str); + +/** + * Get data size from a myhtml_string_t object + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * + * @return data size + */ +size_t +myhtml_string_size(myhtml_string_t *str); + +/** + * Set data (char *) for a myhtml_string_t object. + * + * Attention!!! Attention!!! Attention!!! + * + * You can assign only that it has been allocated from functions: + * myhtml_string_data_alloc + * myhtml_string_data_realloc + * or obtained manually created from mchar_async_t object + * + * Attention!!! Do not try set chat* from allocated by malloc or realloc!!! + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] you data to want assign + * + * @return assigned data if successful, otherwise a NULL value + */ +char* +myhtml_string_data_set(myhtml_string_t *str, char *data); + +/** + * Set data size for a myhtml_string_t object. + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] you size to want assign + * + * @return assigned size + */ +size_t +myhtml_string_size_set(myhtml_string_t *str, size_t size); + +/** + * Set data length for a myhtml_string_t object. + * + * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] you length to want assign + * + * @return assigned length + */ +size_t +myhtml_string_length_set(myhtml_string_t *str, size_t length); + +/** + * Allocate data (char*) from a mchar_async_t object + * + * @param[in] mchar_async_t*. See description for myhtml_string_init function + * @param[in] node id. See description for myhtml_string_init function + * @param[in] you size to want assign + * + * @return data if successful, otherwise a NULL value + */ +char* +myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); + +/** + * Allocate data (char*) from a mchar_async_t object + * + * @param[in] mchar_async_t*. See description for myhtml_string_init function + * @param[in] node id. See description for myhtml_string_init function + * @param[in] old data + * @param[in] how much data is copied from the old data to new data + * @param[in] new size + * + * @return data if successful, otherwise a NULL value + */ +char* +myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, + char *data, size_t len_to_copy, size_t size); + +/** + * Release allocated data + * + * @param[in] mchar_async_t*. See description for myhtml_string_init function + * @param[in] node id. See description for myhtml_string_init function + * @param[in] data to release + * + * @return data if successful, otherwise a NULL value + */ +void +myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); + +/*********************************************************************************** + * + * MyHTML_INCOMING + * + * @description + * For example, three buffer: + * 1) Data: "bebebe"; Prev: 0; Next: 2; Size: 6; Length: 6; Offset: 0 + * 2) Data: "lalala-lululu"; Prev: 1; Next: 3; Size: 13; Length: 13; Offset: 6 + * 3) Data: "huy"; Prev: 2; Next: 0; Size: 3; Length: 1; Offset: 19 + * + ***********************************************************************************/ + +/** + * Get Incoming Buffer by position + * + * @param[in] current myhtml_incoming_buffer_t* + * @param[in] begin position + * + * @return myhtml_incoming_buffer_t if successful, otherwise a NULL value + */ +myhtml_incoming_buffer_t* +myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); + +/** + * Get data of Incoming Buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return const char* if successful, otherwise a NULL value + */ +const char* +myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get data length of Incoming Buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get data size of Incoming Buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get data offset of Incoming Buffer. Global position of begin Incoming Buffer. + * See description for MyHTML_INCOMING title + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get Relative Position for Incoming Buffer. + * Incoming Buffer should be prepared by myhtml_incoming_buffer_find_by_position + * + * @param[in] myhtml_incoming_buffer_t* + * @param[in] global begin + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); + +/** + * This function returns number of available data by Incoming Buffer + * Incoming buffer may be incomplete. See myhtml_incoming_buffer_next + * + * @param[in] myhtml_incoming_buffer_t* + * @param[in] global begin + * + * @return size_t + */ +size_t +myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, + size_t relative_begin, size_t length); + +/** + * Get next buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return myhtml_incoming_buffer_t* + */ +myhtml_incoming_buffer_t* +myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); + +/** + * Get prev buffer + * + * @param[in] myhtml_incoming_buffer_t* + * + * @return myhtml_incoming_buffer_t* + */ +myhtml_incoming_buffer_t* +myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); + +/*********************************************************************************** + * + * MyHTML_NAMESPACE + * + ***********************************************************************************/ + +/** + * Get namespace text by namespace type (id) + * + * @param[in] myhtml_namespace_t + * @param[out] optional, length of returned text + * + * @return text if successful, otherwise a NULL value + */ +const char* +myhtml_namespace_name_by_id(myhtml_namespace_t ns, size_t *length); + +/** + * Get namespace type (id) by namespace text + * + * @param[in] const char*, namespace text + * @param[in] size of namespace text + * @param[out] detected namespace type (id) + * + * @return true if detect, otherwise false + */ +bool +myhtml_namespace_id_by_name(const char *name, size_t length, myhtml_namespace_t *ns); + +/*********************************************************************************** + * + * MyHTML_CALLBACK + * + ***********************************************************************************/ + +/** + * Get current callback for tokens before processing + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_token_f + */ +myhtml_callback_token_f +myhtml_callback_before_token_done(myhtml_tree_t* tree); + +/** + * Get current callback for tokens after processing + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_token_f + */ +myhtml_callback_token_f +myhtml_callback_after_token_done(myhtml_tree_t* tree); + +/** + * Set callback for tokens before processing + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_token_f callback function + */ +void +myhtml_callback_before_token_done_set(myhtml_tree_t* tree, myhtml_callback_token_f func, void* ctx); + +/** + * Set callback for tokens after processing + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_token_f callback function + */ +void +myhtml_callback_after_token_done_set(myhtml_tree_t* tree, myhtml_callback_token_f func, void* ctx); + +/** + * Get current callback for tree node after inserted + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_tree_node_f + */ +myhtml_callback_tree_node_f +myhtml_callback_tree_node_insert(myhtml_tree_t* tree); + +/** + * Get current callback for tree node after removed + * + * @param[in] myhtml_tree_t* + * + * @return myhtml_callback_tree_node_f + */ +myhtml_callback_tree_node_f +myhtml_callback_tree_node_remove(myhtml_tree_t* tree); + +/** + * Set callback for tree node after inserted + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * Warning!!! + * If you well access to attributes or text for node and you using thread mode then + * you need wait for token processing done. See myhtml_token_node_wait_for_done + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_tree_node_f callback function + */ +void +myhtml_callback_tree_node_insert_set(myhtml_tree_t* tree, myhtml_callback_tree_node_f func, void* ctx); + +/** + * Set callback for tree node after removed + * + * Warning! + * If you using thread mode parsing then this callback calls from thread (not Main thread) + * If you build MyHTML without thread or using MyHTML_OPTIONS_PARSE_MODE_SINGLE for create myhtml_t object + * then this callback calls from Main thread + * + * Warning!!! + * If you well access to attributes or text for node and you using thread mode then + * you need wait for token processing done. See myhtml_token_node_wait_for_done + * + * @param[in] myhtml_tree_t* + * @param[in] myhtml_callback_tree_node_f callback function + */ +void +myhtml_callback_tree_node_remove_set(myhtml_tree_t* tree, myhtml_callback_tree_node_f func, void* ctx); + +/*********************************************************************************** + * + * MyHTML_UTILS + * + ***********************************************************************************/ + +/** + * Compare two strings ignoring case + * + * @param[in] myhtml_collection_t* + * @param[in] count of add nodes + * + * @return 0 if match, otherwise index of break position + */ +size_t +myhtml_strcasecmp(const char* str1, const char* str2); + +/** + * Compare two strings ignoring case of the first n characters + * + * @param[in] myhtml_collection_t* + * @param[in] count of add nodes + * + * @return 0 if match, otherwise index of break position + */ +size_t +myhtml_strncasecmp(const char* str1, const char* str2, size_t size); + +/*********************************************************************************** + * + * MyHTML_VERSION + * + ***********************************************************************************/ + +/** + * Get current version + * + * @return myhtml_version_t + */ +myhtml_version_t +myhtml_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_api.h */ diff --git a/source/myhtml/api_encoding.h b/source/myhtml/api_encoding.h new file mode 100644 index 0000000..d32aa4a --- /dev/null +++ b/source/myhtml/api_encoding.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_API_ENCODING_H +#define MyHTML_API_ENCODING_H +#pragma once + +#include "myhtml/api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum myhtml_encoding_status { + MyHTML_ENCODING_STATUS_OK = 0x00, + MyHTML_ENCODING_STATUS_ERROR = 0x01, + MyHTML_ENCODING_STATUS_CONTINUE = 0x02, + MyHTML_ENCODING_STATUS_DONE = 0x04 +} +typedef myhtml_encoding_status_t; + +struct myhtml_encoding_result { + unsigned long first; + unsigned long second; + unsigned long third; + unsigned long result; + unsigned long result_aux; + unsigned long flag; +} +typedef myhtml_encoding_result_t; + +typedef myhtml_encoding_status_t +(*myhtml_encoding_custom_f)(unsigned const char byte, myhtml_encoding_result_t *res); + +/*********************************************************************************** + * + * MyHTML_ENCODING + * + ***********************************************************************************/ + +/** + * Clean myhtml_encoding_result_t. Use this function before and after text decode + * + * @param[in] myhtml_encoding_result_t* + */ +void +myhtml_encoding_result_clean(myhtml_encoding_result_t *res); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* api_encoding_h */ diff --git a/source/myhtml/callback.c b/source/myhtml/callback.c new file mode 100644 index 0000000..b26377e --- /dev/null +++ b/source/myhtml/callback.c @@ -0,0 +1,69 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/callback.h" + + +/* callback functions for tokens */ +myhtml_callback_token_f myhtml_callback_before_token_done(myhtml_tree_t *tree) +{ + return tree->callback_before_token; +} + +myhtml_callback_token_f myhtml_callback_after_token_done(myhtml_tree_t *tree) +{ + return tree->callback_after_token; +} + +void myhtml_callback_before_token_done_set(myhtml_tree_t *tree, myhtml_callback_token_f func, void* ctx) +{ + tree->callback_before_token = func; + tree->callback_before_token_ctx = ctx; +} + +void myhtml_callback_after_token_done_set(myhtml_tree_t *tree, myhtml_callback_token_f func, void* ctx) +{ + tree->callback_after_token = func; + tree->callback_after_token_ctx = ctx; +} + +myhtml_callback_tree_node_f myhtml_callback_tree_node_insert(myhtml_tree_t *tree) +{ + return tree->callback_tree_node_insert; +} + +myhtml_callback_tree_node_f myhtml_callback_tree_node_remove(myhtml_tree_t *tree) +{ + return tree->callback_tree_node_remove; +} + +void myhtml_callback_tree_node_insert_set(myhtml_tree_t *tree, myhtml_callback_tree_node_f func, void* ctx) +{ + tree->callback_tree_node_insert = func; + tree->callback_tree_node_insert_ctx = ctx; +} + +void myhtml_callback_tree_node_remove_set(myhtml_tree_t *tree, myhtml_callback_tree_node_f func, void* ctx) +{ + tree->callback_tree_node_remove = func; + tree->callback_tree_node_remove_ctx = ctx; +} + + diff --git a/source/myhtml/callback.h b/source/myhtml/callback.h new file mode 100644 index 0000000..fd6420a --- /dev/null +++ b/source/myhtml/callback.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_CALLBACK_H +#define MyHTML_CALLBACK_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/tree.h" + +/* callback functions */ +myhtml_callback_token_f myhtml_callback_before_token_done(myhtml_tree_t *tree); +myhtml_callback_token_f myhtml_callback_after_token_done(myhtml_tree_t *tree); +void myhtml_callback_before_token_done_set(myhtml_tree_t *tree, myhtml_callback_token_f func, void* ctx); +void myhtml_callback_after_token_done_set(myhtml_tree_t *tree, myhtml_callback_token_f func, void* ctx); + +myhtml_callback_tree_node_f myhtml_callback_tree_node_insert(myhtml_tree_t *tree); +myhtml_callback_tree_node_f myhtml_callback_tree_node_remove(myhtml_tree_t *tree); +void myhtml_callback_tree_node_insert_set(myhtml_tree_t *tree, myhtml_callback_tree_node_f func, void* ctx); +void myhtml_callback_tree_node_remove_set(myhtml_tree_t *tree, myhtml_callback_tree_node_f func, void* ctx); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_CALLBACK_H */ diff --git a/source/myhtml/charef.c b/source/myhtml/charef.c new file mode 100644 index 0000000..5947c11 --- /dev/null +++ b/source/myhtml/charef.c @@ -0,0 +1,153 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/charef.h" +#include "myhtml/charef_resource.h" + +const charef_entry_t * myhtml_charef_find(const char *begin, size_t *offset, size_t size, size_t *data_size) +{ + unsigned const char* u_begin = (unsigned const char*)begin; + size_t pos = (size_t)(*u_begin); + + while (named_character_references[pos].ch) + { + if(named_character_references[pos].ch == u_begin[*offset]) + { + (*offset)++; + + if(named_character_references[pos].next == 0 || *offset >= size) { + if(data_size) + *data_size = named_character_references[pos].codepoints_len; + + return &named_character_references[pos]; + } + + pos = named_character_references[pos].next; + } + else if(u_begin[*offset] > named_character_references[pos].ch) { + pos++; + } + else { + break; + } + } + + if(data_size) + *data_size = named_character_references[pos].codepoints_len; + + return &named_character_references[pos]; +} + +const charef_entry_t * myhtml_charef_get_first_position(const char begin) +{ + return &named_character_references[ (unsigned const char)begin ]; +} + +const charef_entry_t * myhtml_charef_find_by_pos(size_t pos, const char *begin, size_t *offset, size_t size, charef_entry_result_t *result) +{ + unsigned const char* u_begin = (unsigned const char*)begin; + + if(u_begin[*offset] == '&') { + result->is_done = 1; + + if(result->curr_entry->codepoints_len) + return result->curr_entry; + else if(result->last_entry) { + *offset = result->last_offset; + return result->last_entry; + } + + return &named_character_references[0]; + } + + result->is_done = 0; + + while (named_character_references[pos].ch) + { + if(named_character_references[pos].ch == u_begin[*offset]) + { + if(u_begin[*offset] == ';') { + result->is_done = 1; + + result->curr_entry = &named_character_references[pos]; + return result->curr_entry; + } + + (*offset)++; + + if(named_character_references[pos].next == 0) { + result->is_done = 1; + return &named_character_references[pos]; + } + + if(*offset >= size) + { + result->curr_entry = &named_character_references[pos]; + + if(named_character_references[pos].codepoints_len) { + result->last_offset = *offset; + result->last_entry = &named_character_references[pos]; + } + + return result->curr_entry; + } + + if(u_begin[*offset] == '&') { + result->is_done = 1; + result->curr_entry = &named_character_references[pos]; + + if(result->curr_entry->codepoints_len) + return result->curr_entry; + else if(result->last_entry) { + *offset = result->last_offset; + return result->last_entry; + } + + return &named_character_references[0]; + } + + if(named_character_references[pos].codepoints_len) { + result->last_offset = *offset; + result->last_entry = &named_character_references[pos]; + } + + pos = named_character_references[pos].next; + } + else if(u_begin[*offset] > named_character_references[pos].ch) { + pos++; + } + else { + break; + } + } + + result->is_done = 1; + + if(named_character_references[pos].codepoints_len) + return &named_character_references[pos]; + else if(result->last_entry) { + *offset = result->last_offset; + return result->last_entry; + } + + return &named_character_references[pos]; +} + + diff --git a/source/myhtml/charef.h b/source/myhtml/charef.h new file mode 100644 index 0000000..53e3436 --- /dev/null +++ b/source/myhtml/charef.h @@ -0,0 +1,56 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_CHAREF_H +#define MyHTML_CHAREF_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" + +struct charef_entry { + unsigned char ch; + size_t next; + size_t cur_pos; + size_t codepoints[2]; + size_t codepoints_len; +} +typedef charef_entry_t; + +struct charef_entry_result { + const charef_entry_t *curr_entry; + const charef_entry_t *last_entry; + size_t last_offset; + int is_done; +} +typedef charef_entry_result_t; + +const charef_entry_t * myhtml_charef_find(const char *begin, size_t *offset, size_t size, size_t *data_size); +const charef_entry_t * myhtml_charef_find_by_pos(size_t pos, const char *begin, size_t *offset, size_t size, charef_entry_result_t *result); +const charef_entry_t * myhtml_charef_get_first_position(const char begin); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* charef_h */ diff --git a/source/myhtml/charef_resource.h b/source/myhtml/charef_resource.h new file mode 100644 index 0000000..79c2086 --- /dev/null +++ b/source/myhtml/charef_resource.h @@ -0,0 +1,5957 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_CHAREF_RESOURCE_H +#define MyHTML_CHAREF_RESOURCE_H +#pragma once + +static const charef_entry_t named_character_references[] = { + {'\0', 0, 0, {0}, 0},{'\0', 0, 1, {0}, 0},{'\0', 0, 2, {0}, 0}, + {'\0', 0, 3, {0}, 0},{'\0', 0, 4, {0}, 0},{'\0', 0, 5, {0}, 0}, + {'\0', 0, 6, {0}, 0},{'\0', 0, 7, {0}, 0},{'\0', 0, 8, {0}, 0}, + {'\0', 0, 9, {0}, 0},{'\0', 0, 10, {0}, 0},{'\0', 0, 11, {0}, 0}, + {'\0', 0, 12, {0}, 0},{'\0', 0, 13, {0}, 0},{'\0', 0, 14, {0}, 0}, + {'\0', 0, 15, {0}, 0},{'\0', 0, 16, {0}, 0},{'\0', 0, 17, {0}, 0}, + {'\0', 0, 18, {0}, 0},{'\0', 0, 19, {0}, 0},{'\0', 0, 20, {0}, 0}, + {'\0', 0, 21, {0}, 0},{'\0', 0, 22, {0}, 0},{'\0', 0, 23, {0}, 0}, + {'\0', 0, 24, {0}, 0},{'\0', 0, 25, {0}, 0},{'\0', 0, 26, {0}, 0}, + {'\0', 0, 27, {0}, 0},{'\0', 0, 28, {0}, 0},{'\0', 0, 29, {0}, 0}, + {'\0', 0, 30, {0}, 0},{'\0', 0, 31, {0}, 0},{'\0', 0, 32, {0}, 0}, + {'\0', 0, 33, {0}, 0},{'\0', 0, 34, {0}, 0},{'\0', 0, 35, {0}, 0}, + {'\0', 0, 36, {0}, 0},{'\0', 0, 37, {0}, 0},{'\0', 0, 38, {0}, 0}, + {'\0', 0, 39, {0}, 0},{'\0', 0, 40, {0}, 0},{'\0', 0, 41, {0}, 0}, + {'\0', 0, 42, {0}, 0},{'\0', 0, 43, {0}, 0},{'\0', 0, 44, {0}, 0}, + {'\0', 0, 45, {0}, 0},{'\0', 0, 46, {0}, 0},{'\0', 0, 47, {0}, 0}, + {'\0', 0, 48, {0}, 0},{'\0', 0, 49, {0}, 0},{'\0', 0, 50, {0}, 0}, + {'\0', 0, 51, {0}, 0},{'\0', 0, 52, {0}, 0},{'\0', 0, 53, {0}, 0}, + {'\0', 0, 54, {0}, 0},{'\0', 0, 55, {0}, 0},{'\0', 0, 56, {0}, 0}, + {'\0', 0, 57, {0}, 0},{'\0', 0, 58, {0}, 0},{'\0', 0, 59, {0}, 0}, + {'\0', 0, 60, {0}, 0},{'\0', 0, 61, {0}, 0},{'\0', 0, 62, {0}, 0}, + {'\0', 0, 63, {0}, 0},{'\0', 0, 64, {0}, 0},{'A', 257, 65, {0}, 0}, + {'B', 427, 66, {0}, 0},{'C', 536, 67, {0}, 0},{'D', 1001, 68, {0}, 0}, + {'E', 1702, 69, {0}, 0},{'F', 1970, 70, {0}, 0},{'G', 2085, 71, {0}, 0}, + {'H', 2279, 72, {0}, 0},{'I', 2422, 73, {0}, 0},{'J', 2648, 74, {0}, 0}, + {'K', 2698, 75, {0}, 0},{'L', 2755, 76, {0}, 0},{'M', 3555, 77, {0}, 0}, + {'N', 3641, 78, {0}, 0},{'O', 4701, 79, {0}, 0},{'P', 4941, 80, {0}, 0}, + {'Q', 5129, 81, {0}, 0},{'R', 5156, 82, {0}, 0},{'S', 5709, 83, {0}, 0}, + {'T', 6142, 84, {0}, 0},{'U', 6353, 85, {0}, 0},{'V', 6748, 86, {0}, 0}, + {'W', 6904, 87, {0}, 0},{'X', 6942, 88, {0}, 0},{'Y', 6965, 89, {0}, 0}, + {'Z', 7036, 90, {0}, 0},{'\0', 0, 91, {0}, 0},{'\0', 0, 92, {0}, 0}, + {'\0', 0, 93, {0}, 0},{'\0', 0, 94, {0}, 0},{'\0', 0, 95, {0}, 0}, + {'\0', 0, 96, {0}, 0},{'a', 7127, 97, {0}, 0},{'b', 7476, 98, {0}, 0}, + {'c', 8214, 99, {0}, 0},{'d', 8891, 100, {0}, 0},{'e', 9436, 101, {0}, 0}, + {'f', 9869, 102, {0}, 0},{'g', 10104, 103, {0}, 0},{'h', 10454, 104, {0}, 0}, + {'i', 10713, 105, {0}, 0},{'j', 11048, 106, {0}, 0},{'k', 11107, 107, {0}, 0}, + {'l', 11178, 108, {0}, 0},{'m', 12315, 109, {0}, 0},{'n', 12577, 110, {0}, 0}, + {'o', 13611, 111, {0}, 0},{'p', 13957, 112, {0}, 0},{'q', 14382, 113, {0}, 0}, + {'r', 14465, 114, {0}, 0},{'s', 15232, 115, {0}, 0},{'t', 16185, 116, {0}, 0}, + {'u', 16630, 117, {0}, 0},{'v', 17016, 118, {0}, 0},{'w', 17365, 119, {0}, 0}, + {'x', 17437, 120, {0}, 0},{'y', 17618, 121, {0}, 0},{'z', 17688, 122, {0}, 0}, + {'\0', 0, 123, {0}, 0},{'\0', 0, 124, {0}, 0},{'\0', 0, 125, {0}, 0}, + {'\0', 0, 126, {0}, 0},{'\0', 0, 127, {0}, 0},{'\0', 0, 128, {0}, 0}, + {'\0', 0, 129, {0}, 0},{'\0', 0, 130, {0}, 0},{'\0', 0, 131, {0}, 0}, + {'\0', 0, 132, {0}, 0},{'\0', 0, 133, {0}, 0},{'\0', 0, 134, {0}, 0}, + {'\0', 0, 135, {0}, 0},{'\0', 0, 136, {0}, 0},{'\0', 0, 137, {0}, 0}, + {'\0', 0, 138, {0}, 0},{'\0', 0, 139, {0}, 0},{'\0', 0, 140, {0}, 0}, + {'\0', 0, 141, {0}, 0},{'\0', 0, 142, {0}, 0},{'\0', 0, 143, {0}, 0}, + {'\0', 0, 144, {0}, 0},{'\0', 0, 145, {0}, 0},{'\0', 0, 146, {0}, 0}, + {'\0', 0, 147, {0}, 0},{'\0', 0, 148, {0}, 0},{'\0', 0, 149, {0}, 0}, + {'\0', 0, 150, {0}, 0},{'\0', 0, 151, {0}, 0},{'\0', 0, 152, {0}, 0}, + {'\0', 0, 153, {0}, 0},{'\0', 0, 154, {0}, 0},{'\0', 0, 155, {0}, 0}, + {'\0', 0, 156, {0}, 0},{'\0', 0, 157, {0}, 0},{'\0', 0, 158, {0}, 0}, + {'\0', 0, 159, {0}, 0},{'\0', 0, 160, {0}, 0},{'\0', 0, 161, {0}, 0}, + {'\0', 0, 162, {0}, 0},{'\0', 0, 163, {0}, 0},{'\0', 0, 164, {0}, 0}, + {'\0', 0, 165, {0}, 0},{'\0', 0, 166, {0}, 0},{'\0', 0, 167, {0}, 0}, + {'\0', 0, 168, {0}, 0},{'\0', 0, 169, {0}, 0},{'\0', 0, 170, {0}, 0}, + {'\0', 0, 171, {0}, 0},{'\0', 0, 172, {0}, 0},{'\0', 0, 173, {0}, 0}, + {'\0', 0, 174, {0}, 0},{'\0', 0, 175, {0}, 0},{'\0', 0, 176, {0}, 0}, + {'\0', 0, 177, {0}, 0},{'\0', 0, 178, {0}, 0},{'\0', 0, 179, {0}, 0}, + {'\0', 0, 180, {0}, 0},{'\0', 0, 181, {0}, 0},{'\0', 0, 182, {0}, 0}, + {'\0', 0, 183, {0}, 0},{'\0', 0, 184, {0}, 0},{'\0', 0, 185, {0}, 0}, + {'\0', 0, 186, {0}, 0},{'\0', 0, 187, {0}, 0},{'\0', 0, 188, {0}, 0}, + {'\0', 0, 189, {0}, 0},{'\0', 0, 190, {0}, 0},{'\0', 0, 191, {0}, 0}, + {'\0', 0, 192, {0}, 0},{'\0', 0, 193, {0}, 0},{'\0', 0, 194, {0}, 0}, + {'\0', 0, 195, {0}, 0},{'\0', 0, 196, {0}, 0},{'\0', 0, 197, {0}, 0}, + {'\0', 0, 198, {0}, 0},{'\0', 0, 199, {0}, 0},{'\0', 0, 200, {0}, 0}, + {'\0', 0, 201, {0}, 0},{'\0', 0, 202, {0}, 0},{'\0', 0, 203, {0}, 0}, + {'\0', 0, 204, {0}, 0},{'\0', 0, 205, {0}, 0},{'\0', 0, 206, {0}, 0}, + {'\0', 0, 207, {0}, 0},{'\0', 0, 208, {0}, 0},{'\0', 0, 209, {0}, 0}, + {'\0', 0, 210, {0}, 0},{'\0', 0, 211, {0}, 0},{'\0', 0, 212, {0}, 0}, + {'\0', 0, 213, {0}, 0},{'\0', 0, 214, {0}, 0},{'\0', 0, 215, {0}, 0}, + {'\0', 0, 216, {0}, 0},{'\0', 0, 217, {0}, 0},{'\0', 0, 218, {0}, 0}, + {'\0', 0, 219, {0}, 0},{'\0', 0, 220, {0}, 0},{'\0', 0, 221, {0}, 0}, + {'\0', 0, 222, {0}, 0},{'\0', 0, 223, {0}, 0},{'\0', 0, 224, {0}, 0}, + {'\0', 0, 225, {0}, 0},{'\0', 0, 226, {0}, 0},{'\0', 0, 227, {0}, 0}, + {'\0', 0, 228, {0}, 0},{'\0', 0, 229, {0}, 0},{'\0', 0, 230, {0}, 0}, + {'\0', 0, 231, {0}, 0},{'\0', 0, 232, {0}, 0},{'\0', 0, 233, {0}, 0}, + {'\0', 0, 234, {0}, 0},{'\0', 0, 235, {0}, 0},{'\0', 0, 236, {0}, 0}, + {'\0', 0, 237, {0}, 0},{'\0', 0, 238, {0}, 0},{'\0', 0, 239, {0}, 0}, + {'\0', 0, 240, {0}, 0},{'\0', 0, 241, {0}, 0},{'\0', 0, 242, {0}, 0}, + {'\0', 0, 243, {0}, 0},{'\0', 0, 244, {0}, 0},{'\0', 0, 245, {0}, 0}, + {'\0', 0, 246, {0}, 0},{'\0', 0, 247, {0}, 0},{'\0', 0, 248, {0}, 0}, + {'\0', 0, 249, {0}, 0},{'\0', 0, 250, {0}, 0},{'\0', 0, 251, {0}, 0}, + {'\0', 0, 252, {0}, 0},{'\0', 0, 253, {0}, 0},{'\0', 0, 254, {0}, 0}, + {'\0', 0, 255, {0}, 0},{'\0', 0, 256, {0}, 0},{'E', 274, 257, {0}, 0}, + {'M', 282, 258, {0}, 0},{'a', 286, 259, {0}, 0},{'b', 296, 260, {0}, 0}, + {'c', 306, 261, {0}, 0},{'f', 317, 262, {0}, 0},{'g', 321, 263, {0}, 0}, + {'l', 331, 264, {0}, 0},{'m', 339, 265, {0}, 0},{'n', 347, 266, {0}, 0}, + {'o', 351, 267, {0}, 0},{'p', 364, 268, {0}, 0},{'r', 388, 269, {0}, 0}, + {'s', 396, 270, {0}, 0},{'t', 411, 271, {0}, 0},{'u', 421, 272, {0}, 0}, + {'\0', 0, 273, {0}, 0},{'l', 276, 274, {0}, 0},{'\0', 0, 275, {0}, 0}, + {'i', 278, 276, {0}, 0},{'\0', 0, 277, {0}, 0},{'g', 280, 278, {198}, 1}, + {'\0', 0, 279, {0}, 0},{';', 0, 280, {198}, 1},{'\0', 0, 281, {0}, 0}, + {'P', 284, 282, {38}, 1},{'\0', 0, 283, {0}, 0},{';', 0, 284, {38}, 1}, + {'\0', 0, 285, {0}, 0},{'c', 288, 286, {0}, 0},{'\0', 0, 287, {0}, 0}, + {'u', 290, 288, {0}, 0},{'\0', 0, 289, {0}, 0},{'t', 292, 290, {0}, 0}, + {'\0', 0, 291, {0}, 0},{'e', 294, 292, {193}, 1},{'\0', 0, 293, {0}, 0}, + {';', 0, 294, {193}, 1},{'\0', 0, 295, {0}, 0},{'r', 298, 296, {0}, 0}, + {'\0', 0, 297, {0}, 0},{'e', 300, 298, {0}, 0},{'\0', 0, 299, {0}, 0}, + {'v', 302, 300, {0}, 0},{'\0', 0, 301, {0}, 0},{'e', 304, 302, {0}, 0}, + {'\0', 0, 303, {0}, 0},{';', 0, 304, {258}, 1},{'\0', 0, 305, {0}, 0}, + {'i', 309, 306, {0}, 0},{'y', 315, 307, {0}, 0},{'\0', 0, 308, {0}, 0}, + {'r', 311, 309, {0}, 0},{'\0', 0, 310, {0}, 0},{'c', 313, 311, {194}, 1}, + {'\0', 0, 312, {0}, 0},{';', 0, 313, {194}, 1},{'\0', 0, 314, {0}, 0}, + {';', 0, 315, {1040}, 1},{'\0', 0, 316, {0}, 0},{'r', 319, 317, {0}, 0}, + {'\0', 0, 318, {0}, 0},{';', 0, 319, {120068}, 1},{'\0', 0, 320, {0}, 0}, + {'r', 323, 321, {0}, 0},{'\0', 0, 322, {0}, 0},{'a', 325, 323, {0}, 0}, + {'\0', 0, 324, {0}, 0},{'v', 327, 325, {0}, 0},{'\0', 0, 326, {0}, 0}, + {'e', 329, 327, {192}, 1},{'\0', 0, 328, {0}, 0},{';', 0, 329, {192}, 1}, + {'\0', 0, 330, {0}, 0},{'p', 333, 331, {0}, 0},{'\0', 0, 332, {0}, 0}, + {'h', 335, 333, {0}, 0},{'\0', 0, 334, {0}, 0},{'a', 337, 335, {0}, 0}, + {'\0', 0, 336, {0}, 0},{';', 0, 337, {913}, 1},{'\0', 0, 338, {0}, 0}, + {'a', 341, 339, {0}, 0},{'\0', 0, 340, {0}, 0},{'c', 343, 341, {0}, 0}, + {'\0', 0, 342, {0}, 0},{'r', 345, 343, {0}, 0},{'\0', 0, 344, {0}, 0}, + {';', 0, 345, {256}, 1},{'\0', 0, 346, {0}, 0},{'d', 349, 347, {0}, 0}, + {'\0', 0, 348, {0}, 0},{';', 0, 349, {10835}, 1},{'\0', 0, 350, {0}, 0}, + {'g', 354, 351, {0}, 0},{'p', 360, 352, {0}, 0},{'\0', 0, 353, {0}, 0}, + {'o', 356, 354, {0}, 0},{'\0', 0, 355, {0}, 0},{'n', 358, 356, {0}, 0}, + {'\0', 0, 357, {0}, 0},{';', 0, 358, {260}, 1},{'\0', 0, 359, {0}, 0}, + {'f', 362, 360, {0}, 0},{'\0', 0, 361, {0}, 0},{';', 0, 362, {120120}, 1}, + {'\0', 0, 363, {0}, 0},{'p', 366, 364, {0}, 0},{'\0', 0, 365, {0}, 0}, + {'l', 368, 366, {0}, 0},{'\0', 0, 367, {0}, 0},{'y', 370, 368, {0}, 0}, + {'\0', 0, 369, {0}, 0},{'F', 372, 370, {0}, 0},{'\0', 0, 371, {0}, 0}, + {'u', 374, 372, {0}, 0},{'\0', 0, 373, {0}, 0},{'n', 376, 374, {0}, 0}, + {'\0', 0, 375, {0}, 0},{'c', 378, 376, {0}, 0},{'\0', 0, 377, {0}, 0}, + {'t', 380, 378, {0}, 0},{'\0', 0, 379, {0}, 0},{'i', 382, 380, {0}, 0}, + {'\0', 0, 381, {0}, 0},{'o', 384, 382, {0}, 0},{'\0', 0, 383, {0}, 0}, + {'n', 386, 384, {0}, 0},{'\0', 0, 385, {0}, 0},{';', 0, 386, {8289}, 1}, + {'\0', 0, 387, {0}, 0},{'i', 390, 388, {0}, 0},{'\0', 0, 389, {0}, 0}, + {'n', 392, 390, {0}, 0},{'\0', 0, 391, {0}, 0},{'g', 394, 392, {197}, 1}, + {'\0', 0, 393, {0}, 0},{';', 0, 394, {197}, 1},{'\0', 0, 395, {0}, 0}, + {'c', 399, 396, {0}, 0},{'s', 403, 397, {0}, 0},{'\0', 0, 398, {0}, 0}, + {'r', 401, 399, {0}, 0},{'\0', 0, 400, {0}, 0},{';', 0, 401, {119964}, 1}, + {'\0', 0, 402, {0}, 0},{'i', 405, 403, {0}, 0},{'\0', 0, 404, {0}, 0}, + {'g', 407, 405, {0}, 0},{'\0', 0, 406, {0}, 0},{'n', 409, 407, {0}, 0}, + {'\0', 0, 408, {0}, 0},{';', 0, 409, {8788}, 1},{'\0', 0, 410, {0}, 0}, + {'i', 413, 411, {0}, 0},{'\0', 0, 412, {0}, 0},{'l', 415, 413, {0}, 0}, + {'\0', 0, 414, {0}, 0},{'d', 417, 415, {0}, 0},{'\0', 0, 416, {0}, 0}, + {'e', 419, 417, {195}, 1},{'\0', 0, 418, {0}, 0},{';', 0, 419, {195}, 1}, + {'\0', 0, 420, {0}, 0},{'m', 423, 421, {0}, 0},{'\0', 0, 422, {0}, 0}, + {'l', 425, 423, {196}, 1},{'\0', 0, 424, {0}, 0},{';', 0, 425, {196}, 1}, + {'\0', 0, 426, {0}, 0},{'a', 436, 427, {0}, 0},{'c', 464, 428, {0}, 0}, + {'e', 468, 429, {0}, 0},{'f', 502, 430, {0}, 0},{'o', 506, 431, {0}, 0}, + {'r', 512, 432, {0}, 0},{'s', 520, 433, {0}, 0},{'u', 526, 434, {0}, 0}, + {'\0', 0, 435, {0}, 0},{'c', 439, 436, {0}, 0},{'r', 453, 437, {0}, 0}, + {'\0', 0, 438, {0}, 0},{'k', 441, 439, {0}, 0},{'\0', 0, 440, {0}, 0}, + {'s', 443, 441, {0}, 0},{'\0', 0, 442, {0}, 0},{'l', 445, 443, {0}, 0}, + {'\0', 0, 444, {0}, 0},{'a', 447, 445, {0}, 0},{'\0', 0, 446, {0}, 0}, + {'s', 449, 447, {0}, 0},{'\0', 0, 448, {0}, 0},{'h', 451, 449, {0}, 0}, + {'\0', 0, 450, {0}, 0},{';', 0, 451, {8726}, 1},{'\0', 0, 452, {0}, 0}, + {'v', 456, 453, {0}, 0},{'w', 458, 454, {0}, 0},{'\0', 0, 455, {0}, 0}, + {';', 0, 456, {10983}, 1},{'\0', 0, 457, {0}, 0},{'e', 460, 458, {0}, 0}, + {'\0', 0, 459, {0}, 0},{'d', 462, 460, {0}, 0},{'\0', 0, 461, {0}, 0}, + {';', 0, 462, {8966}, 1},{'\0', 0, 463, {0}, 0},{'y', 466, 464, {0}, 0}, + {'\0', 0, 465, {0}, 0},{';', 0, 466, {1041}, 1},{'\0', 0, 467, {0}, 0}, + {'c', 472, 468, {0}, 0},{'r', 482, 469, {0}, 0},{'t', 498, 470, {0}, 0}, + {'\0', 0, 471, {0}, 0},{'a', 474, 472, {0}, 0},{'\0', 0, 473, {0}, 0}, + {'u', 476, 474, {0}, 0},{'\0', 0, 475, {0}, 0},{'s', 478, 476, {0}, 0}, + {'\0', 0, 477, {0}, 0},{'e', 480, 478, {0}, 0},{'\0', 0, 479, {0}, 0}, + {';', 0, 480, {8757}, 1},{'\0', 0, 481, {0}, 0},{'n', 484, 482, {0}, 0}, + {'\0', 0, 483, {0}, 0},{'o', 486, 484, {0}, 0},{'\0', 0, 485, {0}, 0}, + {'u', 488, 486, {0}, 0},{'\0', 0, 487, {0}, 0},{'l', 490, 488, {0}, 0}, + {'\0', 0, 489, {0}, 0},{'l', 492, 490, {0}, 0},{'\0', 0, 491, {0}, 0}, + {'i', 494, 492, {0}, 0},{'\0', 0, 493, {0}, 0},{'s', 496, 494, {0}, 0}, + {'\0', 0, 495, {0}, 0},{';', 0, 496, {8492}, 1},{'\0', 0, 497, {0}, 0}, + {'a', 500, 498, {0}, 0},{'\0', 0, 499, {0}, 0},{';', 0, 500, {914}, 1}, + {'\0', 0, 501, {0}, 0},{'r', 504, 502, {0}, 0},{'\0', 0, 503, {0}, 0}, + {';', 0, 504, {120069}, 1},{'\0', 0, 505, {0}, 0},{'p', 508, 506, {0}, 0}, + {'\0', 0, 507, {0}, 0},{'f', 510, 508, {0}, 0},{'\0', 0, 509, {0}, 0}, + {';', 0, 510, {120121}, 1},{'\0', 0, 511, {0}, 0},{'e', 514, 512, {0}, 0}, + {'\0', 0, 513, {0}, 0},{'v', 516, 514, {0}, 0},{'\0', 0, 515, {0}, 0}, + {'e', 518, 516, {0}, 0},{'\0', 0, 517, {0}, 0},{';', 0, 518, {728}, 1}, + {'\0', 0, 519, {0}, 0},{'c', 522, 520, {0}, 0},{'\0', 0, 521, {0}, 0}, + {'r', 524, 522, {0}, 0},{'\0', 0, 523, {0}, 0},{';', 0, 524, {8492}, 1}, + {'\0', 0, 525, {0}, 0},{'m', 528, 526, {0}, 0},{'\0', 0, 527, {0}, 0}, + {'p', 530, 528, {0}, 0},{'\0', 0, 529, {0}, 0},{'e', 532, 530, {0}, 0}, + {'\0', 0, 531, {0}, 0},{'q', 534, 532, {0}, 0},{'\0', 0, 533, {0}, 0}, + {';', 0, 534, {8782}, 1},{'\0', 0, 535, {0}, 0},{'H', 551, 536, {0}, 0}, + {'O', 557, 537, {0}, 0},{'a', 563, 538, {0}, 0},{'c', 622, 539, {0}, 0}, + {'d', 659, 540, {0}, 0},{'e', 665, 541, {0}, 0},{'f', 692, 542, {0}, 0}, + {'h', 696, 543, {0}, 0},{'i', 700, 544, {0}, 0},{'l', 747, 545, {0}, 0}, + {'o', 841, 546, {0}, 0},{'r', 976, 547, {0}, 0},{'s', 984, 548, {0}, 0}, + {'u', 990, 549, {0}, 0},{'\0', 0, 550, {0}, 0},{'c', 553, 551, {0}, 0}, + {'\0', 0, 552, {0}, 0},{'y', 555, 553, {0}, 0},{'\0', 0, 554, {0}, 0}, + {';', 0, 555, {1063}, 1},{'\0', 0, 556, {0}, 0},{'P', 559, 557, {0}, 0}, + {'\0', 0, 558, {0}, 0},{'Y', 561, 559, {169}, 1},{'\0', 0, 560, {0}, 0}, + {';', 0, 561, {169}, 1},{'\0', 0, 562, {0}, 0},{'c', 567, 563, {0}, 0}, + {'p', 575, 564, {0}, 0},{'y', 612, 565, {0}, 0},{'\0', 0, 566, {0}, 0}, + {'u', 569, 567, {0}, 0},{'\0', 0, 568, {0}, 0},{'t', 571, 569, {0}, 0}, + {'\0', 0, 570, {0}, 0},{'e', 573, 571, {0}, 0},{'\0', 0, 572, {0}, 0}, + {';', 0, 573, {262}, 1},{'\0', 0, 574, {0}, 0},{';', 0, 575, {8914}, 1}, + {'i', 578, 576, {0}, 0},{'\0', 0, 577, {0}, 0},{'t', 580, 578, {0}, 0}, + {'\0', 0, 579, {0}, 0},{'a', 582, 580, {0}, 0},{'\0', 0, 581, {0}, 0}, + {'l', 584, 582, {0}, 0},{'\0', 0, 583, {0}, 0},{'D', 586, 584, {0}, 0}, + {'\0', 0, 585, {0}, 0},{'i', 588, 586, {0}, 0},{'\0', 0, 587, {0}, 0}, + {'f', 590, 588, {0}, 0},{'\0', 0, 589, {0}, 0},{'f', 592, 590, {0}, 0}, + {'\0', 0, 591, {0}, 0},{'e', 594, 592, {0}, 0},{'\0', 0, 593, {0}, 0}, + {'r', 596, 594, {0}, 0},{'\0', 0, 595, {0}, 0},{'e', 598, 596, {0}, 0}, + {'\0', 0, 597, {0}, 0},{'n', 600, 598, {0}, 0},{'\0', 0, 599, {0}, 0}, + {'t', 602, 600, {0}, 0},{'\0', 0, 601, {0}, 0},{'i', 604, 602, {0}, 0}, + {'\0', 0, 603, {0}, 0},{'a', 606, 604, {0}, 0},{'\0', 0, 605, {0}, 0}, + {'l', 608, 606, {0}, 0},{'\0', 0, 607, {0}, 0},{'D', 610, 608, {0}, 0}, + {'\0', 0, 609, {0}, 0},{';', 0, 610, {8517}, 1},{'\0', 0, 611, {0}, 0}, + {'l', 614, 612, {0}, 0},{'\0', 0, 613, {0}, 0},{'e', 616, 614, {0}, 0}, + {'\0', 0, 615, {0}, 0},{'y', 618, 616, {0}, 0},{'\0', 0, 617, {0}, 0}, + {'s', 620, 618, {0}, 0},{'\0', 0, 619, {0}, 0},{';', 0, 620, {8493}, 1}, + {'\0', 0, 621, {0}, 0},{'a', 627, 622, {0}, 0},{'e', 635, 623, {0}, 0}, + {'i', 643, 624, {0}, 0},{'o', 649, 625, {0}, 0},{'\0', 0, 626, {0}, 0}, + {'r', 629, 627, {0}, 0},{'\0', 0, 628, {0}, 0},{'o', 631, 629, {0}, 0}, + {'\0', 0, 630, {0}, 0},{'n', 633, 631, {0}, 0},{'\0', 0, 632, {0}, 0}, + {';', 0, 633, {268}, 1},{'\0', 0, 634, {0}, 0},{'d', 637, 635, {0}, 0}, + {'\0', 0, 636, {0}, 0},{'i', 639, 637, {0}, 0},{'\0', 0, 638, {0}, 0}, + {'l', 641, 639, {199}, 1},{'\0', 0, 640, {0}, 0},{';', 0, 641, {199}, 1}, + {'\0', 0, 642, {0}, 0},{'r', 645, 643, {0}, 0},{'\0', 0, 644, {0}, 0}, + {'c', 647, 645, {0}, 0},{'\0', 0, 646, {0}, 0},{';', 0, 647, {264}, 1}, + {'\0', 0, 648, {0}, 0},{'n', 651, 649, {0}, 0},{'\0', 0, 650, {0}, 0}, + {'i', 653, 651, {0}, 0},{'\0', 0, 652, {0}, 0},{'n', 655, 653, {0}, 0}, + {'\0', 0, 654, {0}, 0},{'t', 657, 655, {0}, 0},{'\0', 0, 656, {0}, 0}, + {';', 0, 657, {8752}, 1},{'\0', 0, 658, {0}, 0},{'o', 661, 659, {0}, 0}, + {'\0', 0, 660, {0}, 0},{'t', 663, 661, {0}, 0},{'\0', 0, 662, {0}, 0}, + {';', 0, 663, {266}, 1},{'\0', 0, 664, {0}, 0},{'d', 668, 665, {0}, 0}, + {'n', 678, 666, {0}, 0},{'\0', 0, 667, {0}, 0},{'i', 670, 668, {0}, 0}, + {'\0', 0, 669, {0}, 0},{'l', 672, 670, {0}, 0},{'\0', 0, 671, {0}, 0}, + {'l', 674, 672, {0}, 0},{'\0', 0, 673, {0}, 0},{'a', 676, 674, {0}, 0}, + {'\0', 0, 675, {0}, 0},{';', 0, 676, {184}, 1},{'\0', 0, 677, {0}, 0}, + {'t', 680, 678, {0}, 0},{'\0', 0, 679, {0}, 0},{'e', 682, 680, {0}, 0}, + {'\0', 0, 681, {0}, 0},{'r', 684, 682, {0}, 0},{'\0', 0, 683, {0}, 0}, + {'D', 686, 684, {0}, 0},{'\0', 0, 685, {0}, 0},{'o', 688, 686, {0}, 0}, + {'\0', 0, 687, {0}, 0},{'t', 690, 688, {0}, 0},{'\0', 0, 689, {0}, 0}, + {';', 0, 690, {183}, 1},{'\0', 0, 691, {0}, 0},{'r', 694, 692, {0}, 0}, + {'\0', 0, 693, {0}, 0},{';', 0, 694, {8493}, 1},{'\0', 0, 695, {0}, 0}, + {'i', 698, 696, {0}, 0},{'\0', 0, 697, {0}, 0},{';', 0, 698, {935}, 1}, + {'\0', 0, 699, {0}, 0},{'r', 702, 700, {0}, 0},{'\0', 0, 701, {0}, 0}, + {'c', 704, 702, {0}, 0},{'\0', 0, 703, {0}, 0},{'l', 706, 704, {0}, 0}, + {'\0', 0, 705, {0}, 0},{'e', 708, 706, {0}, 0},{'\0', 0, 707, {0}, 0}, + {'D', 713, 708, {0}, 0},{'M', 719, 709, {0}, 0},{'P', 729, 710, {0}, 0}, + {'T', 737, 711, {0}, 0},{'\0', 0, 712, {0}, 0},{'o', 715, 713, {0}, 0}, + {'\0', 0, 714, {0}, 0},{'t', 717, 715, {0}, 0},{'\0', 0, 716, {0}, 0}, + {';', 0, 717, {8857}, 1},{'\0', 0, 718, {0}, 0},{'i', 721, 719, {0}, 0}, + {'\0', 0, 720, {0}, 0},{'n', 723, 721, {0}, 0},{'\0', 0, 722, {0}, 0}, + {'u', 725, 723, {0}, 0},{'\0', 0, 724, {0}, 0},{'s', 727, 725, {0}, 0}, + {'\0', 0, 726, {0}, 0},{';', 0, 727, {8854}, 1},{'\0', 0, 728, {0}, 0}, + {'l', 731, 729, {0}, 0},{'\0', 0, 730, {0}, 0},{'u', 733, 731, {0}, 0}, + {'\0', 0, 732, {0}, 0},{'s', 735, 733, {0}, 0},{'\0', 0, 734, {0}, 0}, + {';', 0, 735, {8853}, 1},{'\0', 0, 736, {0}, 0},{'i', 739, 737, {0}, 0}, + {'\0', 0, 738, {0}, 0},{'m', 741, 739, {0}, 0},{'\0', 0, 740, {0}, 0}, + {'e', 743, 741, {0}, 0},{'\0', 0, 742, {0}, 0},{'s', 745, 743, {0}, 0}, + {'\0', 0, 744, {0}, 0},{';', 0, 745, {8855}, 1},{'\0', 0, 746, {0}, 0}, + {'o', 749, 747, {0}, 0},{'\0', 0, 748, {0}, 0},{'c', 752, 749, {0}, 0}, + {'s', 794, 750, {0}, 0},{'\0', 0, 751, {0}, 0},{'k', 754, 752, {0}, 0}, + {'\0', 0, 753, {0}, 0},{'w', 756, 754, {0}, 0},{'\0', 0, 755, {0}, 0}, + {'i', 758, 756, {0}, 0},{'\0', 0, 757, {0}, 0},{'s', 760, 758, {0}, 0}, + {'\0', 0, 759, {0}, 0},{'e', 762, 760, {0}, 0},{'\0', 0, 761, {0}, 0}, + {'C', 764, 762, {0}, 0},{'\0', 0, 763, {0}, 0},{'o', 766, 764, {0}, 0}, + {'\0', 0, 765, {0}, 0},{'n', 768, 766, {0}, 0},{'\0', 0, 767, {0}, 0}, + {'t', 770, 768, {0}, 0},{'\0', 0, 769, {0}, 0},{'o', 772, 770, {0}, 0}, + {'\0', 0, 771, {0}, 0},{'u', 774, 772, {0}, 0},{'\0', 0, 773, {0}, 0}, + {'r', 776, 774, {0}, 0},{'\0', 0, 775, {0}, 0},{'I', 778, 776, {0}, 0}, + {'\0', 0, 777, {0}, 0},{'n', 780, 778, {0}, 0},{'\0', 0, 779, {0}, 0}, + {'t', 782, 780, {0}, 0},{'\0', 0, 781, {0}, 0},{'e', 784, 782, {0}, 0}, + {'\0', 0, 783, {0}, 0},{'g', 786, 784, {0}, 0},{'\0', 0, 785, {0}, 0}, + {'r', 788, 786, {0}, 0},{'\0', 0, 787, {0}, 0},{'a', 790, 788, {0}, 0}, + {'\0', 0, 789, {0}, 0},{'l', 792, 790, {0}, 0},{'\0', 0, 791, {0}, 0}, + {';', 0, 792, {8754}, 1},{'\0', 0, 793, {0}, 0},{'e', 796, 794, {0}, 0}, + {'\0', 0, 795, {0}, 0},{'C', 798, 796, {0}, 0},{'\0', 0, 797, {0}, 0}, + {'u', 800, 798, {0}, 0},{'\0', 0, 799, {0}, 0},{'r', 802, 800, {0}, 0}, + {'\0', 0, 801, {0}, 0},{'l', 804, 802, {0}, 0},{'\0', 0, 803, {0}, 0}, + {'y', 806, 804, {0}, 0},{'\0', 0, 805, {0}, 0},{'D', 809, 806, {0}, 0}, + {'Q', 831, 807, {0}, 0},{'\0', 0, 808, {0}, 0},{'o', 811, 809, {0}, 0}, + {'\0', 0, 810, {0}, 0},{'u', 813, 811, {0}, 0},{'\0', 0, 812, {0}, 0}, + {'b', 815, 813, {0}, 0},{'\0', 0, 814, {0}, 0},{'l', 817, 815, {0}, 0}, + {'\0', 0, 816, {0}, 0},{'e', 819, 817, {0}, 0},{'\0', 0, 818, {0}, 0}, + {'Q', 821, 819, {0}, 0},{'\0', 0, 820, {0}, 0},{'u', 823, 821, {0}, 0}, + {'\0', 0, 822, {0}, 0},{'o', 825, 823, {0}, 0},{'\0', 0, 824, {0}, 0}, + {'t', 827, 825, {0}, 0},{'\0', 0, 826, {0}, 0},{'e', 829, 827, {0}, 0}, + {'\0', 0, 828, {0}, 0},{';', 0, 829, {8221}, 1},{'\0', 0, 830, {0}, 0}, + {'u', 833, 831, {0}, 0},{'\0', 0, 832, {0}, 0},{'o', 835, 833, {0}, 0}, + {'\0', 0, 834, {0}, 0},{'t', 837, 835, {0}, 0},{'\0', 0, 836, {0}, 0}, + {'e', 839, 837, {0}, 0},{'\0', 0, 838, {0}, 0},{';', 0, 839, {8217}, 1}, + {'\0', 0, 840, {0}, 0},{'l', 846, 841, {0}, 0},{'n', 855, 842, {0}, 0}, + {'p', 901, 843, {0}, 0},{'u', 918, 844, {0}, 0},{'\0', 0, 845, {0}, 0}, + {'o', 848, 846, {0}, 0},{'\0', 0, 847, {0}, 0},{'n', 850, 848, {0}, 0}, + {'\0', 0, 849, {0}, 0},{';', 0, 850, {8759}, 1},{'e', 853, 851, {0}, 0}, + {'\0', 0, 852, {0}, 0},{';', 0, 853, {10868}, 1},{'\0', 0, 854, {0}, 0}, + {'g', 859, 855, {0}, 0},{'i', 871, 856, {0}, 0},{'t', 877, 857, {0}, 0}, + {'\0', 0, 858, {0}, 0},{'r', 861, 859, {0}, 0},{'\0', 0, 860, {0}, 0}, + {'u', 863, 861, {0}, 0},{'\0', 0, 862, {0}, 0},{'e', 865, 863, {0}, 0}, + {'\0', 0, 864, {0}, 0},{'n', 867, 865, {0}, 0},{'\0', 0, 866, {0}, 0}, + {'t', 869, 867, {0}, 0},{'\0', 0, 868, {0}, 0},{';', 0, 869, {8801}, 1}, + {'\0', 0, 870, {0}, 0},{'n', 873, 871, {0}, 0},{'\0', 0, 872, {0}, 0}, + {'t', 875, 873, {0}, 0},{'\0', 0, 874, {0}, 0},{';', 0, 875, {8751}, 1}, + {'\0', 0, 876, {0}, 0},{'o', 879, 877, {0}, 0},{'\0', 0, 878, {0}, 0}, + {'u', 881, 879, {0}, 0},{'\0', 0, 880, {0}, 0},{'r', 883, 881, {0}, 0}, + {'\0', 0, 882, {0}, 0},{'I', 885, 883, {0}, 0},{'\0', 0, 884, {0}, 0}, + {'n', 887, 885, {0}, 0},{'\0', 0, 886, {0}, 0},{'t', 889, 887, {0}, 0}, + {'\0', 0, 888, {0}, 0},{'e', 891, 889, {0}, 0},{'\0', 0, 890, {0}, 0}, + {'g', 893, 891, {0}, 0},{'\0', 0, 892, {0}, 0},{'r', 895, 893, {0}, 0}, + {'\0', 0, 894, {0}, 0},{'a', 897, 895, {0}, 0},{'\0', 0, 896, {0}, 0}, + {'l', 899, 897, {0}, 0},{'\0', 0, 898, {0}, 0},{';', 0, 899, {8750}, 1}, + {'\0', 0, 900, {0}, 0},{'f', 904, 901, {0}, 0},{'r', 906, 902, {0}, 0}, + {'\0', 0, 903, {0}, 0},{';', 0, 904, {8450}, 1},{'\0', 0, 905, {0}, 0}, + {'o', 908, 906, {0}, 0},{'\0', 0, 907, {0}, 0},{'d', 910, 908, {0}, 0}, + {'\0', 0, 909, {0}, 0},{'u', 912, 910, {0}, 0},{'\0', 0, 911, {0}, 0}, + {'c', 914, 912, {0}, 0},{'\0', 0, 913, {0}, 0},{'t', 916, 914, {0}, 0}, + {'\0', 0, 915, {0}, 0},{';', 0, 916, {8720}, 1},{'\0', 0, 917, {0}, 0}, + {'n', 920, 918, {0}, 0},{'\0', 0, 919, {0}, 0},{'t', 922, 920, {0}, 0}, + {'\0', 0, 921, {0}, 0},{'e', 924, 922, {0}, 0},{'\0', 0, 923, {0}, 0}, + {'r', 926, 924, {0}, 0},{'\0', 0, 925, {0}, 0},{'C', 928, 926, {0}, 0}, + {'\0', 0, 927, {0}, 0},{'l', 930, 928, {0}, 0},{'\0', 0, 929, {0}, 0}, + {'o', 932, 930, {0}, 0},{'\0', 0, 931, {0}, 0},{'c', 934, 932, {0}, 0}, + {'\0', 0, 933, {0}, 0},{'k', 936, 934, {0}, 0},{'\0', 0, 935, {0}, 0}, + {'w', 938, 936, {0}, 0},{'\0', 0, 937, {0}, 0},{'i', 940, 938, {0}, 0}, + {'\0', 0, 939, {0}, 0},{'s', 942, 940, {0}, 0},{'\0', 0, 941, {0}, 0}, + {'e', 944, 942, {0}, 0},{'\0', 0, 943, {0}, 0},{'C', 946, 944, {0}, 0}, + {'\0', 0, 945, {0}, 0},{'o', 948, 946, {0}, 0},{'\0', 0, 947, {0}, 0}, + {'n', 950, 948, {0}, 0},{'\0', 0, 949, {0}, 0},{'t', 952, 950, {0}, 0}, + {'\0', 0, 951, {0}, 0},{'o', 954, 952, {0}, 0},{'\0', 0, 953, {0}, 0}, + {'u', 956, 954, {0}, 0},{'\0', 0, 955, {0}, 0},{'r', 958, 956, {0}, 0}, + {'\0', 0, 957, {0}, 0},{'I', 960, 958, {0}, 0},{'\0', 0, 959, {0}, 0}, + {'n', 962, 960, {0}, 0},{'\0', 0, 961, {0}, 0},{'t', 964, 962, {0}, 0}, + {'\0', 0, 963, {0}, 0},{'e', 966, 964, {0}, 0},{'\0', 0, 965, {0}, 0}, + {'g', 968, 966, {0}, 0},{'\0', 0, 967, {0}, 0},{'r', 970, 968, {0}, 0}, + {'\0', 0, 969, {0}, 0},{'a', 972, 970, {0}, 0},{'\0', 0, 971, {0}, 0}, + {'l', 974, 972, {0}, 0},{'\0', 0, 973, {0}, 0},{';', 0, 974, {8755}, 1}, + {'\0', 0, 975, {0}, 0},{'o', 978, 976, {0}, 0},{'\0', 0, 977, {0}, 0}, + {'s', 980, 978, {0}, 0},{'\0', 0, 979, {0}, 0},{'s', 982, 980, {0}, 0}, + {'\0', 0, 981, {0}, 0},{';', 0, 982, {10799}, 1},{'\0', 0, 983, {0}, 0}, + {'c', 986, 984, {0}, 0},{'\0', 0, 985, {0}, 0},{'r', 988, 986, {0}, 0}, + {'\0', 0, 987, {0}, 0},{';', 0, 988, {119966}, 1},{'\0', 0, 989, {0}, 0}, + {'p', 992, 990, {0}, 0},{'\0', 0, 991, {0}, 0},{';', 0, 992, {8915}, 1}, + {'C', 995, 993, {0}, 0},{'\0', 0, 994, {0}, 0},{'a', 997, 995, {0}, 0}, + {'\0', 0, 996, {0}, 0},{'p', 999, 997, {0}, 0},{'\0', 0, 998, {0}, 0}, + {';', 0, 999, {8781}, 1},{'\0', 0, 1000, {0}, 0},{'D', 1013, 1001, {0}, 0}, + {'J', 1028, 1002, {0}, 0},{'S', 1034, 1003, {0}, 0},{'Z', 1040, 1004, {0}, 0}, + {'a', 1046, 1005, {0}, 0},{'c', 1068, 1006, {0}, 0},{'e', 1081, 1007, {0}, 0}, + {'f', 1090, 1008, {0}, 0},{'i', 1094, 1009, {0}, 0},{'o', 1204, 1010, {0}, 0}, + {'s', 1687, 1011, {0}, 0},{'\0', 0, 1012, {0}, 0},{';', 0, 1013, {8517}, 1}, + {'o', 1016, 1014, {0}, 0},{'\0', 0, 1015, {0}, 0},{'t', 1018, 1016, {0}, 0}, + {'\0', 0, 1017, {0}, 0},{'r', 1020, 1018, {0}, 0},{'\0', 0, 1019, {0}, 0}, + {'a', 1022, 1020, {0}, 0},{'\0', 0, 1021, {0}, 0},{'h', 1024, 1022, {0}, 0}, + {'\0', 0, 1023, {0}, 0},{'d', 1026, 1024, {0}, 0},{'\0', 0, 1025, {0}, 0}, + {';', 0, 1026, {10513}, 1},{'\0', 0, 1027, {0}, 0},{'c', 1030, 1028, {0}, 0}, + {'\0', 0, 1029, {0}, 0},{'y', 1032, 1030, {0}, 0},{'\0', 0, 1031, {0}, 0}, + {';', 0, 1032, {1026}, 1},{'\0', 0, 1033, {0}, 0},{'c', 1036, 1034, {0}, 0}, + {'\0', 0, 1035, {0}, 0},{'y', 1038, 1036, {0}, 0},{'\0', 0, 1037, {0}, 0}, + {';', 0, 1038, {1029}, 1},{'\0', 0, 1039, {0}, 0},{'c', 1042, 1040, {0}, 0}, + {'\0', 0, 1041, {0}, 0},{'y', 1044, 1042, {0}, 0},{'\0', 0, 1043, {0}, 0}, + {';', 0, 1044, {1039}, 1},{'\0', 0, 1045, {0}, 0},{'g', 1050, 1046, {0}, 0}, + {'r', 1058, 1047, {0}, 0},{'s', 1062, 1048, {0}, 0},{'\0', 0, 1049, {0}, 0}, + {'g', 1052, 1050, {0}, 0},{'\0', 0, 1051, {0}, 0},{'e', 1054, 1052, {0}, 0}, + {'\0', 0, 1053, {0}, 0},{'r', 1056, 1054, {0}, 0},{'\0', 0, 1055, {0}, 0}, + {';', 0, 1056, {8225}, 1},{'\0', 0, 1057, {0}, 0},{'r', 1060, 1058, {0}, 0}, + {'\0', 0, 1059, {0}, 0},{';', 0, 1060, {8609}, 1},{'\0', 0, 1061, {0}, 0}, + {'h', 1064, 1062, {0}, 0},{'\0', 0, 1063, {0}, 0},{'v', 1066, 1064, {0}, 0}, + {'\0', 0, 1065, {0}, 0},{';', 0, 1066, {10980}, 1},{'\0', 0, 1067, {0}, 0}, + {'a', 1071, 1068, {0}, 0},{'y', 1079, 1069, {0}, 0},{'\0', 0, 1070, {0}, 0}, + {'r', 1073, 1071, {0}, 0},{'\0', 0, 1072, {0}, 0},{'o', 1075, 1073, {0}, 0}, + {'\0', 0, 1074, {0}, 0},{'n', 1077, 1075, {0}, 0},{'\0', 0, 1076, {0}, 0}, + {';', 0, 1077, {270}, 1},{'\0', 0, 1078, {0}, 0},{';', 0, 1079, {1044}, 1}, + {'\0', 0, 1080, {0}, 0},{'l', 1083, 1081, {0}, 0},{'\0', 0, 1082, {0}, 0}, + {';', 0, 1083, {8711}, 1},{'t', 1086, 1084, {0}, 0},{'\0', 0, 1085, {0}, 0}, + {'a', 1088, 1086, {0}, 0},{'\0', 0, 1087, {0}, 0},{';', 0, 1088, {916}, 1}, + {'\0', 0, 1089, {0}, 0},{'r', 1092, 1090, {0}, 0},{'\0', 0, 1091, {0}, 0}, + {';', 0, 1092, {120071}, 1},{'\0', 0, 1093, {0}, 0},{'a', 1097, 1094, {0}, 0}, + {'f', 1182, 1095, {0}, 0},{'\0', 0, 1096, {0}, 0},{'c', 1100, 1097, {0}, 0}, + {'m', 1174, 1098, {0}, 0},{'\0', 0, 1099, {0}, 0},{'r', 1102, 1100, {0}, 0}, + {'\0', 0, 1101, {0}, 0},{'i', 1104, 1102, {0}, 0},{'\0', 0, 1103, {0}, 0}, + {'t', 1106, 1104, {0}, 0},{'\0', 0, 1105, {0}, 0},{'i', 1108, 1106, {0}, 0}, + {'\0', 0, 1107, {0}, 0},{'c', 1110, 1108, {0}, 0},{'\0', 0, 1109, {0}, 0}, + {'a', 1112, 1110, {0}, 0},{'\0', 0, 1111, {0}, 0},{'l', 1114, 1112, {0}, 0}, + {'\0', 0, 1113, {0}, 0},{'A', 1119, 1114, {0}, 0},{'D', 1129, 1115, {0}, 0}, + {'G', 1154, 1116, {0}, 0},{'T', 1164, 1117, {0}, 0},{'\0', 0, 1118, {0}, 0}, + {'c', 1121, 1119, {0}, 0},{'\0', 0, 1120, {0}, 0},{'u', 1123, 1121, {0}, 0}, + {'\0', 0, 1122, {0}, 0},{'t', 1125, 1123, {0}, 0},{'\0', 0, 1124, {0}, 0}, + {'e', 1127, 1125, {0}, 0},{'\0', 0, 1126, {0}, 0},{';', 0, 1127, {180}, 1}, + {'\0', 0, 1128, {0}, 0},{'o', 1131, 1129, {0}, 0},{'\0', 0, 1130, {0}, 0}, + {'t', 1134, 1131, {0}, 0},{'u', 1136, 1132, {0}, 0},{'\0', 0, 1133, {0}, 0}, + {';', 0, 1134, {729}, 1},{'\0', 0, 1135, {0}, 0},{'b', 1138, 1136, {0}, 0}, + {'\0', 0, 1137, {0}, 0},{'l', 1140, 1138, {0}, 0},{'\0', 0, 1139, {0}, 0}, + {'e', 1142, 1140, {0}, 0},{'\0', 0, 1141, {0}, 0},{'A', 1144, 1142, {0}, 0}, + {'\0', 0, 1143, {0}, 0},{'c', 1146, 1144, {0}, 0},{'\0', 0, 1145, {0}, 0}, + {'u', 1148, 1146, {0}, 0},{'\0', 0, 1147, {0}, 0},{'t', 1150, 1148, {0}, 0}, + {'\0', 0, 1149, {0}, 0},{'e', 1152, 1150, {0}, 0},{'\0', 0, 1151, {0}, 0}, + {';', 0, 1152, {733}, 1},{'\0', 0, 1153, {0}, 0},{'r', 1156, 1154, {0}, 0}, + {'\0', 0, 1155, {0}, 0},{'a', 1158, 1156, {0}, 0},{'\0', 0, 1157, {0}, 0}, + {'v', 1160, 1158, {0}, 0},{'\0', 0, 1159, {0}, 0},{'e', 1162, 1160, {0}, 0}, + {'\0', 0, 1161, {0}, 0},{';', 0, 1162, {96}, 1},{'\0', 0, 1163, {0}, 0}, + {'i', 1166, 1164, {0}, 0},{'\0', 0, 1165, {0}, 0},{'l', 1168, 1166, {0}, 0}, + {'\0', 0, 1167, {0}, 0},{'d', 1170, 1168, {0}, 0},{'\0', 0, 1169, {0}, 0}, + {'e', 1172, 1170, {0}, 0},{'\0', 0, 1171, {0}, 0},{';', 0, 1172, {732}, 1}, + {'\0', 0, 1173, {0}, 0},{'o', 1176, 1174, {0}, 0},{'\0', 0, 1175, {0}, 0}, + {'n', 1178, 1176, {0}, 0},{'\0', 0, 1177, {0}, 0},{'d', 1180, 1178, {0}, 0}, + {'\0', 0, 1179, {0}, 0},{';', 0, 1180, {8900}, 1},{'\0', 0, 1181, {0}, 0}, + {'f', 1184, 1182, {0}, 0},{'\0', 0, 1183, {0}, 0},{'e', 1186, 1184, {0}, 0}, + {'\0', 0, 1185, {0}, 0},{'r', 1188, 1186, {0}, 0},{'\0', 0, 1187, {0}, 0}, + {'e', 1190, 1188, {0}, 0},{'\0', 0, 1189, {0}, 0},{'n', 1192, 1190, {0}, 0}, + {'\0', 0, 1191, {0}, 0},{'t', 1194, 1192, {0}, 0},{'\0', 0, 1193, {0}, 0}, + {'i', 1196, 1194, {0}, 0},{'\0', 0, 1195, {0}, 0},{'a', 1198, 1196, {0}, 0}, + {'\0', 0, 1197, {0}, 0},{'l', 1200, 1198, {0}, 0},{'\0', 0, 1199, {0}, 0}, + {'D', 1202, 1200, {0}, 0},{'\0', 0, 1201, {0}, 0},{';', 0, 1202, {8518}, 1}, + {'\0', 0, 1203, {0}, 0},{'p', 1209, 1204, {0}, 0},{'t', 1213, 1205, {0}, 0}, + {'u', 1233, 1206, {0}, 0},{'w', 1492, 1207, {0}, 0},{'\0', 0, 1208, {0}, 0}, + {'f', 1211, 1209, {0}, 0},{'\0', 0, 1210, {0}, 0},{';', 0, 1211, {120123}, 1}, + {'\0', 0, 1212, {0}, 0},{';', 0, 1213, {168}, 1},{'D', 1217, 1214, {0}, 0}, + {'E', 1223, 1215, {0}, 0},{'\0', 0, 1216, {0}, 0},{'o', 1219, 1217, {0}, 0}, + {'\0', 0, 1218, {0}, 0},{'t', 1221, 1219, {0}, 0},{'\0', 0, 1220, {0}, 0}, + {';', 0, 1221, {8412}, 1},{'\0', 0, 1222, {0}, 0},{'q', 1225, 1223, {0}, 0}, + {'\0', 0, 1224, {0}, 0},{'u', 1227, 1225, {0}, 0},{'\0', 0, 1226, {0}, 0}, + {'a', 1229, 1227, {0}, 0},{'\0', 0, 1228, {0}, 0},{'l', 1231, 1229, {0}, 0}, + {'\0', 0, 1230, {0}, 0},{';', 0, 1231, {8784}, 1},{'\0', 0, 1232, {0}, 0}, + {'b', 1235, 1233, {0}, 0},{'\0', 0, 1234, {0}, 0},{'l', 1237, 1235, {0}, 0}, + {'\0', 0, 1236, {0}, 0},{'e', 1239, 1237, {0}, 0},{'\0', 0, 1238, {0}, 0}, + {'C', 1246, 1239, {0}, 0},{'D', 1276, 1240, {0}, 0},{'L', 1297, 1241, {0}, 0}, + {'R', 1410, 1242, {0}, 0},{'U', 1437, 1243, {0}, 0},{'V', 1470, 1244, {0}, 0}, + {'\0', 0, 1245, {0}, 0},{'o', 1248, 1246, {0}, 0},{'\0', 0, 1247, {0}, 0}, + {'n', 1250, 1248, {0}, 0},{'\0', 0, 1249, {0}, 0},{'t', 1252, 1250, {0}, 0}, + {'\0', 0, 1251, {0}, 0},{'o', 1254, 1252, {0}, 0},{'\0', 0, 1253, {0}, 0}, + {'u', 1256, 1254, {0}, 0},{'\0', 0, 1255, {0}, 0},{'r', 1258, 1256, {0}, 0}, + {'\0', 0, 1257, {0}, 0},{'I', 1260, 1258, {0}, 0},{'\0', 0, 1259, {0}, 0}, + {'n', 1262, 1260, {0}, 0},{'\0', 0, 1261, {0}, 0},{'t', 1264, 1262, {0}, 0}, + {'\0', 0, 1263, {0}, 0},{'e', 1266, 1264, {0}, 0},{'\0', 0, 1265, {0}, 0}, + {'g', 1268, 1266, {0}, 0},{'\0', 0, 1267, {0}, 0},{'r', 1270, 1268, {0}, 0}, + {'\0', 0, 1269, {0}, 0},{'a', 1272, 1270, {0}, 0},{'\0', 0, 1271, {0}, 0}, + {'l', 1274, 1272, {0}, 0},{'\0', 0, 1273, {0}, 0},{';', 0, 1274, {8751}, 1}, + {'\0', 0, 1275, {0}, 0},{'o', 1278, 1276, {0}, 0},{'\0', 0, 1277, {0}, 0}, + {'t', 1281, 1278, {0}, 0},{'w', 1283, 1279, {0}, 0},{'\0', 0, 1280, {0}, 0}, + {';', 0, 1281, {168}, 1},{'\0', 0, 1282, {0}, 0},{'n', 1285, 1283, {0}, 0}, + {'\0', 0, 1284, {0}, 0},{'A', 1287, 1285, {0}, 0},{'\0', 0, 1286, {0}, 0}, + {'r', 1289, 1287, {0}, 0},{'\0', 0, 1288, {0}, 0},{'r', 1291, 1289, {0}, 0}, + {'\0', 0, 1290, {0}, 0},{'o', 1293, 1291, {0}, 0},{'\0', 0, 1292, {0}, 0}, + {'w', 1295, 1293, {0}, 0},{'\0', 0, 1294, {0}, 0},{';', 0, 1295, {8659}, 1}, + {'\0', 0, 1296, {0}, 0},{'e', 1300, 1297, {0}, 0},{'o', 1344, 1298, {0}, 0}, + {'\0', 0, 1299, {0}, 0},{'f', 1302, 1300, {0}, 0},{'\0', 0, 1301, {0}, 0}, + {'t', 1304, 1302, {0}, 0},{'\0', 0, 1303, {0}, 0},{'A', 1308, 1304, {0}, 0}, + {'R', 1318, 1305, {0}, 0},{'T', 1338, 1306, {0}, 0},{'\0', 0, 1307, {0}, 0}, + {'r', 1310, 1308, {0}, 0},{'\0', 0, 1309, {0}, 0},{'r', 1312, 1310, {0}, 0}, + {'\0', 0, 1311, {0}, 0},{'o', 1314, 1312, {0}, 0},{'\0', 0, 1313, {0}, 0}, + {'w', 1316, 1314, {0}, 0},{'\0', 0, 1315, {0}, 0},{';', 0, 1316, {8656}, 1}, + {'\0', 0, 1317, {0}, 0},{'i', 1320, 1318, {0}, 0},{'\0', 0, 1319, {0}, 0}, + {'g', 1322, 1320, {0}, 0},{'\0', 0, 1321, {0}, 0},{'h', 1324, 1322, {0}, 0}, + {'\0', 0, 1323, {0}, 0},{'t', 1326, 1324, {0}, 0},{'\0', 0, 1325, {0}, 0}, + {'A', 1328, 1326, {0}, 0},{'\0', 0, 1327, {0}, 0},{'r', 1330, 1328, {0}, 0}, + {'\0', 0, 1329, {0}, 0},{'r', 1332, 1330, {0}, 0},{'\0', 0, 1331, {0}, 0}, + {'o', 1334, 1332, {0}, 0},{'\0', 0, 1333, {0}, 0},{'w', 1336, 1334, {0}, 0}, + {'\0', 0, 1335, {0}, 0},{';', 0, 1336, {8660}, 1},{'\0', 0, 1337, {0}, 0}, + {'e', 1340, 1338, {0}, 0},{'\0', 0, 1339, {0}, 0},{'e', 1342, 1340, {0}, 0}, + {'\0', 0, 1341, {0}, 0},{';', 0, 1342, {10980}, 1},{'\0', 0, 1343, {0}, 0}, + {'n', 1346, 1344, {0}, 0},{'\0', 0, 1345, {0}, 0},{'g', 1348, 1346, {0}, 0}, + {'\0', 0, 1347, {0}, 0},{'L', 1351, 1348, {0}, 0},{'R', 1390, 1349, {0}, 0}, + {'\0', 0, 1350, {0}, 0},{'e', 1353, 1351, {0}, 0},{'\0', 0, 1352, {0}, 0}, + {'f', 1355, 1353, {0}, 0},{'\0', 0, 1354, {0}, 0},{'t', 1357, 1355, {0}, 0}, + {'\0', 0, 1356, {0}, 0},{'A', 1360, 1357, {0}, 0},{'R', 1370, 1358, {0}, 0}, + {'\0', 0, 1359, {0}, 0},{'r', 1362, 1360, {0}, 0},{'\0', 0, 1361, {0}, 0}, + {'r', 1364, 1362, {0}, 0},{'\0', 0, 1363, {0}, 0},{'o', 1366, 1364, {0}, 0}, + {'\0', 0, 1365, {0}, 0},{'w', 1368, 1366, {0}, 0},{'\0', 0, 1367, {0}, 0}, + {';', 0, 1368, {10232}, 1},{'\0', 0, 1369, {0}, 0},{'i', 1372, 1370, {0}, 0}, + {'\0', 0, 1371, {0}, 0},{'g', 1374, 1372, {0}, 0},{'\0', 0, 1373, {0}, 0}, + {'h', 1376, 1374, {0}, 0},{'\0', 0, 1375, {0}, 0},{'t', 1378, 1376, {0}, 0}, + {'\0', 0, 1377, {0}, 0},{'A', 1380, 1378, {0}, 0},{'\0', 0, 1379, {0}, 0}, + {'r', 1382, 1380, {0}, 0},{'\0', 0, 1381, {0}, 0},{'r', 1384, 1382, {0}, 0}, + {'\0', 0, 1383, {0}, 0},{'o', 1386, 1384, {0}, 0},{'\0', 0, 1385, {0}, 0}, + {'w', 1388, 1386, {0}, 0},{'\0', 0, 1387, {0}, 0},{';', 0, 1388, {10234}, 1}, + {'\0', 0, 1389, {0}, 0},{'i', 1392, 1390, {0}, 0},{'\0', 0, 1391, {0}, 0}, + {'g', 1394, 1392, {0}, 0},{'\0', 0, 1393, {0}, 0},{'h', 1396, 1394, {0}, 0}, + {'\0', 0, 1395, {0}, 0},{'t', 1398, 1396, {0}, 0},{'\0', 0, 1397, {0}, 0}, + {'A', 1400, 1398, {0}, 0},{'\0', 0, 1399, {0}, 0},{'r', 1402, 1400, {0}, 0}, + {'\0', 0, 1401, {0}, 0},{'r', 1404, 1402, {0}, 0},{'\0', 0, 1403, {0}, 0}, + {'o', 1406, 1404, {0}, 0},{'\0', 0, 1405, {0}, 0},{'w', 1408, 1406, {0}, 0}, + {'\0', 0, 1407, {0}, 0},{';', 0, 1408, {10233}, 1},{'\0', 0, 1409, {0}, 0}, + {'i', 1412, 1410, {0}, 0},{'\0', 0, 1411, {0}, 0},{'g', 1414, 1412, {0}, 0}, + {'\0', 0, 1413, {0}, 0},{'h', 1416, 1414, {0}, 0},{'\0', 0, 1415, {0}, 0}, + {'t', 1418, 1416, {0}, 0},{'\0', 0, 1417, {0}, 0},{'A', 1421, 1418, {0}, 0}, + {'T', 1431, 1419, {0}, 0},{'\0', 0, 1420, {0}, 0},{'r', 1423, 1421, {0}, 0}, + {'\0', 0, 1422, {0}, 0},{'r', 1425, 1423, {0}, 0},{'\0', 0, 1424, {0}, 0}, + {'o', 1427, 1425, {0}, 0},{'\0', 0, 1426, {0}, 0},{'w', 1429, 1427, {0}, 0}, + {'\0', 0, 1428, {0}, 0},{';', 0, 1429, {8658}, 1},{'\0', 0, 1430, {0}, 0}, + {'e', 1433, 1431, {0}, 0},{'\0', 0, 1432, {0}, 0},{'e', 1435, 1433, {0}, 0}, + {'\0', 0, 1434, {0}, 0},{';', 0, 1435, {8872}, 1},{'\0', 0, 1436, {0}, 0}, + {'p', 1439, 1437, {0}, 0},{'\0', 0, 1438, {0}, 0},{'A', 1442, 1439, {0}, 0}, + {'D', 1452, 1440, {0}, 0},{'\0', 0, 1441, {0}, 0},{'r', 1444, 1442, {0}, 0}, + {'\0', 0, 1443, {0}, 0},{'r', 1446, 1444, {0}, 0},{'\0', 0, 1445, {0}, 0}, + {'o', 1448, 1446, {0}, 0},{'\0', 0, 1447, {0}, 0},{'w', 1450, 1448, {0}, 0}, + {'\0', 0, 1449, {0}, 0},{';', 0, 1450, {8657}, 1},{'\0', 0, 1451, {0}, 0}, + {'o', 1454, 1452, {0}, 0},{'\0', 0, 1453, {0}, 0},{'w', 1456, 1454, {0}, 0}, + {'\0', 0, 1455, {0}, 0},{'n', 1458, 1456, {0}, 0},{'\0', 0, 1457, {0}, 0}, + {'A', 1460, 1458, {0}, 0},{'\0', 0, 1459, {0}, 0},{'r', 1462, 1460, {0}, 0}, + {'\0', 0, 1461, {0}, 0},{'r', 1464, 1462, {0}, 0},{'\0', 0, 1463, {0}, 0}, + {'o', 1466, 1464, {0}, 0},{'\0', 0, 1465, {0}, 0},{'w', 1468, 1466, {0}, 0}, + {'\0', 0, 1467, {0}, 0},{';', 0, 1468, {8661}, 1},{'\0', 0, 1469, {0}, 0}, + {'e', 1472, 1470, {0}, 0},{'\0', 0, 1471, {0}, 0},{'r', 1474, 1472, {0}, 0}, + {'\0', 0, 1473, {0}, 0},{'t', 1476, 1474, {0}, 0},{'\0', 0, 1475, {0}, 0}, + {'i', 1478, 1476, {0}, 0},{'\0', 0, 1477, {0}, 0},{'c', 1480, 1478, {0}, 0}, + {'\0', 0, 1479, {0}, 0},{'a', 1482, 1480, {0}, 0},{'\0', 0, 1481, {0}, 0}, + {'l', 1484, 1482, {0}, 0},{'\0', 0, 1483, {0}, 0},{'B', 1486, 1484, {0}, 0}, + {'\0', 0, 1485, {0}, 0},{'a', 1488, 1486, {0}, 0},{'\0', 0, 1487, {0}, 0}, + {'r', 1490, 1488, {0}, 0},{'\0', 0, 1489, {0}, 0},{';', 0, 1490, {8741}, 1}, + {'\0', 0, 1491, {0}, 0},{'n', 1494, 1492, {0}, 0},{'\0', 0, 1493, {0}, 0}, + {'A', 1501, 1494, {0}, 0},{'B', 1533, 1495, {0}, 0},{'L', 1543, 1496, {0}, 0}, + {'R', 1612, 1497, {0}, 0},{'T', 1660, 1498, {0}, 0},{'a', 1677, 1499, {0}, 0}, + {'\0', 0, 1500, {0}, 0},{'r', 1503, 1501, {0}, 0},{'\0', 0, 1502, {0}, 0}, + {'r', 1505, 1503, {0}, 0},{'\0', 0, 1504, {0}, 0},{'o', 1507, 1505, {0}, 0}, + {'\0', 0, 1506, {0}, 0},{'w', 1509, 1507, {0}, 0},{'\0', 0, 1508, {0}, 0}, + {';', 0, 1509, {8595}, 1},{'B', 1513, 1510, {0}, 0},{'U', 1519, 1511, {0}, 0}, + {'\0', 0, 1512, {0}, 0},{'a', 1515, 1513, {0}, 0},{'\0', 0, 1514, {0}, 0}, + {'r', 1517, 1515, {0}, 0},{'\0', 0, 1516, {0}, 0},{';', 0, 1517, {10515}, 1}, + {'\0', 0, 1518, {0}, 0},{'p', 1521, 1519, {0}, 0},{'\0', 0, 1520, {0}, 0}, + {'A', 1523, 1521, {0}, 0},{'\0', 0, 1522, {0}, 0},{'r', 1525, 1523, {0}, 0}, + {'\0', 0, 1524, {0}, 0},{'r', 1527, 1525, {0}, 0},{'\0', 0, 1526, {0}, 0}, + {'o', 1529, 1527, {0}, 0},{'\0', 0, 1528, {0}, 0},{'w', 1531, 1529, {0}, 0}, + {'\0', 0, 1530, {0}, 0},{';', 0, 1531, {8693}, 1},{'\0', 0, 1532, {0}, 0}, + {'r', 1535, 1533, {0}, 0},{'\0', 0, 1534, {0}, 0},{'e', 1537, 1535, {0}, 0}, + {'\0', 0, 1536, {0}, 0},{'v', 1539, 1537, {0}, 0},{'\0', 0, 1538, {0}, 0}, + {'e', 1541, 1539, {0}, 0},{'\0', 0, 1540, {0}, 0},{';', 0, 1541, {785}, 1}, + {'\0', 0, 1542, {0}, 0},{'e', 1545, 1543, {0}, 0},{'\0', 0, 1544, {0}, 0}, + {'f', 1547, 1545, {0}, 0},{'\0', 0, 1546, {0}, 0},{'t', 1549, 1547, {0}, 0}, + {'\0', 0, 1548, {0}, 0},{'R', 1553, 1549, {0}, 0},{'T', 1575, 1550, {0}, 0}, + {'V', 1593, 1551, {0}, 0},{'\0', 0, 1552, {0}, 0},{'i', 1555, 1553, {0}, 0}, + {'\0', 0, 1554, {0}, 0},{'g', 1557, 1555, {0}, 0},{'\0', 0, 1556, {0}, 0}, + {'h', 1559, 1557, {0}, 0},{'\0', 0, 1558, {0}, 0},{'t', 1561, 1559, {0}, 0}, + {'\0', 0, 1560, {0}, 0},{'V', 1563, 1561, {0}, 0},{'\0', 0, 1562, {0}, 0}, + {'e', 1565, 1563, {0}, 0},{'\0', 0, 1564, {0}, 0},{'c', 1567, 1565, {0}, 0}, + {'\0', 0, 1566, {0}, 0},{'t', 1569, 1567, {0}, 0},{'\0', 0, 1568, {0}, 0}, + {'o', 1571, 1569, {0}, 0},{'\0', 0, 1570, {0}, 0},{'r', 1573, 1571, {0}, 0}, + {'\0', 0, 1572, {0}, 0},{';', 0, 1573, {10576}, 1},{'\0', 0, 1574, {0}, 0}, + {'e', 1577, 1575, {0}, 0},{'\0', 0, 1576, {0}, 0},{'e', 1579, 1577, {0}, 0}, + {'\0', 0, 1578, {0}, 0},{'V', 1581, 1579, {0}, 0},{'\0', 0, 1580, {0}, 0}, + {'e', 1583, 1581, {0}, 0},{'\0', 0, 1582, {0}, 0},{'c', 1585, 1583, {0}, 0}, + {'\0', 0, 1584, {0}, 0},{'t', 1587, 1585, {0}, 0},{'\0', 0, 1586, {0}, 0}, + {'o', 1589, 1587, {0}, 0},{'\0', 0, 1588, {0}, 0},{'r', 1591, 1589, {0}, 0}, + {'\0', 0, 1590, {0}, 0},{';', 0, 1591, {10590}, 1},{'\0', 0, 1592, {0}, 0}, + {'e', 1595, 1593, {0}, 0},{'\0', 0, 1594, {0}, 0},{'c', 1597, 1595, {0}, 0}, + {'\0', 0, 1596, {0}, 0},{'t', 1599, 1597, {0}, 0},{'\0', 0, 1598, {0}, 0}, + {'o', 1601, 1599, {0}, 0},{'\0', 0, 1600, {0}, 0},{'r', 1603, 1601, {0}, 0}, + {'\0', 0, 1602, {0}, 0},{';', 0, 1603, {8637}, 1},{'B', 1606, 1604, {0}, 0}, + {'\0', 0, 1605, {0}, 0},{'a', 1608, 1606, {0}, 0},{'\0', 0, 1607, {0}, 0}, + {'r', 1610, 1608, {0}, 0},{'\0', 0, 1609, {0}, 0},{';', 0, 1610, {10582}, 1}, + {'\0', 0, 1611, {0}, 0},{'i', 1614, 1612, {0}, 0},{'\0', 0, 1613, {0}, 0}, + {'g', 1616, 1614, {0}, 0},{'\0', 0, 1615, {0}, 0},{'h', 1618, 1616, {0}, 0}, + {'\0', 0, 1617, {0}, 0},{'t', 1620, 1618, {0}, 0},{'\0', 0, 1619, {0}, 0}, + {'T', 1623, 1620, {0}, 0},{'V', 1641, 1621, {0}, 0},{'\0', 0, 1622, {0}, 0}, + {'e', 1625, 1623, {0}, 0},{'\0', 0, 1624, {0}, 0},{'e', 1627, 1625, {0}, 0}, + {'\0', 0, 1626, {0}, 0},{'V', 1629, 1627, {0}, 0},{'\0', 0, 1628, {0}, 0}, + {'e', 1631, 1629, {0}, 0},{'\0', 0, 1630, {0}, 0},{'c', 1633, 1631, {0}, 0}, + {'\0', 0, 1632, {0}, 0},{'t', 1635, 1633, {0}, 0},{'\0', 0, 1634, {0}, 0}, + {'o', 1637, 1635, {0}, 0},{'\0', 0, 1636, {0}, 0},{'r', 1639, 1637, {0}, 0}, + {'\0', 0, 1638, {0}, 0},{';', 0, 1639, {10591}, 1},{'\0', 0, 1640, {0}, 0}, + {'e', 1643, 1641, {0}, 0},{'\0', 0, 1642, {0}, 0},{'c', 1645, 1643, {0}, 0}, + {'\0', 0, 1644, {0}, 0},{'t', 1647, 1645, {0}, 0},{'\0', 0, 1646, {0}, 0}, + {'o', 1649, 1647, {0}, 0},{'\0', 0, 1648, {0}, 0},{'r', 1651, 1649, {0}, 0}, + {'\0', 0, 1650, {0}, 0},{';', 0, 1651, {8641}, 1},{'B', 1654, 1652, {0}, 0}, + {'\0', 0, 1653, {0}, 0},{'a', 1656, 1654, {0}, 0},{'\0', 0, 1655, {0}, 0}, + {'r', 1658, 1656, {0}, 0},{'\0', 0, 1657, {0}, 0},{';', 0, 1658, {10583}, 1}, + {'\0', 0, 1659, {0}, 0},{'e', 1662, 1660, {0}, 0},{'\0', 0, 1661, {0}, 0}, + {'e', 1664, 1662, {0}, 0},{'\0', 0, 1663, {0}, 0},{';', 0, 1664, {8868}, 1}, + {'A', 1667, 1665, {0}, 0},{'\0', 0, 1666, {0}, 0},{'r', 1669, 1667, {0}, 0}, + {'\0', 0, 1668, {0}, 0},{'r', 1671, 1669, {0}, 0},{'\0', 0, 1670, {0}, 0}, + {'o', 1673, 1671, {0}, 0},{'\0', 0, 1672, {0}, 0},{'w', 1675, 1673, {0}, 0}, + {'\0', 0, 1674, {0}, 0},{';', 0, 1675, {8615}, 1},{'\0', 0, 1676, {0}, 0}, + {'r', 1679, 1677, {0}, 0},{'\0', 0, 1678, {0}, 0},{'r', 1681, 1679, {0}, 0}, + {'\0', 0, 1680, {0}, 0},{'o', 1683, 1681, {0}, 0},{'\0', 0, 1682, {0}, 0}, + {'w', 1685, 1683, {0}, 0},{'\0', 0, 1684, {0}, 0},{';', 0, 1685, {8659}, 1}, + {'\0', 0, 1686, {0}, 0},{'c', 1690, 1687, {0}, 0},{'t', 1694, 1688, {0}, 0}, + {'\0', 0, 1689, {0}, 0},{'r', 1692, 1690, {0}, 0},{'\0', 0, 1691, {0}, 0}, + {';', 0, 1692, {119967}, 1},{'\0', 0, 1693, {0}, 0},{'r', 1696, 1694, {0}, 0}, + {'\0', 0, 1695, {0}, 0},{'o', 1698, 1696, {0}, 0},{'\0', 0, 1697, {0}, 0}, + {'k', 1700, 1698, {0}, 0},{'\0', 0, 1699, {0}, 0},{';', 0, 1700, {272}, 1}, + {'\0', 0, 1701, {0}, 0},{'N', 1719, 1702, {0}, 0},{'T', 1723, 1703, {0}, 0}, + {'a', 1727, 1704, {0}, 0},{'c', 1737, 1705, {0}, 0},{'d', 1757, 1706, {0}, 0}, + {'f', 1763, 1707, {0}, 0},{'g', 1767, 1708, {0}, 0},{'l', 1777, 1709, {0}, 0}, + {'m', 1789, 1710, {0}, 0},{'o', 1857, 1711, {0}, 0},{'p', 1870, 1712, {0}, 0}, + {'q', 1882, 1713, {0}, 0},{'s', 1918, 1714, {0}, 0},{'t', 1929, 1715, {0}, 0}, + {'u', 1933, 1716, {0}, 0},{'x', 1939, 1717, {0}, 0},{'\0', 0, 1718, {0}, 0}, + {'G', 1721, 1719, {0}, 0},{'\0', 0, 1720, {0}, 0},{';', 0, 1721, {330}, 1}, + {'\0', 0, 1722, {0}, 0},{'H', 1725, 1723, {208}, 1},{'\0', 0, 1724, {0}, 0}, + {';', 0, 1725, {208}, 1},{'\0', 0, 1726, {0}, 0},{'c', 1729, 1727, {0}, 0}, + {'\0', 0, 1728, {0}, 0},{'u', 1731, 1729, {0}, 0},{'\0', 0, 1730, {0}, 0}, + {'t', 1733, 1731, {0}, 0},{'\0', 0, 1732, {0}, 0},{'e', 1735, 1733, {201}, 1}, + {'\0', 0, 1734, {0}, 0},{';', 0, 1735, {201}, 1},{'\0', 0, 1736, {0}, 0}, + {'a', 1741, 1737, {0}, 0},{'i', 1749, 1738, {0}, 0},{'y', 1755, 1739, {0}, 0}, + {'\0', 0, 1740, {0}, 0},{'r', 1743, 1741, {0}, 0},{'\0', 0, 1742, {0}, 0}, + {'o', 1745, 1743, {0}, 0},{'\0', 0, 1744, {0}, 0},{'n', 1747, 1745, {0}, 0}, + {'\0', 0, 1746, {0}, 0},{';', 0, 1747, {282}, 1},{'\0', 0, 1748, {0}, 0}, + {'r', 1751, 1749, {0}, 0},{'\0', 0, 1750, {0}, 0},{'c', 1753, 1751, {202}, 1}, + {'\0', 0, 1752, {0}, 0},{';', 0, 1753, {202}, 1},{'\0', 0, 1754, {0}, 0}, + {';', 0, 1755, {1069}, 1},{'\0', 0, 1756, {0}, 0},{'o', 1759, 1757, {0}, 0}, + {'\0', 0, 1758, {0}, 0},{'t', 1761, 1759, {0}, 0},{'\0', 0, 1760, {0}, 0}, + {';', 0, 1761, {278}, 1},{'\0', 0, 1762, {0}, 0},{'r', 1765, 1763, {0}, 0}, + {'\0', 0, 1764, {0}, 0},{';', 0, 1765, {120072}, 1},{'\0', 0, 1766, {0}, 0}, + {'r', 1769, 1767, {0}, 0},{'\0', 0, 1768, {0}, 0},{'a', 1771, 1769, {0}, 0}, + {'\0', 0, 1770, {0}, 0},{'v', 1773, 1771, {0}, 0},{'\0', 0, 1772, {0}, 0}, + {'e', 1775, 1773, {200}, 1},{'\0', 0, 1774, {0}, 0},{';', 0, 1775, {200}, 1}, + {'\0', 0, 1776, {0}, 0},{'e', 1779, 1777, {0}, 0},{'\0', 0, 1778, {0}, 0}, + {'m', 1781, 1779, {0}, 0},{'\0', 0, 1780, {0}, 0},{'e', 1783, 1781, {0}, 0}, + {'\0', 0, 1782, {0}, 0},{'n', 1785, 1783, {0}, 0},{'\0', 0, 1784, {0}, 0}, + {'t', 1787, 1785, {0}, 0},{'\0', 0, 1786, {0}, 0},{';', 0, 1787, {8712}, 1}, + {'\0', 0, 1788, {0}, 0},{'a', 1792, 1789, {0}, 0},{'p', 1798, 1790, {0}, 0}, + {'\0', 0, 1791, {0}, 0},{'c', 1794, 1792, {0}, 0},{'\0', 0, 1793, {0}, 0}, + {'r', 1796, 1794, {0}, 0},{'\0', 0, 1795, {0}, 0},{';', 0, 1796, {274}, 1}, + {'\0', 0, 1797, {0}, 0},{'t', 1800, 1798, {0}, 0},{'\0', 0, 1799, {0}, 0}, + {'y', 1802, 1800, {0}, 0},{'\0', 0, 1801, {0}, 0},{'S', 1805, 1802, {0}, 0}, + {'V', 1827, 1803, {0}, 0},{'\0', 0, 1804, {0}, 0},{'m', 1807, 1805, {0}, 0}, + {'\0', 0, 1806, {0}, 0},{'a', 1809, 1807, {0}, 0},{'\0', 0, 1808, {0}, 0}, + {'l', 1811, 1809, {0}, 0},{'\0', 0, 1810, {0}, 0},{'l', 1813, 1811, {0}, 0}, + {'\0', 0, 1812, {0}, 0},{'S', 1815, 1813, {0}, 0},{'\0', 0, 1814, {0}, 0}, + {'q', 1817, 1815, {0}, 0},{'\0', 0, 1816, {0}, 0},{'u', 1819, 1817, {0}, 0}, + {'\0', 0, 1818, {0}, 0},{'a', 1821, 1819, {0}, 0},{'\0', 0, 1820, {0}, 0}, + {'r', 1823, 1821, {0}, 0},{'\0', 0, 1822, {0}, 0},{'e', 1825, 1823, {0}, 0}, + {'\0', 0, 1824, {0}, 0},{';', 0, 1825, {9723}, 1},{'\0', 0, 1826, {0}, 0}, + {'e', 1829, 1827, {0}, 0},{'\0', 0, 1828, {0}, 0},{'r', 1831, 1829, {0}, 0}, + {'\0', 0, 1830, {0}, 0},{'y', 1833, 1831, {0}, 0},{'\0', 0, 1832, {0}, 0}, + {'S', 1835, 1833, {0}, 0},{'\0', 0, 1834, {0}, 0},{'m', 1837, 1835, {0}, 0}, + {'\0', 0, 1836, {0}, 0},{'a', 1839, 1837, {0}, 0},{'\0', 0, 1838, {0}, 0}, + {'l', 1841, 1839, {0}, 0},{'\0', 0, 1840, {0}, 0},{'l', 1843, 1841, {0}, 0}, + {'\0', 0, 1842, {0}, 0},{'S', 1845, 1843, {0}, 0},{'\0', 0, 1844, {0}, 0}, + {'q', 1847, 1845, {0}, 0},{'\0', 0, 1846, {0}, 0},{'u', 1849, 1847, {0}, 0}, + {'\0', 0, 1848, {0}, 0},{'a', 1851, 1849, {0}, 0},{'\0', 0, 1850, {0}, 0}, + {'r', 1853, 1851, {0}, 0},{'\0', 0, 1852, {0}, 0},{'e', 1855, 1853, {0}, 0}, + {'\0', 0, 1854, {0}, 0},{';', 0, 1855, {9643}, 1},{'\0', 0, 1856, {0}, 0}, + {'g', 1860, 1857, {0}, 0},{'p', 1866, 1858, {0}, 0},{'\0', 0, 1859, {0}, 0}, + {'o', 1862, 1860, {0}, 0},{'\0', 0, 1861, {0}, 0},{'n', 1864, 1862, {0}, 0}, + {'\0', 0, 1863, {0}, 0},{';', 0, 1864, {280}, 1},{'\0', 0, 1865, {0}, 0}, + {'f', 1868, 1866, {0}, 0},{'\0', 0, 1867, {0}, 0},{';', 0, 1868, {120124}, 1}, + {'\0', 0, 1869, {0}, 0},{'s', 1872, 1870, {0}, 0},{'\0', 0, 1871, {0}, 0}, + {'i', 1874, 1872, {0}, 0},{'\0', 0, 1873, {0}, 0},{'l', 1876, 1874, {0}, 0}, + {'\0', 0, 1875, {0}, 0},{'o', 1878, 1876, {0}, 0},{'\0', 0, 1877, {0}, 0}, + {'n', 1880, 1878, {0}, 0},{'\0', 0, 1879, {0}, 0},{';', 0, 1880, {917}, 1}, + {'\0', 0, 1881, {0}, 0},{'u', 1884, 1882, {0}, 0},{'\0', 0, 1883, {0}, 0}, + {'a', 1887, 1884, {0}, 0},{'i', 1902, 1885, {0}, 0},{'\0', 0, 1886, {0}, 0}, + {'l', 1889, 1887, {0}, 0},{'\0', 0, 1888, {0}, 0},{';', 0, 1889, {10869}, 1}, + {'T', 1892, 1890, {0}, 0},{'\0', 0, 1891, {0}, 0},{'i', 1894, 1892, {0}, 0}, + {'\0', 0, 1893, {0}, 0},{'l', 1896, 1894, {0}, 0},{'\0', 0, 1895, {0}, 0}, + {'d', 1898, 1896, {0}, 0},{'\0', 0, 1897, {0}, 0},{'e', 1900, 1898, {0}, 0}, + {'\0', 0, 1899, {0}, 0},{';', 0, 1900, {8770}, 1},{'\0', 0, 1901, {0}, 0}, + {'l', 1904, 1902, {0}, 0},{'\0', 0, 1903, {0}, 0},{'i', 1906, 1904, {0}, 0}, + {'\0', 0, 1905, {0}, 0},{'b', 1908, 1906, {0}, 0},{'\0', 0, 1907, {0}, 0}, + {'r', 1910, 1908, {0}, 0},{'\0', 0, 1909, {0}, 0},{'i', 1912, 1910, {0}, 0}, + {'\0', 0, 1911, {0}, 0},{'u', 1914, 1912, {0}, 0},{'\0', 0, 1913, {0}, 0}, + {'m', 1916, 1914, {0}, 0},{'\0', 0, 1915, {0}, 0},{';', 0, 1916, {8652}, 1}, + {'\0', 0, 1917, {0}, 0},{'c', 1921, 1918, {0}, 0},{'i', 1925, 1919, {0}, 0}, + {'\0', 0, 1920, {0}, 0},{'r', 1923, 1921, {0}, 0},{'\0', 0, 1922, {0}, 0}, + {';', 0, 1923, {8496}, 1},{'\0', 0, 1924, {0}, 0},{'m', 1927, 1925, {0}, 0}, + {'\0', 0, 1926, {0}, 0},{';', 0, 1927, {10867}, 1},{'\0', 0, 1928, {0}, 0}, + {'a', 1931, 1929, {0}, 0},{'\0', 0, 1930, {0}, 0},{';', 0, 1931, {919}, 1}, + {'\0', 0, 1932, {0}, 0},{'m', 1935, 1933, {0}, 0},{'\0', 0, 1934, {0}, 0}, + {'l', 1937, 1935, {203}, 1},{'\0', 0, 1936, {0}, 0},{';', 0, 1937, {203}, 1}, + {'\0', 0, 1938, {0}, 0},{'i', 1942, 1939, {0}, 0},{'p', 1950, 1940, {0}, 0}, + {'\0', 0, 1941, {0}, 0},{'s', 1944, 1942, {0}, 0},{'\0', 0, 1943, {0}, 0}, + {'t', 1946, 1944, {0}, 0},{'\0', 0, 1945, {0}, 0},{'s', 1948, 1946, {0}, 0}, + {'\0', 0, 1947, {0}, 0},{';', 0, 1948, {8707}, 1},{'\0', 0, 1949, {0}, 0}, + {'o', 1952, 1950, {0}, 0},{'\0', 0, 1951, {0}, 0},{'n', 1954, 1952, {0}, 0}, + {'\0', 0, 1953, {0}, 0},{'e', 1956, 1954, {0}, 0},{'\0', 0, 1955, {0}, 0}, + {'n', 1958, 1956, {0}, 0},{'\0', 0, 1957, {0}, 0},{'t', 1960, 1958, {0}, 0}, + {'\0', 0, 1959, {0}, 0},{'i', 1962, 1960, {0}, 0},{'\0', 0, 1961, {0}, 0}, + {'a', 1964, 1962, {0}, 0},{'\0', 0, 1963, {0}, 0},{'l', 1966, 1964, {0}, 0}, + {'\0', 0, 1965, {0}, 0},{'E', 1968, 1966, {0}, 0},{'\0', 0, 1967, {0}, 0}, + {';', 0, 1968, {8519}, 1},{'\0', 0, 1969, {0}, 0},{'c', 1976, 1970, {0}, 0}, + {'f', 1980, 1971, {0}, 0},{'i', 1984, 1972, {0}, 0},{'o', 2047, 1973, {0}, 0}, + {'s', 2079, 1974, {0}, 0},{'\0', 0, 1975, {0}, 0},{'y', 1978, 1976, {0}, 0}, + {'\0', 0, 1977, {0}, 0},{';', 0, 1978, {1060}, 1},{'\0', 0, 1979, {0}, 0}, + {'r', 1982, 1980, {0}, 0},{'\0', 0, 1981, {0}, 0},{';', 0, 1982, {120073}, 1}, + {'\0', 0, 1983, {0}, 0},{'l', 1986, 1984, {0}, 0},{'\0', 0, 1985, {0}, 0}, + {'l', 1988, 1986, {0}, 0},{'\0', 0, 1987, {0}, 0},{'e', 1990, 1988, {0}, 0}, + {'\0', 0, 1989, {0}, 0},{'d', 1992, 1990, {0}, 0},{'\0', 0, 1991, {0}, 0}, + {'S', 1995, 1992, {0}, 0},{'V', 2017, 1993, {0}, 0},{'\0', 0, 1994, {0}, 0}, + {'m', 1997, 1995, {0}, 0},{'\0', 0, 1996, {0}, 0},{'a', 1999, 1997, {0}, 0}, + {'\0', 0, 1998, {0}, 0},{'l', 2001, 1999, {0}, 0},{'\0', 0, 2000, {0}, 0}, + {'l', 2003, 2001, {0}, 0},{'\0', 0, 2002, {0}, 0},{'S', 2005, 2003, {0}, 0}, + {'\0', 0, 2004, {0}, 0},{'q', 2007, 2005, {0}, 0},{'\0', 0, 2006, {0}, 0}, + {'u', 2009, 2007, {0}, 0},{'\0', 0, 2008, {0}, 0},{'a', 2011, 2009, {0}, 0}, + {'\0', 0, 2010, {0}, 0},{'r', 2013, 2011, {0}, 0},{'\0', 0, 2012, {0}, 0}, + {'e', 2015, 2013, {0}, 0},{'\0', 0, 2014, {0}, 0},{';', 0, 2015, {9724}, 1}, + {'\0', 0, 2016, {0}, 0},{'e', 2019, 2017, {0}, 0},{'\0', 0, 2018, {0}, 0}, + {'r', 2021, 2019, {0}, 0},{'\0', 0, 2020, {0}, 0},{'y', 2023, 2021, {0}, 0}, + {'\0', 0, 2022, {0}, 0},{'S', 2025, 2023, {0}, 0},{'\0', 0, 2024, {0}, 0}, + {'m', 2027, 2025, {0}, 0},{'\0', 0, 2026, {0}, 0},{'a', 2029, 2027, {0}, 0}, + {'\0', 0, 2028, {0}, 0},{'l', 2031, 2029, {0}, 0},{'\0', 0, 2030, {0}, 0}, + {'l', 2033, 2031, {0}, 0},{'\0', 0, 2032, {0}, 0},{'S', 2035, 2033, {0}, 0}, + {'\0', 0, 2034, {0}, 0},{'q', 2037, 2035, {0}, 0},{'\0', 0, 2036, {0}, 0}, + {'u', 2039, 2037, {0}, 0},{'\0', 0, 2038, {0}, 0},{'a', 2041, 2039, {0}, 0}, + {'\0', 0, 2040, {0}, 0},{'r', 2043, 2041, {0}, 0},{'\0', 0, 2042, {0}, 0}, + {'e', 2045, 2043, {0}, 0},{'\0', 0, 2044, {0}, 0},{';', 0, 2045, {9642}, 1}, + {'\0', 0, 2046, {0}, 0},{'p', 2051, 2047, {0}, 0},{'r', 2055, 2048, {0}, 0}, + {'u', 2063, 2049, {0}, 0},{'\0', 0, 2050, {0}, 0},{'f', 2053, 2051, {0}, 0}, + {'\0', 0, 2052, {0}, 0},{';', 0, 2053, {120125}, 1},{'\0', 0, 2054, {0}, 0}, + {'A', 2057, 2055, {0}, 0},{'\0', 0, 2056, {0}, 0},{'l', 2059, 2057, {0}, 0}, + {'\0', 0, 2058, {0}, 0},{'l', 2061, 2059, {0}, 0},{'\0', 0, 2060, {0}, 0}, + {';', 0, 2061, {8704}, 1},{'\0', 0, 2062, {0}, 0},{'r', 2065, 2063, {0}, 0}, + {'\0', 0, 2064, {0}, 0},{'i', 2067, 2065, {0}, 0},{'\0', 0, 2066, {0}, 0}, + {'e', 2069, 2067, {0}, 0},{'\0', 0, 2068, {0}, 0},{'r', 2071, 2069, {0}, 0}, + {'\0', 0, 2070, {0}, 0},{'t', 2073, 2071, {0}, 0},{'\0', 0, 2072, {0}, 0}, + {'r', 2075, 2073, {0}, 0},{'\0', 0, 2074, {0}, 0},{'f', 2077, 2075, {0}, 0}, + {'\0', 0, 2076, {0}, 0},{';', 0, 2077, {8497}, 1},{'\0', 0, 2078, {0}, 0}, + {'c', 2081, 2079, {0}, 0},{'\0', 0, 2080, {0}, 0},{'r', 2083, 2081, {0}, 0}, + {'\0', 0, 2082, {0}, 0},{';', 0, 2083, {8497}, 1},{'\0', 0, 2084, {0}, 0}, + {'J', 2098, 2085, {0}, 0},{'T', 2104, 2086, {62}, 1},{'a', 2106, 2087, {0}, 0}, + {'b', 2117, 2088, {0}, 0},{'c', 2127, 2089, {0}, 0},{'d', 2147, 2090, {0}, 0}, + {'f', 2153, 2091, {0}, 0},{'g', 2157, 2092, {0}, 0},{'o', 2159, 2093, {0}, 0}, + {'r', 2165, 2094, {0}, 0},{'s', 2271, 2095, {0}, 0},{'t', 2277, 2096, {0}, 0}, + {'\0', 0, 2097, {0}, 0},{'c', 2100, 2098, {0}, 0},{'\0', 0, 2099, {0}, 0}, + {'y', 2102, 2100, {0}, 0},{'\0', 0, 2101, {0}, 0},{';', 0, 2102, {1027}, 1}, + {'\0', 0, 2103, {0}, 0},{';', 0, 2104, {62}, 1},{'\0', 0, 2105, {0}, 0}, + {'m', 2108, 2106, {0}, 0},{'\0', 0, 2107, {0}, 0},{'m', 2110, 2108, {0}, 0}, + {'\0', 0, 2109, {0}, 0},{'a', 2112, 2110, {0}, 0},{'\0', 0, 2111, {0}, 0}, + {';', 0, 2112, {915}, 1},{'d', 2115, 2113, {0}, 0},{'\0', 0, 2114, {0}, 0}, + {';', 0, 2115, {988}, 1},{'\0', 0, 2116, {0}, 0},{'r', 2119, 2117, {0}, 0}, + {'\0', 0, 2118, {0}, 0},{'e', 2121, 2119, {0}, 0},{'\0', 0, 2120, {0}, 0}, + {'v', 2123, 2121, {0}, 0},{'\0', 0, 2122, {0}, 0},{'e', 2125, 2123, {0}, 0}, + {'\0', 0, 2124, {0}, 0},{';', 0, 2125, {286}, 1},{'\0', 0, 2126, {0}, 0}, + {'e', 2131, 2127, {0}, 0},{'i', 2139, 2128, {0}, 0},{'y', 2145, 2129, {0}, 0}, + {'\0', 0, 2130, {0}, 0},{'d', 2133, 2131, {0}, 0},{'\0', 0, 2132, {0}, 0}, + {'i', 2135, 2133, {0}, 0},{'\0', 0, 2134, {0}, 0},{'l', 2137, 2135, {0}, 0}, + {'\0', 0, 2136, {0}, 0},{';', 0, 2137, {290}, 1},{'\0', 0, 2138, {0}, 0}, + {'r', 2141, 2139, {0}, 0},{'\0', 0, 2140, {0}, 0},{'c', 2143, 2141, {0}, 0}, + {'\0', 0, 2142, {0}, 0},{';', 0, 2143, {284}, 1},{'\0', 0, 2144, {0}, 0}, + {';', 0, 2145, {1043}, 1},{'\0', 0, 2146, {0}, 0},{'o', 2149, 2147, {0}, 0}, + {'\0', 0, 2148, {0}, 0},{'t', 2151, 2149, {0}, 0},{'\0', 0, 2150, {0}, 0}, + {';', 0, 2151, {288}, 1},{'\0', 0, 2152, {0}, 0},{'r', 2155, 2153, {0}, 0}, + {'\0', 0, 2154, {0}, 0},{';', 0, 2155, {120074}, 1},{'\0', 0, 2156, {0}, 0}, + {';', 0, 2157, {8921}, 1},{'\0', 0, 2158, {0}, 0},{'p', 2161, 2159, {0}, 0}, + {'\0', 0, 2160, {0}, 0},{'f', 2163, 2161, {0}, 0},{'\0', 0, 2162, {0}, 0}, + {';', 0, 2163, {120126}, 1},{'\0', 0, 2164, {0}, 0},{'e', 2167, 2165, {0}, 0}, + {'\0', 0, 2166, {0}, 0},{'a', 2169, 2167, {0}, 0},{'\0', 0, 2168, {0}, 0}, + {'t', 2171, 2169, {0}, 0},{'\0', 0, 2170, {0}, 0},{'e', 2173, 2171, {0}, 0}, + {'\0', 0, 2172, {0}, 0},{'r', 2175, 2173, {0}, 0},{'\0', 0, 2174, {0}, 0}, + {'E', 2182, 2175, {0}, 0},{'F', 2201, 2176, {0}, 0},{'G', 2219, 2177, {0}, 0}, + {'L', 2233, 2178, {0}, 0},{'S', 2241, 2179, {0}, 0},{'T', 2261, 2180, {0}, 0}, + {'\0', 0, 2181, {0}, 0},{'q', 2184, 2182, {0}, 0},{'\0', 0, 2183, {0}, 0}, + {'u', 2186, 2184, {0}, 0},{'\0', 0, 2185, {0}, 0},{'a', 2188, 2186, {0}, 0}, + {'\0', 0, 2187, {0}, 0},{'l', 2190, 2188, {0}, 0},{'\0', 0, 2189, {0}, 0}, + {';', 0, 2190, {8805}, 1},{'L', 2193, 2191, {0}, 0},{'\0', 0, 2192, {0}, 0}, + {'e', 2195, 2193, {0}, 0},{'\0', 0, 2194, {0}, 0},{'s', 2197, 2195, {0}, 0}, + {'\0', 0, 2196, {0}, 0},{'s', 2199, 2197, {0}, 0},{'\0', 0, 2198, {0}, 0}, + {';', 0, 2199, {8923}, 1},{'\0', 0, 2200, {0}, 0},{'u', 2203, 2201, {0}, 0}, + {'\0', 0, 2202, {0}, 0},{'l', 2205, 2203, {0}, 0},{'\0', 0, 2204, {0}, 0}, + {'l', 2207, 2205, {0}, 0},{'\0', 0, 2206, {0}, 0},{'E', 2209, 2207, {0}, 0}, + {'\0', 0, 2208, {0}, 0},{'q', 2211, 2209, {0}, 0},{'\0', 0, 2210, {0}, 0}, + {'u', 2213, 2211, {0}, 0},{'\0', 0, 2212, {0}, 0},{'a', 2215, 2213, {0}, 0}, + {'\0', 0, 2214, {0}, 0},{'l', 2217, 2215, {0}, 0},{'\0', 0, 2216, {0}, 0}, + {';', 0, 2217, {8807}, 1},{'\0', 0, 2218, {0}, 0},{'r', 2221, 2219, {0}, 0}, + {'\0', 0, 2220, {0}, 0},{'e', 2223, 2221, {0}, 0},{'\0', 0, 2222, {0}, 0}, + {'a', 2225, 2223, {0}, 0},{'\0', 0, 2224, {0}, 0},{'t', 2227, 2225, {0}, 0}, + {'\0', 0, 2226, {0}, 0},{'e', 2229, 2227, {0}, 0},{'\0', 0, 2228, {0}, 0}, + {'r', 2231, 2229, {0}, 0},{'\0', 0, 2230, {0}, 0},{';', 0, 2231, {10914}, 1}, + {'\0', 0, 2232, {0}, 0},{'e', 2235, 2233, {0}, 0},{'\0', 0, 2234, {0}, 0}, + {'s', 2237, 2235, {0}, 0},{'\0', 0, 2236, {0}, 0},{'s', 2239, 2237, {0}, 0}, + {'\0', 0, 2238, {0}, 0},{';', 0, 2239, {8823}, 1},{'\0', 0, 2240, {0}, 0}, + {'l', 2243, 2241, {0}, 0},{'\0', 0, 2242, {0}, 0},{'a', 2245, 2243, {0}, 0}, + {'\0', 0, 2244, {0}, 0},{'n', 2247, 2245, {0}, 0},{'\0', 0, 2246, {0}, 0}, + {'t', 2249, 2247, {0}, 0},{'\0', 0, 2248, {0}, 0},{'E', 2251, 2249, {0}, 0}, + {'\0', 0, 2250, {0}, 0},{'q', 2253, 2251, {0}, 0},{'\0', 0, 2252, {0}, 0}, + {'u', 2255, 2253, {0}, 0},{'\0', 0, 2254, {0}, 0},{'a', 2257, 2255, {0}, 0}, + {'\0', 0, 2256, {0}, 0},{'l', 2259, 2257, {0}, 0},{'\0', 0, 2258, {0}, 0}, + {';', 0, 2259, {10878}, 1},{'\0', 0, 2260, {0}, 0},{'i', 2263, 2261, {0}, 0}, + {'\0', 0, 2262, {0}, 0},{'l', 2265, 2263, {0}, 0},{'\0', 0, 2264, {0}, 0}, + {'d', 2267, 2265, {0}, 0},{'\0', 0, 2266, {0}, 0},{'e', 2269, 2267, {0}, 0}, + {'\0', 0, 2268, {0}, 0},{';', 0, 2269, {8819}, 1},{'\0', 0, 2270, {0}, 0}, + {'c', 2273, 2271, {0}, 0},{'\0', 0, 2272, {0}, 0},{'r', 2275, 2273, {0}, 0}, + {'\0', 0, 2274, {0}, 0},{';', 0, 2275, {119970}, 1},{'\0', 0, 2276, {0}, 0}, + {';', 0, 2277, {8811}, 1},{'\0', 0, 2278, {0}, 0},{'A', 2288, 2279, {0}, 0}, + {'a', 2298, 2280, {0}, 0},{'c', 2309, 2281, {0}, 0},{'f', 2317, 2282, {0}, 0}, + {'i', 2321, 2283, {0}, 0},{'o', 2343, 2284, {0}, 0},{'s', 2374, 2285, {0}, 0}, + {'u', 2389, 2286, {0}, 0},{'\0', 0, 2287, {0}, 0},{'R', 2290, 2288, {0}, 0}, + {'\0', 0, 2289, {0}, 0},{'D', 2292, 2290, {0}, 0},{'\0', 0, 2291, {0}, 0}, + {'c', 2294, 2292, {0}, 0},{'\0', 0, 2293, {0}, 0},{'y', 2296, 2294, {0}, 0}, + {'\0', 0, 2295, {0}, 0},{';', 0, 2296, {1066}, 1},{'\0', 0, 2297, {0}, 0}, + {'c', 2301, 2298, {0}, 0},{'t', 2307, 2299, {0}, 0},{'\0', 0, 2300, {0}, 0}, + {'e', 2303, 2301, {0}, 0},{'\0', 0, 2302, {0}, 0},{'k', 2305, 2303, {0}, 0}, + {'\0', 0, 2304, {0}, 0},{';', 0, 2305, {711}, 1},{'\0', 0, 2306, {0}, 0}, + {';', 0, 2307, {94}, 1},{'\0', 0, 2308, {0}, 0},{'i', 2311, 2309, {0}, 0}, + {'\0', 0, 2310, {0}, 0},{'r', 2313, 2311, {0}, 0},{'\0', 0, 2312, {0}, 0}, + {'c', 2315, 2313, {0}, 0},{'\0', 0, 2314, {0}, 0},{';', 0, 2315, {292}, 1}, + {'\0', 0, 2316, {0}, 0},{'r', 2319, 2317, {0}, 0},{'\0', 0, 2318, {0}, 0}, + {';', 0, 2319, {8460}, 1},{'\0', 0, 2320, {0}, 0},{'l', 2323, 2321, {0}, 0}, + {'\0', 0, 2322, {0}, 0},{'b', 2325, 2323, {0}, 0},{'\0', 0, 2324, {0}, 0}, + {'e', 2327, 2325, {0}, 0},{'\0', 0, 2326, {0}, 0},{'r', 2329, 2327, {0}, 0}, + {'\0', 0, 2328, {0}, 0},{'t', 2331, 2329, {0}, 0},{'\0', 0, 2330, {0}, 0}, + {'S', 2333, 2331, {0}, 0},{'\0', 0, 2332, {0}, 0},{'p', 2335, 2333, {0}, 0}, + {'\0', 0, 2334, {0}, 0},{'a', 2337, 2335, {0}, 0},{'\0', 0, 2336, {0}, 0}, + {'c', 2339, 2337, {0}, 0},{'\0', 0, 2338, {0}, 0},{'e', 2341, 2339, {0}, 0}, + {'\0', 0, 2340, {0}, 0},{';', 0, 2341, {8459}, 1},{'\0', 0, 2342, {0}, 0}, + {'p', 2346, 2343, {0}, 0},{'r', 2350, 2344, {0}, 0},{'\0', 0, 2345, {0}, 0}, + {'f', 2348, 2346, {0}, 0},{'\0', 0, 2347, {0}, 0},{';', 0, 2348, {8461}, 1}, + {'\0', 0, 2349, {0}, 0},{'i', 2352, 2350, {0}, 0},{'\0', 0, 2351, {0}, 0}, + {'z', 2354, 2352, {0}, 0},{'\0', 0, 2353, {0}, 0},{'o', 2356, 2354, {0}, 0}, + {'\0', 0, 2355, {0}, 0},{'n', 2358, 2356, {0}, 0},{'\0', 0, 2357, {0}, 0}, + {'t', 2360, 2358, {0}, 0},{'\0', 0, 2359, {0}, 0},{'a', 2362, 2360, {0}, 0}, + {'\0', 0, 2361, {0}, 0},{'l', 2364, 2362, {0}, 0},{'\0', 0, 2363, {0}, 0}, + {'L', 2366, 2364, {0}, 0},{'\0', 0, 2365, {0}, 0},{'i', 2368, 2366, {0}, 0}, + {'\0', 0, 2367, {0}, 0},{'n', 2370, 2368, {0}, 0},{'\0', 0, 2369, {0}, 0}, + {'e', 2372, 2370, {0}, 0},{'\0', 0, 2371, {0}, 0},{';', 0, 2372, {9472}, 1}, + {'\0', 0, 2373, {0}, 0},{'c', 2377, 2374, {0}, 0},{'t', 2381, 2375, {0}, 0}, + {'\0', 0, 2376, {0}, 0},{'r', 2379, 2377, {0}, 0},{'\0', 0, 2378, {0}, 0}, + {';', 0, 2379, {8459}, 1},{'\0', 0, 2380, {0}, 0},{'r', 2383, 2381, {0}, 0}, + {'\0', 0, 2382, {0}, 0},{'o', 2385, 2383, {0}, 0},{'\0', 0, 2384, {0}, 0}, + {'k', 2387, 2385, {0}, 0},{'\0', 0, 2386, {0}, 0},{';', 0, 2387, {294}, 1}, + {'\0', 0, 2388, {0}, 0},{'m', 2391, 2389, {0}, 0},{'\0', 0, 2390, {0}, 0}, + {'p', 2393, 2391, {0}, 0},{'\0', 0, 2392, {0}, 0},{'D', 2396, 2393, {0}, 0}, + {'E', 2412, 2394, {0}, 0},{'\0', 0, 2395, {0}, 0},{'o', 2398, 2396, {0}, 0}, + {'\0', 0, 2397, {0}, 0},{'w', 2400, 2398, {0}, 0},{'\0', 0, 2399, {0}, 0}, + {'n', 2402, 2400, {0}, 0},{'\0', 0, 2401, {0}, 0},{'H', 2404, 2402, {0}, 0}, + {'\0', 0, 2403, {0}, 0},{'u', 2406, 2404, {0}, 0},{'\0', 0, 2405, {0}, 0}, + {'m', 2408, 2406, {0}, 0},{'\0', 0, 2407, {0}, 0},{'p', 2410, 2408, {0}, 0}, + {'\0', 0, 2409, {0}, 0},{';', 0, 2410, {8782}, 1},{'\0', 0, 2411, {0}, 0}, + {'q', 2414, 2412, {0}, 0},{'\0', 0, 2413, {0}, 0},{'u', 2416, 2414, {0}, 0}, + {'\0', 0, 2415, {0}, 0},{'a', 2418, 2416, {0}, 0},{'\0', 0, 2417, {0}, 0}, + {'l', 2420, 2418, {0}, 0},{'\0', 0, 2419, {0}, 0},{';', 0, 2420, {8783}, 1}, + {'\0', 0, 2421, {0}, 0},{'E', 2437, 2422, {0}, 0},{'J', 2443, 2423, {0}, 0}, + {'O', 2451, 2424, {0}, 0},{'a', 2457, 2425, {0}, 0},{'c', 2467, 2426, {0}, 0}, + {'d', 2478, 2427, {0}, 0},{'f', 2484, 2428, {0}, 0},{'g', 2488, 2429, {0}, 0}, + {'m', 2498, 2430, {0}, 0},{'n', 2533, 2431, {0}, 0},{'o', 2601, 2432, {0}, 0}, + {'s', 2619, 2433, {0}, 0},{'t', 2625, 2434, {0}, 0},{'u', 2635, 2435, {0}, 0}, + {'\0', 0, 2436, {0}, 0},{'c', 2439, 2437, {0}, 0},{'\0', 0, 2438, {0}, 0}, + {'y', 2441, 2439, {0}, 0},{'\0', 0, 2440, {0}, 0},{';', 0, 2441, {1045}, 1}, + {'\0', 0, 2442, {0}, 0},{'l', 2445, 2443, {0}, 0},{'\0', 0, 2444, {0}, 0}, + {'i', 2447, 2445, {0}, 0},{'\0', 0, 2446, {0}, 0},{'g', 2449, 2447, {0}, 0}, + {'\0', 0, 2448, {0}, 0},{';', 0, 2449, {306}, 1},{'\0', 0, 2450, {0}, 0}, + {'c', 2453, 2451, {0}, 0},{'\0', 0, 2452, {0}, 0},{'y', 2455, 2453, {0}, 0}, + {'\0', 0, 2454, {0}, 0},{';', 0, 2455, {1025}, 1},{'\0', 0, 2456, {0}, 0}, + {'c', 2459, 2457, {0}, 0},{'\0', 0, 2458, {0}, 0},{'u', 2461, 2459, {0}, 0}, + {'\0', 0, 2460, {0}, 0},{'t', 2463, 2461, {0}, 0},{'\0', 0, 2462, {0}, 0}, + {'e', 2465, 2463, {205}, 1},{'\0', 0, 2464, {0}, 0},{';', 0, 2465, {205}, 1}, + {'\0', 0, 2466, {0}, 0},{'i', 2470, 2467, {0}, 0},{'y', 2476, 2468, {0}, 0}, + {'\0', 0, 2469, {0}, 0},{'r', 2472, 2470, {0}, 0},{'\0', 0, 2471, {0}, 0}, + {'c', 2474, 2472, {206}, 1},{'\0', 0, 2473, {0}, 0},{';', 0, 2474, {206}, 1}, + {'\0', 0, 2475, {0}, 0},{';', 0, 2476, {1048}, 1},{'\0', 0, 2477, {0}, 0}, + {'o', 2480, 2478, {0}, 0},{'\0', 0, 2479, {0}, 0},{'t', 2482, 2480, {0}, 0}, + {'\0', 0, 2481, {0}, 0},{';', 0, 2482, {304}, 1},{'\0', 0, 2483, {0}, 0}, + {'r', 2486, 2484, {0}, 0},{'\0', 0, 2485, {0}, 0},{';', 0, 2486, {8465}, 1}, + {'\0', 0, 2487, {0}, 0},{'r', 2490, 2488, {0}, 0},{'\0', 0, 2489, {0}, 0}, + {'a', 2492, 2490, {0}, 0},{'\0', 0, 2491, {0}, 0},{'v', 2494, 2492, {0}, 0}, + {'\0', 0, 2493, {0}, 0},{'e', 2496, 2494, {204}, 1},{'\0', 0, 2495, {0}, 0}, + {';', 0, 2496, {204}, 1},{'\0', 0, 2497, {0}, 0},{';', 0, 2498, {8465}, 1}, + {'a', 2502, 2499, {0}, 0},{'p', 2523, 2500, {0}, 0},{'\0', 0, 2501, {0}, 0}, + {'c', 2505, 2502, {0}, 0},{'g', 2509, 2503, {0}, 0},{'\0', 0, 2504, {0}, 0}, + {'r', 2507, 2505, {0}, 0},{'\0', 0, 2506, {0}, 0},{';', 0, 2507, {298}, 1}, + {'\0', 0, 2508, {0}, 0},{'i', 2511, 2509, {0}, 0},{'\0', 0, 2510, {0}, 0}, + {'n', 2513, 2511, {0}, 0},{'\0', 0, 2512, {0}, 0},{'a', 2515, 2513, {0}, 0}, + {'\0', 0, 2514, {0}, 0},{'r', 2517, 2515, {0}, 0},{'\0', 0, 2516, {0}, 0}, + {'y', 2519, 2517, {0}, 0},{'\0', 0, 2518, {0}, 0},{'I', 2521, 2519, {0}, 0}, + {'\0', 0, 2520, {0}, 0},{';', 0, 2521, {8520}, 1},{'\0', 0, 2522, {0}, 0}, + {'l', 2525, 2523, {0}, 0},{'\0', 0, 2524, {0}, 0},{'i', 2527, 2525, {0}, 0}, + {'\0', 0, 2526, {0}, 0},{'e', 2529, 2527, {0}, 0},{'\0', 0, 2528, {0}, 0}, + {'s', 2531, 2529, {0}, 0},{'\0', 0, 2530, {0}, 0},{';', 0, 2531, {8658}, 1}, + {'\0', 0, 2532, {0}, 0},{'t', 2536, 2533, {0}, 0},{'v', 2566, 2534, {0}, 0}, + {'\0', 0, 2535, {0}, 0},{';', 0, 2536, {8748}, 1},{'e', 2539, 2537, {0}, 0}, + {'\0', 0, 2538, {0}, 0},{'g', 2542, 2539, {0}, 0},{'r', 2550, 2540, {0}, 0}, + {'\0', 0, 2541, {0}, 0},{'r', 2544, 2542, {0}, 0},{'\0', 0, 2543, {0}, 0}, + {'a', 2546, 2544, {0}, 0},{'\0', 0, 2545, {0}, 0},{'l', 2548, 2546, {0}, 0}, + {'\0', 0, 2547, {0}, 0},{';', 0, 2548, {8747}, 1},{'\0', 0, 2549, {0}, 0}, + {'s', 2552, 2550, {0}, 0},{'\0', 0, 2551, {0}, 0},{'e', 2554, 2552, {0}, 0}, + {'\0', 0, 2553, {0}, 0},{'c', 2556, 2554, {0}, 0},{'\0', 0, 2555, {0}, 0}, + {'t', 2558, 2556, {0}, 0},{'\0', 0, 2557, {0}, 0},{'i', 2560, 2558, {0}, 0}, + {'\0', 0, 2559, {0}, 0},{'o', 2562, 2560, {0}, 0},{'\0', 0, 2561, {0}, 0}, + {'n', 2564, 2562, {0}, 0},{'\0', 0, 2563, {0}, 0},{';', 0, 2564, {8898}, 1}, + {'\0', 0, 2565, {0}, 0},{'i', 2568, 2566, {0}, 0},{'\0', 0, 2567, {0}, 0}, + {'s', 2570, 2568, {0}, 0},{'\0', 0, 2569, {0}, 0},{'i', 2572, 2570, {0}, 0}, + {'\0', 0, 2571, {0}, 0},{'b', 2574, 2572, {0}, 0},{'\0', 0, 2573, {0}, 0}, + {'l', 2576, 2574, {0}, 0},{'\0', 0, 2575, {0}, 0},{'e', 2578, 2576, {0}, 0}, + {'\0', 0, 2577, {0}, 0},{'C', 2581, 2578, {0}, 0},{'T', 2591, 2579, {0}, 0}, + {'\0', 0, 2580, {0}, 0},{'o', 2583, 2581, {0}, 0},{'\0', 0, 2582, {0}, 0}, + {'m', 2585, 2583, {0}, 0},{'\0', 0, 2584, {0}, 0},{'m', 2587, 2585, {0}, 0}, + {'\0', 0, 2586, {0}, 0},{'a', 2589, 2587, {0}, 0},{'\0', 0, 2588, {0}, 0}, + {';', 0, 2589, {8291}, 1},{'\0', 0, 2590, {0}, 0},{'i', 2593, 2591, {0}, 0}, + {'\0', 0, 2592, {0}, 0},{'m', 2595, 2593, {0}, 0},{'\0', 0, 2594, {0}, 0}, + {'e', 2597, 2595, {0}, 0},{'\0', 0, 2596, {0}, 0},{'s', 2599, 2597, {0}, 0}, + {'\0', 0, 2598, {0}, 0},{';', 0, 2599, {8290}, 1},{'\0', 0, 2600, {0}, 0}, + {'g', 2605, 2601, {0}, 0},{'p', 2611, 2602, {0}, 0},{'t', 2615, 2603, {0}, 0}, + {'\0', 0, 2604, {0}, 0},{'o', 2607, 2605, {0}, 0},{'\0', 0, 2606, {0}, 0}, + {'n', 2609, 2607, {0}, 0},{'\0', 0, 2608, {0}, 0},{';', 0, 2609, {302}, 1}, + {'\0', 0, 2610, {0}, 0},{'f', 2613, 2611, {0}, 0},{'\0', 0, 2612, {0}, 0}, + {';', 0, 2613, {120128}, 1},{'\0', 0, 2614, {0}, 0},{'a', 2617, 2615, {0}, 0}, + {'\0', 0, 2616, {0}, 0},{';', 0, 2617, {921}, 1},{'\0', 0, 2618, {0}, 0}, + {'c', 2621, 2619, {0}, 0},{'\0', 0, 2620, {0}, 0},{'r', 2623, 2621, {0}, 0}, + {'\0', 0, 2622, {0}, 0},{';', 0, 2623, {8464}, 1},{'\0', 0, 2624, {0}, 0}, + {'i', 2627, 2625, {0}, 0},{'\0', 0, 2626, {0}, 0},{'l', 2629, 2627, {0}, 0}, + {'\0', 0, 2628, {0}, 0},{'d', 2631, 2629, {0}, 0},{'\0', 0, 2630, {0}, 0}, + {'e', 2633, 2631, {0}, 0},{'\0', 0, 2632, {0}, 0},{';', 0, 2633, {296}, 1}, + {'\0', 0, 2634, {0}, 0},{'k', 2638, 2635, {0}, 0},{'m', 2644, 2636, {0}, 0}, + {'\0', 0, 2637, {0}, 0},{'c', 2640, 2638, {0}, 0},{'\0', 0, 2639, {0}, 0}, + {'y', 2642, 2640, {0}, 0},{'\0', 0, 2641, {0}, 0},{';', 0, 2642, {1030}, 1}, + {'\0', 0, 2643, {0}, 0},{'l', 2646, 2644, {207}, 1},{'\0', 0, 2645, {0}, 0}, + {';', 0, 2646, {207}, 1},{'\0', 0, 2647, {0}, 0},{'c', 2654, 2648, {0}, 0}, + {'f', 2665, 2649, {0}, 0},{'o', 2669, 2650, {0}, 0},{'s', 2675, 2651, {0}, 0}, + {'u', 2690, 2652, {0}, 0},{'\0', 0, 2653, {0}, 0},{'i', 2657, 2654, {0}, 0}, + {'y', 2663, 2655, {0}, 0},{'\0', 0, 2656, {0}, 0},{'r', 2659, 2657, {0}, 0}, + {'\0', 0, 2658, {0}, 0},{'c', 2661, 2659, {0}, 0},{'\0', 0, 2660, {0}, 0}, + {';', 0, 2661, {308}, 1},{'\0', 0, 2662, {0}, 0},{';', 0, 2663, {1049}, 1}, + {'\0', 0, 2664, {0}, 0},{'r', 2667, 2665, {0}, 0},{'\0', 0, 2666, {0}, 0}, + {';', 0, 2667, {120077}, 1},{'\0', 0, 2668, {0}, 0},{'p', 2671, 2669, {0}, 0}, + {'\0', 0, 2670, {0}, 0},{'f', 2673, 2671, {0}, 0},{'\0', 0, 2672, {0}, 0}, + {';', 0, 2673, {120129}, 1},{'\0', 0, 2674, {0}, 0},{'c', 2678, 2675, {0}, 0}, + {'e', 2682, 2676, {0}, 0},{'\0', 0, 2677, {0}, 0},{'r', 2680, 2678, {0}, 0}, + {'\0', 0, 2679, {0}, 0},{';', 0, 2680, {119973}, 1},{'\0', 0, 2681, {0}, 0}, + {'r', 2684, 2682, {0}, 0},{'\0', 0, 2683, {0}, 0},{'c', 2686, 2684, {0}, 0}, + {'\0', 0, 2685, {0}, 0},{'y', 2688, 2686, {0}, 0},{'\0', 0, 2687, {0}, 0}, + {';', 0, 2688, {1032}, 1},{'\0', 0, 2689, {0}, 0},{'k', 2692, 2690, {0}, 0}, + {'\0', 0, 2691, {0}, 0},{'c', 2694, 2692, {0}, 0},{'\0', 0, 2693, {0}, 0}, + {'y', 2696, 2694, {0}, 0},{'\0', 0, 2695, {0}, 0},{';', 0, 2696, {1028}, 1}, + {'\0', 0, 2697, {0}, 0},{'H', 2706, 2698, {0}, 0},{'J', 2712, 2699, {0}, 0}, + {'a', 2718, 2700, {0}, 0},{'c', 2726, 2701, {0}, 0},{'f', 2739, 2702, {0}, 0}, + {'o', 2743, 2703, {0}, 0},{'s', 2749, 2704, {0}, 0},{'\0', 0, 2705, {0}, 0}, + {'c', 2708, 2706, {0}, 0},{'\0', 0, 2707, {0}, 0},{'y', 2710, 2708, {0}, 0}, + {'\0', 0, 2709, {0}, 0},{';', 0, 2710, {1061}, 1},{'\0', 0, 2711, {0}, 0}, + {'c', 2714, 2712, {0}, 0},{'\0', 0, 2713, {0}, 0},{'y', 2716, 2714, {0}, 0}, + {'\0', 0, 2715, {0}, 0},{';', 0, 2716, {1036}, 1},{'\0', 0, 2717, {0}, 0}, + {'p', 2720, 2718, {0}, 0},{'\0', 0, 2719, {0}, 0},{'p', 2722, 2720, {0}, 0}, + {'\0', 0, 2721, {0}, 0},{'a', 2724, 2722, {0}, 0},{'\0', 0, 2723, {0}, 0}, + {';', 0, 2724, {922}, 1},{'\0', 0, 2725, {0}, 0},{'e', 2729, 2726, {0}, 0}, + {'y', 2737, 2727, {0}, 0},{'\0', 0, 2728, {0}, 0},{'d', 2731, 2729, {0}, 0}, + {'\0', 0, 2730, {0}, 0},{'i', 2733, 2731, {0}, 0},{'\0', 0, 2732, {0}, 0}, + {'l', 2735, 2733, {0}, 0},{'\0', 0, 2734, {0}, 0},{';', 0, 2735, {310}, 1}, + {'\0', 0, 2736, {0}, 0},{';', 0, 2737, {1050}, 1},{'\0', 0, 2738, {0}, 0}, + {'r', 2741, 2739, {0}, 0},{'\0', 0, 2740, {0}, 0},{';', 0, 2741, {120078}, 1}, + {'\0', 0, 2742, {0}, 0},{'p', 2745, 2743, {0}, 0},{'\0', 0, 2744, {0}, 0}, + {'f', 2747, 2745, {0}, 0},{'\0', 0, 2746, {0}, 0},{';', 0, 2747, {120130}, 1}, + {'\0', 0, 2748, {0}, 0},{'c', 2751, 2749, {0}, 0},{'\0', 0, 2750, {0}, 0}, + {'r', 2753, 2751, {0}, 0},{'\0', 0, 2752, {0}, 0},{';', 0, 2753, {119974}, 1}, + {'\0', 0, 2754, {0}, 0},{'J', 2767, 2755, {0}, 0},{'T', 2773, 2756, {60}, 1}, + {'a', 2775, 2757, {0}, 0},{'c', 2821, 2758, {0}, 0},{'e', 2843, 2759, {0}, 0}, + {'f', 3324, 2760, {0}, 0},{'l', 3328, 2761, {0}, 0},{'m', 3347, 2762, {0}, 0}, + {'o', 3357, 2763, {0}, 0},{'s', 3535, 2764, {0}, 0},{'t', 3553, 2765, {0}, 0}, + {'\0', 0, 2766, {0}, 0},{'c', 2769, 2767, {0}, 0},{'\0', 0, 2768, {0}, 0}, + {'y', 2771, 2769, {0}, 0},{'\0', 0, 2770, {0}, 0},{';', 0, 2771, {1033}, 1}, + {'\0', 0, 2772, {0}, 0},{';', 0, 2773, {60}, 1},{'\0', 0, 2774, {0}, 0}, + {'c', 2781, 2775, {0}, 0},{'m', 2789, 2776, {0}, 0},{'n', 2797, 2777, {0}, 0}, + {'p', 2801, 2778, {0}, 0},{'r', 2817, 2779, {0}, 0},{'\0', 0, 2780, {0}, 0}, + {'u', 2783, 2781, {0}, 0},{'\0', 0, 2782, {0}, 0},{'t', 2785, 2783, {0}, 0}, + {'\0', 0, 2784, {0}, 0},{'e', 2787, 2785, {0}, 0},{'\0', 0, 2786, {0}, 0}, + {';', 0, 2787, {313}, 1},{'\0', 0, 2788, {0}, 0},{'b', 2791, 2789, {0}, 0}, + {'\0', 0, 2790, {0}, 0},{'d', 2793, 2791, {0}, 0},{'\0', 0, 2792, {0}, 0}, + {'a', 2795, 2793, {0}, 0},{'\0', 0, 2794, {0}, 0},{';', 0, 2795, {923}, 1}, + {'\0', 0, 2796, {0}, 0},{'g', 2799, 2797, {0}, 0},{'\0', 0, 2798, {0}, 0}, + {';', 0, 2799, {10218}, 1},{'\0', 0, 2800, {0}, 0},{'l', 2803, 2801, {0}, 0}, + {'\0', 0, 2802, {0}, 0},{'a', 2805, 2803, {0}, 0},{'\0', 0, 2804, {0}, 0}, + {'c', 2807, 2805, {0}, 0},{'\0', 0, 2806, {0}, 0},{'e', 2809, 2807, {0}, 0}, + {'\0', 0, 2808, {0}, 0},{'t', 2811, 2809, {0}, 0},{'\0', 0, 2810, {0}, 0}, + {'r', 2813, 2811, {0}, 0},{'\0', 0, 2812, {0}, 0},{'f', 2815, 2813, {0}, 0}, + {'\0', 0, 2814, {0}, 0},{';', 0, 2815, {8466}, 1},{'\0', 0, 2816, {0}, 0}, + {'r', 2819, 2817, {0}, 0},{'\0', 0, 2818, {0}, 0},{';', 0, 2819, {8606}, 1}, + {'\0', 0, 2820, {0}, 0},{'a', 2825, 2821, {0}, 0},{'e', 2833, 2822, {0}, 0}, + {'y', 2841, 2823, {0}, 0},{'\0', 0, 2824, {0}, 0},{'r', 2827, 2825, {0}, 0}, + {'\0', 0, 2826, {0}, 0},{'o', 2829, 2827, {0}, 0},{'\0', 0, 2828, {0}, 0}, + {'n', 2831, 2829, {0}, 0},{'\0', 0, 2830, {0}, 0},{';', 0, 2831, {317}, 1}, + {'\0', 0, 2832, {0}, 0},{'d', 2835, 2833, {0}, 0},{'\0', 0, 2834, {0}, 0}, + {'i', 2837, 2835, {0}, 0},{'\0', 0, 2836, {0}, 0},{'l', 2839, 2837, {0}, 0}, + {'\0', 0, 2838, {0}, 0},{';', 0, 2839, {315}, 1},{'\0', 0, 2840, {0}, 0}, + {';', 0, 2841, {1051}, 1},{'\0', 0, 2842, {0}, 0},{'f', 2846, 2843, {0}, 0}, + {'s', 3221, 2844, {0}, 0},{'\0', 0, 2845, {0}, 0},{'t', 2848, 2846, {0}, 0}, + {'\0', 0, 2847, {0}, 0},{'A', 2859, 2848, {0}, 0},{'C', 2920, 2849, {0}, 0}, + {'D', 2934, 2850, {0}, 0},{'F', 3003, 2851, {0}, 0},{'R', 3013, 2852, {0}, 0}, + {'T', 3046, 2853, {0}, 0},{'U', 3109, 2854, {0}, 0},{'V', 3172, 2855, {0}, 0}, + {'a', 3191, 2856, {0}, 0},{'r', 3201, 2857, {0}, 0},{'\0', 0, 2858, {0}, 0}, + {'n', 2862, 2859, {0}, 0},{'r', 2884, 2860, {0}, 0},{'\0', 0, 2861, {0}, 0}, + {'g', 2864, 2862, {0}, 0},{'\0', 0, 2863, {0}, 0},{'l', 2866, 2864, {0}, 0}, + {'\0', 0, 2865, {0}, 0},{'e', 2868, 2866, {0}, 0},{'\0', 0, 2867, {0}, 0}, + {'B', 2870, 2868, {0}, 0},{'\0', 0, 2869, {0}, 0},{'r', 2872, 2870, {0}, 0}, + {'\0', 0, 2871, {0}, 0},{'a', 2874, 2872, {0}, 0},{'\0', 0, 2873, {0}, 0}, + {'c', 2876, 2874, {0}, 0},{'\0', 0, 2875, {0}, 0},{'k', 2878, 2876, {0}, 0}, + {'\0', 0, 2877, {0}, 0},{'e', 2880, 2878, {0}, 0},{'\0', 0, 2879, {0}, 0}, + {'t', 2882, 2880, {0}, 0},{'\0', 0, 2881, {0}, 0},{';', 0, 2882, {10216}, 1}, + {'\0', 0, 2883, {0}, 0},{'r', 2886, 2884, {0}, 0},{'\0', 0, 2885, {0}, 0}, + {'o', 2888, 2886, {0}, 0},{'\0', 0, 2887, {0}, 0},{'w', 2890, 2888, {0}, 0}, + {'\0', 0, 2889, {0}, 0},{';', 0, 2890, {8592}, 1},{'B', 2894, 2891, {0}, 0}, + {'R', 2900, 2892, {0}, 0},{'\0', 0, 2893, {0}, 0},{'a', 2896, 2894, {0}, 0}, + {'\0', 0, 2895, {0}, 0},{'r', 2898, 2896, {0}, 0},{'\0', 0, 2897, {0}, 0}, + {';', 0, 2898, {8676}, 1},{'\0', 0, 2899, {0}, 0},{'i', 2902, 2900, {0}, 0}, + {'\0', 0, 2901, {0}, 0},{'g', 2904, 2902, {0}, 0},{'\0', 0, 2903, {0}, 0}, + {'h', 2906, 2904, {0}, 0},{'\0', 0, 2905, {0}, 0},{'t', 2908, 2906, {0}, 0}, + {'\0', 0, 2907, {0}, 0},{'A', 2910, 2908, {0}, 0},{'\0', 0, 2909, {0}, 0}, + {'r', 2912, 2910, {0}, 0},{'\0', 0, 2911, {0}, 0},{'r', 2914, 2912, {0}, 0}, + {'\0', 0, 2913, {0}, 0},{'o', 2916, 2914, {0}, 0},{'\0', 0, 2915, {0}, 0}, + {'w', 2918, 2916, {0}, 0},{'\0', 0, 2917, {0}, 0},{';', 0, 2918, {8646}, 1}, + {'\0', 0, 2919, {0}, 0},{'e', 2922, 2920, {0}, 0},{'\0', 0, 2921, {0}, 0}, + {'i', 2924, 2922, {0}, 0},{'\0', 0, 2923, {0}, 0},{'l', 2926, 2924, {0}, 0}, + {'\0', 0, 2925, {0}, 0},{'i', 2928, 2926, {0}, 0},{'\0', 0, 2927, {0}, 0}, + {'n', 2930, 2928, {0}, 0},{'\0', 0, 2929, {0}, 0},{'g', 2932, 2930, {0}, 0}, + {'\0', 0, 2931, {0}, 0},{';', 0, 2932, {8968}, 1},{'\0', 0, 2933, {0}, 0}, + {'o', 2936, 2934, {0}, 0},{'\0', 0, 2935, {0}, 0},{'u', 2939, 2936, {0}, 0}, + {'w', 2961, 2937, {0}, 0},{'\0', 0, 2938, {0}, 0},{'b', 2941, 2939, {0}, 0}, + {'\0', 0, 2940, {0}, 0},{'l', 2943, 2941, {0}, 0},{'\0', 0, 2942, {0}, 0}, + {'e', 2945, 2943, {0}, 0},{'\0', 0, 2944, {0}, 0},{'B', 2947, 2945, {0}, 0}, + {'\0', 0, 2946, {0}, 0},{'r', 2949, 2947, {0}, 0},{'\0', 0, 2948, {0}, 0}, + {'a', 2951, 2949, {0}, 0},{'\0', 0, 2950, {0}, 0},{'c', 2953, 2951, {0}, 0}, + {'\0', 0, 2952, {0}, 0},{'k', 2955, 2953, {0}, 0},{'\0', 0, 2954, {0}, 0}, + {'e', 2957, 2955, {0}, 0},{'\0', 0, 2956, {0}, 0},{'t', 2959, 2957, {0}, 0}, + {'\0', 0, 2958, {0}, 0},{';', 0, 2959, {10214}, 1},{'\0', 0, 2960, {0}, 0}, + {'n', 2963, 2961, {0}, 0},{'\0', 0, 2962, {0}, 0},{'T', 2966, 2963, {0}, 0}, + {'V', 2984, 2964, {0}, 0},{'\0', 0, 2965, {0}, 0},{'e', 2968, 2966, {0}, 0}, + {'\0', 0, 2967, {0}, 0},{'e', 2970, 2968, {0}, 0},{'\0', 0, 2969, {0}, 0}, + {'V', 2972, 2970, {0}, 0},{'\0', 0, 2971, {0}, 0},{'e', 2974, 2972, {0}, 0}, + {'\0', 0, 2973, {0}, 0},{'c', 2976, 2974, {0}, 0},{'\0', 0, 2975, {0}, 0}, + {'t', 2978, 2976, {0}, 0},{'\0', 0, 2977, {0}, 0},{'o', 2980, 2978, {0}, 0}, + {'\0', 0, 2979, {0}, 0},{'r', 2982, 2980, {0}, 0},{'\0', 0, 2981, {0}, 0}, + {';', 0, 2982, {10593}, 1},{'\0', 0, 2983, {0}, 0},{'e', 2986, 2984, {0}, 0}, + {'\0', 0, 2985, {0}, 0},{'c', 2988, 2986, {0}, 0},{'\0', 0, 2987, {0}, 0}, + {'t', 2990, 2988, {0}, 0},{'\0', 0, 2989, {0}, 0},{'o', 2992, 2990, {0}, 0}, + {'\0', 0, 2991, {0}, 0},{'r', 2994, 2992, {0}, 0},{'\0', 0, 2993, {0}, 0}, + {';', 0, 2994, {8643}, 1},{'B', 2997, 2995, {0}, 0},{'\0', 0, 2996, {0}, 0}, + {'a', 2999, 2997, {0}, 0},{'\0', 0, 2998, {0}, 0},{'r', 3001, 2999, {0}, 0}, + {'\0', 0, 3000, {0}, 0},{';', 0, 3001, {10585}, 1},{'\0', 0, 3002, {0}, 0}, + {'l', 3005, 3003, {0}, 0},{'\0', 0, 3004, {0}, 0},{'o', 3007, 3005, {0}, 0}, + {'\0', 0, 3006, {0}, 0},{'o', 3009, 3007, {0}, 0},{'\0', 0, 3008, {0}, 0}, + {'r', 3011, 3009, {0}, 0},{'\0', 0, 3010, {0}, 0},{';', 0, 3011, {8970}, 1}, + {'\0', 0, 3012, {0}, 0},{'i', 3015, 3013, {0}, 0},{'\0', 0, 3014, {0}, 0}, + {'g', 3017, 3015, {0}, 0},{'\0', 0, 3016, {0}, 0},{'h', 3019, 3017, {0}, 0}, + {'\0', 0, 3018, {0}, 0},{'t', 3021, 3019, {0}, 0},{'\0', 0, 3020, {0}, 0}, + {'A', 3024, 3021, {0}, 0},{'V', 3034, 3022, {0}, 0},{'\0', 0, 3023, {0}, 0}, + {'r', 3026, 3024, {0}, 0},{'\0', 0, 3025, {0}, 0},{'r', 3028, 3026, {0}, 0}, + {'\0', 0, 3027, {0}, 0},{'o', 3030, 3028, {0}, 0},{'\0', 0, 3029, {0}, 0}, + {'w', 3032, 3030, {0}, 0},{'\0', 0, 3031, {0}, 0},{';', 0, 3032, {8596}, 1}, + {'\0', 0, 3033, {0}, 0},{'e', 3036, 3034, {0}, 0},{'\0', 0, 3035, {0}, 0}, + {'c', 3038, 3036, {0}, 0},{'\0', 0, 3037, {0}, 0},{'t', 3040, 3038, {0}, 0}, + {'\0', 0, 3039, {0}, 0},{'o', 3042, 3040, {0}, 0},{'\0', 0, 3041, {0}, 0}, + {'r', 3044, 3042, {0}, 0},{'\0', 0, 3043, {0}, 0},{';', 0, 3044, {10574}, 1}, + {'\0', 0, 3045, {0}, 0},{'e', 3049, 3046, {0}, 0},{'r', 3077, 3047, {0}, 0}, + {'\0', 0, 3048, {0}, 0},{'e', 3051, 3049, {0}, 0},{'\0', 0, 3050, {0}, 0}, + {';', 0, 3051, {8867}, 1},{'A', 3055, 3052, {0}, 0},{'V', 3065, 3053, {0}, 0}, + {'\0', 0, 3054, {0}, 0},{'r', 3057, 3055, {0}, 0},{'\0', 0, 3056, {0}, 0}, + {'r', 3059, 3057, {0}, 0},{'\0', 0, 3058, {0}, 0},{'o', 3061, 3059, {0}, 0}, + {'\0', 0, 3060, {0}, 0},{'w', 3063, 3061, {0}, 0},{'\0', 0, 3062, {0}, 0}, + {';', 0, 3063, {8612}, 1},{'\0', 0, 3064, {0}, 0},{'e', 3067, 3065, {0}, 0}, + {'\0', 0, 3066, {0}, 0},{'c', 3069, 3067, {0}, 0},{'\0', 0, 3068, {0}, 0}, + {'t', 3071, 3069, {0}, 0},{'\0', 0, 3070, {0}, 0},{'o', 3073, 3071, {0}, 0}, + {'\0', 0, 3072, {0}, 0},{'r', 3075, 3073, {0}, 0},{'\0', 0, 3074, {0}, 0}, + {';', 0, 3075, {10586}, 1},{'\0', 0, 3076, {0}, 0},{'i', 3079, 3077, {0}, 0}, + {'\0', 0, 3078, {0}, 0},{'a', 3081, 3079, {0}, 0},{'\0', 0, 3080, {0}, 0}, + {'n', 3083, 3081, {0}, 0},{'\0', 0, 3082, {0}, 0},{'g', 3085, 3083, {0}, 0}, + {'\0', 0, 3084, {0}, 0},{'l', 3087, 3085, {0}, 0},{'\0', 0, 3086, {0}, 0}, + {'e', 3089, 3087, {0}, 0},{'\0', 0, 3088, {0}, 0},{';', 0, 3089, {8882}, 1}, + {'B', 3093, 3090, {0}, 0},{'E', 3099, 3091, {0}, 0},{'\0', 0, 3092, {0}, 0}, + {'a', 3095, 3093, {0}, 0},{'\0', 0, 3094, {0}, 0},{'r', 3097, 3095, {0}, 0}, + {'\0', 0, 3096, {0}, 0},{';', 0, 3097, {10703}, 1},{'\0', 0, 3098, {0}, 0}, + {'q', 3101, 3099, {0}, 0},{'\0', 0, 3100, {0}, 0},{'u', 3103, 3101, {0}, 0}, + {'\0', 0, 3102, {0}, 0},{'a', 3105, 3103, {0}, 0},{'\0', 0, 3104, {0}, 0}, + {'l', 3107, 3105, {0}, 0},{'\0', 0, 3106, {0}, 0},{';', 0, 3107, {8884}, 1}, + {'\0', 0, 3108, {0}, 0},{'p', 3111, 3109, {0}, 0},{'\0', 0, 3110, {0}, 0}, + {'D', 3115, 3111, {0}, 0},{'T', 3135, 3112, {0}, 0},{'V', 3153, 3113, {0}, 0}, + {'\0', 0, 3114, {0}, 0},{'o', 3117, 3115, {0}, 0},{'\0', 0, 3116, {0}, 0}, + {'w', 3119, 3117, {0}, 0},{'\0', 0, 3118, {0}, 0},{'n', 3121, 3119, {0}, 0}, + {'\0', 0, 3120, {0}, 0},{'V', 3123, 3121, {0}, 0},{'\0', 0, 3122, {0}, 0}, + {'e', 3125, 3123, {0}, 0},{'\0', 0, 3124, {0}, 0},{'c', 3127, 3125, {0}, 0}, + {'\0', 0, 3126, {0}, 0},{'t', 3129, 3127, {0}, 0},{'\0', 0, 3128, {0}, 0}, + {'o', 3131, 3129, {0}, 0},{'\0', 0, 3130, {0}, 0},{'r', 3133, 3131, {0}, 0}, + {'\0', 0, 3132, {0}, 0},{';', 0, 3133, {10577}, 1},{'\0', 0, 3134, {0}, 0}, + {'e', 3137, 3135, {0}, 0},{'\0', 0, 3136, {0}, 0},{'e', 3139, 3137, {0}, 0}, + {'\0', 0, 3138, {0}, 0},{'V', 3141, 3139, {0}, 0},{'\0', 0, 3140, {0}, 0}, + {'e', 3143, 3141, {0}, 0},{'\0', 0, 3142, {0}, 0},{'c', 3145, 3143, {0}, 0}, + {'\0', 0, 3144, {0}, 0},{'t', 3147, 3145, {0}, 0},{'\0', 0, 3146, {0}, 0}, + {'o', 3149, 3147, {0}, 0},{'\0', 0, 3148, {0}, 0},{'r', 3151, 3149, {0}, 0}, + {'\0', 0, 3150, {0}, 0},{';', 0, 3151, {10592}, 1},{'\0', 0, 3152, {0}, 0}, + {'e', 3155, 3153, {0}, 0},{'\0', 0, 3154, {0}, 0},{'c', 3157, 3155, {0}, 0}, + {'\0', 0, 3156, {0}, 0},{'t', 3159, 3157, {0}, 0},{'\0', 0, 3158, {0}, 0}, + {'o', 3161, 3159, {0}, 0},{'\0', 0, 3160, {0}, 0},{'r', 3163, 3161, {0}, 0}, + {'\0', 0, 3162, {0}, 0},{';', 0, 3163, {8639}, 1},{'B', 3166, 3164, {0}, 0}, + {'\0', 0, 3165, {0}, 0},{'a', 3168, 3166, {0}, 0},{'\0', 0, 3167, {0}, 0}, + {'r', 3170, 3168, {0}, 0},{'\0', 0, 3169, {0}, 0},{';', 0, 3170, {10584}, 1}, + {'\0', 0, 3171, {0}, 0},{'e', 3174, 3172, {0}, 0},{'\0', 0, 3173, {0}, 0}, + {'c', 3176, 3174, {0}, 0},{'\0', 0, 3175, {0}, 0},{'t', 3178, 3176, {0}, 0}, + {'\0', 0, 3177, {0}, 0},{'o', 3180, 3178, {0}, 0},{'\0', 0, 3179, {0}, 0}, + {'r', 3182, 3180, {0}, 0},{'\0', 0, 3181, {0}, 0},{';', 0, 3182, {8636}, 1}, + {'B', 3185, 3183, {0}, 0},{'\0', 0, 3184, {0}, 0},{'a', 3187, 3185, {0}, 0}, + {'\0', 0, 3186, {0}, 0},{'r', 3189, 3187, {0}, 0},{'\0', 0, 3188, {0}, 0}, + {';', 0, 3189, {10578}, 1},{'\0', 0, 3190, {0}, 0},{'r', 3193, 3191, {0}, 0}, + {'\0', 0, 3192, {0}, 0},{'r', 3195, 3193, {0}, 0},{'\0', 0, 3194, {0}, 0}, + {'o', 3197, 3195, {0}, 0},{'\0', 0, 3196, {0}, 0},{'w', 3199, 3197, {0}, 0}, + {'\0', 0, 3198, {0}, 0},{';', 0, 3199, {8656}, 1},{'\0', 0, 3200, {0}, 0}, + {'i', 3203, 3201, {0}, 0},{'\0', 0, 3202, {0}, 0},{'g', 3205, 3203, {0}, 0}, + {'\0', 0, 3204, {0}, 0},{'h', 3207, 3205, {0}, 0},{'\0', 0, 3206, {0}, 0}, + {'t', 3209, 3207, {0}, 0},{'\0', 0, 3208, {0}, 0},{'a', 3211, 3209, {0}, 0}, + {'\0', 0, 3210, {0}, 0},{'r', 3213, 3211, {0}, 0},{'\0', 0, 3212, {0}, 0}, + {'r', 3215, 3213, {0}, 0},{'\0', 0, 3214, {0}, 0},{'o', 3217, 3215, {0}, 0}, + {'\0', 0, 3216, {0}, 0},{'w', 3219, 3217, {0}, 0},{'\0', 0, 3218, {0}, 0}, + {';', 0, 3219, {8660}, 1},{'\0', 0, 3220, {0}, 0},{'s', 3223, 3221, {0}, 0}, + {'\0', 0, 3222, {0}, 0},{'E', 3230, 3223, {0}, 0},{'F', 3254, 3224, {0}, 0}, + {'G', 3272, 3225, {0}, 0},{'L', 3286, 3226, {0}, 0},{'S', 3294, 3227, {0}, 0}, + {'T', 3314, 3228, {0}, 0},{'\0', 0, 3229, {0}, 0},{'q', 3232, 3230, {0}, 0}, + {'\0', 0, 3231, {0}, 0},{'u', 3234, 3232, {0}, 0},{'\0', 0, 3233, {0}, 0}, + {'a', 3236, 3234, {0}, 0},{'\0', 0, 3235, {0}, 0},{'l', 3238, 3236, {0}, 0}, + {'\0', 0, 3237, {0}, 0},{'G', 3240, 3238, {0}, 0},{'\0', 0, 3239, {0}, 0}, + {'r', 3242, 3240, {0}, 0},{'\0', 0, 3241, {0}, 0},{'e', 3244, 3242, {0}, 0}, + {'\0', 0, 3243, {0}, 0},{'a', 3246, 3244, {0}, 0},{'\0', 0, 3245, {0}, 0}, + {'t', 3248, 3246, {0}, 0},{'\0', 0, 3247, {0}, 0},{'e', 3250, 3248, {0}, 0}, + {'\0', 0, 3249, {0}, 0},{'r', 3252, 3250, {0}, 0},{'\0', 0, 3251, {0}, 0}, + {';', 0, 3252, {8922}, 1},{'\0', 0, 3253, {0}, 0},{'u', 3256, 3254, {0}, 0}, + {'\0', 0, 3255, {0}, 0},{'l', 3258, 3256, {0}, 0},{'\0', 0, 3257, {0}, 0}, + {'l', 3260, 3258, {0}, 0},{'\0', 0, 3259, {0}, 0},{'E', 3262, 3260, {0}, 0}, + {'\0', 0, 3261, {0}, 0},{'q', 3264, 3262, {0}, 0},{'\0', 0, 3263, {0}, 0}, + {'u', 3266, 3264, {0}, 0},{'\0', 0, 3265, {0}, 0},{'a', 3268, 3266, {0}, 0}, + {'\0', 0, 3267, {0}, 0},{'l', 3270, 3268, {0}, 0},{'\0', 0, 3269, {0}, 0}, + {';', 0, 3270, {8806}, 1},{'\0', 0, 3271, {0}, 0},{'r', 3274, 3272, {0}, 0}, + {'\0', 0, 3273, {0}, 0},{'e', 3276, 3274, {0}, 0},{'\0', 0, 3275, {0}, 0}, + {'a', 3278, 3276, {0}, 0},{'\0', 0, 3277, {0}, 0},{'t', 3280, 3278, {0}, 0}, + {'\0', 0, 3279, {0}, 0},{'e', 3282, 3280, {0}, 0},{'\0', 0, 3281, {0}, 0}, + {'r', 3284, 3282, {0}, 0},{'\0', 0, 3283, {0}, 0},{';', 0, 3284, {8822}, 1}, + {'\0', 0, 3285, {0}, 0},{'e', 3288, 3286, {0}, 0},{'\0', 0, 3287, {0}, 0}, + {'s', 3290, 3288, {0}, 0},{'\0', 0, 3289, {0}, 0},{'s', 3292, 3290, {0}, 0}, + {'\0', 0, 3291, {0}, 0},{';', 0, 3292, {10913}, 1},{'\0', 0, 3293, {0}, 0}, + {'l', 3296, 3294, {0}, 0},{'\0', 0, 3295, {0}, 0},{'a', 3298, 3296, {0}, 0}, + {'\0', 0, 3297, {0}, 0},{'n', 3300, 3298, {0}, 0},{'\0', 0, 3299, {0}, 0}, + {'t', 3302, 3300, {0}, 0},{'\0', 0, 3301, {0}, 0},{'E', 3304, 3302, {0}, 0}, + {'\0', 0, 3303, {0}, 0},{'q', 3306, 3304, {0}, 0},{'\0', 0, 3305, {0}, 0}, + {'u', 3308, 3306, {0}, 0},{'\0', 0, 3307, {0}, 0},{'a', 3310, 3308, {0}, 0}, + {'\0', 0, 3309, {0}, 0},{'l', 3312, 3310, {0}, 0},{'\0', 0, 3311, {0}, 0}, + {';', 0, 3312, {10877}, 1},{'\0', 0, 3313, {0}, 0},{'i', 3316, 3314, {0}, 0}, + {'\0', 0, 3315, {0}, 0},{'l', 3318, 3316, {0}, 0},{'\0', 0, 3317, {0}, 0}, + {'d', 3320, 3318, {0}, 0},{'\0', 0, 3319, {0}, 0},{'e', 3322, 3320, {0}, 0}, + {'\0', 0, 3321, {0}, 0},{';', 0, 3322, {8818}, 1},{'\0', 0, 3323, {0}, 0}, + {'r', 3326, 3324, {0}, 0},{'\0', 0, 3325, {0}, 0},{';', 0, 3326, {120079}, 1}, + {'\0', 0, 3327, {0}, 0},{';', 0, 3328, {8920}, 1},{'e', 3331, 3329, {0}, 0}, + {'\0', 0, 3330, {0}, 0},{'f', 3333, 3331, {0}, 0},{'\0', 0, 3332, {0}, 0}, + {'t', 3335, 3333, {0}, 0},{'\0', 0, 3334, {0}, 0},{'a', 3337, 3335, {0}, 0}, + {'\0', 0, 3336, {0}, 0},{'r', 3339, 3337, {0}, 0},{'\0', 0, 3338, {0}, 0}, + {'r', 3341, 3339, {0}, 0},{'\0', 0, 3340, {0}, 0},{'o', 3343, 3341, {0}, 0}, + {'\0', 0, 3342, {0}, 0},{'w', 3345, 3343, {0}, 0},{'\0', 0, 3344, {0}, 0}, + {';', 0, 3345, {8666}, 1},{'\0', 0, 3346, {0}, 0},{'i', 3349, 3347, {0}, 0}, + {'\0', 0, 3348, {0}, 0},{'d', 3351, 3349, {0}, 0},{'\0', 0, 3350, {0}, 0}, + {'o', 3353, 3351, {0}, 0},{'\0', 0, 3352, {0}, 0},{'t', 3355, 3353, {0}, 0}, + {'\0', 0, 3354, {0}, 0},{';', 0, 3355, {319}, 1},{'\0', 0, 3356, {0}, 0}, + {'n', 3361, 3357, {0}, 0},{'p', 3486, 3358, {0}, 0},{'w', 3490, 3359, {0}, 0}, + {'\0', 0, 3360, {0}, 0},{'g', 3363, 3361, {0}, 0},{'\0', 0, 3362, {0}, 0}, + {'L', 3368, 3363, {0}, 0},{'R', 3407, 3364, {0}, 0},{'l', 3427, 3365, {0}, 0}, + {'r', 3466, 3366, {0}, 0},{'\0', 0, 3367, {0}, 0},{'e', 3370, 3368, {0}, 0}, + {'\0', 0, 3369, {0}, 0},{'f', 3372, 3370, {0}, 0},{'\0', 0, 3371, {0}, 0}, + {'t', 3374, 3372, {0}, 0},{'\0', 0, 3373, {0}, 0},{'A', 3377, 3374, {0}, 0}, + {'R', 3387, 3375, {0}, 0},{'\0', 0, 3376, {0}, 0},{'r', 3379, 3377, {0}, 0}, + {'\0', 0, 3378, {0}, 0},{'r', 3381, 3379, {0}, 0},{'\0', 0, 3380, {0}, 0}, + {'o', 3383, 3381, {0}, 0},{'\0', 0, 3382, {0}, 0},{'w', 3385, 3383, {0}, 0}, + {'\0', 0, 3384, {0}, 0},{';', 0, 3385, {10229}, 1},{'\0', 0, 3386, {0}, 0}, + {'i', 3389, 3387, {0}, 0},{'\0', 0, 3388, {0}, 0},{'g', 3391, 3389, {0}, 0}, + {'\0', 0, 3390, {0}, 0},{'h', 3393, 3391, {0}, 0},{'\0', 0, 3392, {0}, 0}, + {'t', 3395, 3393, {0}, 0},{'\0', 0, 3394, {0}, 0},{'A', 3397, 3395, {0}, 0}, + {'\0', 0, 3396, {0}, 0},{'r', 3399, 3397, {0}, 0},{'\0', 0, 3398, {0}, 0}, + {'r', 3401, 3399, {0}, 0},{'\0', 0, 3400, {0}, 0},{'o', 3403, 3401, {0}, 0}, + {'\0', 0, 3402, {0}, 0},{'w', 3405, 3403, {0}, 0},{'\0', 0, 3404, {0}, 0}, + {';', 0, 3405, {10231}, 1},{'\0', 0, 3406, {0}, 0},{'i', 3409, 3407, {0}, 0}, + {'\0', 0, 3408, {0}, 0},{'g', 3411, 3409, {0}, 0},{'\0', 0, 3410, {0}, 0}, + {'h', 3413, 3411, {0}, 0},{'\0', 0, 3412, {0}, 0},{'t', 3415, 3413, {0}, 0}, + {'\0', 0, 3414, {0}, 0},{'A', 3417, 3415, {0}, 0},{'\0', 0, 3416, {0}, 0}, + {'r', 3419, 3417, {0}, 0},{'\0', 0, 3418, {0}, 0},{'r', 3421, 3419, {0}, 0}, + {'\0', 0, 3420, {0}, 0},{'o', 3423, 3421, {0}, 0},{'\0', 0, 3422, {0}, 0}, + {'w', 3425, 3423, {0}, 0},{'\0', 0, 3424, {0}, 0},{';', 0, 3425, {10230}, 1}, + {'\0', 0, 3426, {0}, 0},{'e', 3429, 3427, {0}, 0},{'\0', 0, 3428, {0}, 0}, + {'f', 3431, 3429, {0}, 0},{'\0', 0, 3430, {0}, 0},{'t', 3433, 3431, {0}, 0}, + {'\0', 0, 3432, {0}, 0},{'a', 3436, 3433, {0}, 0},{'r', 3446, 3434, {0}, 0}, + {'\0', 0, 3435, {0}, 0},{'r', 3438, 3436, {0}, 0},{'\0', 0, 3437, {0}, 0}, + {'r', 3440, 3438, {0}, 0},{'\0', 0, 3439, {0}, 0},{'o', 3442, 3440, {0}, 0}, + {'\0', 0, 3441, {0}, 0},{'w', 3444, 3442, {0}, 0},{'\0', 0, 3443, {0}, 0}, + {';', 0, 3444, {10232}, 1},{'\0', 0, 3445, {0}, 0},{'i', 3448, 3446, {0}, 0}, + {'\0', 0, 3447, {0}, 0},{'g', 3450, 3448, {0}, 0},{'\0', 0, 3449, {0}, 0}, + {'h', 3452, 3450, {0}, 0},{'\0', 0, 3451, {0}, 0},{'t', 3454, 3452, {0}, 0}, + {'\0', 0, 3453, {0}, 0},{'a', 3456, 3454, {0}, 0},{'\0', 0, 3455, {0}, 0}, + {'r', 3458, 3456, {0}, 0},{'\0', 0, 3457, {0}, 0},{'r', 3460, 3458, {0}, 0}, + {'\0', 0, 3459, {0}, 0},{'o', 3462, 3460, {0}, 0},{'\0', 0, 3461, {0}, 0}, + {'w', 3464, 3462, {0}, 0},{'\0', 0, 3463, {0}, 0},{';', 0, 3464, {10234}, 1}, + {'\0', 0, 3465, {0}, 0},{'i', 3468, 3466, {0}, 0},{'\0', 0, 3467, {0}, 0}, + {'g', 3470, 3468, {0}, 0},{'\0', 0, 3469, {0}, 0},{'h', 3472, 3470, {0}, 0}, + {'\0', 0, 3471, {0}, 0},{'t', 3474, 3472, {0}, 0},{'\0', 0, 3473, {0}, 0}, + {'a', 3476, 3474, {0}, 0},{'\0', 0, 3475, {0}, 0},{'r', 3478, 3476, {0}, 0}, + {'\0', 0, 3477, {0}, 0},{'r', 3480, 3478, {0}, 0},{'\0', 0, 3479, {0}, 0}, + {'o', 3482, 3480, {0}, 0},{'\0', 0, 3481, {0}, 0},{'w', 3484, 3482, {0}, 0}, + {'\0', 0, 3483, {0}, 0},{';', 0, 3484, {10233}, 1},{'\0', 0, 3485, {0}, 0}, + {'f', 3488, 3486, {0}, 0},{'\0', 0, 3487, {0}, 0},{';', 0, 3488, {120131}, 1}, + {'\0', 0, 3489, {0}, 0},{'e', 3492, 3490, {0}, 0},{'\0', 0, 3491, {0}, 0}, + {'r', 3494, 3492, {0}, 0},{'\0', 0, 3493, {0}, 0},{'L', 3497, 3494, {0}, 0}, + {'R', 3515, 3495, {0}, 0},{'\0', 0, 3496, {0}, 0},{'e', 3499, 3497, {0}, 0}, + {'\0', 0, 3498, {0}, 0},{'f', 3501, 3499, {0}, 0},{'\0', 0, 3500, {0}, 0}, + {'t', 3503, 3501, {0}, 0},{'\0', 0, 3502, {0}, 0},{'A', 3505, 3503, {0}, 0}, + {'\0', 0, 3504, {0}, 0},{'r', 3507, 3505, {0}, 0},{'\0', 0, 3506, {0}, 0}, + {'r', 3509, 3507, {0}, 0},{'\0', 0, 3508, {0}, 0},{'o', 3511, 3509, {0}, 0}, + {'\0', 0, 3510, {0}, 0},{'w', 3513, 3511, {0}, 0},{'\0', 0, 3512, {0}, 0}, + {';', 0, 3513, {8601}, 1},{'\0', 0, 3514, {0}, 0},{'i', 3517, 3515, {0}, 0}, + {'\0', 0, 3516, {0}, 0},{'g', 3519, 3517, {0}, 0},{'\0', 0, 3518, {0}, 0}, + {'h', 3521, 3519, {0}, 0},{'\0', 0, 3520, {0}, 0},{'t', 3523, 3521, {0}, 0}, + {'\0', 0, 3522, {0}, 0},{'A', 3525, 3523, {0}, 0},{'\0', 0, 3524, {0}, 0}, + {'r', 3527, 3525, {0}, 0},{'\0', 0, 3526, {0}, 0},{'r', 3529, 3527, {0}, 0}, + {'\0', 0, 3528, {0}, 0},{'o', 3531, 3529, {0}, 0},{'\0', 0, 3530, {0}, 0}, + {'w', 3533, 3531, {0}, 0},{'\0', 0, 3532, {0}, 0},{';', 0, 3533, {8600}, 1}, + {'\0', 0, 3534, {0}, 0},{'c', 3539, 3535, {0}, 0},{'h', 3543, 3536, {0}, 0}, + {'t', 3545, 3537, {0}, 0},{'\0', 0, 3538, {0}, 0},{'r', 3541, 3539, {0}, 0}, + {'\0', 0, 3540, {0}, 0},{';', 0, 3541, {8466}, 1},{'\0', 0, 3542, {0}, 0}, + {';', 0, 3543, {8624}, 1},{'\0', 0, 3544, {0}, 0},{'r', 3547, 3545, {0}, 0}, + {'\0', 0, 3546, {0}, 0},{'o', 3549, 3547, {0}, 0},{'\0', 0, 3548, {0}, 0}, + {'k', 3551, 3549, {0}, 0},{'\0', 0, 3550, {0}, 0},{';', 0, 3551, {321}, 1}, + {'\0', 0, 3552, {0}, 0},{';', 0, 3553, {8810}, 1},{'\0', 0, 3554, {0}, 0}, + {'a', 3564, 3555, {0}, 0},{'c', 3568, 3556, {0}, 0},{'e', 3572, 3557, {0}, 0}, + {'f', 3607, 3558, {0}, 0},{'i', 3611, 3559, {0}, 0},{'o', 3627, 3560, {0}, 0}, + {'s', 3633, 3561, {0}, 0},{'u', 3639, 3562, {0}, 0},{'\0', 0, 3563, {0}, 0}, + {'p', 3566, 3564, {0}, 0},{'\0', 0, 3565, {0}, 0},{';', 0, 3566, {10501}, 1}, + {'\0', 0, 3567, {0}, 0},{'y', 3570, 3568, {0}, 0},{'\0', 0, 3569, {0}, 0}, + {';', 0, 3570, {1052}, 1},{'\0', 0, 3571, {0}, 0},{'d', 3575, 3572, {0}, 0}, + {'l', 3593, 3573, {0}, 0},{'\0', 0, 3574, {0}, 0},{'i', 3577, 3575, {0}, 0}, + {'\0', 0, 3576, {0}, 0},{'u', 3579, 3577, {0}, 0},{'\0', 0, 3578, {0}, 0}, + {'m', 3581, 3579, {0}, 0},{'\0', 0, 3580, {0}, 0},{'S', 3583, 3581, {0}, 0}, + {'\0', 0, 3582, {0}, 0},{'p', 3585, 3583, {0}, 0},{'\0', 0, 3584, {0}, 0}, + {'a', 3587, 3585, {0}, 0},{'\0', 0, 3586, {0}, 0},{'c', 3589, 3587, {0}, 0}, + {'\0', 0, 3588, {0}, 0},{'e', 3591, 3589, {0}, 0},{'\0', 0, 3590, {0}, 0}, + {';', 0, 3591, {8287}, 1},{'\0', 0, 3592, {0}, 0},{'l', 3595, 3593, {0}, 0}, + {'\0', 0, 3594, {0}, 0},{'i', 3597, 3595, {0}, 0},{'\0', 0, 3596, {0}, 0}, + {'n', 3599, 3597, {0}, 0},{'\0', 0, 3598, {0}, 0},{'t', 3601, 3599, {0}, 0}, + {'\0', 0, 3600, {0}, 0},{'r', 3603, 3601, {0}, 0},{'\0', 0, 3602, {0}, 0}, + {'f', 3605, 3603, {0}, 0},{'\0', 0, 3604, {0}, 0},{';', 0, 3605, {8499}, 1}, + {'\0', 0, 3606, {0}, 0},{'r', 3609, 3607, {0}, 0},{'\0', 0, 3608, {0}, 0}, + {';', 0, 3609, {120080}, 1},{'\0', 0, 3610, {0}, 0},{'n', 3613, 3611, {0}, 0}, + {'\0', 0, 3612, {0}, 0},{'u', 3615, 3613, {0}, 0},{'\0', 0, 3614, {0}, 0}, + {'s', 3617, 3615, {0}, 0},{'\0', 0, 3616, {0}, 0},{'P', 3619, 3617, {0}, 0}, + {'\0', 0, 3618, {0}, 0},{'l', 3621, 3619, {0}, 0},{'\0', 0, 3620, {0}, 0}, + {'u', 3623, 3621, {0}, 0},{'\0', 0, 3622, {0}, 0},{'s', 3625, 3623, {0}, 0}, + {'\0', 0, 3624, {0}, 0},{';', 0, 3625, {8723}, 1},{'\0', 0, 3626, {0}, 0}, + {'p', 3629, 3627, {0}, 0},{'\0', 0, 3628, {0}, 0},{'f', 3631, 3629, {0}, 0}, + {'\0', 0, 3630, {0}, 0},{';', 0, 3631, {120132}, 1},{'\0', 0, 3632, {0}, 0}, + {'c', 3635, 3633, {0}, 0},{'\0', 0, 3634, {0}, 0},{'r', 3637, 3635, {0}, 0}, + {'\0', 0, 3636, {0}, 0},{';', 0, 3637, {8499}, 1},{'\0', 0, 3638, {0}, 0}, + {';', 0, 3639, {924}, 1},{'\0', 0, 3640, {0}, 0},{'J', 3651, 3641, {0}, 0}, + {'a', 3657, 3642, {0}, 0},{'c', 3667, 3643, {0}, 0},{'e', 3689, 3644, {0}, 0}, + {'f', 3851, 3645, {0}, 0},{'o', 3855, 3646, {0}, 0},{'s', 4683, 3647, {0}, 0}, + {'t', 4689, 3648, {0}, 0},{'u', 4699, 3649, {0}, 0},{'\0', 0, 3650, {0}, 0}, + {'c', 3653, 3651, {0}, 0},{'\0', 0, 3652, {0}, 0},{'y', 3655, 3653, {0}, 0}, + {'\0', 0, 3654, {0}, 0},{';', 0, 3655, {1034}, 1},{'\0', 0, 3656, {0}, 0}, + {'c', 3659, 3657, {0}, 0},{'\0', 0, 3658, {0}, 0},{'u', 3661, 3659, {0}, 0}, + {'\0', 0, 3660, {0}, 0},{'t', 3663, 3661, {0}, 0},{'\0', 0, 3662, {0}, 0}, + {'e', 3665, 3663, {0}, 0},{'\0', 0, 3664, {0}, 0},{';', 0, 3665, {323}, 1}, + {'\0', 0, 3666, {0}, 0},{'a', 3671, 3667, {0}, 0},{'e', 3679, 3668, {0}, 0}, + {'y', 3687, 3669, {0}, 0},{'\0', 0, 3670, {0}, 0},{'r', 3673, 3671, {0}, 0}, + {'\0', 0, 3672, {0}, 0},{'o', 3675, 3673, {0}, 0},{'\0', 0, 3674, {0}, 0}, + {'n', 3677, 3675, {0}, 0},{'\0', 0, 3676, {0}, 0},{';', 0, 3677, {327}, 1}, + {'\0', 0, 3678, {0}, 0},{'d', 3681, 3679, {0}, 0},{'\0', 0, 3680, {0}, 0}, + {'i', 3683, 3681, {0}, 0},{'\0', 0, 3682, {0}, 0},{'l', 3685, 3683, {0}, 0}, + {'\0', 0, 3684, {0}, 0},{';', 0, 3685, {325}, 1},{'\0', 0, 3686, {0}, 0}, + {';', 0, 3687, {1053}, 1},{'\0', 0, 3688, {0}, 0},{'g', 3693, 3689, {0}, 0}, + {'s', 3788, 3690, {0}, 0},{'w', 3841, 3691, {0}, 0},{'\0', 0, 3692, {0}, 0}, + {'a', 3695, 3693, {0}, 0},{'\0', 0, 3694, {0}, 0},{'t', 3697, 3695, {0}, 0}, + {'\0', 0, 3696, {0}, 0},{'i', 3699, 3697, {0}, 0},{'\0', 0, 3698, {0}, 0}, + {'v', 3701, 3699, {0}, 0},{'\0', 0, 3700, {0}, 0},{'e', 3703, 3701, {0}, 0}, + {'\0', 0, 3702, {0}, 0},{'M', 3707, 3703, {0}, 0},{'T', 3729, 3704, {0}, 0}, + {'V', 3762, 3705, {0}, 0},{'\0', 0, 3706, {0}, 0},{'e', 3709, 3707, {0}, 0}, + {'\0', 0, 3708, {0}, 0},{'d', 3711, 3709, {0}, 0},{'\0', 0, 3710, {0}, 0}, + {'i', 3713, 3711, {0}, 0},{'\0', 0, 3712, {0}, 0},{'u', 3715, 3713, {0}, 0}, + {'\0', 0, 3714, {0}, 0},{'m', 3717, 3715, {0}, 0},{'\0', 0, 3716, {0}, 0}, + {'S', 3719, 3717, {0}, 0},{'\0', 0, 3718, {0}, 0},{'p', 3721, 3719, {0}, 0}, + {'\0', 0, 3720, {0}, 0},{'a', 3723, 3721, {0}, 0},{'\0', 0, 3722, {0}, 0}, + {'c', 3725, 3723, {0}, 0},{'\0', 0, 3724, {0}, 0},{'e', 3727, 3725, {0}, 0}, + {'\0', 0, 3726, {0}, 0},{';', 0, 3727, {8203}, 1},{'\0', 0, 3728, {0}, 0}, + {'h', 3731, 3729, {0}, 0},{'\0', 0, 3730, {0}, 0},{'i', 3733, 3731, {0}, 0}, + {'\0', 0, 3732, {0}, 0},{'c', 3736, 3733, {0}, 0},{'n', 3750, 3734, {0}, 0}, + {'\0', 0, 3735, {0}, 0},{'k', 3738, 3736, {0}, 0},{'\0', 0, 3737, {0}, 0}, + {'S', 3740, 3738, {0}, 0},{'\0', 0, 3739, {0}, 0},{'p', 3742, 3740, {0}, 0}, + {'\0', 0, 3741, {0}, 0},{'a', 3744, 3742, {0}, 0},{'\0', 0, 3743, {0}, 0}, + {'c', 3746, 3744, {0}, 0},{'\0', 0, 3745, {0}, 0},{'e', 3748, 3746, {0}, 0}, + {'\0', 0, 3747, {0}, 0},{';', 0, 3748, {8203}, 1},{'\0', 0, 3749, {0}, 0}, + {'S', 3752, 3750, {0}, 0},{'\0', 0, 3751, {0}, 0},{'p', 3754, 3752, {0}, 0}, + {'\0', 0, 3753, {0}, 0},{'a', 3756, 3754, {0}, 0},{'\0', 0, 3755, {0}, 0}, + {'c', 3758, 3756, {0}, 0},{'\0', 0, 3757, {0}, 0},{'e', 3760, 3758, {0}, 0}, + {'\0', 0, 3759, {0}, 0},{';', 0, 3760, {8203}, 1},{'\0', 0, 3761, {0}, 0}, + {'e', 3764, 3762, {0}, 0},{'\0', 0, 3763, {0}, 0},{'r', 3766, 3764, {0}, 0}, + {'\0', 0, 3765, {0}, 0},{'y', 3768, 3766, {0}, 0},{'\0', 0, 3767, {0}, 0}, + {'T', 3770, 3768, {0}, 0},{'\0', 0, 3769, {0}, 0},{'h', 3772, 3770, {0}, 0}, + {'\0', 0, 3771, {0}, 0},{'i', 3774, 3772, {0}, 0},{'\0', 0, 3773, {0}, 0}, + {'n', 3776, 3774, {0}, 0},{'\0', 0, 3775, {0}, 0},{'S', 3778, 3776, {0}, 0}, + {'\0', 0, 3777, {0}, 0},{'p', 3780, 3778, {0}, 0},{'\0', 0, 3779, {0}, 0}, + {'a', 3782, 3780, {0}, 0},{'\0', 0, 3781, {0}, 0},{'c', 3784, 3782, {0}, 0}, + {'\0', 0, 3783, {0}, 0},{'e', 3786, 3784, {0}, 0},{'\0', 0, 3785, {0}, 0}, + {';', 0, 3786, {8203}, 1},{'\0', 0, 3787, {0}, 0},{'t', 3790, 3788, {0}, 0}, + {'\0', 0, 3789, {0}, 0},{'e', 3792, 3790, {0}, 0},{'\0', 0, 3791, {0}, 0}, + {'d', 3794, 3792, {0}, 0},{'\0', 0, 3793, {0}, 0},{'G', 3797, 3794, {0}, 0}, + {'L', 3825, 3795, {0}, 0},{'\0', 0, 3796, {0}, 0},{'r', 3799, 3797, {0}, 0}, + {'\0', 0, 3798, {0}, 0},{'e', 3801, 3799, {0}, 0},{'\0', 0, 3800, {0}, 0}, + {'a', 3803, 3801, {0}, 0},{'\0', 0, 3802, {0}, 0},{'t', 3805, 3803, {0}, 0}, + {'\0', 0, 3804, {0}, 0},{'e', 3807, 3805, {0}, 0},{'\0', 0, 3806, {0}, 0}, + {'r', 3809, 3807, {0}, 0},{'\0', 0, 3808, {0}, 0},{'G', 3811, 3809, {0}, 0}, + {'\0', 0, 3810, {0}, 0},{'r', 3813, 3811, {0}, 0},{'\0', 0, 3812, {0}, 0}, + {'e', 3815, 3813, {0}, 0},{'\0', 0, 3814, {0}, 0},{'a', 3817, 3815, {0}, 0}, + {'\0', 0, 3816, {0}, 0},{'t', 3819, 3817, {0}, 0},{'\0', 0, 3818, {0}, 0}, + {'e', 3821, 3819, {0}, 0},{'\0', 0, 3820, {0}, 0},{'r', 3823, 3821, {0}, 0}, + {'\0', 0, 3822, {0}, 0},{';', 0, 3823, {8811}, 1},{'\0', 0, 3824, {0}, 0}, + {'e', 3827, 3825, {0}, 0},{'\0', 0, 3826, {0}, 0},{'s', 3829, 3827, {0}, 0}, + {'\0', 0, 3828, {0}, 0},{'s', 3831, 3829, {0}, 0},{'\0', 0, 3830, {0}, 0}, + {'L', 3833, 3831, {0}, 0},{'\0', 0, 3832, {0}, 0},{'e', 3835, 3833, {0}, 0}, + {'\0', 0, 3834, {0}, 0},{'s', 3837, 3835, {0}, 0},{'\0', 0, 3836, {0}, 0}, + {'s', 3839, 3837, {0}, 0},{'\0', 0, 3838, {0}, 0},{';', 0, 3839, {8810}, 1}, + {'\0', 0, 3840, {0}, 0},{'L', 3843, 3841, {0}, 0},{'\0', 0, 3842, {0}, 0}, + {'i', 3845, 3843, {0}, 0},{'\0', 0, 3844, {0}, 0},{'n', 3847, 3845, {0}, 0}, + {'\0', 0, 3846, {0}, 0},{'e', 3849, 3847, {0}, 0},{'\0', 0, 3848, {0}, 0}, + {';', 0, 3849, {10}, 1},{'\0', 0, 3850, {0}, 0},{'r', 3853, 3851, {0}, 0}, + {'\0', 0, 3852, {0}, 0},{';', 0, 3853, {120081}, 1},{'\0', 0, 3854, {0}, 0}, + {'B', 3860, 3855, {0}, 0},{'n', 3870, 3856, {0}, 0},{'p', 3898, 3857, {0}, 0}, + {'t', 3902, 3858, {0}, 0},{'\0', 0, 3859, {0}, 0},{'r', 3862, 3860, {0}, 0}, + {'\0', 0, 3861, {0}, 0},{'e', 3864, 3862, {0}, 0},{'\0', 0, 3863, {0}, 0}, + {'a', 3866, 3864, {0}, 0},{'\0', 0, 3865, {0}, 0},{'k', 3868, 3866, {0}, 0}, + {'\0', 0, 3867, {0}, 0},{';', 0, 3868, {8288}, 1},{'\0', 0, 3869, {0}, 0}, + {'B', 3872, 3870, {0}, 0},{'\0', 0, 3871, {0}, 0},{'r', 3874, 3872, {0}, 0}, + {'\0', 0, 3873, {0}, 0},{'e', 3876, 3874, {0}, 0},{'\0', 0, 3875, {0}, 0}, + {'a', 3878, 3876, {0}, 0},{'\0', 0, 3877, {0}, 0},{'k', 3880, 3878, {0}, 0}, + {'\0', 0, 3879, {0}, 0},{'i', 3882, 3880, {0}, 0},{'\0', 0, 3881, {0}, 0}, + {'n', 3884, 3882, {0}, 0},{'\0', 0, 3883, {0}, 0},{'g', 3886, 3884, {0}, 0}, + {'\0', 0, 3885, {0}, 0},{'S', 3888, 3886, {0}, 0},{'\0', 0, 3887, {0}, 0}, + {'p', 3890, 3888, {0}, 0},{'\0', 0, 3889, {0}, 0},{'a', 3892, 3890, {0}, 0}, + {'\0', 0, 3891, {0}, 0},{'c', 3894, 3892, {0}, 0},{'\0', 0, 3893, {0}, 0}, + {'e', 3896, 3894, {0}, 0},{'\0', 0, 3895, {0}, 0},{';', 0, 3896, {160}, 1}, + {'\0', 0, 3897, {0}, 0},{'f', 3900, 3898, {0}, 0},{'\0', 0, 3899, {0}, 0}, + {';', 0, 3900, {8469}, 1},{'\0', 0, 3901, {0}, 0},{';', 0, 3902, {10988}, 1}, + {'C', 3916, 3903, {0}, 0},{'D', 3945, 3904, {0}, 0},{'E', 3979, 3905, {0}, 0}, + {'G', 4024, 3906, {0}, 0},{'H', 4124, 3907, {0}, 0},{'L', 4159, 3908, {0}, 0}, + {'N', 4273, 3909, {0}, 0},{'P', 4330, 3910, {0}, 0},{'R', 4378, 3911, {0}, 0}, + {'S', 4449, 3912, {0}, 0},{'T', 4610, 3913, {0}, 0},{'V', 4661, 3914, {0}, 0}, + {'\0', 0, 3915, {0}, 0},{'o', 3919, 3916, {0}, 0},{'u', 3935, 3917, {0}, 0}, + {'\0', 0, 3918, {0}, 0},{'n', 3921, 3919, {0}, 0},{'\0', 0, 3920, {0}, 0}, + {'g', 3923, 3921, {0}, 0},{'\0', 0, 3922, {0}, 0},{'r', 3925, 3923, {0}, 0}, + {'\0', 0, 3924, {0}, 0},{'u', 3927, 3925, {0}, 0},{'\0', 0, 3926, {0}, 0}, + {'e', 3929, 3927, {0}, 0},{'\0', 0, 3928, {0}, 0},{'n', 3931, 3929, {0}, 0}, + {'\0', 0, 3930, {0}, 0},{'t', 3933, 3931, {0}, 0},{'\0', 0, 3932, {0}, 0}, + {';', 0, 3933, {8802}, 1},{'\0', 0, 3934, {0}, 0},{'p', 3937, 3935, {0}, 0}, + {'\0', 0, 3936, {0}, 0},{'C', 3939, 3937, {0}, 0},{'\0', 0, 3938, {0}, 0}, + {'a', 3941, 3939, {0}, 0},{'\0', 0, 3940, {0}, 0},{'p', 3943, 3941, {0}, 0}, + {'\0', 0, 3942, {0}, 0},{';', 0, 3943, {8813}, 1},{'\0', 0, 3944, {0}, 0}, + {'o', 3947, 3945, {0}, 0},{'\0', 0, 3946, {0}, 0},{'u', 3949, 3947, {0}, 0}, + {'\0', 0, 3948, {0}, 0},{'b', 3951, 3949, {0}, 0},{'\0', 0, 3950, {0}, 0}, + {'l', 3953, 3951, {0}, 0},{'\0', 0, 3952, {0}, 0},{'e', 3955, 3953, {0}, 0}, + {'\0', 0, 3954, {0}, 0},{'V', 3957, 3955, {0}, 0},{'\0', 0, 3956, {0}, 0}, + {'e', 3959, 3957, {0}, 0},{'\0', 0, 3958, {0}, 0},{'r', 3961, 3959, {0}, 0}, + {'\0', 0, 3960, {0}, 0},{'t', 3963, 3961, {0}, 0},{'\0', 0, 3962, {0}, 0}, + {'i', 3965, 3963, {0}, 0},{'\0', 0, 3964, {0}, 0},{'c', 3967, 3965, {0}, 0}, + {'\0', 0, 3966, {0}, 0},{'a', 3969, 3967, {0}, 0},{'\0', 0, 3968, {0}, 0}, + {'l', 3971, 3969, {0}, 0},{'\0', 0, 3970, {0}, 0},{'B', 3973, 3971, {0}, 0}, + {'\0', 0, 3972, {0}, 0},{'a', 3975, 3973, {0}, 0},{'\0', 0, 3974, {0}, 0}, + {'r', 3977, 3975, {0}, 0},{'\0', 0, 3976, {0}, 0},{';', 0, 3977, {8742}, 1}, + {'\0', 0, 3978, {0}, 0},{'l', 3983, 3979, {0}, 0},{'q', 3995, 3980, {0}, 0}, + {'x', 4014, 3981, {0}, 0},{'\0', 0, 3982, {0}, 0},{'e', 3985, 3983, {0}, 0}, + {'\0', 0, 3984, {0}, 0},{'m', 3987, 3985, {0}, 0},{'\0', 0, 3986, {0}, 0}, + {'e', 3989, 3987, {0}, 0},{'\0', 0, 3988, {0}, 0},{'n', 3991, 3989, {0}, 0}, + {'\0', 0, 3990, {0}, 0},{'t', 3993, 3991, {0}, 0},{'\0', 0, 3992, {0}, 0}, + {';', 0, 3993, {8713}, 1},{'\0', 0, 3994, {0}, 0},{'u', 3997, 3995, {0}, 0}, + {'\0', 0, 3996, {0}, 0},{'a', 3999, 3997, {0}, 0},{'\0', 0, 3998, {0}, 0}, + {'l', 4001, 3999, {0}, 0},{'\0', 0, 4000, {0}, 0},{';', 0, 4001, {8800}, 1}, + {'T', 4004, 4002, {0}, 0},{'\0', 0, 4003, {0}, 0},{'i', 4006, 4004, {0}, 0}, + {'\0', 0, 4005, {0}, 0},{'l', 4008, 4006, {0}, 0},{'\0', 0, 4007, {0}, 0}, + {'d', 4010, 4008, {0}, 0},{'\0', 0, 4009, {0}, 0},{'e', 4012, 4010, {0}, 0}, + {'\0', 0, 4011, {0}, 0},{';', 0, 4012, {8770,824}, 2},{'\0', 0, 4013, {0}, 0}, + {'i', 4016, 4014, {0}, 0},{'\0', 0, 4015, {0}, 0},{'s', 4018, 4016, {0}, 0}, + {'\0', 0, 4017, {0}, 0},{'t', 4020, 4018, {0}, 0},{'\0', 0, 4019, {0}, 0}, + {'s', 4022, 4020, {0}, 0},{'\0', 0, 4021, {0}, 0},{';', 0, 4022, {8708}, 1}, + {'\0', 0, 4023, {0}, 0},{'r', 4026, 4024, {0}, 0},{'\0', 0, 4025, {0}, 0}, + {'e', 4028, 4026, {0}, 0},{'\0', 0, 4027, {0}, 0},{'a', 4030, 4028, {0}, 0}, + {'\0', 0, 4029, {0}, 0},{'t', 4032, 4030, {0}, 0},{'\0', 0, 4031, {0}, 0}, + {'e', 4034, 4032, {0}, 0},{'\0', 0, 4033, {0}, 0},{'r', 4036, 4034, {0}, 0}, + {'\0', 0, 4035, {0}, 0},{';', 0, 4036, {8815}, 1},{'E', 4044, 4037, {0}, 0}, + {'F', 4054, 4038, {0}, 0},{'G', 4072, 4039, {0}, 0},{'L', 4086, 4040, {0}, 0}, + {'S', 4094, 4041, {0}, 0},{'T', 4114, 4042, {0}, 0},{'\0', 0, 4043, {0}, 0}, + {'q', 4046, 4044, {0}, 0},{'\0', 0, 4045, {0}, 0},{'u', 4048, 4046, {0}, 0}, + {'\0', 0, 4047, {0}, 0},{'a', 4050, 4048, {0}, 0},{'\0', 0, 4049, {0}, 0}, + {'l', 4052, 4050, {0}, 0},{'\0', 0, 4051, {0}, 0},{';', 0, 4052, {8817}, 1}, + {'\0', 0, 4053, {0}, 0},{'u', 4056, 4054, {0}, 0},{'\0', 0, 4055, {0}, 0}, + {'l', 4058, 4056, {0}, 0},{'\0', 0, 4057, {0}, 0},{'l', 4060, 4058, {0}, 0}, + {'\0', 0, 4059, {0}, 0},{'E', 4062, 4060, {0}, 0},{'\0', 0, 4061, {0}, 0}, + {'q', 4064, 4062, {0}, 0},{'\0', 0, 4063, {0}, 0},{'u', 4066, 4064, {0}, 0}, + {'\0', 0, 4065, {0}, 0},{'a', 4068, 4066, {0}, 0},{'\0', 0, 4067, {0}, 0}, + {'l', 4070, 4068, {0}, 0},{'\0', 0, 4069, {0}, 0},{';', 0, 4070, {8807,824}, 2}, + {'\0', 0, 4071, {0}, 0},{'r', 4074, 4072, {0}, 0},{'\0', 0, 4073, {0}, 0}, + {'e', 4076, 4074, {0}, 0},{'\0', 0, 4075, {0}, 0},{'a', 4078, 4076, {0}, 0}, + {'\0', 0, 4077, {0}, 0},{'t', 4080, 4078, {0}, 0},{'\0', 0, 4079, {0}, 0}, + {'e', 4082, 4080, {0}, 0},{'\0', 0, 4081, {0}, 0},{'r', 4084, 4082, {0}, 0}, + {'\0', 0, 4083, {0}, 0},{';', 0, 4084, {8811,824}, 2},{'\0', 0, 4085, {0}, 0}, + {'e', 4088, 4086, {0}, 0},{'\0', 0, 4087, {0}, 0},{'s', 4090, 4088, {0}, 0}, + {'\0', 0, 4089, {0}, 0},{'s', 4092, 4090, {0}, 0},{'\0', 0, 4091, {0}, 0}, + {';', 0, 4092, {8825}, 1},{'\0', 0, 4093, {0}, 0},{'l', 4096, 4094, {0}, 0}, + {'\0', 0, 4095, {0}, 0},{'a', 4098, 4096, {0}, 0},{'\0', 0, 4097, {0}, 0}, + {'n', 4100, 4098, {0}, 0},{'\0', 0, 4099, {0}, 0},{'t', 4102, 4100, {0}, 0}, + {'\0', 0, 4101, {0}, 0},{'E', 4104, 4102, {0}, 0},{'\0', 0, 4103, {0}, 0}, + {'q', 4106, 4104, {0}, 0},{'\0', 0, 4105, {0}, 0},{'u', 4108, 4106, {0}, 0}, + {'\0', 0, 4107, {0}, 0},{'a', 4110, 4108, {0}, 0},{'\0', 0, 4109, {0}, 0}, + {'l', 4112, 4110, {0}, 0},{'\0', 0, 4111, {0}, 0},{';', 0, 4112, {10878,824}, 2}, + {'\0', 0, 4113, {0}, 0},{'i', 4116, 4114, {0}, 0},{'\0', 0, 4115, {0}, 0}, + {'l', 4118, 4116, {0}, 0},{'\0', 0, 4117, {0}, 0},{'d', 4120, 4118, {0}, 0}, + {'\0', 0, 4119, {0}, 0},{'e', 4122, 4120, {0}, 0},{'\0', 0, 4121, {0}, 0}, + {';', 0, 4122, {8821}, 1},{'\0', 0, 4123, {0}, 0},{'u', 4126, 4124, {0}, 0}, + {'\0', 0, 4125, {0}, 0},{'m', 4128, 4126, {0}, 0},{'\0', 0, 4127, {0}, 0}, + {'p', 4130, 4128, {0}, 0},{'\0', 0, 4129, {0}, 0},{'D', 4133, 4130, {0}, 0}, + {'E', 4149, 4131, {0}, 0},{'\0', 0, 4132, {0}, 0},{'o', 4135, 4133, {0}, 0}, + {'\0', 0, 4134, {0}, 0},{'w', 4137, 4135, {0}, 0},{'\0', 0, 4136, {0}, 0}, + {'n', 4139, 4137, {0}, 0},{'\0', 0, 4138, {0}, 0},{'H', 4141, 4139, {0}, 0}, + {'\0', 0, 4140, {0}, 0},{'u', 4143, 4141, {0}, 0},{'\0', 0, 4142, {0}, 0}, + {'m', 4145, 4143, {0}, 0},{'\0', 0, 4144, {0}, 0},{'p', 4147, 4145, {0}, 0}, + {'\0', 0, 4146, {0}, 0},{';', 0, 4147, {8782,824}, 2},{'\0', 0, 4148, {0}, 0}, + {'q', 4151, 4149, {0}, 0},{'\0', 0, 4150, {0}, 0},{'u', 4153, 4151, {0}, 0}, + {'\0', 0, 4152, {0}, 0},{'a', 4155, 4153, {0}, 0},{'\0', 0, 4154, {0}, 0}, + {'l', 4157, 4155, {0}, 0},{'\0', 0, 4156, {0}, 0},{';', 0, 4157, {8783,824}, 2}, + {'\0', 0, 4158, {0}, 0},{'e', 4161, 4159, {0}, 0},{'\0', 0, 4160, {0}, 0}, + {'f', 4164, 4161, {0}, 0},{'s', 4202, 4162, {0}, 0},{'\0', 0, 4163, {0}, 0}, + {'t', 4166, 4164, {0}, 0},{'\0', 0, 4165, {0}, 0},{'T', 4168, 4166, {0}, 0}, + {'\0', 0, 4167, {0}, 0},{'r', 4170, 4168, {0}, 0},{'\0', 0, 4169, {0}, 0}, + {'i', 4172, 4170, {0}, 0},{'\0', 0, 4171, {0}, 0},{'a', 4174, 4172, {0}, 0}, + {'\0', 0, 4173, {0}, 0},{'n', 4176, 4174, {0}, 0},{'\0', 0, 4175, {0}, 0}, + {'g', 4178, 4176, {0}, 0},{'\0', 0, 4177, {0}, 0},{'l', 4180, 4178, {0}, 0}, + {'\0', 0, 4179, {0}, 0},{'e', 4182, 4180, {0}, 0},{'\0', 0, 4181, {0}, 0}, + {';', 0, 4182, {8938}, 1},{'B', 4186, 4183, {0}, 0},{'E', 4192, 4184, {0}, 0}, + {'\0', 0, 4185, {0}, 0},{'a', 4188, 4186, {0}, 0},{'\0', 0, 4187, {0}, 0}, + {'r', 4190, 4188, {0}, 0},{'\0', 0, 4189, {0}, 0},{';', 0, 4190, {10703,824}, 2}, + {'\0', 0, 4191, {0}, 0},{'q', 4194, 4192, {0}, 0},{'\0', 0, 4193, {0}, 0}, + {'u', 4196, 4194, {0}, 0},{'\0', 0, 4195, {0}, 0},{'a', 4198, 4196, {0}, 0}, + {'\0', 0, 4197, {0}, 0},{'l', 4200, 4198, {0}, 0},{'\0', 0, 4199, {0}, 0}, + {';', 0, 4200, {8940}, 1},{'\0', 0, 4201, {0}, 0},{'s', 4204, 4202, {0}, 0}, + {'\0', 0, 4203, {0}, 0},{';', 0, 4204, {8814}, 1},{'E', 4211, 4205, {0}, 0}, + {'G', 4221, 4206, {0}, 0},{'L', 4235, 4207, {0}, 0},{'S', 4243, 4208, {0}, 0}, + {'T', 4263, 4209, {0}, 0},{'\0', 0, 4210, {0}, 0},{'q', 4213, 4211, {0}, 0}, + {'\0', 0, 4212, {0}, 0},{'u', 4215, 4213, {0}, 0},{'\0', 0, 4214, {0}, 0}, + {'a', 4217, 4215, {0}, 0},{'\0', 0, 4216, {0}, 0},{'l', 4219, 4217, {0}, 0}, + {'\0', 0, 4218, {0}, 0},{';', 0, 4219, {8816}, 1},{'\0', 0, 4220, {0}, 0}, + {'r', 4223, 4221, {0}, 0},{'\0', 0, 4222, {0}, 0},{'e', 4225, 4223, {0}, 0}, + {'\0', 0, 4224, {0}, 0},{'a', 4227, 4225, {0}, 0},{'\0', 0, 4226, {0}, 0}, + {'t', 4229, 4227, {0}, 0},{'\0', 0, 4228, {0}, 0},{'e', 4231, 4229, {0}, 0}, + {'\0', 0, 4230, {0}, 0},{'r', 4233, 4231, {0}, 0},{'\0', 0, 4232, {0}, 0}, + {';', 0, 4233, {8824}, 1},{'\0', 0, 4234, {0}, 0},{'e', 4237, 4235, {0}, 0}, + {'\0', 0, 4236, {0}, 0},{'s', 4239, 4237, {0}, 0},{'\0', 0, 4238, {0}, 0}, + {'s', 4241, 4239, {0}, 0},{'\0', 0, 4240, {0}, 0},{';', 0, 4241, {8810,824}, 2}, + {'\0', 0, 4242, {0}, 0},{'l', 4245, 4243, {0}, 0},{'\0', 0, 4244, {0}, 0}, + {'a', 4247, 4245, {0}, 0},{'\0', 0, 4246, {0}, 0},{'n', 4249, 4247, {0}, 0}, + {'\0', 0, 4248, {0}, 0},{'t', 4251, 4249, {0}, 0},{'\0', 0, 4250, {0}, 0}, + {'E', 4253, 4251, {0}, 0},{'\0', 0, 4252, {0}, 0},{'q', 4255, 4253, {0}, 0}, + {'\0', 0, 4254, {0}, 0},{'u', 4257, 4255, {0}, 0},{'\0', 0, 4256, {0}, 0}, + {'a', 4259, 4257, {0}, 0},{'\0', 0, 4258, {0}, 0},{'l', 4261, 4259, {0}, 0}, + {'\0', 0, 4260, {0}, 0},{';', 0, 4261, {10877,824}, 2},{'\0', 0, 4262, {0}, 0}, + {'i', 4265, 4263, {0}, 0},{'\0', 0, 4264, {0}, 0},{'l', 4267, 4265, {0}, 0}, + {'\0', 0, 4266, {0}, 0},{'d', 4269, 4267, {0}, 0},{'\0', 0, 4268, {0}, 0}, + {'e', 4271, 4269, {0}, 0},{'\0', 0, 4270, {0}, 0},{';', 0, 4271, {8820}, 1}, + {'\0', 0, 4272, {0}, 0},{'e', 4275, 4273, {0}, 0},{'\0', 0, 4274, {0}, 0}, + {'s', 4277, 4275, {0}, 0},{'\0', 0, 4276, {0}, 0},{'t', 4279, 4277, {0}, 0}, + {'\0', 0, 4278, {0}, 0},{'e', 4281, 4279, {0}, 0},{'\0', 0, 4280, {0}, 0}, + {'d', 4283, 4281, {0}, 0},{'\0', 0, 4282, {0}, 0},{'G', 4286, 4283, {0}, 0}, + {'L', 4314, 4284, {0}, 0},{'\0', 0, 4285, {0}, 0},{'r', 4288, 4286, {0}, 0}, + {'\0', 0, 4287, {0}, 0},{'e', 4290, 4288, {0}, 0},{'\0', 0, 4289, {0}, 0}, + {'a', 4292, 4290, {0}, 0},{'\0', 0, 4291, {0}, 0},{'t', 4294, 4292, {0}, 0}, + {'\0', 0, 4293, {0}, 0},{'e', 4296, 4294, {0}, 0},{'\0', 0, 4295, {0}, 0}, + {'r', 4298, 4296, {0}, 0},{'\0', 0, 4297, {0}, 0},{'G', 4300, 4298, {0}, 0}, + {'\0', 0, 4299, {0}, 0},{'r', 4302, 4300, {0}, 0},{'\0', 0, 4301, {0}, 0}, + {'e', 4304, 4302, {0}, 0},{'\0', 0, 4303, {0}, 0},{'a', 4306, 4304, {0}, 0}, + {'\0', 0, 4305, {0}, 0},{'t', 4308, 4306, {0}, 0},{'\0', 0, 4307, {0}, 0}, + {'e', 4310, 4308, {0}, 0},{'\0', 0, 4309, {0}, 0},{'r', 4312, 4310, {0}, 0}, + {'\0', 0, 4311, {0}, 0},{';', 0, 4312, {10914,824}, 2},{'\0', 0, 4313, {0}, 0}, + {'e', 4316, 4314, {0}, 0},{'\0', 0, 4315, {0}, 0},{'s', 4318, 4316, {0}, 0}, + {'\0', 0, 4317, {0}, 0},{'s', 4320, 4318, {0}, 0},{'\0', 0, 4319, {0}, 0}, + {'L', 4322, 4320, {0}, 0},{'\0', 0, 4321, {0}, 0},{'e', 4324, 4322, {0}, 0}, + {'\0', 0, 4323, {0}, 0},{'s', 4326, 4324, {0}, 0},{'\0', 0, 4325, {0}, 0}, + {'s', 4328, 4326, {0}, 0},{'\0', 0, 4327, {0}, 0},{';', 0, 4328, {10913,824}, 2}, + {'\0', 0, 4329, {0}, 0},{'r', 4332, 4330, {0}, 0},{'\0', 0, 4331, {0}, 0}, + {'e', 4334, 4332, {0}, 0},{'\0', 0, 4333, {0}, 0},{'c', 4336, 4334, {0}, 0}, + {'\0', 0, 4335, {0}, 0},{'e', 4338, 4336, {0}, 0},{'\0', 0, 4337, {0}, 0}, + {'d', 4340, 4338, {0}, 0},{'\0', 0, 4339, {0}, 0},{'e', 4342, 4340, {0}, 0}, + {'\0', 0, 4341, {0}, 0},{'s', 4344, 4342, {0}, 0},{'\0', 0, 4343, {0}, 0}, + {';', 0, 4344, {8832}, 1},{'E', 4348, 4345, {0}, 0},{'S', 4358, 4346, {0}, 0}, + {'\0', 0, 4347, {0}, 0},{'q', 4350, 4348, {0}, 0},{'\0', 0, 4349, {0}, 0}, + {'u', 4352, 4350, {0}, 0},{'\0', 0, 4351, {0}, 0},{'a', 4354, 4352, {0}, 0}, + {'\0', 0, 4353, {0}, 0},{'l', 4356, 4354, {0}, 0},{'\0', 0, 4355, {0}, 0}, + {';', 0, 4356, {10927,824}, 2},{'\0', 0, 4357, {0}, 0},{'l', 4360, 4358, {0}, 0}, + {'\0', 0, 4359, {0}, 0},{'a', 4362, 4360, {0}, 0},{'\0', 0, 4361, {0}, 0}, + {'n', 4364, 4362, {0}, 0},{'\0', 0, 4363, {0}, 0},{'t', 4366, 4364, {0}, 0}, + {'\0', 0, 4365, {0}, 0},{'E', 4368, 4366, {0}, 0},{'\0', 0, 4367, {0}, 0}, + {'q', 4370, 4368, {0}, 0},{'\0', 0, 4369, {0}, 0},{'u', 4372, 4370, {0}, 0}, + {'\0', 0, 4371, {0}, 0},{'a', 4374, 4372, {0}, 0},{'\0', 0, 4373, {0}, 0}, + {'l', 4376, 4374, {0}, 0},{'\0', 0, 4375, {0}, 0},{';', 0, 4376, {8928}, 1}, + {'\0', 0, 4377, {0}, 0},{'e', 4381, 4378, {0}, 0},{'i', 4407, 4379, {0}, 0}, + {'\0', 0, 4380, {0}, 0},{'v', 4383, 4381, {0}, 0},{'\0', 0, 4382, {0}, 0}, + {'e', 4385, 4383, {0}, 0},{'\0', 0, 4384, {0}, 0},{'r', 4387, 4385, {0}, 0}, + {'\0', 0, 4386, {0}, 0},{'s', 4389, 4387, {0}, 0},{'\0', 0, 4388, {0}, 0}, + {'e', 4391, 4389, {0}, 0},{'\0', 0, 4390, {0}, 0},{'E', 4393, 4391, {0}, 0}, + {'\0', 0, 4392, {0}, 0},{'l', 4395, 4393, {0}, 0},{'\0', 0, 4394, {0}, 0}, + {'e', 4397, 4395, {0}, 0},{'\0', 0, 4396, {0}, 0},{'m', 4399, 4397, {0}, 0}, + {'\0', 0, 4398, {0}, 0},{'e', 4401, 4399, {0}, 0},{'\0', 0, 4400, {0}, 0}, + {'n', 4403, 4401, {0}, 0},{'\0', 0, 4402, {0}, 0},{'t', 4405, 4403, {0}, 0}, + {'\0', 0, 4404, {0}, 0},{';', 0, 4405, {8716}, 1},{'\0', 0, 4406, {0}, 0}, + {'g', 4409, 4407, {0}, 0},{'\0', 0, 4408, {0}, 0},{'h', 4411, 4409, {0}, 0}, + {'\0', 0, 4410, {0}, 0},{'t', 4413, 4411, {0}, 0},{'\0', 0, 4412, {0}, 0}, + {'T', 4415, 4413, {0}, 0},{'\0', 0, 4414, {0}, 0},{'r', 4417, 4415, {0}, 0}, + {'\0', 0, 4416, {0}, 0},{'i', 4419, 4417, {0}, 0},{'\0', 0, 4418, {0}, 0}, + {'a', 4421, 4419, {0}, 0},{'\0', 0, 4420, {0}, 0},{'n', 4423, 4421, {0}, 0}, + {'\0', 0, 4422, {0}, 0},{'g', 4425, 4423, {0}, 0},{'\0', 0, 4424, {0}, 0}, + {'l', 4427, 4425, {0}, 0},{'\0', 0, 4426, {0}, 0},{'e', 4429, 4427, {0}, 0}, + {'\0', 0, 4428, {0}, 0},{';', 0, 4429, {8939}, 1},{'B', 4433, 4430, {0}, 0}, + {'E', 4439, 4431, {0}, 0},{'\0', 0, 4432, {0}, 0},{'a', 4435, 4433, {0}, 0}, + {'\0', 0, 4434, {0}, 0},{'r', 4437, 4435, {0}, 0},{'\0', 0, 4436, {0}, 0}, + {';', 0, 4437, {10704,824}, 2},{'\0', 0, 4438, {0}, 0},{'q', 4441, 4439, {0}, 0}, + {'\0', 0, 4440, {0}, 0},{'u', 4443, 4441, {0}, 0},{'\0', 0, 4442, {0}, 0}, + {'a', 4445, 4443, {0}, 0},{'\0', 0, 4444, {0}, 0},{'l', 4447, 4445, {0}, 0}, + {'\0', 0, 4446, {0}, 0},{';', 0, 4447, {8941}, 1},{'\0', 0, 4448, {0}, 0}, + {'q', 4452, 4449, {0}, 0},{'u', 4509, 4450, {0}, 0},{'\0', 0, 4451, {0}, 0}, + {'u', 4454, 4452, {0}, 0},{'\0', 0, 4453, {0}, 0},{'a', 4456, 4454, {0}, 0}, + {'\0', 0, 4455, {0}, 0},{'r', 4458, 4456, {0}, 0},{'\0', 0, 4457, {0}, 0}, + {'e', 4460, 4458, {0}, 0},{'\0', 0, 4459, {0}, 0},{'S', 4462, 4460, {0}, 0}, + {'\0', 0, 4461, {0}, 0},{'u', 4464, 4462, {0}, 0},{'\0', 0, 4463, {0}, 0}, + {'b', 4467, 4464, {0}, 0},{'p', 4486, 4465, {0}, 0},{'\0', 0, 4466, {0}, 0}, + {'s', 4469, 4467, {0}, 0},{'\0', 0, 4468, {0}, 0},{'e', 4471, 4469, {0}, 0}, + {'\0', 0, 4470, {0}, 0},{'t', 4473, 4471, {0}, 0},{'\0', 0, 4472, {0}, 0}, + {';', 0, 4473, {8847,824}, 2},{'E', 4476, 4474, {0}, 0},{'\0', 0, 4475, {0}, 0}, + {'q', 4478, 4476, {0}, 0},{'\0', 0, 4477, {0}, 0},{'u', 4480, 4478, {0}, 0}, + {'\0', 0, 4479, {0}, 0},{'a', 4482, 4480, {0}, 0},{'\0', 0, 4481, {0}, 0}, + {'l', 4484, 4482, {0}, 0},{'\0', 0, 4483, {0}, 0},{';', 0, 4484, {8930}, 1}, + {'\0', 0, 4485, {0}, 0},{'e', 4488, 4486, {0}, 0},{'\0', 0, 4487, {0}, 0}, + {'r', 4490, 4488, {0}, 0},{'\0', 0, 4489, {0}, 0},{'s', 4492, 4490, {0}, 0}, + {'\0', 0, 4491, {0}, 0},{'e', 4494, 4492, {0}, 0},{'\0', 0, 4493, {0}, 0}, + {'t', 4496, 4494, {0}, 0},{'\0', 0, 4495, {0}, 0},{';', 0, 4496, {8848,824}, 2}, + {'E', 4499, 4497, {0}, 0},{'\0', 0, 4498, {0}, 0},{'q', 4501, 4499, {0}, 0}, + {'\0', 0, 4500, {0}, 0},{'u', 4503, 4501, {0}, 0},{'\0', 0, 4502, {0}, 0}, + {'a', 4505, 4503, {0}, 0},{'\0', 0, 4504, {0}, 0},{'l', 4507, 4505, {0}, 0}, + {'\0', 0, 4506, {0}, 0},{';', 0, 4507, {8931}, 1},{'\0', 0, 4508, {0}, 0}, + {'b', 4513, 4509, {0}, 0},{'c', 4532, 4510, {0}, 0},{'p', 4587, 4511, {0}, 0}, + {'\0', 0, 4512, {0}, 0},{'s', 4515, 4513, {0}, 0},{'\0', 0, 4514, {0}, 0}, + {'e', 4517, 4515, {0}, 0},{'\0', 0, 4516, {0}, 0},{'t', 4519, 4517, {0}, 0}, + {'\0', 0, 4518, {0}, 0},{';', 0, 4519, {8834,8402}, 2},{'E', 4522, 4520, {0}, 0}, + {'\0', 0, 4521, {0}, 0},{'q', 4524, 4522, {0}, 0},{'\0', 0, 4523, {0}, 0}, + {'u', 4526, 4524, {0}, 0},{'\0', 0, 4525, {0}, 0},{'a', 4528, 4526, {0}, 0}, + {'\0', 0, 4527, {0}, 0},{'l', 4530, 4528, {0}, 0},{'\0', 0, 4529, {0}, 0}, + {';', 0, 4530, {8840}, 1},{'\0', 0, 4531, {0}, 0},{'c', 4534, 4532, {0}, 0}, + {'\0', 0, 4533, {0}, 0},{'e', 4536, 4534, {0}, 0},{'\0', 0, 4535, {0}, 0}, + {'e', 4538, 4536, {0}, 0},{'\0', 0, 4537, {0}, 0},{'d', 4540, 4538, {0}, 0}, + {'\0', 0, 4539, {0}, 0},{'s', 4542, 4540, {0}, 0},{'\0', 0, 4541, {0}, 0}, + {';', 0, 4542, {8833}, 1},{'E', 4547, 4543, {0}, 0},{'S', 4557, 4544, {0}, 0}, + {'T', 4577, 4545, {0}, 0},{'\0', 0, 4546, {0}, 0},{'q', 4549, 4547, {0}, 0}, + {'\0', 0, 4548, {0}, 0},{'u', 4551, 4549, {0}, 0},{'\0', 0, 4550, {0}, 0}, + {'a', 4553, 4551, {0}, 0},{'\0', 0, 4552, {0}, 0},{'l', 4555, 4553, {0}, 0}, + {'\0', 0, 4554, {0}, 0},{';', 0, 4555, {10928,824}, 2},{'\0', 0, 4556, {0}, 0}, + {'l', 4559, 4557, {0}, 0},{'\0', 0, 4558, {0}, 0},{'a', 4561, 4559, {0}, 0}, + {'\0', 0, 4560, {0}, 0},{'n', 4563, 4561, {0}, 0},{'\0', 0, 4562, {0}, 0}, + {'t', 4565, 4563, {0}, 0},{'\0', 0, 4564, {0}, 0},{'E', 4567, 4565, {0}, 0}, + {'\0', 0, 4566, {0}, 0},{'q', 4569, 4567, {0}, 0},{'\0', 0, 4568, {0}, 0}, + {'u', 4571, 4569, {0}, 0},{'\0', 0, 4570, {0}, 0},{'a', 4573, 4571, {0}, 0}, + {'\0', 0, 4572, {0}, 0},{'l', 4575, 4573, {0}, 0},{'\0', 0, 4574, {0}, 0}, + {';', 0, 4575, {8929}, 1},{'\0', 0, 4576, {0}, 0},{'i', 4579, 4577, {0}, 0}, + {'\0', 0, 4578, {0}, 0},{'l', 4581, 4579, {0}, 0},{'\0', 0, 4580, {0}, 0}, + {'d', 4583, 4581, {0}, 0},{'\0', 0, 4582, {0}, 0},{'e', 4585, 4583, {0}, 0}, + {'\0', 0, 4584, {0}, 0},{';', 0, 4585, {8831,824}, 2},{'\0', 0, 4586, {0}, 0}, + {'e', 4589, 4587, {0}, 0},{'\0', 0, 4588, {0}, 0},{'r', 4591, 4589, {0}, 0}, + {'\0', 0, 4590, {0}, 0},{'s', 4593, 4591, {0}, 0},{'\0', 0, 4592, {0}, 0}, + {'e', 4595, 4593, {0}, 0},{'\0', 0, 4594, {0}, 0},{'t', 4597, 4595, {0}, 0}, + {'\0', 0, 4596, {0}, 0},{';', 0, 4597, {8835,8402}, 2},{'E', 4600, 4598, {0}, 0}, + {'\0', 0, 4599, {0}, 0},{'q', 4602, 4600, {0}, 0},{'\0', 0, 4601, {0}, 0}, + {'u', 4604, 4602, {0}, 0},{'\0', 0, 4603, {0}, 0},{'a', 4606, 4604, {0}, 0}, + {'\0', 0, 4605, {0}, 0},{'l', 4608, 4606, {0}, 0},{'\0', 0, 4607, {0}, 0}, + {';', 0, 4608, {8841}, 1},{'\0', 0, 4609, {0}, 0},{'i', 4612, 4610, {0}, 0}, + {'\0', 0, 4611, {0}, 0},{'l', 4614, 4612, {0}, 0},{'\0', 0, 4613, {0}, 0}, + {'d', 4616, 4614, {0}, 0},{'\0', 0, 4615, {0}, 0},{'e', 4618, 4616, {0}, 0}, + {'\0', 0, 4617, {0}, 0},{';', 0, 4618, {8769}, 1},{'E', 4623, 4619, {0}, 0}, + {'F', 4633, 4620, {0}, 0},{'T', 4651, 4621, {0}, 0},{'\0', 0, 4622, {0}, 0}, + {'q', 4625, 4623, {0}, 0},{'\0', 0, 4624, {0}, 0},{'u', 4627, 4625, {0}, 0}, + {'\0', 0, 4626, {0}, 0},{'a', 4629, 4627, {0}, 0},{'\0', 0, 4628, {0}, 0}, + {'l', 4631, 4629, {0}, 0},{'\0', 0, 4630, {0}, 0},{';', 0, 4631, {8772}, 1}, + {'\0', 0, 4632, {0}, 0},{'u', 4635, 4633, {0}, 0},{'\0', 0, 4634, {0}, 0}, + {'l', 4637, 4635, {0}, 0},{'\0', 0, 4636, {0}, 0},{'l', 4639, 4637, {0}, 0}, + {'\0', 0, 4638, {0}, 0},{'E', 4641, 4639, {0}, 0},{'\0', 0, 4640, {0}, 0}, + {'q', 4643, 4641, {0}, 0},{'\0', 0, 4642, {0}, 0},{'u', 4645, 4643, {0}, 0}, + {'\0', 0, 4644, {0}, 0},{'a', 4647, 4645, {0}, 0},{'\0', 0, 4646, {0}, 0}, + {'l', 4649, 4647, {0}, 0},{'\0', 0, 4648, {0}, 0},{';', 0, 4649, {8775}, 1}, + {'\0', 0, 4650, {0}, 0},{'i', 4653, 4651, {0}, 0},{'\0', 0, 4652, {0}, 0}, + {'l', 4655, 4653, {0}, 0},{'\0', 0, 4654, {0}, 0},{'d', 4657, 4655, {0}, 0}, + {'\0', 0, 4656, {0}, 0},{'e', 4659, 4657, {0}, 0},{'\0', 0, 4658, {0}, 0}, + {';', 0, 4659, {8777}, 1},{'\0', 0, 4660, {0}, 0},{'e', 4663, 4661, {0}, 0}, + {'\0', 0, 4662, {0}, 0},{'r', 4665, 4663, {0}, 0},{'\0', 0, 4664, {0}, 0}, + {'t', 4667, 4665, {0}, 0},{'\0', 0, 4666, {0}, 0},{'i', 4669, 4667, {0}, 0}, + {'\0', 0, 4668, {0}, 0},{'c', 4671, 4669, {0}, 0},{'\0', 0, 4670, {0}, 0}, + {'a', 4673, 4671, {0}, 0},{'\0', 0, 4672, {0}, 0},{'l', 4675, 4673, {0}, 0}, + {'\0', 0, 4674, {0}, 0},{'B', 4677, 4675, {0}, 0},{'\0', 0, 4676, {0}, 0}, + {'a', 4679, 4677, {0}, 0},{'\0', 0, 4678, {0}, 0},{'r', 4681, 4679, {0}, 0}, + {'\0', 0, 4680, {0}, 0},{';', 0, 4681, {8740}, 1},{'\0', 0, 4682, {0}, 0}, + {'c', 4685, 4683, {0}, 0},{'\0', 0, 4684, {0}, 0},{'r', 4687, 4685, {0}, 0}, + {'\0', 0, 4686, {0}, 0},{';', 0, 4687, {119977}, 1},{'\0', 0, 4688, {0}, 0}, + {'i', 4691, 4689, {0}, 0},{'\0', 0, 4690, {0}, 0},{'l', 4693, 4691, {0}, 0}, + {'\0', 0, 4692, {0}, 0},{'d', 4695, 4693, {0}, 0},{'\0', 0, 4694, {0}, 0}, + {'e', 4697, 4695, {209}, 1},{'\0', 0, 4696, {0}, 0},{';', 0, 4697, {209}, 1}, + {'\0', 0, 4698, {0}, 0},{';', 0, 4699, {925}, 1},{'\0', 0, 4700, {0}, 0}, + {'E', 4716, 4701, {0}, 0},{'a', 4724, 4702, {0}, 0},{'c', 4734, 4703, {0}, 0}, + {'d', 4745, 4704, {0}, 0},{'f', 4755, 4705, {0}, 0},{'g', 4759, 4706, {0}, 0}, + {'m', 4769, 4707, {0}, 0},{'o', 4795, 4708, {0}, 0},{'p', 4801, 4709, {0}, 0}, + {'r', 4850, 4710, {0}, 0},{'s', 4852, 4711, {0}, 0},{'t', 4867, 4712, {0}, 0}, + {'u', 4884, 4713, {0}, 0},{'v', 4890, 4714, {0}, 0},{'\0', 0, 4715, {0}, 0}, + {'l', 4718, 4716, {0}, 0},{'\0', 0, 4717, {0}, 0},{'i', 4720, 4718, {0}, 0}, + {'\0', 0, 4719, {0}, 0},{'g', 4722, 4720, {0}, 0},{'\0', 0, 4721, {0}, 0}, + {';', 0, 4722, {338}, 1},{'\0', 0, 4723, {0}, 0},{'c', 4726, 4724, {0}, 0}, + {'\0', 0, 4725, {0}, 0},{'u', 4728, 4726, {0}, 0},{'\0', 0, 4727, {0}, 0}, + {'t', 4730, 4728, {0}, 0},{'\0', 0, 4729, {0}, 0},{'e', 4732, 4730, {211}, 1}, + {'\0', 0, 4731, {0}, 0},{';', 0, 4732, {211}, 1},{'\0', 0, 4733, {0}, 0}, + {'i', 4737, 4734, {0}, 0},{'y', 4743, 4735, {0}, 0},{'\0', 0, 4736, {0}, 0}, + {'r', 4739, 4737, {0}, 0},{'\0', 0, 4738, {0}, 0},{'c', 4741, 4739, {212}, 1}, + {'\0', 0, 4740, {0}, 0},{';', 0, 4741, {212}, 1},{'\0', 0, 4742, {0}, 0}, + {';', 0, 4743, {1054}, 1},{'\0', 0, 4744, {0}, 0},{'b', 4747, 4745, {0}, 0}, + {'\0', 0, 4746, {0}, 0},{'l', 4749, 4747, {0}, 0},{'\0', 0, 4748, {0}, 0}, + {'a', 4751, 4749, {0}, 0},{'\0', 0, 4750, {0}, 0},{'c', 4753, 4751, {0}, 0}, + {'\0', 0, 4752, {0}, 0},{';', 0, 4753, {336}, 1},{'\0', 0, 4754, {0}, 0}, + {'r', 4757, 4755, {0}, 0},{'\0', 0, 4756, {0}, 0},{';', 0, 4757, {120082}, 1}, + {'\0', 0, 4758, {0}, 0},{'r', 4761, 4759, {0}, 0},{'\0', 0, 4760, {0}, 0}, + {'a', 4763, 4761, {0}, 0},{'\0', 0, 4762, {0}, 0},{'v', 4765, 4763, {0}, 0}, + {'\0', 0, 4764, {0}, 0},{'e', 4767, 4765, {210}, 1},{'\0', 0, 4766, {0}, 0}, + {';', 0, 4767, {210}, 1},{'\0', 0, 4768, {0}, 0},{'a', 4773, 4769, {0}, 0}, + {'e', 4779, 4770, {0}, 0},{'i', 4785, 4771, {0}, 0},{'\0', 0, 4772, {0}, 0}, + {'c', 4775, 4773, {0}, 0},{'\0', 0, 4774, {0}, 0},{'r', 4777, 4775, {0}, 0}, + {'\0', 0, 4776, {0}, 0},{';', 0, 4777, {332}, 1},{'\0', 0, 4778, {0}, 0}, + {'g', 4781, 4779, {0}, 0},{'\0', 0, 4780, {0}, 0},{'a', 4783, 4781, {0}, 0}, + {'\0', 0, 4782, {0}, 0},{';', 0, 4783, {937}, 1},{'\0', 0, 4784, {0}, 0}, + {'c', 4787, 4785, {0}, 0},{'\0', 0, 4786, {0}, 0},{'r', 4789, 4787, {0}, 0}, + {'\0', 0, 4788, {0}, 0},{'o', 4791, 4789, {0}, 0},{'\0', 0, 4790, {0}, 0}, + {'n', 4793, 4791, {0}, 0},{'\0', 0, 4792, {0}, 0},{';', 0, 4793, {927}, 1}, + {'\0', 0, 4794, {0}, 0},{'p', 4797, 4795, {0}, 0},{'\0', 0, 4796, {0}, 0}, + {'f', 4799, 4797, {0}, 0},{'\0', 0, 4798, {0}, 0},{';', 0, 4799, {120134}, 1}, + {'\0', 0, 4800, {0}, 0},{'e', 4803, 4801, {0}, 0},{'\0', 0, 4802, {0}, 0}, + {'n', 4805, 4803, {0}, 0},{'\0', 0, 4804, {0}, 0},{'C', 4807, 4805, {0}, 0}, + {'\0', 0, 4806, {0}, 0},{'u', 4809, 4807, {0}, 0},{'\0', 0, 4808, {0}, 0}, + {'r', 4811, 4809, {0}, 0},{'\0', 0, 4810, {0}, 0},{'l', 4813, 4811, {0}, 0}, + {'\0', 0, 4812, {0}, 0},{'y', 4815, 4813, {0}, 0},{'\0', 0, 4814, {0}, 0}, + {'D', 4818, 4815, {0}, 0},{'Q', 4840, 4816, {0}, 0},{'\0', 0, 4817, {0}, 0}, + {'o', 4820, 4818, {0}, 0},{'\0', 0, 4819, {0}, 0},{'u', 4822, 4820, {0}, 0}, + {'\0', 0, 4821, {0}, 0},{'b', 4824, 4822, {0}, 0},{'\0', 0, 4823, {0}, 0}, + {'l', 4826, 4824, {0}, 0},{'\0', 0, 4825, {0}, 0},{'e', 4828, 4826, {0}, 0}, + {'\0', 0, 4827, {0}, 0},{'Q', 4830, 4828, {0}, 0},{'\0', 0, 4829, {0}, 0}, + {'u', 4832, 4830, {0}, 0},{'\0', 0, 4831, {0}, 0},{'o', 4834, 4832, {0}, 0}, + {'\0', 0, 4833, {0}, 0},{'t', 4836, 4834, {0}, 0},{'\0', 0, 4835, {0}, 0}, + {'e', 4838, 4836, {0}, 0},{'\0', 0, 4837, {0}, 0},{';', 0, 4838, {8220}, 1}, + {'\0', 0, 4839, {0}, 0},{'u', 4842, 4840, {0}, 0},{'\0', 0, 4841, {0}, 0}, + {'o', 4844, 4842, {0}, 0},{'\0', 0, 4843, {0}, 0},{'t', 4846, 4844, {0}, 0}, + {'\0', 0, 4845, {0}, 0},{'e', 4848, 4846, {0}, 0},{'\0', 0, 4847, {0}, 0}, + {';', 0, 4848, {8216}, 1},{'\0', 0, 4849, {0}, 0},{';', 0, 4850, {10836}, 1}, + {'\0', 0, 4851, {0}, 0},{'c', 4855, 4852, {0}, 0},{'l', 4859, 4853, {0}, 0}, + {'\0', 0, 4854, {0}, 0},{'r', 4857, 4855, {0}, 0},{'\0', 0, 4856, {0}, 0}, + {';', 0, 4857, {119978}, 1},{'\0', 0, 4858, {0}, 0},{'a', 4861, 4859, {0}, 0}, + {'\0', 0, 4860, {0}, 0},{'s', 4863, 4861, {0}, 0},{'\0', 0, 4862, {0}, 0}, + {'h', 4865, 4863, {216}, 1},{'\0', 0, 4864, {0}, 0},{';', 0, 4865, {216}, 1}, + {'\0', 0, 4866, {0}, 0},{'i', 4869, 4867, {0}, 0},{'\0', 0, 4868, {0}, 0}, + {'l', 4872, 4869, {0}, 0},{'m', 4878, 4870, {0}, 0},{'\0', 0, 4871, {0}, 0}, + {'d', 4874, 4872, {0}, 0},{'\0', 0, 4873, {0}, 0},{'e', 4876, 4874, {213}, 1}, + {'\0', 0, 4875, {0}, 0},{';', 0, 4876, {213}, 1},{'\0', 0, 4877, {0}, 0}, + {'e', 4880, 4878, {0}, 0},{'\0', 0, 4879, {0}, 0},{'s', 4882, 4880, {0}, 0}, + {'\0', 0, 4881, {0}, 0},{';', 0, 4882, {10807}, 1},{'\0', 0, 4883, {0}, 0}, + {'m', 4886, 4884, {0}, 0},{'\0', 0, 4885, {0}, 0},{'l', 4888, 4886, {214}, 1}, + {'\0', 0, 4887, {0}, 0},{';', 0, 4888, {214}, 1},{'\0', 0, 4889, {0}, 0}, + {'e', 4892, 4890, {0}, 0},{'\0', 0, 4891, {0}, 0},{'r', 4894, 4892, {0}, 0}, + {'\0', 0, 4893, {0}, 0},{'B', 4897, 4894, {0}, 0},{'P', 4919, 4895, {0}, 0}, + {'\0', 0, 4896, {0}, 0},{'a', 4900, 4897, {0}, 0},{'r', 4904, 4898, {0}, 0}, + {'\0', 0, 4899, {0}, 0},{'r', 4902, 4900, {0}, 0},{'\0', 0, 4901, {0}, 0}, + {';', 0, 4902, {8254}, 1},{'\0', 0, 4903, {0}, 0},{'a', 4906, 4904, {0}, 0}, + {'\0', 0, 4905, {0}, 0},{'c', 4908, 4906, {0}, 0},{'\0', 0, 4907, {0}, 0}, + {'e', 4911, 4908, {0}, 0},{'k', 4913, 4909, {0}, 0},{'\0', 0, 4910, {0}, 0}, + {';', 0, 4911, {9182}, 1},{'\0', 0, 4912, {0}, 0},{'e', 4915, 4913, {0}, 0}, + {'\0', 0, 4914, {0}, 0},{'t', 4917, 4915, {0}, 0},{'\0', 0, 4916, {0}, 0}, + {';', 0, 4917, {9140}, 1},{'\0', 0, 4918, {0}, 0},{'a', 4921, 4919, {0}, 0}, + {'\0', 0, 4920, {0}, 0},{'r', 4923, 4921, {0}, 0},{'\0', 0, 4922, {0}, 0}, + {'e', 4925, 4923, {0}, 0},{'\0', 0, 4924, {0}, 0},{'n', 4927, 4925, {0}, 0}, + {'\0', 0, 4926, {0}, 0},{'t', 4929, 4927, {0}, 0},{'\0', 0, 4928, {0}, 0}, + {'h', 4931, 4929, {0}, 0},{'\0', 0, 4930, {0}, 0},{'e', 4933, 4931, {0}, 0}, + {'\0', 0, 4932, {0}, 0},{'s', 4935, 4933, {0}, 0},{'\0', 0, 4934, {0}, 0}, + {'i', 4937, 4935, {0}, 0},{'\0', 0, 4936, {0}, 0},{'s', 4939, 4937, {0}, 0}, + {'\0', 0, 4938, {0}, 0},{';', 0, 4939, {9180}, 1},{'\0', 0, 4940, {0}, 0}, + {'a', 4951, 4941, {0}, 0},{'c', 4965, 4942, {0}, 0},{'f', 4969, 4943, {0}, 0}, + {'h', 4973, 4944, {0}, 0},{'i', 4977, 4945, {0}, 0},{'l', 4979, 4946, {0}, 0}, + {'o', 4995, 4947, {0}, 0},{'r', 5024, 4948, {0}, 0},{'s', 5120, 4949, {0}, 0}, + {'\0', 0, 4950, {0}, 0},{'r', 4953, 4951, {0}, 0},{'\0', 0, 4952, {0}, 0}, + {'t', 4955, 4953, {0}, 0},{'\0', 0, 4954, {0}, 0},{'i', 4957, 4955, {0}, 0}, + {'\0', 0, 4956, {0}, 0},{'a', 4959, 4957, {0}, 0},{'\0', 0, 4958, {0}, 0}, + {'l', 4961, 4959, {0}, 0},{'\0', 0, 4960, {0}, 0},{'D', 4963, 4961, {0}, 0}, + {'\0', 0, 4962, {0}, 0},{';', 0, 4963, {8706}, 1},{'\0', 0, 4964, {0}, 0}, + {'y', 4967, 4965, {0}, 0},{'\0', 0, 4966, {0}, 0},{';', 0, 4967, {1055}, 1}, + {'\0', 0, 4968, {0}, 0},{'r', 4971, 4969, {0}, 0},{'\0', 0, 4970, {0}, 0}, + {';', 0, 4971, {120083}, 1},{'\0', 0, 4972, {0}, 0},{'i', 4975, 4973, {0}, 0}, + {'\0', 0, 4974, {0}, 0},{';', 0, 4975, {934}, 1},{'\0', 0, 4976, {0}, 0}, + {';', 0, 4977, {928}, 1},{'\0', 0, 4978, {0}, 0},{'u', 4981, 4979, {0}, 0}, + {'\0', 0, 4980, {0}, 0},{'s', 4983, 4981, {0}, 0},{'\0', 0, 4982, {0}, 0}, + {'M', 4985, 4983, {0}, 0},{'\0', 0, 4984, {0}, 0},{'i', 4987, 4985, {0}, 0}, + {'\0', 0, 4986, {0}, 0},{'n', 4989, 4987, {0}, 0},{'\0', 0, 4988, {0}, 0}, + {'u', 4991, 4989, {0}, 0},{'\0', 0, 4990, {0}, 0},{'s', 4993, 4991, {0}, 0}, + {'\0', 0, 4992, {0}, 0},{';', 0, 4993, {177}, 1},{'\0', 0, 4994, {0}, 0}, + {'i', 4998, 4995, {0}, 0},{'p', 5020, 4996, {0}, 0},{'\0', 0, 4997, {0}, 0}, + {'n', 5000, 4998, {0}, 0},{'\0', 0, 4999, {0}, 0},{'c', 5002, 5000, {0}, 0}, + {'\0', 0, 5001, {0}, 0},{'a', 5004, 5002, {0}, 0},{'\0', 0, 5003, {0}, 0}, + {'r', 5006, 5004, {0}, 0},{'\0', 0, 5005, {0}, 0},{'e', 5008, 5006, {0}, 0}, + {'\0', 0, 5007, {0}, 0},{'p', 5010, 5008, {0}, 0},{'\0', 0, 5009, {0}, 0}, + {'l', 5012, 5010, {0}, 0},{'\0', 0, 5011, {0}, 0},{'a', 5014, 5012, {0}, 0}, + {'\0', 0, 5013, {0}, 0},{'n', 5016, 5014, {0}, 0},{'\0', 0, 5015, {0}, 0}, + {'e', 5018, 5016, {0}, 0},{'\0', 0, 5017, {0}, 0},{';', 0, 5018, {8460}, 1}, + {'\0', 0, 5019, {0}, 0},{'f', 5022, 5020, {0}, 0},{'\0', 0, 5021, {0}, 0}, + {';', 0, 5022, {8473}, 1},{'\0', 0, 5023, {0}, 0},{';', 0, 5024, {10939}, 1}, + {'e', 5029, 5025, {0}, 0},{'i', 5084, 5026, {0}, 0},{'o', 5090, 5027, {0}, 0}, + {'\0', 0, 5028, {0}, 0},{'c', 5031, 5029, {0}, 0},{'\0', 0, 5030, {0}, 0}, + {'e', 5033, 5031, {0}, 0},{'\0', 0, 5032, {0}, 0},{'d', 5035, 5033, {0}, 0}, + {'\0', 0, 5034, {0}, 0},{'e', 5037, 5035, {0}, 0},{'\0', 0, 5036, {0}, 0}, + {'s', 5039, 5037, {0}, 0},{'\0', 0, 5038, {0}, 0},{';', 0, 5039, {8826}, 1}, + {'E', 5044, 5040, {0}, 0},{'S', 5054, 5041, {0}, 0},{'T', 5074, 5042, {0}, 0}, + {'\0', 0, 5043, {0}, 0},{'q', 5046, 5044, {0}, 0},{'\0', 0, 5045, {0}, 0}, + {'u', 5048, 5046, {0}, 0},{'\0', 0, 5047, {0}, 0},{'a', 5050, 5048, {0}, 0}, + {'\0', 0, 5049, {0}, 0},{'l', 5052, 5050, {0}, 0},{'\0', 0, 5051, {0}, 0}, + {';', 0, 5052, {10927}, 1},{'\0', 0, 5053, {0}, 0},{'l', 5056, 5054, {0}, 0}, + {'\0', 0, 5055, {0}, 0},{'a', 5058, 5056, {0}, 0},{'\0', 0, 5057, {0}, 0}, + {'n', 5060, 5058, {0}, 0},{'\0', 0, 5059, {0}, 0},{'t', 5062, 5060, {0}, 0}, + {'\0', 0, 5061, {0}, 0},{'E', 5064, 5062, {0}, 0},{'\0', 0, 5063, {0}, 0}, + {'q', 5066, 5064, {0}, 0},{'\0', 0, 5065, {0}, 0},{'u', 5068, 5066, {0}, 0}, + {'\0', 0, 5067, {0}, 0},{'a', 5070, 5068, {0}, 0},{'\0', 0, 5069, {0}, 0}, + {'l', 5072, 5070, {0}, 0},{'\0', 0, 5071, {0}, 0},{';', 0, 5072, {8828}, 1}, + {'\0', 0, 5073, {0}, 0},{'i', 5076, 5074, {0}, 0},{'\0', 0, 5075, {0}, 0}, + {'l', 5078, 5076, {0}, 0},{'\0', 0, 5077, {0}, 0},{'d', 5080, 5078, {0}, 0}, + {'\0', 0, 5079, {0}, 0},{'e', 5082, 5080, {0}, 0},{'\0', 0, 5081, {0}, 0}, + {';', 0, 5082, {8830}, 1},{'\0', 0, 5083, {0}, 0},{'m', 5086, 5084, {0}, 0}, + {'\0', 0, 5085, {0}, 0},{'e', 5088, 5086, {0}, 0},{'\0', 0, 5087, {0}, 0}, + {';', 0, 5088, {8243}, 1},{'\0', 0, 5089, {0}, 0},{'d', 5093, 5090, {0}, 0}, + {'p', 5101, 5091, {0}, 0},{'\0', 0, 5092, {0}, 0},{'u', 5095, 5093, {0}, 0}, + {'\0', 0, 5094, {0}, 0},{'c', 5097, 5095, {0}, 0},{'\0', 0, 5096, {0}, 0}, + {'t', 5099, 5097, {0}, 0},{'\0', 0, 5098, {0}, 0},{';', 0, 5099, {8719}, 1}, + {'\0', 0, 5100, {0}, 0},{'o', 5103, 5101, {0}, 0},{'\0', 0, 5102, {0}, 0}, + {'r', 5105, 5103, {0}, 0},{'\0', 0, 5104, {0}, 0},{'t', 5107, 5105, {0}, 0}, + {'\0', 0, 5106, {0}, 0},{'i', 5109, 5107, {0}, 0},{'\0', 0, 5108, {0}, 0}, + {'o', 5111, 5109, {0}, 0},{'\0', 0, 5110, {0}, 0},{'n', 5113, 5111, {0}, 0}, + {'\0', 0, 5112, {0}, 0},{';', 0, 5113, {8759}, 1},{'a', 5116, 5114, {0}, 0}, + {'\0', 0, 5115, {0}, 0},{'l', 5118, 5116, {0}, 0},{'\0', 0, 5117, {0}, 0}, + {';', 0, 5118, {8733}, 1},{'\0', 0, 5119, {0}, 0},{'c', 5123, 5120, {0}, 0}, + {'i', 5127, 5121, {0}, 0},{'\0', 0, 5122, {0}, 0},{'r', 5125, 5123, {0}, 0}, + {'\0', 0, 5124, {0}, 0},{';', 0, 5125, {119979}, 1},{'\0', 0, 5126, {0}, 0}, + {';', 0, 5127, {936}, 1},{'\0', 0, 5128, {0}, 0},{'U', 5134, 5129, {0}, 0}, + {'f', 5140, 5130, {0}, 0},{'o', 5144, 5131, {0}, 0},{'s', 5150, 5132, {0}, 0}, + {'\0', 0, 5133, {0}, 0},{'O', 5136, 5134, {0}, 0},{'\0', 0, 5135, {0}, 0}, + {'T', 5138, 5136, {34}, 1},{'\0', 0, 5137, {0}, 0},{';', 0, 5138, {34}, 1}, + {'\0', 0, 5139, {0}, 0},{'r', 5142, 5140, {0}, 0},{'\0', 0, 5141, {0}, 0}, + {';', 0, 5142, {120084}, 1},{'\0', 0, 5143, {0}, 0},{'p', 5146, 5144, {0}, 0}, + {'\0', 0, 5145, {0}, 0},{'f', 5148, 5146, {0}, 0},{'\0', 0, 5147, {0}, 0}, + {';', 0, 5148, {8474}, 1},{'\0', 0, 5149, {0}, 0},{'c', 5152, 5150, {0}, 0}, + {'\0', 0, 5151, {0}, 0},{'r', 5154, 5152, {0}, 0},{'\0', 0, 5153, {0}, 0}, + {';', 0, 5154, {119980}, 1},{'\0', 0, 5155, {0}, 0},{'B', 5169, 5156, {0}, 0}, + {'E', 5177, 5157, {0}, 0},{'a', 5181, 5158, {0}, 0},{'c', 5206, 5159, {0}, 0}, + {'e', 5228, 5160, {0}, 0},{'f', 5303, 5161, {0}, 0},{'h', 5307, 5162, {0}, 0}, + {'i', 5311, 5163, {0}, 0},{'o', 5633, 5164, {0}, 0},{'r', 5660, 5165, {0}, 0}, + {'s', 5680, 5166, {0}, 0},{'u', 5689, 5167, {0}, 0},{'\0', 0, 5168, {0}, 0}, + {'a', 5171, 5169, {0}, 0},{'\0', 0, 5170, {0}, 0},{'r', 5173, 5171, {0}, 0}, + {'\0', 0, 5172, {0}, 0},{'r', 5175, 5173, {0}, 0},{'\0', 0, 5174, {0}, 0}, + {';', 0, 5175, {10512}, 1},{'\0', 0, 5176, {0}, 0},{'G', 5179, 5177, {174}, 1}, + {'\0', 0, 5178, {0}, 0},{';', 0, 5179, {174}, 1},{'\0', 0, 5180, {0}, 0}, + {'c', 5185, 5181, {0}, 0},{'n', 5193, 5182, {0}, 0},{'r', 5197, 5183, {0}, 0}, + {'\0', 0, 5184, {0}, 0},{'u', 5187, 5185, {0}, 0},{'\0', 0, 5186, {0}, 0}, + {'t', 5189, 5187, {0}, 0},{'\0', 0, 5188, {0}, 0},{'e', 5191, 5189, {0}, 0}, + {'\0', 0, 5190, {0}, 0},{';', 0, 5191, {340}, 1},{'\0', 0, 5192, {0}, 0}, + {'g', 5195, 5193, {0}, 0},{'\0', 0, 5194, {0}, 0},{';', 0, 5195, {10219}, 1}, + {'\0', 0, 5196, {0}, 0},{'r', 5199, 5197, {0}, 0},{'\0', 0, 5198, {0}, 0}, + {';', 0, 5199, {8608}, 1},{'t', 5202, 5200, {0}, 0},{'\0', 0, 5201, {0}, 0}, + {'l', 5204, 5202, {0}, 0},{'\0', 0, 5203, {0}, 0},{';', 0, 5204, {10518}, 1}, + {'\0', 0, 5205, {0}, 0},{'a', 5210, 5206, {0}, 0},{'e', 5218, 5207, {0}, 0}, + {'y', 5226, 5208, {0}, 0},{'\0', 0, 5209, {0}, 0},{'r', 5212, 5210, {0}, 0}, + {'\0', 0, 5211, {0}, 0},{'o', 5214, 5212, {0}, 0},{'\0', 0, 5213, {0}, 0}, + {'n', 5216, 5214, {0}, 0},{'\0', 0, 5215, {0}, 0},{';', 0, 5216, {344}, 1}, + {'\0', 0, 5217, {0}, 0},{'d', 5220, 5218, {0}, 0},{'\0', 0, 5219, {0}, 0}, + {'i', 5222, 5220, {0}, 0},{'\0', 0, 5221, {0}, 0},{'l', 5224, 5222, {0}, 0}, + {'\0', 0, 5223, {0}, 0},{';', 0, 5224, {342}, 1},{'\0', 0, 5225, {0}, 0}, + {';', 0, 5226, {1056}, 1},{'\0', 0, 5227, {0}, 0},{';', 0, 5228, {8476}, 1}, + {'v', 5231, 5229, {0}, 0},{'\0', 0, 5230, {0}, 0},{'e', 5233, 5231, {0}, 0}, + {'\0', 0, 5232, {0}, 0},{'r', 5235, 5233, {0}, 0},{'\0', 0, 5234, {0}, 0}, + {'s', 5237, 5235, {0}, 0},{'\0', 0, 5236, {0}, 0},{'e', 5239, 5237, {0}, 0}, + {'\0', 0, 5238, {0}, 0},{'E', 5242, 5239, {0}, 0},{'U', 5277, 5240, {0}, 0}, + {'\0', 0, 5241, {0}, 0},{'l', 5245, 5242, {0}, 0},{'q', 5257, 5243, {0}, 0}, + {'\0', 0, 5244, {0}, 0},{'e', 5247, 5245, {0}, 0},{'\0', 0, 5246, {0}, 0}, + {'m', 5249, 5247, {0}, 0},{'\0', 0, 5248, {0}, 0},{'e', 5251, 5249, {0}, 0}, + {'\0', 0, 5250, {0}, 0},{'n', 5253, 5251, {0}, 0},{'\0', 0, 5252, {0}, 0}, + {'t', 5255, 5253, {0}, 0},{'\0', 0, 5254, {0}, 0},{';', 0, 5255, {8715}, 1}, + {'\0', 0, 5256, {0}, 0},{'u', 5259, 5257, {0}, 0},{'\0', 0, 5258, {0}, 0}, + {'i', 5261, 5259, {0}, 0},{'\0', 0, 5260, {0}, 0},{'l', 5263, 5261, {0}, 0}, + {'\0', 0, 5262, {0}, 0},{'i', 5265, 5263, {0}, 0},{'\0', 0, 5264, {0}, 0}, + {'b', 5267, 5265, {0}, 0},{'\0', 0, 5266, {0}, 0},{'r', 5269, 5267, {0}, 0}, + {'\0', 0, 5268, {0}, 0},{'i', 5271, 5269, {0}, 0},{'\0', 0, 5270, {0}, 0}, + {'u', 5273, 5271, {0}, 0},{'\0', 0, 5272, {0}, 0},{'m', 5275, 5273, {0}, 0}, + {'\0', 0, 5274, {0}, 0},{';', 0, 5275, {8651}, 1},{'\0', 0, 5276, {0}, 0}, + {'p', 5279, 5277, {0}, 0},{'\0', 0, 5278, {0}, 0},{'E', 5281, 5279, {0}, 0}, + {'\0', 0, 5280, {0}, 0},{'q', 5283, 5281, {0}, 0},{'\0', 0, 5282, {0}, 0}, + {'u', 5285, 5283, {0}, 0},{'\0', 0, 5284, {0}, 0},{'i', 5287, 5285, {0}, 0}, + {'\0', 0, 5286, {0}, 0},{'l', 5289, 5287, {0}, 0},{'\0', 0, 5288, {0}, 0}, + {'i', 5291, 5289, {0}, 0},{'\0', 0, 5290, {0}, 0},{'b', 5293, 5291, {0}, 0}, + {'\0', 0, 5292, {0}, 0},{'r', 5295, 5293, {0}, 0},{'\0', 0, 5294, {0}, 0}, + {'i', 5297, 5295, {0}, 0},{'\0', 0, 5296, {0}, 0},{'u', 5299, 5297, {0}, 0}, + {'\0', 0, 5298, {0}, 0},{'m', 5301, 5299, {0}, 0},{'\0', 0, 5300, {0}, 0}, + {';', 0, 5301, {10607}, 1},{'\0', 0, 5302, {0}, 0},{'r', 5305, 5303, {0}, 0}, + {'\0', 0, 5304, {0}, 0},{';', 0, 5305, {8476}, 1},{'\0', 0, 5306, {0}, 0}, + {'o', 5309, 5307, {0}, 0},{'\0', 0, 5308, {0}, 0},{';', 0, 5309, {929}, 1}, + {'\0', 0, 5310, {0}, 0},{'g', 5313, 5311, {0}, 0},{'\0', 0, 5312, {0}, 0}, + {'h', 5315, 5313, {0}, 0},{'\0', 0, 5314, {0}, 0},{'t', 5317, 5315, {0}, 0}, + {'\0', 0, 5316, {0}, 0},{'A', 5326, 5317, {0}, 0},{'C', 5385, 5318, {0}, 0}, + {'D', 5399, 5319, {0}, 0},{'F', 5468, 5320, {0}, 0},{'T', 5478, 5321, {0}, 0}, + {'U', 5541, 5322, {0}, 0},{'V', 5604, 5323, {0}, 0},{'a', 5623, 5324, {0}, 0}, + {'\0', 0, 5325, {0}, 0},{'n', 5329, 5326, {0}, 0},{'r', 5351, 5327, {0}, 0}, + {'\0', 0, 5328, {0}, 0},{'g', 5331, 5329, {0}, 0},{'\0', 0, 5330, {0}, 0}, + {'l', 5333, 5331, {0}, 0},{'\0', 0, 5332, {0}, 0},{'e', 5335, 5333, {0}, 0}, + {'\0', 0, 5334, {0}, 0},{'B', 5337, 5335, {0}, 0},{'\0', 0, 5336, {0}, 0}, + {'r', 5339, 5337, {0}, 0},{'\0', 0, 5338, {0}, 0},{'a', 5341, 5339, {0}, 0}, + {'\0', 0, 5340, {0}, 0},{'c', 5343, 5341, {0}, 0},{'\0', 0, 5342, {0}, 0}, + {'k', 5345, 5343, {0}, 0},{'\0', 0, 5344, {0}, 0},{'e', 5347, 5345, {0}, 0}, + {'\0', 0, 5346, {0}, 0},{'t', 5349, 5347, {0}, 0},{'\0', 0, 5348, {0}, 0}, + {';', 0, 5349, {10217}, 1},{'\0', 0, 5350, {0}, 0},{'r', 5353, 5351, {0}, 0}, + {'\0', 0, 5352, {0}, 0},{'o', 5355, 5353, {0}, 0},{'\0', 0, 5354, {0}, 0}, + {'w', 5357, 5355, {0}, 0},{'\0', 0, 5356, {0}, 0},{';', 0, 5357, {8594}, 1}, + {'B', 5361, 5358, {0}, 0},{'L', 5367, 5359, {0}, 0},{'\0', 0, 5360, {0}, 0}, + {'a', 5363, 5361, {0}, 0},{'\0', 0, 5362, {0}, 0},{'r', 5365, 5363, {0}, 0}, + {'\0', 0, 5364, {0}, 0},{';', 0, 5365, {8677}, 1},{'\0', 0, 5366, {0}, 0}, + {'e', 5369, 5367, {0}, 0},{'\0', 0, 5368, {0}, 0},{'f', 5371, 5369, {0}, 0}, + {'\0', 0, 5370, {0}, 0},{'t', 5373, 5371, {0}, 0},{'\0', 0, 5372, {0}, 0}, + {'A', 5375, 5373, {0}, 0},{'\0', 0, 5374, {0}, 0},{'r', 5377, 5375, {0}, 0}, + {'\0', 0, 5376, {0}, 0},{'r', 5379, 5377, {0}, 0},{'\0', 0, 5378, {0}, 0}, + {'o', 5381, 5379, {0}, 0},{'\0', 0, 5380, {0}, 0},{'w', 5383, 5381, {0}, 0}, + {'\0', 0, 5382, {0}, 0},{';', 0, 5383, {8644}, 1},{'\0', 0, 5384, {0}, 0}, + {'e', 5387, 5385, {0}, 0},{'\0', 0, 5386, {0}, 0},{'i', 5389, 5387, {0}, 0}, + {'\0', 0, 5388, {0}, 0},{'l', 5391, 5389, {0}, 0},{'\0', 0, 5390, {0}, 0}, + {'i', 5393, 5391, {0}, 0},{'\0', 0, 5392, {0}, 0},{'n', 5395, 5393, {0}, 0}, + {'\0', 0, 5394, {0}, 0},{'g', 5397, 5395, {0}, 0},{'\0', 0, 5396, {0}, 0}, + {';', 0, 5397, {8969}, 1},{'\0', 0, 5398, {0}, 0},{'o', 5401, 5399, {0}, 0}, + {'\0', 0, 5400, {0}, 0},{'u', 5404, 5401, {0}, 0},{'w', 5426, 5402, {0}, 0}, + {'\0', 0, 5403, {0}, 0},{'b', 5406, 5404, {0}, 0},{'\0', 0, 5405, {0}, 0}, + {'l', 5408, 5406, {0}, 0},{'\0', 0, 5407, {0}, 0},{'e', 5410, 5408, {0}, 0}, + {'\0', 0, 5409, {0}, 0},{'B', 5412, 5410, {0}, 0},{'\0', 0, 5411, {0}, 0}, + {'r', 5414, 5412, {0}, 0},{'\0', 0, 5413, {0}, 0},{'a', 5416, 5414, {0}, 0}, + {'\0', 0, 5415, {0}, 0},{'c', 5418, 5416, {0}, 0},{'\0', 0, 5417, {0}, 0}, + {'k', 5420, 5418, {0}, 0},{'\0', 0, 5419, {0}, 0},{'e', 5422, 5420, {0}, 0}, + {'\0', 0, 5421, {0}, 0},{'t', 5424, 5422, {0}, 0},{'\0', 0, 5423, {0}, 0}, + {';', 0, 5424, {10215}, 1},{'\0', 0, 5425, {0}, 0},{'n', 5428, 5426, {0}, 0}, + {'\0', 0, 5427, {0}, 0},{'T', 5431, 5428, {0}, 0},{'V', 5449, 5429, {0}, 0}, + {'\0', 0, 5430, {0}, 0},{'e', 5433, 5431, {0}, 0},{'\0', 0, 5432, {0}, 0}, + {'e', 5435, 5433, {0}, 0},{'\0', 0, 5434, {0}, 0},{'V', 5437, 5435, {0}, 0}, + {'\0', 0, 5436, {0}, 0},{'e', 5439, 5437, {0}, 0},{'\0', 0, 5438, {0}, 0}, + {'c', 5441, 5439, {0}, 0},{'\0', 0, 5440, {0}, 0},{'t', 5443, 5441, {0}, 0}, + {'\0', 0, 5442, {0}, 0},{'o', 5445, 5443, {0}, 0},{'\0', 0, 5444, {0}, 0}, + {'r', 5447, 5445, {0}, 0},{'\0', 0, 5446, {0}, 0},{';', 0, 5447, {10589}, 1}, + {'\0', 0, 5448, {0}, 0},{'e', 5451, 5449, {0}, 0},{'\0', 0, 5450, {0}, 0}, + {'c', 5453, 5451, {0}, 0},{'\0', 0, 5452, {0}, 0},{'t', 5455, 5453, {0}, 0}, + {'\0', 0, 5454, {0}, 0},{'o', 5457, 5455, {0}, 0},{'\0', 0, 5456, {0}, 0}, + {'r', 5459, 5457, {0}, 0},{'\0', 0, 5458, {0}, 0},{';', 0, 5459, {8642}, 1}, + {'B', 5462, 5460, {0}, 0},{'\0', 0, 5461, {0}, 0},{'a', 5464, 5462, {0}, 0}, + {'\0', 0, 5463, {0}, 0},{'r', 5466, 5464, {0}, 0},{'\0', 0, 5465, {0}, 0}, + {';', 0, 5466, {10581}, 1},{'\0', 0, 5467, {0}, 0},{'l', 5470, 5468, {0}, 0}, + {'\0', 0, 5469, {0}, 0},{'o', 5472, 5470, {0}, 0},{'\0', 0, 5471, {0}, 0}, + {'o', 5474, 5472, {0}, 0},{'\0', 0, 5473, {0}, 0},{'r', 5476, 5474, {0}, 0}, + {'\0', 0, 5475, {0}, 0},{';', 0, 5476, {8971}, 1},{'\0', 0, 5477, {0}, 0}, + {'e', 5481, 5478, {0}, 0},{'r', 5509, 5479, {0}, 0},{'\0', 0, 5480, {0}, 0}, + {'e', 5483, 5481, {0}, 0},{'\0', 0, 5482, {0}, 0},{';', 0, 5483, {8866}, 1}, + {'A', 5487, 5484, {0}, 0},{'V', 5497, 5485, {0}, 0},{'\0', 0, 5486, {0}, 0}, + {'r', 5489, 5487, {0}, 0},{'\0', 0, 5488, {0}, 0},{'r', 5491, 5489, {0}, 0}, + {'\0', 0, 5490, {0}, 0},{'o', 5493, 5491, {0}, 0},{'\0', 0, 5492, {0}, 0}, + {'w', 5495, 5493, {0}, 0},{'\0', 0, 5494, {0}, 0},{';', 0, 5495, {8614}, 1}, + {'\0', 0, 5496, {0}, 0},{'e', 5499, 5497, {0}, 0},{'\0', 0, 5498, {0}, 0}, + {'c', 5501, 5499, {0}, 0},{'\0', 0, 5500, {0}, 0},{'t', 5503, 5501, {0}, 0}, + {'\0', 0, 5502, {0}, 0},{'o', 5505, 5503, {0}, 0},{'\0', 0, 5504, {0}, 0}, + {'r', 5507, 5505, {0}, 0},{'\0', 0, 5506, {0}, 0},{';', 0, 5507, {10587}, 1}, + {'\0', 0, 5508, {0}, 0},{'i', 5511, 5509, {0}, 0},{'\0', 0, 5510, {0}, 0}, + {'a', 5513, 5511, {0}, 0},{'\0', 0, 5512, {0}, 0},{'n', 5515, 5513, {0}, 0}, + {'\0', 0, 5514, {0}, 0},{'g', 5517, 5515, {0}, 0},{'\0', 0, 5516, {0}, 0}, + {'l', 5519, 5517, {0}, 0},{'\0', 0, 5518, {0}, 0},{'e', 5521, 5519, {0}, 0}, + {'\0', 0, 5520, {0}, 0},{';', 0, 5521, {8883}, 1},{'B', 5525, 5522, {0}, 0}, + {'E', 5531, 5523, {0}, 0},{'\0', 0, 5524, {0}, 0},{'a', 5527, 5525, {0}, 0}, + {'\0', 0, 5526, {0}, 0},{'r', 5529, 5527, {0}, 0},{'\0', 0, 5528, {0}, 0}, + {';', 0, 5529, {10704}, 1},{'\0', 0, 5530, {0}, 0},{'q', 5533, 5531, {0}, 0}, + {'\0', 0, 5532, {0}, 0},{'u', 5535, 5533, {0}, 0},{'\0', 0, 5534, {0}, 0}, + {'a', 5537, 5535, {0}, 0},{'\0', 0, 5536, {0}, 0},{'l', 5539, 5537, {0}, 0}, + {'\0', 0, 5538, {0}, 0},{';', 0, 5539, {8885}, 1},{'\0', 0, 5540, {0}, 0}, + {'p', 5543, 5541, {0}, 0},{'\0', 0, 5542, {0}, 0},{'D', 5547, 5543, {0}, 0}, + {'T', 5567, 5544, {0}, 0},{'V', 5585, 5545, {0}, 0},{'\0', 0, 5546, {0}, 0}, + {'o', 5549, 5547, {0}, 0},{'\0', 0, 5548, {0}, 0},{'w', 5551, 5549, {0}, 0}, + {'\0', 0, 5550, {0}, 0},{'n', 5553, 5551, {0}, 0},{'\0', 0, 5552, {0}, 0}, + {'V', 5555, 5553, {0}, 0},{'\0', 0, 5554, {0}, 0},{'e', 5557, 5555, {0}, 0}, + {'\0', 0, 5556, {0}, 0},{'c', 5559, 5557, {0}, 0},{'\0', 0, 5558, {0}, 0}, + {'t', 5561, 5559, {0}, 0},{'\0', 0, 5560, {0}, 0},{'o', 5563, 5561, {0}, 0}, + {'\0', 0, 5562, {0}, 0},{'r', 5565, 5563, {0}, 0},{'\0', 0, 5564, {0}, 0}, + {';', 0, 5565, {10575}, 1},{'\0', 0, 5566, {0}, 0},{'e', 5569, 5567, {0}, 0}, + {'\0', 0, 5568, {0}, 0},{'e', 5571, 5569, {0}, 0},{'\0', 0, 5570, {0}, 0}, + {'V', 5573, 5571, {0}, 0},{'\0', 0, 5572, {0}, 0},{'e', 5575, 5573, {0}, 0}, + {'\0', 0, 5574, {0}, 0},{'c', 5577, 5575, {0}, 0},{'\0', 0, 5576, {0}, 0}, + {'t', 5579, 5577, {0}, 0},{'\0', 0, 5578, {0}, 0},{'o', 5581, 5579, {0}, 0}, + {'\0', 0, 5580, {0}, 0},{'r', 5583, 5581, {0}, 0},{'\0', 0, 5582, {0}, 0}, + {';', 0, 5583, {10588}, 1},{'\0', 0, 5584, {0}, 0},{'e', 5587, 5585, {0}, 0}, + {'\0', 0, 5586, {0}, 0},{'c', 5589, 5587, {0}, 0},{'\0', 0, 5588, {0}, 0}, + {'t', 5591, 5589, {0}, 0},{'\0', 0, 5590, {0}, 0},{'o', 5593, 5591, {0}, 0}, + {'\0', 0, 5592, {0}, 0},{'r', 5595, 5593, {0}, 0},{'\0', 0, 5594, {0}, 0}, + {';', 0, 5595, {8638}, 1},{'B', 5598, 5596, {0}, 0},{'\0', 0, 5597, {0}, 0}, + {'a', 5600, 5598, {0}, 0},{'\0', 0, 5599, {0}, 0},{'r', 5602, 5600, {0}, 0}, + {'\0', 0, 5601, {0}, 0},{';', 0, 5602, {10580}, 1},{'\0', 0, 5603, {0}, 0}, + {'e', 5606, 5604, {0}, 0},{'\0', 0, 5605, {0}, 0},{'c', 5608, 5606, {0}, 0}, + {'\0', 0, 5607, {0}, 0},{'t', 5610, 5608, {0}, 0},{'\0', 0, 5609, {0}, 0}, + {'o', 5612, 5610, {0}, 0},{'\0', 0, 5611, {0}, 0},{'r', 5614, 5612, {0}, 0}, + {'\0', 0, 5613, {0}, 0},{';', 0, 5614, {8640}, 1},{'B', 5617, 5615, {0}, 0}, + {'\0', 0, 5616, {0}, 0},{'a', 5619, 5617, {0}, 0},{'\0', 0, 5618, {0}, 0}, + {'r', 5621, 5619, {0}, 0},{'\0', 0, 5620, {0}, 0},{';', 0, 5621, {10579}, 1}, + {'\0', 0, 5622, {0}, 0},{'r', 5625, 5623, {0}, 0},{'\0', 0, 5624, {0}, 0}, + {'r', 5627, 5625, {0}, 0},{'\0', 0, 5626, {0}, 0},{'o', 5629, 5627, {0}, 0}, + {'\0', 0, 5628, {0}, 0},{'w', 5631, 5629, {0}, 0},{'\0', 0, 5630, {0}, 0}, + {';', 0, 5631, {8658}, 1},{'\0', 0, 5632, {0}, 0},{'p', 5636, 5633, {0}, 0}, + {'u', 5640, 5634, {0}, 0},{'\0', 0, 5635, {0}, 0},{'f', 5638, 5636, {0}, 0}, + {'\0', 0, 5637, {0}, 0},{';', 0, 5638, {8477}, 1},{'\0', 0, 5639, {0}, 0}, + {'n', 5642, 5640, {0}, 0},{'\0', 0, 5641, {0}, 0},{'d', 5644, 5642, {0}, 0}, + {'\0', 0, 5643, {0}, 0},{'I', 5646, 5644, {0}, 0},{'\0', 0, 5645, {0}, 0}, + {'m', 5648, 5646, {0}, 0},{'\0', 0, 5647, {0}, 0},{'p', 5650, 5648, {0}, 0}, + {'\0', 0, 5649, {0}, 0},{'l', 5652, 5650, {0}, 0},{'\0', 0, 5651, {0}, 0}, + {'i', 5654, 5652, {0}, 0},{'\0', 0, 5653, {0}, 0},{'e', 5656, 5654, {0}, 0}, + {'\0', 0, 5655, {0}, 0},{'s', 5658, 5656, {0}, 0},{'\0', 0, 5657, {0}, 0}, + {';', 0, 5658, {10608}, 1},{'\0', 0, 5659, {0}, 0},{'i', 5662, 5660, {0}, 0}, + {'\0', 0, 5661, {0}, 0},{'g', 5664, 5662, {0}, 0},{'\0', 0, 5663, {0}, 0}, + {'h', 5666, 5664, {0}, 0},{'\0', 0, 5665, {0}, 0},{'t', 5668, 5666, {0}, 0}, + {'\0', 0, 5667, {0}, 0},{'a', 5670, 5668, {0}, 0},{'\0', 0, 5669, {0}, 0}, + {'r', 5672, 5670, {0}, 0},{'\0', 0, 5671, {0}, 0},{'r', 5674, 5672, {0}, 0}, + {'\0', 0, 5673, {0}, 0},{'o', 5676, 5674, {0}, 0},{'\0', 0, 5675, {0}, 0}, + {'w', 5678, 5676, {0}, 0},{'\0', 0, 5677, {0}, 0},{';', 0, 5678, {8667}, 1}, + {'\0', 0, 5679, {0}, 0},{'c', 5683, 5680, {0}, 0},{'h', 5687, 5681, {0}, 0}, + {'\0', 0, 5682, {0}, 0},{'r', 5685, 5683, {0}, 0},{'\0', 0, 5684, {0}, 0}, + {';', 0, 5685, {8475}, 1},{'\0', 0, 5686, {0}, 0},{';', 0, 5687, {8625}, 1}, + {'\0', 0, 5688, {0}, 0},{'l', 5691, 5689, {0}, 0},{'\0', 0, 5690, {0}, 0}, + {'e', 5693, 5691, {0}, 0},{'\0', 0, 5692, {0}, 0},{'D', 5695, 5693, {0}, 0}, + {'\0', 0, 5694, {0}, 0},{'e', 5697, 5695, {0}, 0},{'\0', 0, 5696, {0}, 0}, + {'l', 5699, 5697, {0}, 0},{'\0', 0, 5698, {0}, 0},{'a', 5701, 5699, {0}, 0}, + {'\0', 0, 5700, {0}, 0},{'y', 5703, 5701, {0}, 0},{'\0', 0, 5702, {0}, 0}, + {'e', 5705, 5703, {0}, 0},{'\0', 0, 5704, {0}, 0},{'d', 5707, 5705, {0}, 0}, + {'\0', 0, 5706, {0}, 0},{';', 0, 5707, {10740}, 1},{'\0', 0, 5708, {0}, 0}, + {'H', 5723, 5709, {0}, 0},{'O', 5738, 5710, {0}, 0},{'a', 5748, 5711, {0}, 0}, + {'c', 5758, 5712, {0}, 0},{'f', 5788, 5713, {0}, 0},{'h', 5792, 5714, {0}, 0}, + {'i', 5873, 5715, {0}, 0},{'m', 5881, 5716, {0}, 0},{'o', 5901, 5717, {0}, 0}, + {'q', 5907, 5718, {0}, 0},{'s', 6006, 5719, {0}, 0},{'t', 6012, 5720, {0}, 0}, + {'u', 6018, 5721, {0}, 0},{'\0', 0, 5722, {0}, 0},{'C', 5726, 5723, {0}, 0}, + {'c', 5734, 5724, {0}, 0},{'\0', 0, 5725, {0}, 0},{'H', 5728, 5726, {0}, 0}, + {'\0', 0, 5727, {0}, 0},{'c', 5730, 5728, {0}, 0},{'\0', 0, 5729, {0}, 0}, + {'y', 5732, 5730, {0}, 0},{'\0', 0, 5731, {0}, 0},{';', 0, 5732, {1065}, 1}, + {'\0', 0, 5733, {0}, 0},{'y', 5736, 5734, {0}, 0},{'\0', 0, 5735, {0}, 0}, + {';', 0, 5736, {1064}, 1},{'\0', 0, 5737, {0}, 0},{'F', 5740, 5738, {0}, 0}, + {'\0', 0, 5739, {0}, 0},{'T', 5742, 5740, {0}, 0},{'\0', 0, 5741, {0}, 0}, + {'c', 5744, 5742, {0}, 0},{'\0', 0, 5743, {0}, 0},{'y', 5746, 5744, {0}, 0}, + {'\0', 0, 5745, {0}, 0},{';', 0, 5746, {1068}, 1},{'\0', 0, 5747, {0}, 0}, + {'c', 5750, 5748, {0}, 0},{'\0', 0, 5749, {0}, 0},{'u', 5752, 5750, {0}, 0}, + {'\0', 0, 5751, {0}, 0},{'t', 5754, 5752, {0}, 0},{'\0', 0, 5753, {0}, 0}, + {'e', 5756, 5754, {0}, 0},{'\0', 0, 5755, {0}, 0},{';', 0, 5756, {346}, 1}, + {'\0', 0, 5757, {0}, 0},{';', 0, 5758, {10940}, 1},{'a', 5764, 5759, {0}, 0}, + {'e', 5772, 5760, {0}, 0},{'i', 5780, 5761, {0}, 0},{'y', 5786, 5762, {0}, 0}, + {'\0', 0, 5763, {0}, 0},{'r', 5766, 5764, {0}, 0},{'\0', 0, 5765, {0}, 0}, + {'o', 5768, 5766, {0}, 0},{'\0', 0, 5767, {0}, 0},{'n', 5770, 5768, {0}, 0}, + {'\0', 0, 5769, {0}, 0},{';', 0, 5770, {352}, 1},{'\0', 0, 5771, {0}, 0}, + {'d', 5774, 5772, {0}, 0},{'\0', 0, 5773, {0}, 0},{'i', 5776, 5774, {0}, 0}, + {'\0', 0, 5775, {0}, 0},{'l', 5778, 5776, {0}, 0},{'\0', 0, 5777, {0}, 0}, + {';', 0, 5778, {350}, 1},{'\0', 0, 5779, {0}, 0},{'r', 5782, 5780, {0}, 0}, + {'\0', 0, 5781, {0}, 0},{'c', 5784, 5782, {0}, 0},{'\0', 0, 5783, {0}, 0}, + {';', 0, 5784, {348}, 1},{'\0', 0, 5785, {0}, 0},{';', 0, 5786, {1057}, 1}, + {'\0', 0, 5787, {0}, 0},{'r', 5790, 5788, {0}, 0},{'\0', 0, 5789, {0}, 0}, + {';', 0, 5790, {120086}, 1},{'\0', 0, 5791, {0}, 0},{'o', 5794, 5792, {0}, 0}, + {'\0', 0, 5793, {0}, 0},{'r', 5796, 5794, {0}, 0},{'\0', 0, 5795, {0}, 0}, + {'t', 5798, 5796, {0}, 0},{'\0', 0, 5797, {0}, 0},{'D', 5803, 5798, {0}, 0}, + {'L', 5821, 5799, {0}, 0},{'R', 5839, 5800, {0}, 0},{'U', 5859, 5801, {0}, 0}, + {'\0', 0, 5802, {0}, 0},{'o', 5805, 5803, {0}, 0},{'\0', 0, 5804, {0}, 0}, + {'w', 5807, 5805, {0}, 0},{'\0', 0, 5806, {0}, 0},{'n', 5809, 5807, {0}, 0}, + {'\0', 0, 5808, {0}, 0},{'A', 5811, 5809, {0}, 0},{'\0', 0, 5810, {0}, 0}, + {'r', 5813, 5811, {0}, 0},{'\0', 0, 5812, {0}, 0},{'r', 5815, 5813, {0}, 0}, + {'\0', 0, 5814, {0}, 0},{'o', 5817, 5815, {0}, 0},{'\0', 0, 5816, {0}, 0}, + {'w', 5819, 5817, {0}, 0},{'\0', 0, 5818, {0}, 0},{';', 0, 5819, {8595}, 1}, + {'\0', 0, 5820, {0}, 0},{'e', 5823, 5821, {0}, 0},{'\0', 0, 5822, {0}, 0}, + {'f', 5825, 5823, {0}, 0},{'\0', 0, 5824, {0}, 0},{'t', 5827, 5825, {0}, 0}, + {'\0', 0, 5826, {0}, 0},{'A', 5829, 5827, {0}, 0},{'\0', 0, 5828, {0}, 0}, + {'r', 5831, 5829, {0}, 0},{'\0', 0, 5830, {0}, 0},{'r', 5833, 5831, {0}, 0}, + {'\0', 0, 5832, {0}, 0},{'o', 5835, 5833, {0}, 0},{'\0', 0, 5834, {0}, 0}, + {'w', 5837, 5835, {0}, 0},{'\0', 0, 5836, {0}, 0},{';', 0, 5837, {8592}, 1}, + {'\0', 0, 5838, {0}, 0},{'i', 5841, 5839, {0}, 0},{'\0', 0, 5840, {0}, 0}, + {'g', 5843, 5841, {0}, 0},{'\0', 0, 5842, {0}, 0},{'h', 5845, 5843, {0}, 0}, + {'\0', 0, 5844, {0}, 0},{'t', 5847, 5845, {0}, 0},{'\0', 0, 5846, {0}, 0}, + {'A', 5849, 5847, {0}, 0},{'\0', 0, 5848, {0}, 0},{'r', 5851, 5849, {0}, 0}, + {'\0', 0, 5850, {0}, 0},{'r', 5853, 5851, {0}, 0},{'\0', 0, 5852, {0}, 0}, + {'o', 5855, 5853, {0}, 0},{'\0', 0, 5854, {0}, 0},{'w', 5857, 5855, {0}, 0}, + {'\0', 0, 5856, {0}, 0},{';', 0, 5857, {8594}, 1},{'\0', 0, 5858, {0}, 0}, + {'p', 5861, 5859, {0}, 0},{'\0', 0, 5860, {0}, 0},{'A', 5863, 5861, {0}, 0}, + {'\0', 0, 5862, {0}, 0},{'r', 5865, 5863, {0}, 0},{'\0', 0, 5864, {0}, 0}, + {'r', 5867, 5865, {0}, 0},{'\0', 0, 5866, {0}, 0},{'o', 5869, 5867, {0}, 0}, + {'\0', 0, 5868, {0}, 0},{'w', 5871, 5869, {0}, 0},{'\0', 0, 5870, {0}, 0}, + {';', 0, 5871, {8593}, 1},{'\0', 0, 5872, {0}, 0},{'g', 5875, 5873, {0}, 0}, + {'\0', 0, 5874, {0}, 0},{'m', 5877, 5875, {0}, 0},{'\0', 0, 5876, {0}, 0}, + {'a', 5879, 5877, {0}, 0},{'\0', 0, 5878, {0}, 0},{';', 0, 5879, {931}, 1}, + {'\0', 0, 5880, {0}, 0},{'a', 5883, 5881, {0}, 0},{'\0', 0, 5882, {0}, 0}, + {'l', 5885, 5883, {0}, 0},{'\0', 0, 5884, {0}, 0},{'l', 5887, 5885, {0}, 0}, + {'\0', 0, 5886, {0}, 0},{'C', 5889, 5887, {0}, 0},{'\0', 0, 5888, {0}, 0}, + {'i', 5891, 5889, {0}, 0},{'\0', 0, 5890, {0}, 0},{'r', 5893, 5891, {0}, 0}, + {'\0', 0, 5892, {0}, 0},{'c', 5895, 5893, {0}, 0},{'\0', 0, 5894, {0}, 0}, + {'l', 5897, 5895, {0}, 0},{'\0', 0, 5896, {0}, 0},{'e', 5899, 5897, {0}, 0}, + {'\0', 0, 5898, {0}, 0},{';', 0, 5899, {8728}, 1},{'\0', 0, 5900, {0}, 0}, + {'p', 5903, 5901, {0}, 0},{'\0', 0, 5902, {0}, 0},{'f', 5905, 5903, {0}, 0}, + {'\0', 0, 5904, {0}, 0},{';', 0, 5905, {120138}, 1},{'\0', 0, 5906, {0}, 0}, + {'r', 5910, 5907, {0}, 0},{'u', 5914, 5908, {0}, 0},{'\0', 0, 5909, {0}, 0}, + {'t', 5912, 5910, {0}, 0},{'\0', 0, 5911, {0}, 0},{';', 0, 5912, {8730}, 1}, + {'\0', 0, 5913, {0}, 0},{'a', 5916, 5914, {0}, 0},{'\0', 0, 5915, {0}, 0}, + {'r', 5918, 5916, {0}, 0},{'\0', 0, 5917, {0}, 0},{'e', 5920, 5918, {0}, 0}, + {'\0', 0, 5919, {0}, 0},{';', 0, 5920, {9633}, 1},{'I', 5925, 5921, {0}, 0}, + {'S', 5949, 5922, {0}, 0},{'U', 5996, 5923, {0}, 0},{'\0', 0, 5924, {0}, 0}, + {'n', 5927, 5925, {0}, 0},{'\0', 0, 5926, {0}, 0},{'t', 5929, 5927, {0}, 0}, + {'\0', 0, 5928, {0}, 0},{'e', 5931, 5929, {0}, 0},{'\0', 0, 5930, {0}, 0}, + {'r', 5933, 5931, {0}, 0},{'\0', 0, 5932, {0}, 0},{'s', 5935, 5933, {0}, 0}, + {'\0', 0, 5934, {0}, 0},{'e', 5937, 5935, {0}, 0},{'\0', 0, 5936, {0}, 0}, + {'c', 5939, 5937, {0}, 0},{'\0', 0, 5938, {0}, 0},{'t', 5941, 5939, {0}, 0}, + {'\0', 0, 5940, {0}, 0},{'i', 5943, 5941, {0}, 0},{'\0', 0, 5942, {0}, 0}, + {'o', 5945, 5943, {0}, 0},{'\0', 0, 5944, {0}, 0},{'n', 5947, 5945, {0}, 0}, + {'\0', 0, 5946, {0}, 0},{';', 0, 5947, {8851}, 1},{'\0', 0, 5948, {0}, 0}, + {'u', 5951, 5949, {0}, 0},{'\0', 0, 5950, {0}, 0},{'b', 5954, 5951, {0}, 0}, + {'p', 5973, 5952, {0}, 0},{'\0', 0, 5953, {0}, 0},{'s', 5956, 5954, {0}, 0}, + {'\0', 0, 5955, {0}, 0},{'e', 5958, 5956, {0}, 0},{'\0', 0, 5957, {0}, 0}, + {'t', 5960, 5958, {0}, 0},{'\0', 0, 5959, {0}, 0},{';', 0, 5960, {8847}, 1}, + {'E', 5963, 5961, {0}, 0},{'\0', 0, 5962, {0}, 0},{'q', 5965, 5963, {0}, 0}, + {'\0', 0, 5964, {0}, 0},{'u', 5967, 5965, {0}, 0},{'\0', 0, 5966, {0}, 0}, + {'a', 5969, 5967, {0}, 0},{'\0', 0, 5968, {0}, 0},{'l', 5971, 5969, {0}, 0}, + {'\0', 0, 5970, {0}, 0},{';', 0, 5971, {8849}, 1},{'\0', 0, 5972, {0}, 0}, + {'e', 5975, 5973, {0}, 0},{'\0', 0, 5974, {0}, 0},{'r', 5977, 5975, {0}, 0}, + {'\0', 0, 5976, {0}, 0},{'s', 5979, 5977, {0}, 0},{'\0', 0, 5978, {0}, 0}, + {'e', 5981, 5979, {0}, 0},{'\0', 0, 5980, {0}, 0},{'t', 5983, 5981, {0}, 0}, + {'\0', 0, 5982, {0}, 0},{';', 0, 5983, {8848}, 1},{'E', 5986, 5984, {0}, 0}, + {'\0', 0, 5985, {0}, 0},{'q', 5988, 5986, {0}, 0},{'\0', 0, 5987, {0}, 0}, + {'u', 5990, 5988, {0}, 0},{'\0', 0, 5989, {0}, 0},{'a', 5992, 5990, {0}, 0}, + {'\0', 0, 5991, {0}, 0},{'l', 5994, 5992, {0}, 0},{'\0', 0, 5993, {0}, 0}, + {';', 0, 5994, {8850}, 1},{'\0', 0, 5995, {0}, 0},{'n', 5998, 5996, {0}, 0}, + {'\0', 0, 5997, {0}, 0},{'i', 6000, 5998, {0}, 0},{'\0', 0, 5999, {0}, 0}, + {'o', 6002, 6000, {0}, 0},{'\0', 0, 6001, {0}, 0},{'n', 6004, 6002, {0}, 0}, + {'\0', 0, 6003, {0}, 0},{';', 0, 6004, {8852}, 1},{'\0', 0, 6005, {0}, 0}, + {'c', 6008, 6006, {0}, 0},{'\0', 0, 6007, {0}, 0},{'r', 6010, 6008, {0}, 0}, + {'\0', 0, 6009, {0}, 0},{';', 0, 6010, {119982}, 1},{'\0', 0, 6011, {0}, 0}, + {'a', 6014, 6012, {0}, 0},{'\0', 0, 6013, {0}, 0},{'r', 6016, 6014, {0}, 0}, + {'\0', 0, 6015, {0}, 0},{';', 0, 6016, {8902}, 1},{'\0', 0, 6017, {0}, 0}, + {'b', 6023, 6018, {0}, 0},{'c', 6043, 6019, {0}, 0},{'m', 6109, 6020, {0}, 0}, + {'p', 6111, 6021, {0}, 0},{'\0', 0, 6022, {0}, 0},{';', 0, 6023, {8912}, 1}, + {'s', 6026, 6024, {0}, 0},{'\0', 0, 6025, {0}, 0},{'e', 6028, 6026, {0}, 0}, + {'\0', 0, 6027, {0}, 0},{'t', 6030, 6028, {0}, 0},{'\0', 0, 6029, {0}, 0}, + {';', 0, 6030, {8912}, 1},{'E', 6033, 6031, {0}, 0},{'\0', 0, 6032, {0}, 0}, + {'q', 6035, 6033, {0}, 0},{'\0', 0, 6034, {0}, 0},{'u', 6037, 6035, {0}, 0}, + {'\0', 0, 6036, {0}, 0},{'a', 6039, 6037, {0}, 0},{'\0', 0, 6038, {0}, 0}, + {'l', 6041, 6039, {0}, 0},{'\0', 0, 6040, {0}, 0},{';', 0, 6041, {8838}, 1}, + {'\0', 0, 6042, {0}, 0},{'c', 6046, 6043, {0}, 0},{'h', 6099, 6044, {0}, 0}, + {'\0', 0, 6045, {0}, 0},{'e', 6048, 6046, {0}, 0},{'\0', 0, 6047, {0}, 0}, + {'e', 6050, 6048, {0}, 0},{'\0', 0, 6049, {0}, 0},{'d', 6052, 6050, {0}, 0}, + {'\0', 0, 6051, {0}, 0},{'s', 6054, 6052, {0}, 0},{'\0', 0, 6053, {0}, 0}, + {';', 0, 6054, {8827}, 1},{'E', 6059, 6055, {0}, 0},{'S', 6069, 6056, {0}, 0}, + {'T', 6089, 6057, {0}, 0},{'\0', 0, 6058, {0}, 0},{'q', 6061, 6059, {0}, 0}, + {'\0', 0, 6060, {0}, 0},{'u', 6063, 6061, {0}, 0},{'\0', 0, 6062, {0}, 0}, + {'a', 6065, 6063, {0}, 0},{'\0', 0, 6064, {0}, 0},{'l', 6067, 6065, {0}, 0}, + {'\0', 0, 6066, {0}, 0},{';', 0, 6067, {10928}, 1},{'\0', 0, 6068, {0}, 0}, + {'l', 6071, 6069, {0}, 0},{'\0', 0, 6070, {0}, 0},{'a', 6073, 6071, {0}, 0}, + {'\0', 0, 6072, {0}, 0},{'n', 6075, 6073, {0}, 0},{'\0', 0, 6074, {0}, 0}, + {'t', 6077, 6075, {0}, 0},{'\0', 0, 6076, {0}, 0},{'E', 6079, 6077, {0}, 0}, + {'\0', 0, 6078, {0}, 0},{'q', 6081, 6079, {0}, 0},{'\0', 0, 6080, {0}, 0}, + {'u', 6083, 6081, {0}, 0},{'\0', 0, 6082, {0}, 0},{'a', 6085, 6083, {0}, 0}, + {'\0', 0, 6084, {0}, 0},{'l', 6087, 6085, {0}, 0},{'\0', 0, 6086, {0}, 0}, + {';', 0, 6087, {8829}, 1},{'\0', 0, 6088, {0}, 0},{'i', 6091, 6089, {0}, 0}, + {'\0', 0, 6090, {0}, 0},{'l', 6093, 6091, {0}, 0},{'\0', 0, 6092, {0}, 0}, + {'d', 6095, 6093, {0}, 0},{'\0', 0, 6094, {0}, 0},{'e', 6097, 6095, {0}, 0}, + {'\0', 0, 6096, {0}, 0},{';', 0, 6097, {8831}, 1},{'\0', 0, 6098, {0}, 0}, + {'T', 6101, 6099, {0}, 0},{'\0', 0, 6100, {0}, 0},{'h', 6103, 6101, {0}, 0}, + {'\0', 0, 6102, {0}, 0},{'a', 6105, 6103, {0}, 0},{'\0', 0, 6104, {0}, 0}, + {'t', 6107, 6105, {0}, 0},{'\0', 0, 6106, {0}, 0},{';', 0, 6107, {8715}, 1}, + {'\0', 0, 6108, {0}, 0},{';', 0, 6109, {8721}, 1},{'\0', 0, 6110, {0}, 0}, + {';', 0, 6111, {8913}, 1},{'e', 6115, 6112, {0}, 0},{'s', 6136, 6113, {0}, 0}, + {'\0', 0, 6114, {0}, 0},{'r', 6117, 6115, {0}, 0},{'\0', 0, 6116, {0}, 0}, + {'s', 6119, 6117, {0}, 0},{'\0', 0, 6118, {0}, 0},{'e', 6121, 6119, {0}, 0}, + {'\0', 0, 6120, {0}, 0},{'t', 6123, 6121, {0}, 0},{'\0', 0, 6122, {0}, 0}, + {';', 0, 6123, {8835}, 1},{'E', 6126, 6124, {0}, 0},{'\0', 0, 6125, {0}, 0}, + {'q', 6128, 6126, {0}, 0},{'\0', 0, 6127, {0}, 0},{'u', 6130, 6128, {0}, 0}, + {'\0', 0, 6129, {0}, 0},{'a', 6132, 6130, {0}, 0},{'\0', 0, 6131, {0}, 0}, + {'l', 6134, 6132, {0}, 0},{'\0', 0, 6133, {0}, 0},{';', 0, 6134, {8839}, 1}, + {'\0', 0, 6135, {0}, 0},{'e', 6138, 6136, {0}, 0},{'\0', 0, 6137, {0}, 0}, + {'t', 6140, 6138, {0}, 0},{'\0', 0, 6139, {0}, 0},{';', 0, 6140, {8913}, 1}, + {'\0', 0, 6141, {0}, 0},{'H', 6154, 6142, {0}, 0},{'R', 6162, 6143, {0}, 0}, + {'S', 6170, 6144, {0}, 0},{'a', 6183, 6145, {0}, 0},{'c', 6190, 6146, {0}, 0}, + {'f', 6212, 6147, {0}, 0},{'h', 6216, 6148, {0}, 0},{'i', 6267, 6149, {0}, 0}, + {'o', 6316, 6150, {0}, 0},{'r', 6322, 6151, {0}, 0},{'s', 6338, 6152, {0}, 0}, + {'\0', 0, 6153, {0}, 0},{'O', 6156, 6154, {0}, 0},{'\0', 0, 6155, {0}, 0}, + {'R', 6158, 6156, {0}, 0},{'\0', 0, 6157, {0}, 0},{'N', 6160, 6158, {222}, 1}, + {'\0', 0, 6159, {0}, 0},{';', 0, 6160, {222}, 1},{'\0', 0, 6161, {0}, 0}, + {'A', 6164, 6162, {0}, 0},{'\0', 0, 6163, {0}, 0},{'D', 6166, 6164, {0}, 0}, + {'\0', 0, 6165, {0}, 0},{'E', 6168, 6166, {0}, 0},{'\0', 0, 6167, {0}, 0}, + {';', 0, 6168, {8482}, 1},{'\0', 0, 6169, {0}, 0},{'H', 6173, 6170, {0}, 0}, + {'c', 6179, 6171, {0}, 0},{'\0', 0, 6172, {0}, 0},{'c', 6175, 6173, {0}, 0}, + {'\0', 0, 6174, {0}, 0},{'y', 6177, 6175, {0}, 0},{'\0', 0, 6176, {0}, 0}, + {';', 0, 6177, {1035}, 1},{'\0', 0, 6178, {0}, 0},{'y', 6181, 6179, {0}, 0}, + {'\0', 0, 6180, {0}, 0},{';', 0, 6181, {1062}, 1},{'\0', 0, 6182, {0}, 0}, + {'b', 6186, 6183, {0}, 0},{'u', 6188, 6184, {0}, 0},{'\0', 0, 6185, {0}, 0}, + {';', 0, 6186, {9}, 1},{'\0', 0, 6187, {0}, 0},{';', 0, 6188, {932}, 1}, + {'\0', 0, 6189, {0}, 0},{'a', 6194, 6190, {0}, 0},{'e', 6202, 6191, {0}, 0}, + {'y', 6210, 6192, {0}, 0},{'\0', 0, 6193, {0}, 0},{'r', 6196, 6194, {0}, 0}, + {'\0', 0, 6195, {0}, 0},{'o', 6198, 6196, {0}, 0},{'\0', 0, 6197, {0}, 0}, + {'n', 6200, 6198, {0}, 0},{'\0', 0, 6199, {0}, 0},{';', 0, 6200, {356}, 1}, + {'\0', 0, 6201, {0}, 0},{'d', 6204, 6202, {0}, 0},{'\0', 0, 6203, {0}, 0}, + {'i', 6206, 6204, {0}, 0},{'\0', 0, 6205, {0}, 0},{'l', 6208, 6206, {0}, 0}, + {'\0', 0, 6207, {0}, 0},{';', 0, 6208, {354}, 1},{'\0', 0, 6209, {0}, 0}, + {';', 0, 6210, {1058}, 1},{'\0', 0, 6211, {0}, 0},{'r', 6214, 6212, {0}, 0}, + {'\0', 0, 6213, {0}, 0},{';', 0, 6214, {120087}, 1},{'\0', 0, 6215, {0}, 0}, + {'e', 6219, 6216, {0}, 0},{'i', 6238, 6217, {0}, 0},{'\0', 0, 6218, {0}, 0}, + {'r', 6222, 6219, {0}, 0},{'t', 6234, 6220, {0}, 0},{'\0', 0, 6221, {0}, 0}, + {'e', 6224, 6222, {0}, 0},{'\0', 0, 6223, {0}, 0},{'f', 6226, 6224, {0}, 0}, + {'\0', 0, 6225, {0}, 0},{'o', 6228, 6226, {0}, 0},{'\0', 0, 6227, {0}, 0}, + {'r', 6230, 6228, {0}, 0},{'\0', 0, 6229, {0}, 0},{'e', 6232, 6230, {0}, 0}, + {'\0', 0, 6231, {0}, 0},{';', 0, 6232, {8756}, 1},{'\0', 0, 6233, {0}, 0}, + {'a', 6236, 6234, {0}, 0},{'\0', 0, 6235, {0}, 0},{';', 0, 6236, {920}, 1}, + {'\0', 0, 6237, {0}, 0},{'c', 6241, 6238, {0}, 0},{'n', 6255, 6239, {0}, 0}, + {'\0', 0, 6240, {0}, 0},{'k', 6243, 6241, {0}, 0},{'\0', 0, 6242, {0}, 0}, + {'S', 6245, 6243, {0}, 0},{'\0', 0, 6244, {0}, 0},{'p', 6247, 6245, {0}, 0}, + {'\0', 0, 6246, {0}, 0},{'a', 6249, 6247, {0}, 0},{'\0', 0, 6248, {0}, 0}, + {'c', 6251, 6249, {0}, 0},{'\0', 0, 6250, {0}, 0},{'e', 6253, 6251, {0}, 0}, + {'\0', 0, 6252, {0}, 0},{';', 0, 6253, {8287,8202}, 2},{'\0', 0, 6254, {0}, 0}, + {'S', 6257, 6255, {0}, 0},{'\0', 0, 6256, {0}, 0},{'p', 6259, 6257, {0}, 0}, + {'\0', 0, 6258, {0}, 0},{'a', 6261, 6259, {0}, 0},{'\0', 0, 6260, {0}, 0}, + {'c', 6263, 6261, {0}, 0},{'\0', 0, 6262, {0}, 0},{'e', 6265, 6263, {0}, 0}, + {'\0', 0, 6264, {0}, 0},{';', 0, 6265, {8201}, 1},{'\0', 0, 6266, {0}, 0}, + {'l', 6269, 6267, {0}, 0},{'\0', 0, 6268, {0}, 0},{'d', 6271, 6269, {0}, 0}, + {'\0', 0, 6270, {0}, 0},{'e', 6273, 6271, {0}, 0},{'\0', 0, 6272, {0}, 0}, + {';', 0, 6273, {8764}, 1},{'E', 6278, 6274, {0}, 0},{'F', 6288, 6275, {0}, 0}, + {'T', 6306, 6276, {0}, 0},{'\0', 0, 6277, {0}, 0},{'q', 6280, 6278, {0}, 0}, + {'\0', 0, 6279, {0}, 0},{'u', 6282, 6280, {0}, 0},{'\0', 0, 6281, {0}, 0}, + {'a', 6284, 6282, {0}, 0},{'\0', 0, 6283, {0}, 0},{'l', 6286, 6284, {0}, 0}, + {'\0', 0, 6285, {0}, 0},{';', 0, 6286, {8771}, 1},{'\0', 0, 6287, {0}, 0}, + {'u', 6290, 6288, {0}, 0},{'\0', 0, 6289, {0}, 0},{'l', 6292, 6290, {0}, 0}, + {'\0', 0, 6291, {0}, 0},{'l', 6294, 6292, {0}, 0},{'\0', 0, 6293, {0}, 0}, + {'E', 6296, 6294, {0}, 0},{'\0', 0, 6295, {0}, 0},{'q', 6298, 6296, {0}, 0}, + {'\0', 0, 6297, {0}, 0},{'u', 6300, 6298, {0}, 0},{'\0', 0, 6299, {0}, 0}, + {'a', 6302, 6300, {0}, 0},{'\0', 0, 6301, {0}, 0},{'l', 6304, 6302, {0}, 0}, + {'\0', 0, 6303, {0}, 0},{';', 0, 6304, {8773}, 1},{'\0', 0, 6305, {0}, 0}, + {'i', 6308, 6306, {0}, 0},{'\0', 0, 6307, {0}, 0},{'l', 6310, 6308, {0}, 0}, + {'\0', 0, 6309, {0}, 0},{'d', 6312, 6310, {0}, 0},{'\0', 0, 6311, {0}, 0}, + {'e', 6314, 6312, {0}, 0},{'\0', 0, 6313, {0}, 0},{';', 0, 6314, {8776}, 1}, + {'\0', 0, 6315, {0}, 0},{'p', 6318, 6316, {0}, 0},{'\0', 0, 6317, {0}, 0}, + {'f', 6320, 6318, {0}, 0},{'\0', 0, 6319, {0}, 0},{';', 0, 6320, {120139}, 1}, + {'\0', 0, 6321, {0}, 0},{'i', 6324, 6322, {0}, 0},{'\0', 0, 6323, {0}, 0}, + {'p', 6326, 6324, {0}, 0},{'\0', 0, 6325, {0}, 0},{'l', 6328, 6326, {0}, 0}, + {'\0', 0, 6327, {0}, 0},{'e', 6330, 6328, {0}, 0},{'\0', 0, 6329, {0}, 0}, + {'D', 6332, 6330, {0}, 0},{'\0', 0, 6331, {0}, 0},{'o', 6334, 6332, {0}, 0}, + {'\0', 0, 6333, {0}, 0},{'t', 6336, 6334, {0}, 0},{'\0', 0, 6335, {0}, 0}, + {';', 0, 6336, {8411}, 1},{'\0', 0, 6337, {0}, 0},{'c', 6341, 6338, {0}, 0}, + {'t', 6345, 6339, {0}, 0},{'\0', 0, 6340, {0}, 0},{'r', 6343, 6341, {0}, 0}, + {'\0', 0, 6342, {0}, 0},{';', 0, 6343, {119983}, 1},{'\0', 0, 6344, {0}, 0}, + {'r', 6347, 6345, {0}, 0},{'\0', 0, 6346, {0}, 0},{'o', 6349, 6347, {0}, 0}, + {'\0', 0, 6348, {0}, 0},{'k', 6351, 6349, {0}, 0},{'\0', 0, 6350, {0}, 0}, + {';', 0, 6351, {358}, 1},{'\0', 0, 6352, {0}, 0},{'a', 6368, 6353, {0}, 0}, + {'b', 6392, 6354, {0}, 0},{'c', 6407, 6355, {0}, 0},{'d', 6418, 6356, {0}, 0}, + {'f', 6428, 6357, {0}, 0},{'g', 6432, 6358, {0}, 0},{'m', 6442, 6359, {0}, 0}, + {'n', 6450, 6360, {0}, 0},{'o', 6519, 6361, {0}, 0},{'p', 6532, 6362, {0}, 0}, + {'r', 6718, 6363, {0}, 0},{'s', 6726, 6364, {0}, 0},{'t', 6732, 6365, {0}, 0}, + {'u', 6742, 6366, {0}, 0},{'\0', 0, 6367, {0}, 0},{'c', 6371, 6368, {0}, 0}, + {'r', 6379, 6369, {0}, 0},{'\0', 0, 6370, {0}, 0},{'u', 6373, 6371, {0}, 0}, + {'\0', 0, 6372, {0}, 0},{'t', 6375, 6373, {0}, 0},{'\0', 0, 6374, {0}, 0}, + {'e', 6377, 6375, {218}, 1},{'\0', 0, 6376, {0}, 0},{';', 0, 6377, {218}, 1}, + {'\0', 0, 6378, {0}, 0},{'r', 6381, 6379, {0}, 0},{'\0', 0, 6380, {0}, 0}, + {';', 0, 6381, {8607}, 1},{'o', 6384, 6382, {0}, 0},{'\0', 0, 6383, {0}, 0}, + {'c', 6386, 6384, {0}, 0},{'\0', 0, 6385, {0}, 0},{'i', 6388, 6386, {0}, 0}, + {'\0', 0, 6387, {0}, 0},{'r', 6390, 6388, {0}, 0},{'\0', 0, 6389, {0}, 0}, + {';', 0, 6390, {10569}, 1},{'\0', 0, 6391, {0}, 0},{'r', 6394, 6392, {0}, 0}, + {'\0', 0, 6393, {0}, 0},{'c', 6397, 6394, {0}, 0},{'e', 6401, 6395, {0}, 0}, + {'\0', 0, 6396, {0}, 0},{'y', 6399, 6397, {0}, 0},{'\0', 0, 6398, {0}, 0}, + {';', 0, 6399, {1038}, 1},{'\0', 0, 6400, {0}, 0},{'v', 6403, 6401, {0}, 0}, + {'\0', 0, 6402, {0}, 0},{'e', 6405, 6403, {0}, 0},{'\0', 0, 6404, {0}, 0}, + {';', 0, 6405, {364}, 1},{'\0', 0, 6406, {0}, 0},{'i', 6410, 6407, {0}, 0}, + {'y', 6416, 6408, {0}, 0},{'\0', 0, 6409, {0}, 0},{'r', 6412, 6410, {0}, 0}, + {'\0', 0, 6411, {0}, 0},{'c', 6414, 6412, {219}, 1},{'\0', 0, 6413, {0}, 0}, + {';', 0, 6414, {219}, 1},{'\0', 0, 6415, {0}, 0},{';', 0, 6416, {1059}, 1}, + {'\0', 0, 6417, {0}, 0},{'b', 6420, 6418, {0}, 0},{'\0', 0, 6419, {0}, 0}, + {'l', 6422, 6420, {0}, 0},{'\0', 0, 6421, {0}, 0},{'a', 6424, 6422, {0}, 0}, + {'\0', 0, 6423, {0}, 0},{'c', 6426, 6424, {0}, 0},{'\0', 0, 6425, {0}, 0}, + {';', 0, 6426, {368}, 1},{'\0', 0, 6427, {0}, 0},{'r', 6430, 6428, {0}, 0}, + {'\0', 0, 6429, {0}, 0},{';', 0, 6430, {120088}, 1},{'\0', 0, 6431, {0}, 0}, + {'r', 6434, 6432, {0}, 0},{'\0', 0, 6433, {0}, 0},{'a', 6436, 6434, {0}, 0}, + {'\0', 0, 6435, {0}, 0},{'v', 6438, 6436, {0}, 0},{'\0', 0, 6437, {0}, 0}, + {'e', 6440, 6438, {217}, 1},{'\0', 0, 6439, {0}, 0},{';', 0, 6440, {217}, 1}, + {'\0', 0, 6441, {0}, 0},{'a', 6444, 6442, {0}, 0},{'\0', 0, 6443, {0}, 0}, + {'c', 6446, 6444, {0}, 0},{'\0', 0, 6445, {0}, 0},{'r', 6448, 6446, {0}, 0}, + {'\0', 0, 6447, {0}, 0},{';', 0, 6448, {362}, 1},{'\0', 0, 6449, {0}, 0}, + {'d', 6453, 6450, {0}, 0},{'i', 6504, 6451, {0}, 0},{'\0', 0, 6452, {0}, 0}, + {'e', 6455, 6453, {0}, 0},{'\0', 0, 6454, {0}, 0},{'r', 6457, 6455, {0}, 0}, + {'\0', 0, 6456, {0}, 0},{'B', 6460, 6457, {0}, 0},{'P', 6482, 6458, {0}, 0}, + {'\0', 0, 6459, {0}, 0},{'a', 6463, 6460, {0}, 0},{'r', 6467, 6461, {0}, 0}, + {'\0', 0, 6462, {0}, 0},{'r', 6465, 6463, {0}, 0},{'\0', 0, 6464, {0}, 0}, + {';', 0, 6465, {95}, 1},{'\0', 0, 6466, {0}, 0},{'a', 6469, 6467, {0}, 0}, + {'\0', 0, 6468, {0}, 0},{'c', 6471, 6469, {0}, 0},{'\0', 0, 6470, {0}, 0}, + {'e', 6474, 6471, {0}, 0},{'k', 6476, 6472, {0}, 0},{'\0', 0, 6473, {0}, 0}, + {';', 0, 6474, {9183}, 1},{'\0', 0, 6475, {0}, 0},{'e', 6478, 6476, {0}, 0}, + {'\0', 0, 6477, {0}, 0},{'t', 6480, 6478, {0}, 0},{'\0', 0, 6479, {0}, 0}, + {';', 0, 6480, {9141}, 1},{'\0', 0, 6481, {0}, 0},{'a', 6484, 6482, {0}, 0}, + {'\0', 0, 6483, {0}, 0},{'r', 6486, 6484, {0}, 0},{'\0', 0, 6485, {0}, 0}, + {'e', 6488, 6486, {0}, 0},{'\0', 0, 6487, {0}, 0},{'n', 6490, 6488, {0}, 0}, + {'\0', 0, 6489, {0}, 0},{'t', 6492, 6490, {0}, 0},{'\0', 0, 6491, {0}, 0}, + {'h', 6494, 6492, {0}, 0},{'\0', 0, 6493, {0}, 0},{'e', 6496, 6494, {0}, 0}, + {'\0', 0, 6495, {0}, 0},{'s', 6498, 6496, {0}, 0},{'\0', 0, 6497, {0}, 0}, + {'i', 6500, 6498, {0}, 0},{'\0', 0, 6499, {0}, 0},{'s', 6502, 6500, {0}, 0}, + {'\0', 0, 6501, {0}, 0},{';', 0, 6502, {9181}, 1},{'\0', 0, 6503, {0}, 0}, + {'o', 6506, 6504, {0}, 0},{'\0', 0, 6505, {0}, 0},{'n', 6508, 6506, {0}, 0}, + {'\0', 0, 6507, {0}, 0},{';', 0, 6508, {8899}, 1},{'P', 6511, 6509, {0}, 0}, + {'\0', 0, 6510, {0}, 0},{'l', 6513, 6511, {0}, 0},{'\0', 0, 6512, {0}, 0}, + {'u', 6515, 6513, {0}, 0},{'\0', 0, 6514, {0}, 0},{'s', 6517, 6515, {0}, 0}, + {'\0', 0, 6516, {0}, 0},{';', 0, 6517, {8846}, 1},{'\0', 0, 6518, {0}, 0}, + {'g', 6522, 6519, {0}, 0},{'p', 6528, 6520, {0}, 0},{'\0', 0, 6521, {0}, 0}, + {'o', 6524, 6522, {0}, 0},{'\0', 0, 6523, {0}, 0},{'n', 6526, 6524, {0}, 0}, + {'\0', 0, 6525, {0}, 0},{';', 0, 6526, {370}, 1},{'\0', 0, 6527, {0}, 0}, + {'f', 6530, 6528, {0}, 0},{'\0', 0, 6529, {0}, 0},{';', 0, 6530, {120140}, 1}, + {'\0', 0, 6531, {0}, 0},{'A', 6541, 6532, {0}, 0},{'D', 6577, 6533, {0}, 0}, + {'E', 6595, 6534, {0}, 0},{'T', 6617, 6535, {0}, 0},{'a', 6634, 6536, {0}, 0}, + {'d', 6644, 6537, {0}, 0},{'p', 6662, 6538, {0}, 0},{'s', 6707, 6539, {0}, 0}, + {'\0', 0, 6540, {0}, 0},{'r', 6543, 6541, {0}, 0},{'\0', 0, 6542, {0}, 0}, + {'r', 6545, 6543, {0}, 0},{'\0', 0, 6544, {0}, 0},{'o', 6547, 6545, {0}, 0}, + {'\0', 0, 6546, {0}, 0},{'w', 6549, 6547, {0}, 0},{'\0', 0, 6548, {0}, 0}, + {';', 0, 6549, {8593}, 1},{'B', 6553, 6550, {0}, 0},{'D', 6559, 6551, {0}, 0}, + {'\0', 0, 6552, {0}, 0},{'a', 6555, 6553, {0}, 0},{'\0', 0, 6554, {0}, 0}, + {'r', 6557, 6555, {0}, 0},{'\0', 0, 6556, {0}, 0},{';', 0, 6557, {10514}, 1}, + {'\0', 0, 6558, {0}, 0},{'o', 6561, 6559, {0}, 0},{'\0', 0, 6560, {0}, 0}, + {'w', 6563, 6561, {0}, 0},{'\0', 0, 6562, {0}, 0},{'n', 6565, 6563, {0}, 0}, + {'\0', 0, 6564, {0}, 0},{'A', 6567, 6565, {0}, 0},{'\0', 0, 6566, {0}, 0}, + {'r', 6569, 6567, {0}, 0},{'\0', 0, 6568, {0}, 0},{'r', 6571, 6569, {0}, 0}, + {'\0', 0, 6570, {0}, 0},{'o', 6573, 6571, {0}, 0},{'\0', 0, 6572, {0}, 0}, + {'w', 6575, 6573, {0}, 0},{'\0', 0, 6574, {0}, 0},{';', 0, 6575, {8645}, 1}, + {'\0', 0, 6576, {0}, 0},{'o', 6579, 6577, {0}, 0},{'\0', 0, 6578, {0}, 0}, + {'w', 6581, 6579, {0}, 0},{'\0', 0, 6580, {0}, 0},{'n', 6583, 6581, {0}, 0}, + {'\0', 0, 6582, {0}, 0},{'A', 6585, 6583, {0}, 0},{'\0', 0, 6584, {0}, 0}, + {'r', 6587, 6585, {0}, 0},{'\0', 0, 6586, {0}, 0},{'r', 6589, 6587, {0}, 0}, + {'\0', 0, 6588, {0}, 0},{'o', 6591, 6589, {0}, 0},{'\0', 0, 6590, {0}, 0}, + {'w', 6593, 6591, {0}, 0},{'\0', 0, 6592, {0}, 0},{';', 0, 6593, {8597}, 1}, + {'\0', 0, 6594, {0}, 0},{'q', 6597, 6595, {0}, 0},{'\0', 0, 6596, {0}, 0}, + {'u', 6599, 6597, {0}, 0},{'\0', 0, 6598, {0}, 0},{'i', 6601, 6599, {0}, 0}, + {'\0', 0, 6600, {0}, 0},{'l', 6603, 6601, {0}, 0},{'\0', 0, 6602, {0}, 0}, + {'i', 6605, 6603, {0}, 0},{'\0', 0, 6604, {0}, 0},{'b', 6607, 6605, {0}, 0}, + {'\0', 0, 6606, {0}, 0},{'r', 6609, 6607, {0}, 0},{'\0', 0, 6608, {0}, 0}, + {'i', 6611, 6609, {0}, 0},{'\0', 0, 6610, {0}, 0},{'u', 6613, 6611, {0}, 0}, + {'\0', 0, 6612, {0}, 0},{'m', 6615, 6613, {0}, 0},{'\0', 0, 6614, {0}, 0}, + {';', 0, 6615, {10606}, 1},{'\0', 0, 6616, {0}, 0},{'e', 6619, 6617, {0}, 0}, + {'\0', 0, 6618, {0}, 0},{'e', 6621, 6619, {0}, 0},{'\0', 0, 6620, {0}, 0}, + {';', 0, 6621, {8869}, 1},{'A', 6624, 6622, {0}, 0},{'\0', 0, 6623, {0}, 0}, + {'r', 6626, 6624, {0}, 0},{'\0', 0, 6625, {0}, 0},{'r', 6628, 6626, {0}, 0}, + {'\0', 0, 6627, {0}, 0},{'o', 6630, 6628, {0}, 0},{'\0', 0, 6629, {0}, 0}, + {'w', 6632, 6630, {0}, 0},{'\0', 0, 6631, {0}, 0},{';', 0, 6632, {8613}, 1}, + {'\0', 0, 6633, {0}, 0},{'r', 6636, 6634, {0}, 0},{'\0', 0, 6635, {0}, 0}, + {'r', 6638, 6636, {0}, 0},{'\0', 0, 6637, {0}, 0},{'o', 6640, 6638, {0}, 0}, + {'\0', 0, 6639, {0}, 0},{'w', 6642, 6640, {0}, 0},{'\0', 0, 6641, {0}, 0}, + {';', 0, 6642, {8657}, 1},{'\0', 0, 6643, {0}, 0},{'o', 6646, 6644, {0}, 0}, + {'\0', 0, 6645, {0}, 0},{'w', 6648, 6646, {0}, 0},{'\0', 0, 6647, {0}, 0}, + {'n', 6650, 6648, {0}, 0},{'\0', 0, 6649, {0}, 0},{'a', 6652, 6650, {0}, 0}, + {'\0', 0, 6651, {0}, 0},{'r', 6654, 6652, {0}, 0},{'\0', 0, 6653, {0}, 0}, + {'r', 6656, 6654, {0}, 0},{'\0', 0, 6655, {0}, 0},{'o', 6658, 6656, {0}, 0}, + {'\0', 0, 6657, {0}, 0},{'w', 6660, 6658, {0}, 0},{'\0', 0, 6659, {0}, 0}, + {';', 0, 6660, {8661}, 1},{'\0', 0, 6661, {0}, 0},{'e', 6664, 6662, {0}, 0}, + {'\0', 0, 6663, {0}, 0},{'r', 6666, 6664, {0}, 0},{'\0', 0, 6665, {0}, 0}, + {'L', 6669, 6666, {0}, 0},{'R', 6687, 6667, {0}, 0},{'\0', 0, 6668, {0}, 0}, + {'e', 6671, 6669, {0}, 0},{'\0', 0, 6670, {0}, 0},{'f', 6673, 6671, {0}, 0}, + {'\0', 0, 6672, {0}, 0},{'t', 6675, 6673, {0}, 0},{'\0', 0, 6674, {0}, 0}, + {'A', 6677, 6675, {0}, 0},{'\0', 0, 6676, {0}, 0},{'r', 6679, 6677, {0}, 0}, + {'\0', 0, 6678, {0}, 0},{'r', 6681, 6679, {0}, 0},{'\0', 0, 6680, {0}, 0}, + {'o', 6683, 6681, {0}, 0},{'\0', 0, 6682, {0}, 0},{'w', 6685, 6683, {0}, 0}, + {'\0', 0, 6684, {0}, 0},{';', 0, 6685, {8598}, 1},{'\0', 0, 6686, {0}, 0}, + {'i', 6689, 6687, {0}, 0},{'\0', 0, 6688, {0}, 0},{'g', 6691, 6689, {0}, 0}, + {'\0', 0, 6690, {0}, 0},{'h', 6693, 6691, {0}, 0},{'\0', 0, 6692, {0}, 0}, + {'t', 6695, 6693, {0}, 0},{'\0', 0, 6694, {0}, 0},{'A', 6697, 6695, {0}, 0}, + {'\0', 0, 6696, {0}, 0},{'r', 6699, 6697, {0}, 0},{'\0', 0, 6698, {0}, 0}, + {'r', 6701, 6699, {0}, 0},{'\0', 0, 6700, {0}, 0},{'o', 6703, 6701, {0}, 0}, + {'\0', 0, 6702, {0}, 0},{'w', 6705, 6703, {0}, 0},{'\0', 0, 6704, {0}, 0}, + {';', 0, 6705, {8599}, 1},{'\0', 0, 6706, {0}, 0},{'i', 6709, 6707, {0}, 0}, + {'\0', 0, 6708, {0}, 0},{';', 0, 6709, {978}, 1},{'l', 6712, 6710, {0}, 0}, + {'\0', 0, 6711, {0}, 0},{'o', 6714, 6712, {0}, 0},{'\0', 0, 6713, {0}, 0}, + {'n', 6716, 6714, {0}, 0},{'\0', 0, 6715, {0}, 0},{';', 0, 6716, {933}, 1}, + {'\0', 0, 6717, {0}, 0},{'i', 6720, 6718, {0}, 0},{'\0', 0, 6719, {0}, 0}, + {'n', 6722, 6720, {0}, 0},{'\0', 0, 6721, {0}, 0},{'g', 6724, 6722, {0}, 0}, + {'\0', 0, 6723, {0}, 0},{';', 0, 6724, {366}, 1},{'\0', 0, 6725, {0}, 0}, + {'c', 6728, 6726, {0}, 0},{'\0', 0, 6727, {0}, 0},{'r', 6730, 6728, {0}, 0}, + {'\0', 0, 6729, {0}, 0},{';', 0, 6730, {119984}, 1},{'\0', 0, 6731, {0}, 0}, + {'i', 6734, 6732, {0}, 0},{'\0', 0, 6733, {0}, 0},{'l', 6736, 6734, {0}, 0}, + {'\0', 0, 6735, {0}, 0},{'d', 6738, 6736, {0}, 0},{'\0', 0, 6737, {0}, 0}, + {'e', 6740, 6738, {0}, 0},{'\0', 0, 6739, {0}, 0},{';', 0, 6740, {360}, 1}, + {'\0', 0, 6741, {0}, 0},{'m', 6744, 6742, {0}, 0},{'\0', 0, 6743, {0}, 0}, + {'l', 6746, 6744, {220}, 1},{'\0', 0, 6745, {0}, 0},{';', 0, 6746, {220}, 1}, + {'\0', 0, 6747, {0}, 0},{'D', 6758, 6748, {0}, 0},{'b', 6766, 6749, {0}, 0}, + {'c', 6772, 6750, {0}, 0},{'d', 6776, 6751, {0}, 0},{'e', 6787, 6752, {0}, 0}, + {'f', 6878, 6753, {0}, 0},{'o', 6882, 6754, {0}, 0},{'s', 6888, 6755, {0}, 0}, + {'v', 6894, 6756, {0}, 0},{'\0', 0, 6757, {0}, 0},{'a', 6760, 6758, {0}, 0}, + {'\0', 0, 6759, {0}, 0},{'s', 6762, 6760, {0}, 0},{'\0', 0, 6761, {0}, 0}, + {'h', 6764, 6762, {0}, 0},{'\0', 0, 6763, {0}, 0},{';', 0, 6764, {8875}, 1}, + {'\0', 0, 6765, {0}, 0},{'a', 6768, 6766, {0}, 0},{'\0', 0, 6767, {0}, 0}, + {'r', 6770, 6768, {0}, 0},{'\0', 0, 6769, {0}, 0},{';', 0, 6770, {10987}, 1}, + {'\0', 0, 6771, {0}, 0},{'y', 6774, 6772, {0}, 0},{'\0', 0, 6773, {0}, 0}, + {';', 0, 6774, {1042}, 1},{'\0', 0, 6775, {0}, 0},{'a', 6778, 6776, {0}, 0}, + {'\0', 0, 6777, {0}, 0},{'s', 6780, 6778, {0}, 0},{'\0', 0, 6779, {0}, 0}, + {'h', 6782, 6780, {0}, 0},{'\0', 0, 6781, {0}, 0},{';', 0, 6782, {8873}, 1}, + {'l', 6785, 6783, {0}, 0},{'\0', 0, 6784, {0}, 0},{';', 0, 6785, {10982}, 1}, + {'\0', 0, 6786, {0}, 0},{'e', 6790, 6787, {0}, 0},{'r', 6792, 6788, {0}, 0}, + {'\0', 0, 6789, {0}, 0},{';', 0, 6790, {8897}, 1},{'\0', 0, 6791, {0}, 0}, + {'b', 6796, 6792, {0}, 0},{'t', 6802, 6793, {0}, 0},{'y', 6858, 6794, {0}, 0}, + {'\0', 0, 6795, {0}, 0},{'a', 6798, 6796, {0}, 0},{'\0', 0, 6797, {0}, 0}, + {'r', 6800, 6798, {0}, 0},{'\0', 0, 6799, {0}, 0},{';', 0, 6800, {8214}, 1}, + {'\0', 0, 6801, {0}, 0},{';', 0, 6802, {8214}, 1},{'i', 6805, 6803, {0}, 0}, + {'\0', 0, 6804, {0}, 0},{'c', 6807, 6805, {0}, 0},{'\0', 0, 6806, {0}, 0}, + {'a', 6809, 6807, {0}, 0},{'\0', 0, 6808, {0}, 0},{'l', 6811, 6809, {0}, 0}, + {'\0', 0, 6810, {0}, 0},{'B', 6816, 6811, {0}, 0},{'L', 6822, 6812, {0}, 0}, + {'S', 6830, 6813, {0}, 0},{'T', 6848, 6814, {0}, 0},{'\0', 0, 6815, {0}, 0}, + {'a', 6818, 6816, {0}, 0},{'\0', 0, 6817, {0}, 0},{'r', 6820, 6818, {0}, 0}, + {'\0', 0, 6819, {0}, 0},{';', 0, 6820, {8739}, 1},{'\0', 0, 6821, {0}, 0}, + {'i', 6824, 6822, {0}, 0},{'\0', 0, 6823, {0}, 0},{'n', 6826, 6824, {0}, 0}, + {'\0', 0, 6825, {0}, 0},{'e', 6828, 6826, {0}, 0},{'\0', 0, 6827, {0}, 0}, + {';', 0, 6828, {124}, 1},{'\0', 0, 6829, {0}, 0},{'e', 6832, 6830, {0}, 0}, + {'\0', 0, 6831, {0}, 0},{'p', 6834, 6832, {0}, 0},{'\0', 0, 6833, {0}, 0}, + {'a', 6836, 6834, {0}, 0},{'\0', 0, 6835, {0}, 0},{'r', 6838, 6836, {0}, 0}, + {'\0', 0, 6837, {0}, 0},{'a', 6840, 6838, {0}, 0},{'\0', 0, 6839, {0}, 0}, + {'t', 6842, 6840, {0}, 0},{'\0', 0, 6841, {0}, 0},{'o', 6844, 6842, {0}, 0}, + {'\0', 0, 6843, {0}, 0},{'r', 6846, 6844, {0}, 0},{'\0', 0, 6845, {0}, 0}, + {';', 0, 6846, {10072}, 1},{'\0', 0, 6847, {0}, 0},{'i', 6850, 6848, {0}, 0}, + {'\0', 0, 6849, {0}, 0},{'l', 6852, 6850, {0}, 0},{'\0', 0, 6851, {0}, 0}, + {'d', 6854, 6852, {0}, 0},{'\0', 0, 6853, {0}, 0},{'e', 6856, 6854, {0}, 0}, + {'\0', 0, 6855, {0}, 0},{';', 0, 6856, {8768}, 1},{'\0', 0, 6857, {0}, 0}, + {'T', 6860, 6858, {0}, 0},{'\0', 0, 6859, {0}, 0},{'h', 6862, 6860, {0}, 0}, + {'\0', 0, 6861, {0}, 0},{'i', 6864, 6862, {0}, 0},{'\0', 0, 6863, {0}, 0}, + {'n', 6866, 6864, {0}, 0},{'\0', 0, 6865, {0}, 0},{'S', 6868, 6866, {0}, 0}, + {'\0', 0, 6867, {0}, 0},{'p', 6870, 6868, {0}, 0},{'\0', 0, 6869, {0}, 0}, + {'a', 6872, 6870, {0}, 0},{'\0', 0, 6871, {0}, 0},{'c', 6874, 6872, {0}, 0}, + {'\0', 0, 6873, {0}, 0},{'e', 6876, 6874, {0}, 0},{'\0', 0, 6875, {0}, 0}, + {';', 0, 6876, {8202}, 1},{'\0', 0, 6877, {0}, 0},{'r', 6880, 6878, {0}, 0}, + {'\0', 0, 6879, {0}, 0},{';', 0, 6880, {120089}, 1},{'\0', 0, 6881, {0}, 0}, + {'p', 6884, 6882, {0}, 0},{'\0', 0, 6883, {0}, 0},{'f', 6886, 6884, {0}, 0}, + {'\0', 0, 6885, {0}, 0},{';', 0, 6886, {120141}, 1},{'\0', 0, 6887, {0}, 0}, + {'c', 6890, 6888, {0}, 0},{'\0', 0, 6889, {0}, 0},{'r', 6892, 6890, {0}, 0}, + {'\0', 0, 6891, {0}, 0},{';', 0, 6892, {119985}, 1},{'\0', 0, 6893, {0}, 0}, + {'d', 6896, 6894, {0}, 0},{'\0', 0, 6895, {0}, 0},{'a', 6898, 6896, {0}, 0}, + {'\0', 0, 6897, {0}, 0},{'s', 6900, 6898, {0}, 0},{'\0', 0, 6899, {0}, 0}, + {'h', 6902, 6900, {0}, 0},{'\0', 0, 6901, {0}, 0},{';', 0, 6902, {8874}, 1}, + {'\0', 0, 6903, {0}, 0},{'c', 6910, 6904, {0}, 0},{'e', 6918, 6905, {0}, 0}, + {'f', 6926, 6906, {0}, 0},{'o', 6930, 6907, {0}, 0},{'s', 6936, 6908, {0}, 0}, + {'\0', 0, 6909, {0}, 0},{'i', 6912, 6910, {0}, 0},{'\0', 0, 6911, {0}, 0}, + {'r', 6914, 6912, {0}, 0},{'\0', 0, 6913, {0}, 0},{'c', 6916, 6914, {0}, 0}, + {'\0', 0, 6915, {0}, 0},{';', 0, 6916, {372}, 1},{'\0', 0, 6917, {0}, 0}, + {'d', 6920, 6918, {0}, 0},{'\0', 0, 6919, {0}, 0},{'g', 6922, 6920, {0}, 0}, + {'\0', 0, 6921, {0}, 0},{'e', 6924, 6922, {0}, 0},{'\0', 0, 6923, {0}, 0}, + {';', 0, 6924, {8896}, 1},{'\0', 0, 6925, {0}, 0},{'r', 6928, 6926, {0}, 0}, + {'\0', 0, 6927, {0}, 0},{';', 0, 6928, {120090}, 1},{'\0', 0, 6929, {0}, 0}, + {'p', 6932, 6930, {0}, 0},{'\0', 0, 6931, {0}, 0},{'f', 6934, 6932, {0}, 0}, + {'\0', 0, 6933, {0}, 0},{';', 0, 6934, {120142}, 1},{'\0', 0, 6935, {0}, 0}, + {'c', 6938, 6936, {0}, 0},{'\0', 0, 6937, {0}, 0},{'r', 6940, 6938, {0}, 0}, + {'\0', 0, 6939, {0}, 0},{';', 0, 6940, {119986}, 1},{'\0', 0, 6941, {0}, 0}, + {'f', 6947, 6942, {0}, 0},{'i', 6951, 6943, {0}, 0},{'o', 6953, 6944, {0}, 0}, + {'s', 6959, 6945, {0}, 0},{'\0', 0, 6946, {0}, 0},{'r', 6949, 6947, {0}, 0}, + {'\0', 0, 6948, {0}, 0},{';', 0, 6949, {120091}, 1},{'\0', 0, 6950, {0}, 0}, + {';', 0, 6951, {926}, 1},{'\0', 0, 6952, {0}, 0},{'p', 6955, 6953, {0}, 0}, + {'\0', 0, 6954, {0}, 0},{'f', 6957, 6955, {0}, 0},{'\0', 0, 6956, {0}, 0}, + {';', 0, 6957, {120143}, 1},{'\0', 0, 6958, {0}, 0},{'c', 6961, 6959, {0}, 0}, + {'\0', 0, 6960, {0}, 0},{'r', 6963, 6961, {0}, 0},{'\0', 0, 6962, {0}, 0}, + {';', 0, 6963, {119987}, 1},{'\0', 0, 6964, {0}, 0},{'A', 6975, 6965, {0}, 0}, + {'I', 6981, 6966, {0}, 0},{'U', 6987, 6967, {0}, 0},{'a', 6993, 6968, {0}, 0}, + {'c', 7003, 6969, {0}, 0},{'f', 7014, 6970, {0}, 0},{'o', 7018, 6971, {0}, 0}, + {'s', 7024, 6972, {0}, 0},{'u', 7030, 6973, {0}, 0},{'\0', 0, 6974, {0}, 0}, + {'c', 6977, 6975, {0}, 0},{'\0', 0, 6976, {0}, 0},{'y', 6979, 6977, {0}, 0}, + {'\0', 0, 6978, {0}, 0},{';', 0, 6979, {1071}, 1},{'\0', 0, 6980, {0}, 0}, + {'c', 6983, 6981, {0}, 0},{'\0', 0, 6982, {0}, 0},{'y', 6985, 6983, {0}, 0}, + {'\0', 0, 6984, {0}, 0},{';', 0, 6985, {1031}, 1},{'\0', 0, 6986, {0}, 0}, + {'c', 6989, 6987, {0}, 0},{'\0', 0, 6988, {0}, 0},{'y', 6991, 6989, {0}, 0}, + {'\0', 0, 6990, {0}, 0},{';', 0, 6991, {1070}, 1},{'\0', 0, 6992, {0}, 0}, + {'c', 6995, 6993, {0}, 0},{'\0', 0, 6994, {0}, 0},{'u', 6997, 6995, {0}, 0}, + {'\0', 0, 6996, {0}, 0},{'t', 6999, 6997, {0}, 0},{'\0', 0, 6998, {0}, 0}, + {'e', 7001, 6999, {221}, 1},{'\0', 0, 7000, {0}, 0},{';', 0, 7001, {221}, 1}, + {'\0', 0, 7002, {0}, 0},{'i', 7006, 7003, {0}, 0},{'y', 7012, 7004, {0}, 0}, + {'\0', 0, 7005, {0}, 0},{'r', 7008, 7006, {0}, 0},{'\0', 0, 7007, {0}, 0}, + {'c', 7010, 7008, {0}, 0},{'\0', 0, 7009, {0}, 0},{';', 0, 7010, {374}, 1}, + {'\0', 0, 7011, {0}, 0},{';', 0, 7012, {1067}, 1},{'\0', 0, 7013, {0}, 0}, + {'r', 7016, 7014, {0}, 0},{'\0', 0, 7015, {0}, 0},{';', 0, 7016, {120092}, 1}, + {'\0', 0, 7017, {0}, 0},{'p', 7020, 7018, {0}, 0},{'\0', 0, 7019, {0}, 0}, + {'f', 7022, 7020, {0}, 0},{'\0', 0, 7021, {0}, 0},{';', 0, 7022, {120144}, 1}, + {'\0', 0, 7023, {0}, 0},{'c', 7026, 7024, {0}, 0},{'\0', 0, 7025, {0}, 0}, + {'r', 7028, 7026, {0}, 0},{'\0', 0, 7027, {0}, 0},{';', 0, 7028, {119988}, 1}, + {'\0', 0, 7029, {0}, 0},{'m', 7032, 7030, {0}, 0},{'\0', 0, 7031, {0}, 0}, + {'l', 7034, 7032, {0}, 0},{'\0', 0, 7033, {0}, 0},{';', 0, 7034, {376}, 1}, + {'\0', 0, 7035, {0}, 0},{'H', 7045, 7036, {0}, 0},{'a', 7051, 7037, {0}, 0}, + {'c', 7061, 7038, {0}, 0},{'d', 7074, 7039, {0}, 0},{'e', 7080, 7040, {0}, 0}, + {'f', 7111, 7041, {0}, 0},{'o', 7115, 7042, {0}, 0},{'s', 7121, 7043, {0}, 0}, + {'\0', 0, 7044, {0}, 0},{'c', 7047, 7045, {0}, 0},{'\0', 0, 7046, {0}, 0}, + {'y', 7049, 7047, {0}, 0},{'\0', 0, 7048, {0}, 0},{';', 0, 7049, {1046}, 1}, + {'\0', 0, 7050, {0}, 0},{'c', 7053, 7051, {0}, 0},{'\0', 0, 7052, {0}, 0}, + {'u', 7055, 7053, {0}, 0},{'\0', 0, 7054, {0}, 0},{'t', 7057, 7055, {0}, 0}, + {'\0', 0, 7056, {0}, 0},{'e', 7059, 7057, {0}, 0},{'\0', 0, 7058, {0}, 0}, + {';', 0, 7059, {377}, 1},{'\0', 0, 7060, {0}, 0},{'a', 7064, 7061, {0}, 0}, + {'y', 7072, 7062, {0}, 0},{'\0', 0, 7063, {0}, 0},{'r', 7066, 7064, {0}, 0}, + {'\0', 0, 7065, {0}, 0},{'o', 7068, 7066, {0}, 0},{'\0', 0, 7067, {0}, 0}, + {'n', 7070, 7068, {0}, 0},{'\0', 0, 7069, {0}, 0},{';', 0, 7070, {381}, 1}, + {'\0', 0, 7071, {0}, 0},{';', 0, 7072, {1047}, 1},{'\0', 0, 7073, {0}, 0}, + {'o', 7076, 7074, {0}, 0},{'\0', 0, 7075, {0}, 0},{'t', 7078, 7076, {0}, 0}, + {'\0', 0, 7077, {0}, 0},{';', 0, 7078, {379}, 1},{'\0', 0, 7079, {0}, 0}, + {'r', 7083, 7080, {0}, 0},{'t', 7107, 7081, {0}, 0},{'\0', 0, 7082, {0}, 0}, + {'o', 7085, 7083, {0}, 0},{'\0', 0, 7084, {0}, 0},{'W', 7087, 7085, {0}, 0}, + {'\0', 0, 7086, {0}, 0},{'i', 7089, 7087, {0}, 0},{'\0', 0, 7088, {0}, 0}, + {'d', 7091, 7089, {0}, 0},{'\0', 0, 7090, {0}, 0},{'t', 7093, 7091, {0}, 0}, + {'\0', 0, 7092, {0}, 0},{'h', 7095, 7093, {0}, 0},{'\0', 0, 7094, {0}, 0}, + {'S', 7097, 7095, {0}, 0},{'\0', 0, 7096, {0}, 0},{'p', 7099, 7097, {0}, 0}, + {'\0', 0, 7098, {0}, 0},{'a', 7101, 7099, {0}, 0},{'\0', 0, 7100, {0}, 0}, + {'c', 7103, 7101, {0}, 0},{'\0', 0, 7102, {0}, 0},{'e', 7105, 7103, {0}, 0}, + {'\0', 0, 7104, {0}, 0},{';', 0, 7105, {8203}, 1},{'\0', 0, 7106, {0}, 0}, + {'a', 7109, 7107, {0}, 0},{'\0', 0, 7108, {0}, 0},{';', 0, 7109, {918}, 1}, + {'\0', 0, 7110, {0}, 0},{'r', 7113, 7111, {0}, 0},{'\0', 0, 7112, {0}, 0}, + {';', 0, 7113, {8488}, 1},{'\0', 0, 7114, {0}, 0},{'p', 7117, 7115, {0}, 0}, + {'\0', 0, 7116, {0}, 0},{'f', 7119, 7117, {0}, 0},{'\0', 0, 7118, {0}, 0}, + {';', 0, 7119, {8484}, 1},{'\0', 0, 7120, {0}, 0},{'c', 7123, 7121, {0}, 0}, + {'\0', 0, 7122, {0}, 0},{'r', 7125, 7123, {0}, 0},{'\0', 0, 7124, {0}, 0}, + {';', 0, 7125, {119989}, 1},{'\0', 0, 7126, {0}, 0},{'a', 7144, 7127, {0}, 0}, + {'b', 7154, 7128, {0}, 0},{'c', 7164, 7129, {0}, 0},{'e', 7189, 7130, {0}, 0}, + {'f', 7197, 7131, {0}, 0},{'g', 7202, 7132, {0}, 0},{'l', 7212, 7133, {0}, 0}, + {'m', 7236, 7134, {0}, 0},{'n', 7252, 7135, {0}, 0},{'o', 7356, 7136, {0}, 0}, + {'p', 7369, 7137, {0}, 0},{'r', 7410, 7138, {0}, 0},{'s', 7418, 7139, {0}, 0}, + {'t', 7439, 7140, {0}, 0},{'u', 7449, 7141, {0}, 0},{'w', 7455, 7142, {0}, 0}, + {'\0', 0, 7143, {0}, 0},{'c', 7146, 7144, {0}, 0},{'\0', 0, 7145, {0}, 0}, + {'u', 7148, 7146, {0}, 0},{'\0', 0, 7147, {0}, 0},{'t', 7150, 7148, {0}, 0}, + {'\0', 0, 7149, {0}, 0},{'e', 7152, 7150, {225}, 1},{'\0', 0, 7151, {0}, 0}, + {';', 0, 7152, {225}, 1},{'\0', 0, 7153, {0}, 0},{'r', 7156, 7154, {0}, 0}, + {'\0', 0, 7155, {0}, 0},{'e', 7158, 7156, {0}, 0},{'\0', 0, 7157, {0}, 0}, + {'v', 7160, 7158, {0}, 0},{'\0', 0, 7159, {0}, 0},{'e', 7162, 7160, {0}, 0}, + {'\0', 0, 7161, {0}, 0},{';', 0, 7162, {259}, 1},{'\0', 0, 7163, {0}, 0}, + {';', 0, 7164, {8766}, 1},{'E', 7171, 7165, {0}, 0},{'d', 7173, 7166, {0}, 0}, + {'i', 7175, 7167, {0}, 0},{'u', 7181, 7168, {0}, 0},{'y', 7187, 7169, {0}, 0}, + {'\0', 0, 7170, {0}, 0},{';', 0, 7171, {8766,819}, 2},{'\0', 0, 7172, {0}, 0}, + {';', 0, 7173, {8767}, 1},{'\0', 0, 7174, {0}, 0},{'r', 7177, 7175, {0}, 0}, + {'\0', 0, 7176, {0}, 0},{'c', 7179, 7177, {226}, 1},{'\0', 0, 7178, {0}, 0}, + {';', 0, 7179, {226}, 1},{'\0', 0, 7180, {0}, 0},{'t', 7183, 7181, {0}, 0}, + {'\0', 0, 7182, {0}, 0},{'e', 7185, 7183, {180}, 1},{'\0', 0, 7184, {0}, 0}, + {';', 0, 7185, {180}, 1},{'\0', 0, 7186, {0}, 0},{';', 0, 7187, {1072}, 1}, + {'\0', 0, 7188, {0}, 0},{'l', 7191, 7189, {0}, 0},{'\0', 0, 7190, {0}, 0}, + {'i', 7193, 7191, {0}, 0},{'\0', 0, 7192, {0}, 0},{'g', 7195, 7193, {230}, 1}, + {'\0', 0, 7194, {0}, 0},{';', 0, 7195, {230}, 1},{'\0', 0, 7196, {0}, 0}, + {';', 0, 7197, {8289}, 1},{'r', 7200, 7198, {0}, 0},{'\0', 0, 7199, {0}, 0}, + {';', 0, 7200, {120094}, 1},{'\0', 0, 7201, {0}, 0},{'r', 7204, 7202, {0}, 0}, + {'\0', 0, 7203, {0}, 0},{'a', 7206, 7204, {0}, 0},{'\0', 0, 7205, {0}, 0}, + {'v', 7208, 7206, {0}, 0},{'\0', 0, 7207, {0}, 0},{'e', 7210, 7208, {224}, 1}, + {'\0', 0, 7209, {0}, 0},{';', 0, 7210, {224}, 1},{'\0', 0, 7211, {0}, 0}, + {'e', 7215, 7212, {0}, 0},{'p', 7230, 7213, {0}, 0},{'\0', 0, 7214, {0}, 0}, + {'f', 7218, 7215, {0}, 0},{'p', 7226, 7216, {0}, 0},{'\0', 0, 7217, {0}, 0}, + {'s', 7220, 7218, {0}, 0},{'\0', 0, 7219, {0}, 0},{'y', 7222, 7220, {0}, 0}, + {'\0', 0, 7221, {0}, 0},{'m', 7224, 7222, {0}, 0},{'\0', 0, 7223, {0}, 0}, + {';', 0, 7224, {8501}, 1},{'\0', 0, 7225, {0}, 0},{'h', 7228, 7226, {0}, 0}, + {'\0', 0, 7227, {0}, 0},{';', 0, 7228, {8501}, 1},{'\0', 0, 7229, {0}, 0}, + {'h', 7232, 7230, {0}, 0},{'\0', 0, 7231, {0}, 0},{'a', 7234, 7232, {0}, 0}, + {'\0', 0, 7233, {0}, 0},{';', 0, 7234, {945}, 1},{'\0', 0, 7235, {0}, 0}, + {'a', 7239, 7236, {0}, 0},{'p', 7250, 7237, {38}, 1},{'\0', 0, 7238, {0}, 0}, + {'c', 7242, 7239, {0}, 0},{'l', 7246, 7240, {0}, 0},{'\0', 0, 7241, {0}, 0}, + {'r', 7244, 7242, {0}, 0},{'\0', 0, 7243, {0}, 0},{';', 0, 7244, {257}, 1}, + {'\0', 0, 7245, {0}, 0},{'g', 7248, 7246, {0}, 0},{'\0', 0, 7247, {0}, 0}, + {';', 0, 7248, {10815}, 1},{'\0', 0, 7249, {0}, 0},{';', 0, 7250, {38}, 1}, + {'\0', 0, 7251, {0}, 0},{'d', 7255, 7252, {0}, 0},{'g', 7281, 7253, {0}, 0}, + {'\0', 0, 7254, {0}, 0},{';', 0, 7255, {8743}, 1},{'a', 7261, 7256, {0}, 0}, + {'d', 7267, 7257, {0}, 0},{'s', 7269, 7258, {0}, 0},{'v', 7279, 7259, {0}, 0}, + {'\0', 0, 7260, {0}, 0},{'n', 7263, 7261, {0}, 0},{'\0', 0, 7262, {0}, 0}, + {'d', 7265, 7263, {0}, 0},{'\0', 0, 7264, {0}, 0},{';', 0, 7265, {10837}, 1}, + {'\0', 0, 7266, {0}, 0},{';', 0, 7267, {10844}, 1},{'\0', 0, 7268, {0}, 0}, + {'l', 7271, 7269, {0}, 0},{'\0', 0, 7270, {0}, 0},{'o', 7273, 7271, {0}, 0}, + {'\0', 0, 7272, {0}, 0},{'p', 7275, 7273, {0}, 0},{'\0', 0, 7274, {0}, 0}, + {'e', 7277, 7275, {0}, 0},{'\0', 0, 7276, {0}, 0},{';', 0, 7277, {10840}, 1}, + {'\0', 0, 7278, {0}, 0},{';', 0, 7279, {10842}, 1},{'\0', 0, 7280, {0}, 0}, + {';', 0, 7281, {8736}, 1},{'e', 7289, 7282, {0}, 0},{'l', 7291, 7283, {0}, 0}, + {'m', 7295, 7284, {0}, 0},{'r', 7327, 7285, {0}, 0},{'s', 7339, 7286, {0}, 0}, + {'z', 7348, 7287, {0}, 0},{'\0', 0, 7288, {0}, 0},{';', 0, 7289, {10660}, 1}, + {'\0', 0, 7290, {0}, 0},{'e', 7293, 7291, {0}, 0},{'\0', 0, 7292, {0}, 0}, + {';', 0, 7293, {8736}, 1},{'\0', 0, 7294, {0}, 0},{'s', 7297, 7295, {0}, 0}, + {'\0', 0, 7296, {0}, 0},{'d', 7299, 7297, {0}, 0},{'\0', 0, 7298, {0}, 0}, + {';', 0, 7299, {8737}, 1},{'a', 7302, 7300, {0}, 0},{'\0', 0, 7301, {0}, 0}, + {'a', 7311, 7302, {0}, 0},{'b', 7313, 7303, {0}, 0},{'c', 7315, 7304, {0}, 0}, + {'d', 7317, 7305, {0}, 0},{'e', 7319, 7306, {0}, 0},{'f', 7321, 7307, {0}, 0}, + {'g', 7323, 7308, {0}, 0},{'h', 7325, 7309, {0}, 0},{'\0', 0, 7310, {0}, 0}, + {';', 0, 7311, {10664}, 1},{'\0', 0, 7312, {0}, 0},{';', 0, 7313, {10665}, 1}, + {'\0', 0, 7314, {0}, 0},{';', 0, 7315, {10666}, 1},{'\0', 0, 7316, {0}, 0}, + {';', 0, 7317, {10667}, 1},{'\0', 0, 7318, {0}, 0},{';', 0, 7319, {10668}, 1}, + {'\0', 0, 7320, {0}, 0},{';', 0, 7321, {10669}, 1},{'\0', 0, 7322, {0}, 0}, + {';', 0, 7323, {10670}, 1},{'\0', 0, 7324, {0}, 0},{';', 0, 7325, {10671}, 1}, + {'\0', 0, 7326, {0}, 0},{'t', 7329, 7327, {0}, 0},{'\0', 0, 7328, {0}, 0}, + {';', 0, 7329, {8735}, 1},{'v', 7332, 7330, {0}, 0},{'\0', 0, 7331, {0}, 0}, + {'b', 7334, 7332, {0}, 0},{'\0', 0, 7333, {0}, 0},{';', 0, 7334, {8894}, 1}, + {'d', 7337, 7335, {0}, 0},{'\0', 0, 7336, {0}, 0},{';', 0, 7337, {10653}, 1}, + {'\0', 0, 7338, {0}, 0},{'p', 7342, 7339, {0}, 0},{'t', 7346, 7340, {0}, 0}, + {'\0', 0, 7341, {0}, 0},{'h', 7344, 7342, {0}, 0},{'\0', 0, 7343, {0}, 0}, + {';', 0, 7344, {8738}, 1},{'\0', 0, 7345, {0}, 0},{';', 0, 7346, {197}, 1}, + {'\0', 0, 7347, {0}, 0},{'a', 7350, 7348, {0}, 0},{'\0', 0, 7349, {0}, 0}, + {'r', 7352, 7350, {0}, 0},{'\0', 0, 7351, {0}, 0},{'r', 7354, 7352, {0}, 0}, + {'\0', 0, 7353, {0}, 0},{';', 0, 7354, {9084}, 1},{'\0', 0, 7355, {0}, 0}, + {'g', 7359, 7356, {0}, 0},{'p', 7365, 7357, {0}, 0},{'\0', 0, 7358, {0}, 0}, + {'o', 7361, 7359, {0}, 0},{'\0', 0, 7360, {0}, 0},{'n', 7363, 7361, {0}, 0}, + {'\0', 0, 7362, {0}, 0},{';', 0, 7363, {261}, 1},{'\0', 0, 7364, {0}, 0}, + {'f', 7367, 7365, {0}, 0},{'\0', 0, 7366, {0}, 0},{';', 0, 7367, {120146}, 1}, + {'\0', 0, 7368, {0}, 0},{';', 0, 7369, {8776}, 1},{'E', 7377, 7370, {0}, 0}, + {'a', 7379, 7371, {0}, 0},{'e', 7387, 7372, {0}, 0},{'i', 7389, 7373, {0}, 0}, + {'o', 7393, 7374, {0}, 0},{'p', 7397, 7375, {0}, 0},{'\0', 0, 7376, {0}, 0}, + {';', 0, 7377, {10864}, 1},{'\0', 0, 7378, {0}, 0},{'c', 7381, 7379, {0}, 0}, + {'\0', 0, 7380, {0}, 0},{'i', 7383, 7381, {0}, 0},{'\0', 0, 7382, {0}, 0}, + {'r', 7385, 7383, {0}, 0},{'\0', 0, 7384, {0}, 0},{';', 0, 7385, {10863}, 1}, + {'\0', 0, 7386, {0}, 0},{';', 0, 7387, {8778}, 1},{'\0', 0, 7388, {0}, 0}, + {'d', 7391, 7389, {0}, 0},{'\0', 0, 7390, {0}, 0},{';', 0, 7391, {8779}, 1}, + {'\0', 0, 7392, {0}, 0},{'s', 7395, 7393, {0}, 0},{'\0', 0, 7394, {0}, 0}, + {';', 0, 7395, {39}, 1},{'\0', 0, 7396, {0}, 0},{'r', 7399, 7397, {0}, 0}, + {'\0', 0, 7398, {0}, 0},{'o', 7401, 7399, {0}, 0},{'\0', 0, 7400, {0}, 0}, + {'x', 7403, 7401, {0}, 0},{'\0', 0, 7402, {0}, 0},{';', 0, 7403, {8776}, 1}, + {'e', 7406, 7404, {0}, 0},{'\0', 0, 7405, {0}, 0},{'q', 7408, 7406, {0}, 0}, + {'\0', 0, 7407, {0}, 0},{';', 0, 7408, {8778}, 1},{'\0', 0, 7409, {0}, 0}, + {'i', 7412, 7410, {0}, 0},{'\0', 0, 7411, {0}, 0},{'n', 7414, 7412, {0}, 0}, + {'\0', 0, 7413, {0}, 0},{'g', 7416, 7414, {229}, 1},{'\0', 0, 7415, {0}, 0}, + {';', 0, 7416, {229}, 1},{'\0', 0, 7417, {0}, 0},{'c', 7422, 7418, {0}, 0}, + {'t', 7426, 7419, {0}, 0},{'y', 7428, 7420, {0}, 0},{'\0', 0, 7421, {0}, 0}, + {'r', 7424, 7422, {0}, 0},{'\0', 0, 7423, {0}, 0},{';', 0, 7424, {119990}, 1}, + {'\0', 0, 7425, {0}, 0},{';', 0, 7426, {42}, 1},{'\0', 0, 7427, {0}, 0}, + {'m', 7430, 7428, {0}, 0},{'\0', 0, 7429, {0}, 0},{'p', 7432, 7430, {0}, 0}, + {'\0', 0, 7431, {0}, 0},{';', 0, 7432, {8776}, 1},{'e', 7435, 7433, {0}, 0}, + {'\0', 0, 7434, {0}, 0},{'q', 7437, 7435, {0}, 0},{'\0', 0, 7436, {0}, 0}, + {';', 0, 7437, {8781}, 1},{'\0', 0, 7438, {0}, 0},{'i', 7441, 7439, {0}, 0}, + {'\0', 0, 7440, {0}, 0},{'l', 7443, 7441, {0}, 0},{'\0', 0, 7442, {0}, 0}, + {'d', 7445, 7443, {0}, 0},{'\0', 0, 7444, {0}, 0},{'e', 7447, 7445, {227}, 1}, + {'\0', 0, 7446, {0}, 0},{';', 0, 7447, {227}, 1},{'\0', 0, 7448, {0}, 0}, + {'m', 7451, 7449, {0}, 0},{'\0', 0, 7450, {0}, 0},{'l', 7453, 7451, {228}, 1}, + {'\0', 0, 7452, {0}, 0},{';', 0, 7453, {228}, 1},{'\0', 0, 7454, {0}, 0}, + {'c', 7458, 7455, {0}, 0},{'i', 7470, 7456, {0}, 0},{'\0', 0, 7457, {0}, 0}, + {'o', 7460, 7458, {0}, 0},{'\0', 0, 7459, {0}, 0},{'n', 7462, 7460, {0}, 0}, + {'\0', 0, 7461, {0}, 0},{'i', 7464, 7462, {0}, 0},{'\0', 0, 7463, {0}, 0}, + {'n', 7466, 7464, {0}, 0},{'\0', 0, 7465, {0}, 0},{'t', 7468, 7466, {0}, 0}, + {'\0', 0, 7467, {0}, 0},{';', 0, 7468, {8755}, 1},{'\0', 0, 7469, {0}, 0}, + {'n', 7472, 7470, {0}, 0},{'\0', 0, 7471, {0}, 0},{'t', 7474, 7472, {0}, 0}, + {'\0', 0, 7473, {0}, 0},{';', 0, 7474, {10769}, 1},{'\0', 0, 7475, {0}, 0}, + {'N', 7493, 7476, {0}, 0},{'a', 7499, 7477, {0}, 0},{'b', 7572, 7478, {0}, 0}, + {'c', 7587, 7479, {0}, 0},{'d', 7598, 7480, {0}, 0},{'e', 7606, 7481, {0}, 0}, + {'f', 7663, 7482, {0}, 0},{'i', 7667, 7483, {0}, 0},{'k', 7795, 7484, {0}, 0}, + {'l', 7805, 7485, {0}, 0},{'n', 7913, 7486, {0}, 0},{'o', 7931, 7487, {0}, 0}, + {'p', 8124, 7488, {0}, 0},{'r', 8134, 7489, {0}, 0},{'s', 8151, 7490, {0}, 0}, + {'u', 8189, 7491, {0}, 0},{'\0', 0, 7492, {0}, 0},{'o', 7495, 7493, {0}, 0}, + {'\0', 0, 7494, {0}, 0},{'t', 7497, 7495, {0}, 0},{'\0', 0, 7496, {0}, 0}, + {';', 0, 7497, {10989}, 1},{'\0', 0, 7498, {0}, 0},{'c', 7502, 7499, {0}, 0}, + {'r', 7552, 7500, {0}, 0},{'\0', 0, 7501, {0}, 0},{'k', 7504, 7502, {0}, 0}, + {'\0', 0, 7503, {0}, 0},{'c', 7509, 7504, {0}, 0},{'e', 7517, 7505, {0}, 0}, + {'p', 7531, 7506, {0}, 0},{'s', 7541, 7507, {0}, 0},{'\0', 0, 7508, {0}, 0}, + {'o', 7511, 7509, {0}, 0},{'\0', 0, 7510, {0}, 0},{'n', 7513, 7511, {0}, 0}, + {'\0', 0, 7512, {0}, 0},{'g', 7515, 7513, {0}, 0},{'\0', 0, 7514, {0}, 0}, + {';', 0, 7515, {8780}, 1},{'\0', 0, 7516, {0}, 0},{'p', 7519, 7517, {0}, 0}, + {'\0', 0, 7518, {0}, 0},{'s', 7521, 7519, {0}, 0},{'\0', 0, 7520, {0}, 0}, + {'i', 7523, 7521, {0}, 0},{'\0', 0, 7522, {0}, 0},{'l', 7525, 7523, {0}, 0}, + {'\0', 0, 7524, {0}, 0},{'o', 7527, 7525, {0}, 0},{'\0', 0, 7526, {0}, 0}, + {'n', 7529, 7527, {0}, 0},{'\0', 0, 7528, {0}, 0},{';', 0, 7529, {1014}, 1}, + {'\0', 0, 7530, {0}, 0},{'r', 7533, 7531, {0}, 0},{'\0', 0, 7532, {0}, 0}, + {'i', 7535, 7533, {0}, 0},{'\0', 0, 7534, {0}, 0},{'m', 7537, 7535, {0}, 0}, + {'\0', 0, 7536, {0}, 0},{'e', 7539, 7537, {0}, 0},{'\0', 0, 7538, {0}, 0}, + {';', 0, 7539, {8245}, 1},{'\0', 0, 7540, {0}, 0},{'i', 7543, 7541, {0}, 0}, + {'\0', 0, 7542, {0}, 0},{'m', 7545, 7543, {0}, 0},{'\0', 0, 7544, {0}, 0}, + {';', 0, 7545, {8765}, 1},{'e', 7548, 7546, {0}, 0},{'\0', 0, 7547, {0}, 0}, + {'q', 7550, 7548, {0}, 0},{'\0', 0, 7549, {0}, 0},{';', 0, 7550, {8909}, 1}, + {'\0', 0, 7551, {0}, 0},{'v', 7555, 7552, {0}, 0},{'w', 7561, 7553, {0}, 0}, + {'\0', 0, 7554, {0}, 0},{'e', 7557, 7555, {0}, 0},{'\0', 0, 7556, {0}, 0}, + {'e', 7559, 7557, {0}, 0},{'\0', 0, 7558, {0}, 0},{';', 0, 7559, {8893}, 1}, + {'\0', 0, 7560, {0}, 0},{'e', 7563, 7561, {0}, 0},{'\0', 0, 7562, {0}, 0}, + {'d', 7565, 7563, {0}, 0},{'\0', 0, 7564, {0}, 0},{';', 0, 7565, {8965}, 1}, + {'g', 7568, 7566, {0}, 0},{'\0', 0, 7567, {0}, 0},{'e', 7570, 7568, {0}, 0}, + {'\0', 0, 7569, {0}, 0},{';', 0, 7570, {8965}, 1},{'\0', 0, 7571, {0}, 0}, + {'r', 7574, 7572, {0}, 0},{'\0', 0, 7573, {0}, 0},{'k', 7576, 7574, {0}, 0}, + {'\0', 0, 7575, {0}, 0},{';', 0, 7576, {9141}, 1},{'t', 7579, 7577, {0}, 0}, + {'\0', 0, 7578, {0}, 0},{'b', 7581, 7579, {0}, 0},{'\0', 0, 7580, {0}, 0}, + {'r', 7583, 7581, {0}, 0},{'\0', 0, 7582, {0}, 0},{'k', 7585, 7583, {0}, 0}, + {'\0', 0, 7584, {0}, 0},{';', 0, 7585, {9142}, 1},{'\0', 0, 7586, {0}, 0}, + {'o', 7590, 7587, {0}, 0},{'y', 7596, 7588, {0}, 0},{'\0', 0, 7589, {0}, 0}, + {'n', 7592, 7590, {0}, 0},{'\0', 0, 7591, {0}, 0},{'g', 7594, 7592, {0}, 0}, + {'\0', 0, 7593, {0}, 0},{';', 0, 7594, {8780}, 1},{'\0', 0, 7595, {0}, 0}, + {';', 0, 7596, {1073}, 1},{'\0', 0, 7597, {0}, 0},{'q', 7600, 7598, {0}, 0}, + {'\0', 0, 7599, {0}, 0},{'u', 7602, 7600, {0}, 0},{'\0', 0, 7601, {0}, 0}, + {'o', 7604, 7602, {0}, 0},{'\0', 0, 7603, {0}, 0},{';', 0, 7604, {8222}, 1}, + {'\0', 0, 7605, {0}, 0},{'c', 7612, 7606, {0}, 0},{'m', 7623, 7607, {0}, 0}, + {'p', 7633, 7608, {0}, 0},{'r', 7639, 7609, {0}, 0},{'t', 7647, 7610, {0}, 0}, + {'\0', 0, 7611, {0}, 0},{'a', 7614, 7612, {0}, 0},{'\0', 0, 7613, {0}, 0}, + {'u', 7616, 7614, {0}, 0},{'\0', 0, 7615, {0}, 0},{'s', 7618, 7616, {0}, 0}, + {'\0', 0, 7617, {0}, 0},{';', 0, 7618, {8757}, 1},{'e', 7621, 7619, {0}, 0}, + {'\0', 0, 7620, {0}, 0},{';', 0, 7621, {8757}, 1},{'\0', 0, 7622, {0}, 0}, + {'p', 7625, 7623, {0}, 0},{'\0', 0, 7624, {0}, 0},{'t', 7627, 7625, {0}, 0}, + {'\0', 0, 7626, {0}, 0},{'y', 7629, 7627, {0}, 0},{'\0', 0, 7628, {0}, 0}, + {'v', 7631, 7629, {0}, 0},{'\0', 0, 7630, {0}, 0},{';', 0, 7631, {10672}, 1}, + {'\0', 0, 7632, {0}, 0},{'s', 7635, 7633, {0}, 0},{'\0', 0, 7634, {0}, 0}, + {'i', 7637, 7635, {0}, 0},{'\0', 0, 7636, {0}, 0},{';', 0, 7637, {1014}, 1}, + {'\0', 0, 7638, {0}, 0},{'n', 7641, 7639, {0}, 0},{'\0', 0, 7640, {0}, 0}, + {'o', 7643, 7641, {0}, 0},{'\0', 0, 7642, {0}, 0},{'u', 7645, 7643, {0}, 0}, + {'\0', 0, 7644, {0}, 0},{';', 0, 7645, {8492}, 1},{'\0', 0, 7646, {0}, 0}, + {'a', 7651, 7647, {0}, 0},{'h', 7653, 7648, {0}, 0},{'w', 7655, 7649, {0}, 0}, + {'\0', 0, 7650, {0}, 0},{';', 0, 7651, {946}, 1},{'\0', 0, 7652, {0}, 0}, + {';', 0, 7653, {8502}, 1},{'\0', 0, 7654, {0}, 0},{'e', 7657, 7655, {0}, 0}, + {'\0', 0, 7656, {0}, 0},{'e', 7659, 7657, {0}, 0},{'\0', 0, 7658, {0}, 0}, + {'n', 7661, 7659, {0}, 0},{'\0', 0, 7660, {0}, 0},{';', 0, 7661, {8812}, 1}, + {'\0', 0, 7662, {0}, 0},{'r', 7665, 7663, {0}, 0},{'\0', 0, 7664, {0}, 0}, + {';', 0, 7665, {120095}, 1},{'\0', 0, 7666, {0}, 0},{'g', 7669, 7667, {0}, 0}, + {'\0', 0, 7668, {0}, 0},{'c', 7677, 7669, {0}, 0},{'o', 7695, 7670, {0}, 0}, + {'s', 7723, 7671, {0}, 0},{'t', 7740, 7672, {0}, 0},{'u', 7769, 7673, {0}, 0}, + {'v', 7779, 7674, {0}, 0},{'w', 7785, 7675, {0}, 0},{'\0', 0, 7676, {0}, 0}, + {'a', 7681, 7677, {0}, 0},{'i', 7685, 7678, {0}, 0},{'u', 7691, 7679, {0}, 0}, + {'\0', 0, 7680, {0}, 0},{'p', 7683, 7681, {0}, 0},{'\0', 0, 7682, {0}, 0}, + {';', 0, 7683, {8898}, 1},{'\0', 0, 7684, {0}, 0},{'r', 7687, 7685, {0}, 0}, + {'\0', 0, 7686, {0}, 0},{'c', 7689, 7687, {0}, 0},{'\0', 0, 7688, {0}, 0}, + {';', 0, 7689, {9711}, 1},{'\0', 0, 7690, {0}, 0},{'p', 7693, 7691, {0}, 0}, + {'\0', 0, 7692, {0}, 0},{';', 0, 7693, {8899}, 1},{'\0', 0, 7694, {0}, 0}, + {'d', 7699, 7695, {0}, 0},{'p', 7705, 7696, {0}, 0},{'t', 7713, 7697, {0}, 0}, + {'\0', 0, 7698, {0}, 0},{'o', 7701, 7699, {0}, 0},{'\0', 0, 7700, {0}, 0}, + {'t', 7703, 7701, {0}, 0},{'\0', 0, 7702, {0}, 0},{';', 0, 7703, {10752}, 1}, + {'\0', 0, 7704, {0}, 0},{'l', 7707, 7705, {0}, 0},{'\0', 0, 7706, {0}, 0}, + {'u', 7709, 7707, {0}, 0},{'\0', 0, 7708, {0}, 0},{'s', 7711, 7709, {0}, 0}, + {'\0', 0, 7710, {0}, 0},{';', 0, 7711, {10753}, 1},{'\0', 0, 7712, {0}, 0}, + {'i', 7715, 7713, {0}, 0},{'\0', 0, 7714, {0}, 0},{'m', 7717, 7715, {0}, 0}, + {'\0', 0, 7716, {0}, 0},{'e', 7719, 7717, {0}, 0},{'\0', 0, 7718, {0}, 0}, + {'s', 7721, 7719, {0}, 0},{'\0', 0, 7720, {0}, 0},{';', 0, 7721, {10754}, 1}, + {'\0', 0, 7722, {0}, 0},{'q', 7726, 7723, {0}, 0},{'t', 7734, 7724, {0}, 0}, + {'\0', 0, 7725, {0}, 0},{'c', 7728, 7726, {0}, 0},{'\0', 0, 7727, {0}, 0}, + {'u', 7730, 7728, {0}, 0},{'\0', 0, 7729, {0}, 0},{'p', 7732, 7730, {0}, 0}, + {'\0', 0, 7731, {0}, 0},{';', 0, 7732, {10758}, 1},{'\0', 0, 7733, {0}, 0}, + {'a', 7736, 7734, {0}, 0},{'\0', 0, 7735, {0}, 0},{'r', 7738, 7736, {0}, 0}, + {'\0', 0, 7737, {0}, 0},{';', 0, 7738, {9733}, 1},{'\0', 0, 7739, {0}, 0}, + {'r', 7742, 7740, {0}, 0},{'\0', 0, 7741, {0}, 0},{'i', 7744, 7742, {0}, 0}, + {'\0', 0, 7743, {0}, 0},{'a', 7746, 7744, {0}, 0},{'\0', 0, 7745, {0}, 0}, + {'n', 7748, 7746, {0}, 0},{'\0', 0, 7747, {0}, 0},{'g', 7750, 7748, {0}, 0}, + {'\0', 0, 7749, {0}, 0},{'l', 7752, 7750, {0}, 0},{'\0', 0, 7751, {0}, 0}, + {'e', 7754, 7752, {0}, 0},{'\0', 0, 7753, {0}, 0},{'d', 7757, 7754, {0}, 0}, + {'u', 7765, 7755, {0}, 0},{'\0', 0, 7756, {0}, 0},{'o', 7759, 7757, {0}, 0}, + {'\0', 0, 7758, {0}, 0},{'w', 7761, 7759, {0}, 0},{'\0', 0, 7760, {0}, 0}, + {'n', 7763, 7761, {0}, 0},{'\0', 0, 7762, {0}, 0},{';', 0, 7763, {9661}, 1}, + {'\0', 0, 7764, {0}, 0},{'p', 7767, 7765, {0}, 0},{'\0', 0, 7766, {0}, 0}, + {';', 0, 7767, {9651}, 1},{'\0', 0, 7768, {0}, 0},{'p', 7771, 7769, {0}, 0}, + {'\0', 0, 7770, {0}, 0},{'l', 7773, 7771, {0}, 0},{'\0', 0, 7772, {0}, 0}, + {'u', 7775, 7773, {0}, 0},{'\0', 0, 7774, {0}, 0},{'s', 7777, 7775, {0}, 0}, + {'\0', 0, 7776, {0}, 0},{';', 0, 7777, {10756}, 1},{'\0', 0, 7778, {0}, 0}, + {'e', 7781, 7779, {0}, 0},{'\0', 0, 7780, {0}, 0},{'e', 7783, 7781, {0}, 0}, + {'\0', 0, 7782, {0}, 0},{';', 0, 7783, {8897}, 1},{'\0', 0, 7784, {0}, 0}, + {'e', 7787, 7785, {0}, 0},{'\0', 0, 7786, {0}, 0},{'d', 7789, 7787, {0}, 0}, + {'\0', 0, 7788, {0}, 0},{'g', 7791, 7789, {0}, 0},{'\0', 0, 7790, {0}, 0}, + {'e', 7793, 7791, {0}, 0},{'\0', 0, 7792, {0}, 0},{';', 0, 7793, {8896}, 1}, + {'\0', 0, 7794, {0}, 0},{'a', 7797, 7795, {0}, 0},{'\0', 0, 7796, {0}, 0}, + {'r', 7799, 7797, {0}, 0},{'\0', 0, 7798, {0}, 0},{'o', 7801, 7799, {0}, 0}, + {'\0', 0, 7800, {0}, 0},{'w', 7803, 7801, {0}, 0},{'\0', 0, 7802, {0}, 0}, + {';', 0, 7803, {10509}, 1},{'\0', 0, 7804, {0}, 0},{'a', 7809, 7805, {0}, 0}, + {'k', 7893, 7806, {0}, 0},{'o', 7907, 7807, {0}, 0},{'\0', 0, 7808, {0}, 0}, + {'c', 7812, 7809, {0}, 0},{'n', 7889, 7810, {0}, 0},{'\0', 0, 7811, {0}, 0}, + {'k', 7814, 7812, {0}, 0},{'\0', 0, 7813, {0}, 0},{'l', 7818, 7814, {0}, 0}, + {'s', 7832, 7815, {0}, 0},{'t', 7844, 7816, {0}, 0},{'\0', 0, 7817, {0}, 0}, + {'o', 7820, 7818, {0}, 0},{'\0', 0, 7819, {0}, 0},{'z', 7822, 7820, {0}, 0}, + {'\0', 0, 7821, {0}, 0},{'e', 7824, 7822, {0}, 0},{'\0', 0, 7823, {0}, 0}, + {'n', 7826, 7824, {0}, 0},{'\0', 0, 7825, {0}, 0},{'g', 7828, 7826, {0}, 0}, + {'\0', 0, 7827, {0}, 0},{'e', 7830, 7828, {0}, 0},{'\0', 0, 7829, {0}, 0}, + {';', 0, 7830, {10731}, 1},{'\0', 0, 7831, {0}, 0},{'q', 7834, 7832, {0}, 0}, + {'\0', 0, 7833, {0}, 0},{'u', 7836, 7834, {0}, 0},{'\0', 0, 7835, {0}, 0}, + {'a', 7838, 7836, {0}, 0},{'\0', 0, 7837, {0}, 0},{'r', 7840, 7838, {0}, 0}, + {'\0', 0, 7839, {0}, 0},{'e', 7842, 7840, {0}, 0},{'\0', 0, 7841, {0}, 0}, + {';', 0, 7842, {9642}, 1},{'\0', 0, 7843, {0}, 0},{'r', 7846, 7844, {0}, 0}, + {'\0', 0, 7845, {0}, 0},{'i', 7848, 7846, {0}, 0},{'\0', 0, 7847, {0}, 0}, + {'a', 7850, 7848, {0}, 0},{'\0', 0, 7849, {0}, 0},{'n', 7852, 7850, {0}, 0}, + {'\0', 0, 7851, {0}, 0},{'g', 7854, 7852, {0}, 0},{'\0', 0, 7853, {0}, 0}, + {'l', 7856, 7854, {0}, 0},{'\0', 0, 7855, {0}, 0},{'e', 7858, 7856, {0}, 0}, + {'\0', 0, 7857, {0}, 0},{';', 0, 7858, {9652}, 1},{'d', 7863, 7859, {0}, 0}, + {'l', 7871, 7860, {0}, 0},{'r', 7879, 7861, {0}, 0},{'\0', 0, 7862, {0}, 0}, + {'o', 7865, 7863, {0}, 0},{'\0', 0, 7864, {0}, 0},{'w', 7867, 7865, {0}, 0}, + {'\0', 0, 7866, {0}, 0},{'n', 7869, 7867, {0}, 0},{'\0', 0, 7868, {0}, 0}, + {';', 0, 7869, {9662}, 1},{'\0', 0, 7870, {0}, 0},{'e', 7873, 7871, {0}, 0}, + {'\0', 0, 7872, {0}, 0},{'f', 7875, 7873, {0}, 0},{'\0', 0, 7874, {0}, 0}, + {'t', 7877, 7875, {0}, 0},{'\0', 0, 7876, {0}, 0},{';', 0, 7877, {9666}, 1}, + {'\0', 0, 7878, {0}, 0},{'i', 7881, 7879, {0}, 0},{'\0', 0, 7880, {0}, 0}, + {'g', 7883, 7881, {0}, 0},{'\0', 0, 7882, {0}, 0},{'h', 7885, 7883, {0}, 0}, + {'\0', 0, 7884, {0}, 0},{'t', 7887, 7885, {0}, 0},{'\0', 0, 7886, {0}, 0}, + {';', 0, 7887, {9656}, 1},{'\0', 0, 7888, {0}, 0},{'k', 7891, 7889, {0}, 0}, + {'\0', 0, 7890, {0}, 0},{';', 0, 7891, {9251}, 1},{'\0', 0, 7892, {0}, 0}, + {'1', 7896, 7893, {0}, 0},{'3', 7903, 7894, {0}, 0},{'\0', 0, 7895, {0}, 0}, + {'2', 7899, 7896, {0}, 0},{'4', 7901, 7897, {0}, 0},{'\0', 0, 7898, {0}, 0}, + {';', 0, 7899, {9618}, 1},{'\0', 0, 7900, {0}, 0},{';', 0, 7901, {9617}, 1}, + {'\0', 0, 7902, {0}, 0},{'4', 7905, 7903, {0}, 0},{'\0', 0, 7904, {0}, 0}, + {';', 0, 7905, {9619}, 1},{'\0', 0, 7906, {0}, 0},{'c', 7909, 7907, {0}, 0}, + {'\0', 0, 7908, {0}, 0},{'k', 7911, 7909, {0}, 0},{'\0', 0, 7910, {0}, 0}, + {';', 0, 7911, {9608}, 1},{'\0', 0, 7912, {0}, 0},{'e', 7916, 7913, {0}, 0}, + {'o', 7927, 7914, {0}, 0},{'\0', 0, 7915, {0}, 0},{';', 0, 7916, {61,8421}, 2}, + {'q', 7919, 7917, {0}, 0},{'\0', 0, 7918, {0}, 0},{'u', 7921, 7919, {0}, 0}, + {'\0', 0, 7920, {0}, 0},{'i', 7923, 7921, {0}, 0},{'\0', 0, 7922, {0}, 0}, + {'v', 7925, 7923, {0}, 0},{'\0', 0, 7924, {0}, 0},{';', 0, 7925, {8801,8421}, 2}, + {'\0', 0, 7926, {0}, 0},{'t', 7929, 7927, {0}, 0},{'\0', 0, 7928, {0}, 0}, + {';', 0, 7929, {8976}, 1},{'\0', 0, 7930, {0}, 0},{'p', 7936, 7931, {0}, 0}, + {'t', 7940, 7932, {0}, 0},{'w', 7949, 7933, {0}, 0},{'x', 7957, 7934, {0}, 0}, + {'\0', 0, 7935, {0}, 0},{'f', 7938, 7936, {0}, 0},{'\0', 0, 7937, {0}, 0}, + {';', 0, 7938, {120147}, 1},{'\0', 0, 7939, {0}, 0},{';', 0, 7940, {8869}, 1}, + {'t', 7943, 7941, {0}, 0},{'\0', 0, 7942, {0}, 0},{'o', 7945, 7943, {0}, 0}, + {'\0', 0, 7944, {0}, 0},{'m', 7947, 7945, {0}, 0},{'\0', 0, 7946, {0}, 0}, + {';', 0, 7947, {8869}, 1},{'\0', 0, 7948, {0}, 0},{'t', 7951, 7949, {0}, 0}, + {'\0', 0, 7950, {0}, 0},{'i', 7953, 7951, {0}, 0},{'\0', 0, 7952, {0}, 0}, + {'e', 7955, 7953, {0}, 0},{'\0', 0, 7954, {0}, 0},{';', 0, 7955, {8904}, 1}, + {'\0', 0, 7956, {0}, 0},{'D', 7970, 7957, {0}, 0},{'H', 7983, 7958, {0}, 0}, + {'U', 7997, 7959, {0}, 0},{'V', 8010, 7960, {0}, 0},{'b', 8030, 7961, {0}, 0}, + {'d', 8036, 7962, {0}, 0},{'h', 8049, 7963, {0}, 0},{'m', 8063, 7964, {0}, 0}, + {'p', 8073, 7965, {0}, 0},{'t', 8081, 7966, {0}, 0},{'u', 8091, 7967, {0}, 0}, + {'v', 8104, 7968, {0}, 0},{'\0', 0, 7969, {0}, 0},{'L', 7975, 7970, {0}, 0}, + {'R', 7977, 7971, {0}, 0},{'l', 7979, 7972, {0}, 0},{'r', 7981, 7973, {0}, 0}, + {'\0', 0, 7974, {0}, 0},{';', 0, 7975, {9559}, 1},{'\0', 0, 7976, {0}, 0}, + {';', 0, 7977, {9556}, 1},{'\0', 0, 7978, {0}, 0},{';', 0, 7979, {9558}, 1}, + {'\0', 0, 7980, {0}, 0},{';', 0, 7981, {9555}, 1},{'\0', 0, 7982, {0}, 0}, + {';', 0, 7983, {9552}, 1},{'D', 7989, 7984, {0}, 0},{'U', 7991, 7985, {0}, 0}, + {'d', 7993, 7986, {0}, 0},{'u', 7995, 7987, {0}, 0},{'\0', 0, 7988, {0}, 0}, + {';', 0, 7989, {9574}, 1},{'\0', 0, 7990, {0}, 0},{';', 0, 7991, {9577}, 1}, + {'\0', 0, 7992, {0}, 0},{';', 0, 7993, {9572}, 1},{'\0', 0, 7994, {0}, 0}, + {';', 0, 7995, {9575}, 1},{'\0', 0, 7996, {0}, 0},{'L', 8002, 7997, {0}, 0}, + {'R', 8004, 7998, {0}, 0},{'l', 8006, 7999, {0}, 0},{'r', 8008, 8000, {0}, 0}, + {'\0', 0, 8001, {0}, 0},{';', 0, 8002, {9565}, 1},{'\0', 0, 8003, {0}, 0}, + {';', 0, 8004, {9562}, 1},{'\0', 0, 8005, {0}, 0},{';', 0, 8006, {9564}, 1}, + {'\0', 0, 8007, {0}, 0},{';', 0, 8008, {9561}, 1},{'\0', 0, 8009, {0}, 0}, + {';', 0, 8010, {9553}, 1},{'H', 8018, 8011, {0}, 0},{'L', 8020, 8012, {0}, 0}, + {'R', 8022, 8013, {0}, 0},{'h', 8024, 8014, {0}, 0},{'l', 8026, 8015, {0}, 0}, + {'r', 8028, 8016, {0}, 0},{'\0', 0, 8017, {0}, 0},{';', 0, 8018, {9580}, 1}, + {'\0', 0, 8019, {0}, 0},{';', 0, 8020, {9571}, 1},{'\0', 0, 8021, {0}, 0}, + {';', 0, 8022, {9568}, 1},{'\0', 0, 8023, {0}, 0},{';', 0, 8024, {9579}, 1}, + {'\0', 0, 8025, {0}, 0},{';', 0, 8026, {9570}, 1},{'\0', 0, 8027, {0}, 0}, + {';', 0, 8028, {9567}, 1},{'\0', 0, 8029, {0}, 0},{'o', 8032, 8030, {0}, 0}, + {'\0', 0, 8031, {0}, 0},{'x', 8034, 8032, {0}, 0},{'\0', 0, 8033, {0}, 0}, + {';', 0, 8034, {10697}, 1},{'\0', 0, 8035, {0}, 0},{'L', 8041, 8036, {0}, 0}, + {'R', 8043, 8037, {0}, 0},{'l', 8045, 8038, {0}, 0},{'r', 8047, 8039, {0}, 0}, + {'\0', 0, 8040, {0}, 0},{';', 0, 8041, {9557}, 1},{'\0', 0, 8042, {0}, 0}, + {';', 0, 8043, {9554}, 1},{'\0', 0, 8044, {0}, 0},{';', 0, 8045, {9488}, 1}, + {'\0', 0, 8046, {0}, 0},{';', 0, 8047, {9484}, 1},{'\0', 0, 8048, {0}, 0}, + {';', 0, 8049, {9472}, 1},{'D', 8055, 8050, {0}, 0},{'U', 8057, 8051, {0}, 0}, + {'d', 8059, 8052, {0}, 0},{'u', 8061, 8053, {0}, 0},{'\0', 0, 8054, {0}, 0}, + {';', 0, 8055, {9573}, 1},{'\0', 0, 8056, {0}, 0},{';', 0, 8057, {9576}, 1}, + {'\0', 0, 8058, {0}, 0},{';', 0, 8059, {9516}, 1},{'\0', 0, 8060, {0}, 0}, + {';', 0, 8061, {9524}, 1},{'\0', 0, 8062, {0}, 0},{'i', 8065, 8063, {0}, 0}, + {'\0', 0, 8064, {0}, 0},{'n', 8067, 8065, {0}, 0},{'\0', 0, 8066, {0}, 0}, + {'u', 8069, 8067, {0}, 0},{'\0', 0, 8068, {0}, 0},{'s', 8071, 8069, {0}, 0}, + {'\0', 0, 8070, {0}, 0},{';', 0, 8071, {8863}, 1},{'\0', 0, 8072, {0}, 0}, + {'l', 8075, 8073, {0}, 0},{'\0', 0, 8074, {0}, 0},{'u', 8077, 8075, {0}, 0}, + {'\0', 0, 8076, {0}, 0},{'s', 8079, 8077, {0}, 0},{'\0', 0, 8078, {0}, 0}, + {';', 0, 8079, {8862}, 1},{'\0', 0, 8080, {0}, 0},{'i', 8083, 8081, {0}, 0}, + {'\0', 0, 8082, {0}, 0},{'m', 8085, 8083, {0}, 0},{'\0', 0, 8084, {0}, 0}, + {'e', 8087, 8085, {0}, 0},{'\0', 0, 8086, {0}, 0},{'s', 8089, 8087, {0}, 0}, + {'\0', 0, 8088, {0}, 0},{';', 0, 8089, {8864}, 1},{'\0', 0, 8090, {0}, 0}, + {'L', 8096, 8091, {0}, 0},{'R', 8098, 8092, {0}, 0},{'l', 8100, 8093, {0}, 0}, + {'r', 8102, 8094, {0}, 0},{'\0', 0, 8095, {0}, 0},{';', 0, 8096, {9563}, 1}, + {'\0', 0, 8097, {0}, 0},{';', 0, 8098, {9560}, 1},{'\0', 0, 8099, {0}, 0}, + {';', 0, 8100, {9496}, 1},{'\0', 0, 8101, {0}, 0},{';', 0, 8102, {9492}, 1}, + {'\0', 0, 8103, {0}, 0},{';', 0, 8104, {9474}, 1},{'H', 8112, 8105, {0}, 0}, + {'L', 8114, 8106, {0}, 0},{'R', 8116, 8107, {0}, 0},{'h', 8118, 8108, {0}, 0}, + {'l', 8120, 8109, {0}, 0},{'r', 8122, 8110, {0}, 0},{'\0', 0, 8111, {0}, 0}, + {';', 0, 8112, {9578}, 1},{'\0', 0, 8113, {0}, 0},{';', 0, 8114, {9569}, 1}, + {'\0', 0, 8115, {0}, 0},{';', 0, 8116, {9566}, 1},{'\0', 0, 8117, {0}, 0}, + {';', 0, 8118, {9532}, 1},{'\0', 0, 8119, {0}, 0},{';', 0, 8120, {9508}, 1}, + {'\0', 0, 8121, {0}, 0},{';', 0, 8122, {9500}, 1},{'\0', 0, 8123, {0}, 0}, + {'r', 8126, 8124, {0}, 0},{'\0', 0, 8125, {0}, 0},{'i', 8128, 8126, {0}, 0}, + {'\0', 0, 8127, {0}, 0},{'m', 8130, 8128, {0}, 0},{'\0', 0, 8129, {0}, 0}, + {'e', 8132, 8130, {0}, 0},{'\0', 0, 8131, {0}, 0},{';', 0, 8132, {8245}, 1}, + {'\0', 0, 8133, {0}, 0},{'e', 8137, 8134, {0}, 0},{'v', 8143, 8135, {0}, 0}, + {'\0', 0, 8136, {0}, 0},{'v', 8139, 8137, {0}, 0},{'\0', 0, 8138, {0}, 0}, + {'e', 8141, 8139, {0}, 0},{'\0', 0, 8140, {0}, 0},{';', 0, 8141, {728}, 1}, + {'\0', 0, 8142, {0}, 0},{'b', 8145, 8143, {0}, 0},{'\0', 0, 8144, {0}, 0}, + {'a', 8147, 8145, {0}, 0},{'\0', 0, 8146, {0}, 0},{'r', 8149, 8147, {166}, 1}, + {'\0', 0, 8148, {0}, 0},{';', 0, 8149, {166}, 1},{'\0', 0, 8150, {0}, 0}, + {'c', 8156, 8151, {0}, 0},{'e', 8160, 8152, {0}, 0},{'i', 8166, 8153, {0}, 0}, + {'o', 8173, 8154, {0}, 0},{'\0', 0, 8155, {0}, 0},{'r', 8158, 8156, {0}, 0}, + {'\0', 0, 8157, {0}, 0},{';', 0, 8158, {119991}, 1},{'\0', 0, 8159, {0}, 0}, + {'m', 8162, 8160, {0}, 0},{'\0', 0, 8161, {0}, 0},{'i', 8164, 8162, {0}, 0}, + {'\0', 0, 8163, {0}, 0},{';', 0, 8164, {8271}, 1},{'\0', 0, 8165, {0}, 0}, + {'m', 8168, 8166, {0}, 0},{'\0', 0, 8167, {0}, 0},{';', 0, 8168, {8765}, 1}, + {'e', 8171, 8169, {0}, 0},{'\0', 0, 8170, {0}, 0},{';', 0, 8171, {8909}, 1}, + {'\0', 0, 8172, {0}, 0},{'l', 8175, 8173, {0}, 0},{'\0', 0, 8174, {0}, 0}, + {';', 0, 8175, {92}, 1},{'b', 8179, 8176, {0}, 0},{'h', 8181, 8177, {0}, 0}, + {'\0', 0, 8178, {0}, 0},{';', 0, 8179, {10693}, 1},{'\0', 0, 8180, {0}, 0}, + {'s', 8183, 8181, {0}, 0},{'\0', 0, 8182, {0}, 0},{'u', 8185, 8183, {0}, 0}, + {'\0', 0, 8184, {0}, 0},{'b', 8187, 8185, {0}, 0},{'\0', 0, 8186, {0}, 0}, + {';', 0, 8187, {10184}, 1},{'\0', 0, 8188, {0}, 0},{'l', 8192, 8189, {0}, 0}, + {'m', 8201, 8190, {0}, 0},{'\0', 0, 8191, {0}, 0},{'l', 8194, 8192, {0}, 0}, + {'\0', 0, 8193, {0}, 0},{';', 0, 8194, {8226}, 1},{'e', 8197, 8195, {0}, 0}, + {'\0', 0, 8196, {0}, 0},{'t', 8199, 8197, {0}, 0},{'\0', 0, 8198, {0}, 0}, + {';', 0, 8199, {8226}, 1},{'\0', 0, 8200, {0}, 0},{'p', 8203, 8201, {0}, 0}, + {'\0', 0, 8202, {0}, 0},{';', 0, 8203, {8782}, 1},{'E', 8207, 8204, {0}, 0}, + {'e', 8209, 8205, {0}, 0},{'\0', 0, 8206, {0}, 0},{';', 0, 8207, {10926}, 1}, + {'\0', 0, 8208, {0}, 0},{';', 0, 8209, {8783}, 1},{'q', 8212, 8210, {0}, 0}, + {'\0', 0, 8211, {0}, 0},{';', 0, 8212, {8783}, 1},{'\0', 0, 8213, {0}, 0}, + {'a', 8230, 8214, {0}, 0},{'c', 8295, 8215, {0}, 0},{'d', 8338, 8216, {0}, 0}, + {'e', 8344, 8217, {0}, 0},{'f', 8379, 8218, {0}, 0},{'h', 8383, 8219, {0}, 0}, + {'i', 8408, 8220, {0}, 0},{'l', 8520, 8221, {0}, 0},{'o', 8535, 8222, {0}, 0}, + {'r', 8626, 8223, {0}, 0},{'s', 8641, 8224, {0}, 0},{'t', 8661, 8225, {0}, 0}, + {'u', 8669, 8226, {0}, 0},{'w', 8860, 8227, {0}, 0},{'y', 8881, 8228, {0}, 0}, + {'\0', 0, 8229, {0}, 0},{'c', 8234, 8230, {0}, 0},{'p', 8242, 8231, {0}, 0}, + {'r', 8284, 8232, {0}, 0},{'\0', 0, 8233, {0}, 0},{'u', 8236, 8234, {0}, 0}, + {'\0', 0, 8235, {0}, 0},{'t', 8238, 8236, {0}, 0},{'\0', 0, 8237, {0}, 0}, + {'e', 8240, 8238, {0}, 0},{'\0', 0, 8239, {0}, 0},{';', 0, 8240, {263}, 1}, + {'\0', 0, 8241, {0}, 0},{';', 0, 8242, {8745}, 1},{'a', 8249, 8243, {0}, 0}, + {'b', 8255, 8244, {0}, 0},{'c', 8265, 8245, {0}, 0},{'d', 8276, 8246, {0}, 0}, + {'s', 8282, 8247, {0}, 0},{'\0', 0, 8248, {0}, 0},{'n', 8251, 8249, {0}, 0}, + {'\0', 0, 8250, {0}, 0},{'d', 8253, 8251, {0}, 0},{'\0', 0, 8252, {0}, 0}, + {';', 0, 8253, {10820}, 1},{'\0', 0, 8254, {0}, 0},{'r', 8257, 8255, {0}, 0}, + {'\0', 0, 8256, {0}, 0},{'c', 8259, 8257, {0}, 0},{'\0', 0, 8258, {0}, 0}, + {'u', 8261, 8259, {0}, 0},{'\0', 0, 8260, {0}, 0},{'p', 8263, 8261, {0}, 0}, + {'\0', 0, 8262, {0}, 0},{';', 0, 8263, {10825}, 1},{'\0', 0, 8264, {0}, 0}, + {'a', 8268, 8265, {0}, 0},{'u', 8272, 8266, {0}, 0},{'\0', 0, 8267, {0}, 0}, + {'p', 8270, 8268, {0}, 0},{'\0', 0, 8269, {0}, 0},{';', 0, 8270, {10827}, 1}, + {'\0', 0, 8271, {0}, 0},{'p', 8274, 8272, {0}, 0},{'\0', 0, 8273, {0}, 0}, + {';', 0, 8274, {10823}, 1},{'\0', 0, 8275, {0}, 0},{'o', 8278, 8276, {0}, 0}, + {'\0', 0, 8277, {0}, 0},{'t', 8280, 8278, {0}, 0},{'\0', 0, 8279, {0}, 0}, + {';', 0, 8280, {10816}, 1},{'\0', 0, 8281, {0}, 0},{';', 0, 8282, {8745,65024}, 2}, + {'\0', 0, 8283, {0}, 0},{'e', 8287, 8284, {0}, 0},{'o', 8291, 8285, {0}, 0}, + {'\0', 0, 8286, {0}, 0},{'t', 8289, 8287, {0}, 0},{'\0', 0, 8288, {0}, 0}, + {';', 0, 8289, {8257}, 1},{'\0', 0, 8290, {0}, 0},{'n', 8293, 8291, {0}, 0}, + {'\0', 0, 8292, {0}, 0},{';', 0, 8293, {711}, 1},{'\0', 0, 8294, {0}, 0}, + {'a', 8300, 8295, {0}, 0},{'e', 8313, 8296, {0}, 0},{'i', 8321, 8297, {0}, 0}, + {'u', 8327, 8298, {0}, 0},{'\0', 0, 8299, {0}, 0},{'p', 8303, 8300, {0}, 0}, + {'r', 8307, 8301, {0}, 0},{'\0', 0, 8302, {0}, 0},{'s', 8305, 8303, {0}, 0}, + {'\0', 0, 8304, {0}, 0},{';', 0, 8305, {10829}, 1},{'\0', 0, 8306, {0}, 0}, + {'o', 8309, 8307, {0}, 0},{'\0', 0, 8308, {0}, 0},{'n', 8311, 8309, {0}, 0}, + {'\0', 0, 8310, {0}, 0},{';', 0, 8311, {269}, 1},{'\0', 0, 8312, {0}, 0}, + {'d', 8315, 8313, {0}, 0},{'\0', 0, 8314, {0}, 0},{'i', 8317, 8315, {0}, 0}, + {'\0', 0, 8316, {0}, 0},{'l', 8319, 8317, {231}, 1},{'\0', 0, 8318, {0}, 0}, + {';', 0, 8319, {231}, 1},{'\0', 0, 8320, {0}, 0},{'r', 8323, 8321, {0}, 0}, + {'\0', 0, 8322, {0}, 0},{'c', 8325, 8323, {0}, 0},{'\0', 0, 8324, {0}, 0}, + {';', 0, 8325, {265}, 1},{'\0', 0, 8326, {0}, 0},{'p', 8329, 8327, {0}, 0}, + {'\0', 0, 8328, {0}, 0},{'s', 8331, 8329, {0}, 0},{'\0', 0, 8330, {0}, 0}, + {';', 0, 8331, {10828}, 1},{'s', 8334, 8332, {0}, 0},{'\0', 0, 8333, {0}, 0}, + {'m', 8336, 8334, {0}, 0},{'\0', 0, 8335, {0}, 0},{';', 0, 8336, {10832}, 1}, + {'\0', 0, 8337, {0}, 0},{'o', 8340, 8338, {0}, 0},{'\0', 0, 8339, {0}, 0}, + {'t', 8342, 8340, {0}, 0},{'\0', 0, 8341, {0}, 0},{';', 0, 8342, {267}, 1}, + {'\0', 0, 8343, {0}, 0},{'d', 8348, 8344, {0}, 0},{'m', 8354, 8345, {0}, 0}, + {'n', 8364, 8346, {0}, 0},{'\0', 0, 8347, {0}, 0},{'i', 8350, 8348, {0}, 0}, + {'\0', 0, 8349, {0}, 0},{'l', 8352, 8350, {184}, 1},{'\0', 0, 8351, {0}, 0}, + {';', 0, 8352, {184}, 1},{'\0', 0, 8353, {0}, 0},{'p', 8356, 8354, {0}, 0}, + {'\0', 0, 8355, {0}, 0},{'t', 8358, 8356, {0}, 0},{'\0', 0, 8357, {0}, 0}, + {'y', 8360, 8358, {0}, 0},{'\0', 0, 8359, {0}, 0},{'v', 8362, 8360, {0}, 0}, + {'\0', 0, 8361, {0}, 0},{';', 0, 8362, {10674}, 1},{'\0', 0, 8363, {0}, 0}, + {'t', 8366, 8364, {162}, 1},{'\0', 0, 8365, {0}, 0},{';', 0, 8366, {162}, 1}, + {'e', 8369, 8367, {0}, 0},{'\0', 0, 8368, {0}, 0},{'r', 8371, 8369, {0}, 0}, + {'\0', 0, 8370, {0}, 0},{'d', 8373, 8371, {0}, 0},{'\0', 0, 8372, {0}, 0}, + {'o', 8375, 8373, {0}, 0},{'\0', 0, 8374, {0}, 0},{'t', 8377, 8375, {0}, 0}, + {'\0', 0, 8376, {0}, 0},{';', 0, 8377, {183}, 1},{'\0', 0, 8378, {0}, 0}, + {'r', 8381, 8379, {0}, 0},{'\0', 0, 8380, {0}, 0},{';', 0, 8381, {120096}, 1}, + {'\0', 0, 8382, {0}, 0},{'c', 8387, 8383, {0}, 0},{'e', 8391, 8384, {0}, 0}, + {'i', 8406, 8385, {0}, 0},{'\0', 0, 8386, {0}, 0},{'y', 8389, 8387, {0}, 0}, + {'\0', 0, 8388, {0}, 0},{';', 0, 8389, {1095}, 1},{'\0', 0, 8390, {0}, 0}, + {'c', 8393, 8391, {0}, 0},{'\0', 0, 8392, {0}, 0},{'k', 8395, 8393, {0}, 0}, + {'\0', 0, 8394, {0}, 0},{';', 0, 8395, {10003}, 1},{'m', 8398, 8396, {0}, 0}, + {'\0', 0, 8397, {0}, 0},{'a', 8400, 8398, {0}, 0},{'\0', 0, 8399, {0}, 0}, + {'r', 8402, 8400, {0}, 0},{'\0', 0, 8401, {0}, 0},{'k', 8404, 8402, {0}, 0}, + {'\0', 0, 8403, {0}, 0},{';', 0, 8404, {10003}, 1},{'\0', 0, 8405, {0}, 0}, + {';', 0, 8406, {967}, 1},{'\0', 0, 8407, {0}, 0},{'r', 8410, 8408, {0}, 0}, + {'\0', 0, 8409, {0}, 0},{';', 0, 8410, {9675}, 1},{'E', 8418, 8411, {0}, 0}, + {'c', 8420, 8412, {0}, 0},{'e', 8494, 8413, {0}, 0},{'f', 8496, 8414, {0}, 0}, + {'m', 8506, 8415, {0}, 0},{'s', 8512, 8416, {0}, 0},{'\0', 0, 8417, {0}, 0}, + {';', 0, 8418, {10691}, 1},{'\0', 0, 8419, {0}, 0},{';', 0, 8420, {710}, 1}, + {'e', 8424, 8421, {0}, 0},{'l', 8428, 8422, {0}, 0},{'\0', 0, 8423, {0}, 0}, + {'q', 8426, 8424, {0}, 0},{'\0', 0, 8425, {0}, 0},{';', 0, 8426, {8791}, 1}, + {'\0', 0, 8427, {0}, 0},{'e', 8430, 8428, {0}, 0},{'\0', 0, 8429, {0}, 0}, + {'a', 8433, 8430, {0}, 0},{'d', 8462, 8431, {0}, 0},{'\0', 0, 8432, {0}, 0}, + {'r', 8435, 8433, {0}, 0},{'\0', 0, 8434, {0}, 0},{'r', 8437, 8435, {0}, 0}, + {'\0', 0, 8436, {0}, 0},{'o', 8439, 8437, {0}, 0},{'\0', 0, 8438, {0}, 0}, + {'w', 8441, 8439, {0}, 0},{'\0', 0, 8440, {0}, 0},{'l', 8444, 8441, {0}, 0}, + {'r', 8452, 8442, {0}, 0},{'\0', 0, 8443, {0}, 0},{'e', 8446, 8444, {0}, 0}, + {'\0', 0, 8445, {0}, 0},{'f', 8448, 8446, {0}, 0},{'\0', 0, 8447, {0}, 0}, + {'t', 8450, 8448, {0}, 0},{'\0', 0, 8449, {0}, 0},{';', 0, 8450, {8634}, 1}, + {'\0', 0, 8451, {0}, 0},{'i', 8454, 8452, {0}, 0},{'\0', 0, 8453, {0}, 0}, + {'g', 8456, 8454, {0}, 0},{'\0', 0, 8455, {0}, 0},{'h', 8458, 8456, {0}, 0}, + {'\0', 0, 8457, {0}, 0},{'t', 8460, 8458, {0}, 0},{'\0', 0, 8459, {0}, 0}, + {';', 0, 8460, {8635}, 1},{'\0', 0, 8461, {0}, 0},{'R', 8468, 8462, {0}, 0}, + {'S', 8470, 8463, {0}, 0},{'a', 8472, 8464, {0}, 0},{'c', 8478, 8465, {0}, 0}, + {'d', 8486, 8466, {0}, 0},{'\0', 0, 8467, {0}, 0},{';', 0, 8468, {174}, 1}, + {'\0', 0, 8469, {0}, 0},{';', 0, 8470, {9416}, 1},{'\0', 0, 8471, {0}, 0}, + {'s', 8474, 8472, {0}, 0},{'\0', 0, 8473, {0}, 0},{'t', 8476, 8474, {0}, 0}, + {'\0', 0, 8475, {0}, 0},{';', 0, 8476, {8859}, 1},{'\0', 0, 8477, {0}, 0}, + {'i', 8480, 8478, {0}, 0},{'\0', 0, 8479, {0}, 0},{'r', 8482, 8480, {0}, 0}, + {'\0', 0, 8481, {0}, 0},{'c', 8484, 8482, {0}, 0},{'\0', 0, 8483, {0}, 0}, + {';', 0, 8484, {8858}, 1},{'\0', 0, 8485, {0}, 0},{'a', 8488, 8486, {0}, 0}, + {'\0', 0, 8487, {0}, 0},{'s', 8490, 8488, {0}, 0},{'\0', 0, 8489, {0}, 0}, + {'h', 8492, 8490, {0}, 0},{'\0', 0, 8491, {0}, 0},{';', 0, 8492, {8861}, 1}, + {'\0', 0, 8493, {0}, 0},{';', 0, 8494, {8791}, 1},{'\0', 0, 8495, {0}, 0}, + {'n', 8498, 8496, {0}, 0},{'\0', 0, 8497, {0}, 0},{'i', 8500, 8498, {0}, 0}, + {'\0', 0, 8499, {0}, 0},{'n', 8502, 8500, {0}, 0},{'\0', 0, 8501, {0}, 0}, + {'t', 8504, 8502, {0}, 0},{'\0', 0, 8503, {0}, 0},{';', 0, 8504, {10768}, 1}, + {'\0', 0, 8505, {0}, 0},{'i', 8508, 8506, {0}, 0},{'\0', 0, 8507, {0}, 0}, + {'d', 8510, 8508, {0}, 0},{'\0', 0, 8509, {0}, 0},{';', 0, 8510, {10991}, 1}, + {'\0', 0, 8511, {0}, 0},{'c', 8514, 8512, {0}, 0},{'\0', 0, 8513, {0}, 0}, + {'i', 8516, 8514, {0}, 0},{'\0', 0, 8515, {0}, 0},{'r', 8518, 8516, {0}, 0}, + {'\0', 0, 8517, {0}, 0},{';', 0, 8518, {10690}, 1},{'\0', 0, 8519, {0}, 0}, + {'u', 8522, 8520, {0}, 0},{'\0', 0, 8521, {0}, 0},{'b', 8524, 8522, {0}, 0}, + {'\0', 0, 8523, {0}, 0},{'s', 8526, 8524, {0}, 0},{'\0', 0, 8525, {0}, 0}, + {';', 0, 8526, {9827}, 1},{'u', 8529, 8527, {0}, 0},{'\0', 0, 8528, {0}, 0}, + {'i', 8531, 8529, {0}, 0},{'\0', 0, 8530, {0}, 0},{'t', 8533, 8531, {0}, 0}, + {'\0', 0, 8532, {0}, 0},{';', 0, 8533, {9827}, 1},{'\0', 0, 8534, {0}, 0}, + {'l', 8540, 8535, {0}, 0},{'m', 8552, 8536, {0}, 0},{'n', 8589, 8537, {0}, 0}, + {'p', 8607, 8538, {0}, 0},{'\0', 0, 8539, {0}, 0},{'o', 8542, 8540, {0}, 0}, + {'\0', 0, 8541, {0}, 0},{'n', 8544, 8542, {0}, 0},{'\0', 0, 8543, {0}, 0}, + {';', 0, 8544, {58}, 1},{'e', 8547, 8545, {0}, 0},{'\0', 0, 8546, {0}, 0}, + {';', 0, 8547, {8788}, 1},{'q', 8550, 8548, {0}, 0},{'\0', 0, 8549, {0}, 0}, + {';', 0, 8550, {8788}, 1},{'\0', 0, 8551, {0}, 0},{'m', 8555, 8552, {0}, 0}, + {'p', 8562, 8553, {0}, 0},{'\0', 0, 8554, {0}, 0},{'a', 8557, 8555, {0}, 0}, + {'\0', 0, 8556, {0}, 0},{';', 0, 8557, {44}, 1},{'t', 8560, 8558, {0}, 0}, + {'\0', 0, 8559, {0}, 0},{';', 0, 8560, {64}, 1},{'\0', 0, 8561, {0}, 0}, + {';', 0, 8562, {8705}, 1},{'f', 8566, 8563, {0}, 0},{'l', 8570, 8564, {0}, 0}, + {'\0', 0, 8565, {0}, 0},{'n', 8568, 8566, {0}, 0},{'\0', 0, 8567, {0}, 0}, + {';', 0, 8568, {8728}, 1},{'\0', 0, 8569, {0}, 0},{'e', 8572, 8570, {0}, 0}, + {'\0', 0, 8571, {0}, 0},{'m', 8575, 8572, {0}, 0},{'x', 8583, 8573, {0}, 0}, + {'\0', 0, 8574, {0}, 0},{'e', 8577, 8575, {0}, 0},{'\0', 0, 8576, {0}, 0}, + {'n', 8579, 8577, {0}, 0},{'\0', 0, 8578, {0}, 0},{'t', 8581, 8579, {0}, 0}, + {'\0', 0, 8580, {0}, 0},{';', 0, 8581, {8705}, 1},{'\0', 0, 8582, {0}, 0}, + {'e', 8585, 8583, {0}, 0},{'\0', 0, 8584, {0}, 0},{'s', 8587, 8585, {0}, 0}, + {'\0', 0, 8586, {0}, 0},{';', 0, 8587, {8450}, 1},{'\0', 0, 8588, {0}, 0}, + {'g', 8592, 8589, {0}, 0},{'i', 8601, 8590, {0}, 0},{'\0', 0, 8591, {0}, 0}, + {';', 0, 8592, {8773}, 1},{'d', 8595, 8593, {0}, 0},{'\0', 0, 8594, {0}, 0}, + {'o', 8597, 8595, {0}, 0},{'\0', 0, 8596, {0}, 0},{'t', 8599, 8597, {0}, 0}, + {'\0', 0, 8598, {0}, 0},{';', 0, 8599, {10861}, 1},{'\0', 0, 8600, {0}, 0}, + {'n', 8603, 8601, {0}, 0},{'\0', 0, 8602, {0}, 0},{'t', 8605, 8603, {0}, 0}, + {'\0', 0, 8604, {0}, 0},{';', 0, 8605, {8750}, 1},{'\0', 0, 8606, {0}, 0}, + {'f', 8611, 8607, {0}, 0},{'r', 8613, 8608, {0}, 0},{'y', 8619, 8609, {169}, 1}, + {'\0', 0, 8610, {0}, 0},{';', 0, 8611, {120148}, 1},{'\0', 0, 8612, {0}, 0}, + {'o', 8615, 8613, {0}, 0},{'\0', 0, 8614, {0}, 0},{'d', 8617, 8615, {0}, 0}, + {'\0', 0, 8616, {0}, 0},{';', 0, 8617, {8720}, 1},{'\0', 0, 8618, {0}, 0}, + {';', 0, 8619, {169}, 1},{'s', 8622, 8620, {0}, 0},{'\0', 0, 8621, {0}, 0}, + {'r', 8624, 8622, {0}, 0},{'\0', 0, 8623, {0}, 0},{';', 0, 8624, {8471}, 1}, + {'\0', 0, 8625, {0}, 0},{'a', 8629, 8626, {0}, 0},{'o', 8635, 8627, {0}, 0}, + {'\0', 0, 8628, {0}, 0},{'r', 8631, 8629, {0}, 0},{'\0', 0, 8630, {0}, 0}, + {'r', 8633, 8631, {0}, 0},{'\0', 0, 8632, {0}, 0},{';', 0, 8633, {8629}, 1}, + {'\0', 0, 8634, {0}, 0},{'s', 8637, 8635, {0}, 0},{'\0', 0, 8636, {0}, 0}, + {'s', 8639, 8637, {0}, 0},{'\0', 0, 8638, {0}, 0},{';', 0, 8639, {10007}, 1}, + {'\0', 0, 8640, {0}, 0},{'c', 8644, 8641, {0}, 0},{'u', 8648, 8642, {0}, 0}, + {'\0', 0, 8643, {0}, 0},{'r', 8646, 8644, {0}, 0},{'\0', 0, 8645, {0}, 0}, + {';', 0, 8646, {119992}, 1},{'\0', 0, 8647, {0}, 0},{'b', 8651, 8648, {0}, 0}, + {'p', 8656, 8649, {0}, 0},{'\0', 0, 8650, {0}, 0},{';', 0, 8651, {10959}, 1}, + {'e', 8654, 8652, {0}, 0},{'\0', 0, 8653, {0}, 0},{';', 0, 8654, {10961}, 1}, + {'\0', 0, 8655, {0}, 0},{';', 0, 8656, {10960}, 1},{'e', 8659, 8657, {0}, 0}, + {'\0', 0, 8658, {0}, 0},{';', 0, 8659, {10962}, 1},{'\0', 0, 8660, {0}, 0}, + {'d', 8663, 8661, {0}, 0},{'\0', 0, 8662, {0}, 0},{'o', 8665, 8663, {0}, 0}, + {'\0', 0, 8664, {0}, 0},{'t', 8667, 8665, {0}, 0},{'\0', 0, 8666, {0}, 0}, + {';', 0, 8667, {8943}, 1},{'\0', 0, 8668, {0}, 0},{'d', 8677, 8669, {0}, 0}, + {'e', 8690, 8670, {0}, 0},{'l', 8701, 8671, {0}, 0},{'p', 8712, 8672, {0}, 0}, + {'r', 8752, 8673, {0}, 0},{'v', 8848, 8674, {0}, 0},{'w', 8854, 8675, {0}, 0}, + {'\0', 0, 8676, {0}, 0},{'a', 8679, 8677, {0}, 0},{'\0', 0, 8678, {0}, 0}, + {'r', 8681, 8679, {0}, 0},{'\0', 0, 8680, {0}, 0},{'r', 8683, 8681, {0}, 0}, + {'\0', 0, 8682, {0}, 0},{'l', 8686, 8683, {0}, 0},{'r', 8688, 8684, {0}, 0}, + {'\0', 0, 8685, {0}, 0},{';', 0, 8686, {10552}, 1},{'\0', 0, 8687, {0}, 0}, + {';', 0, 8688, {10549}, 1},{'\0', 0, 8689, {0}, 0},{'p', 8693, 8690, {0}, 0}, + {'s', 8697, 8691, {0}, 0},{'\0', 0, 8692, {0}, 0},{'r', 8695, 8693, {0}, 0}, + {'\0', 0, 8694, {0}, 0},{';', 0, 8695, {8926}, 1},{'\0', 0, 8696, {0}, 0}, + {'c', 8699, 8697, {0}, 0},{'\0', 0, 8698, {0}, 0},{';', 0, 8699, {8927}, 1}, + {'\0', 0, 8700, {0}, 0},{'a', 8703, 8701, {0}, 0},{'\0', 0, 8702, {0}, 0}, + {'r', 8705, 8703, {0}, 0},{'\0', 0, 8704, {0}, 0},{'r', 8707, 8705, {0}, 0}, + {'\0', 0, 8706, {0}, 0},{';', 0, 8707, {8630}, 1},{'p', 8710, 8708, {0}, 0}, + {'\0', 0, 8709, {0}, 0},{';', 0, 8710, {10557}, 1},{'\0', 0, 8711, {0}, 0}, + {';', 0, 8712, {8746}, 1},{'b', 8719, 8713, {0}, 0},{'c', 8729, 8714, {0}, 0}, + {'d', 8740, 8715, {0}, 0},{'o', 8746, 8716, {0}, 0},{'s', 8750, 8717, {0}, 0}, + {'\0', 0, 8718, {0}, 0},{'r', 8721, 8719, {0}, 0},{'\0', 0, 8720, {0}, 0}, + {'c', 8723, 8721, {0}, 0},{'\0', 0, 8722, {0}, 0},{'a', 8725, 8723, {0}, 0}, + {'\0', 0, 8724, {0}, 0},{'p', 8727, 8725, {0}, 0},{'\0', 0, 8726, {0}, 0}, + {';', 0, 8727, {10824}, 1},{'\0', 0, 8728, {0}, 0},{'a', 8732, 8729, {0}, 0}, + {'u', 8736, 8730, {0}, 0},{'\0', 0, 8731, {0}, 0},{'p', 8734, 8732, {0}, 0}, + {'\0', 0, 8733, {0}, 0},{';', 0, 8734, {10822}, 1},{'\0', 0, 8735, {0}, 0}, + {'p', 8738, 8736, {0}, 0},{'\0', 0, 8737, {0}, 0},{';', 0, 8738, {10826}, 1}, + {'\0', 0, 8739, {0}, 0},{'o', 8742, 8740, {0}, 0},{'\0', 0, 8741, {0}, 0}, + {'t', 8744, 8742, {0}, 0},{'\0', 0, 8743, {0}, 0},{';', 0, 8744, {8845}, 1}, + {'\0', 0, 8745, {0}, 0},{'r', 8748, 8746, {0}, 0},{'\0', 0, 8747, {0}, 0}, + {';', 0, 8748, {10821}, 1},{'\0', 0, 8749, {0}, 0},{';', 0, 8750, {8746,65024}, 2}, + {'\0', 0, 8751, {0}, 0},{'a', 8757, 8752, {0}, 0},{'l', 8766, 8753, {0}, 0}, + {'r', 8809, 8754, {0}, 0},{'v', 8815, 8755, {0}, 0},{'\0', 0, 8756, {0}, 0}, + {'r', 8759, 8757, {0}, 0},{'\0', 0, 8758, {0}, 0},{'r', 8761, 8759, {0}, 0}, + {'\0', 0, 8760, {0}, 0},{';', 0, 8761, {8631}, 1},{'m', 8764, 8762, {0}, 0}, + {'\0', 0, 8763, {0}, 0},{';', 0, 8764, {10556}, 1},{'\0', 0, 8765, {0}, 0}, + {'y', 8768, 8766, {0}, 0},{'\0', 0, 8767, {0}, 0},{'e', 8772, 8768, {0}, 0}, + {'v', 8793, 8769, {0}, 0},{'w', 8799, 8770, {0}, 0},{'\0', 0, 8771, {0}, 0}, + {'q', 8774, 8772, {0}, 0},{'\0', 0, 8773, {0}, 0},{'p', 8777, 8774, {0}, 0}, + {'s', 8785, 8775, {0}, 0},{'\0', 0, 8776, {0}, 0},{'r', 8779, 8777, {0}, 0}, + {'\0', 0, 8778, {0}, 0},{'e', 8781, 8779, {0}, 0},{'\0', 0, 8780, {0}, 0}, + {'c', 8783, 8781, {0}, 0},{'\0', 0, 8782, {0}, 0},{';', 0, 8783, {8926}, 1}, + {'\0', 0, 8784, {0}, 0},{'u', 8787, 8785, {0}, 0},{'\0', 0, 8786, {0}, 0}, + {'c', 8789, 8787, {0}, 0},{'\0', 0, 8788, {0}, 0},{'c', 8791, 8789, {0}, 0}, + {'\0', 0, 8790, {0}, 0},{';', 0, 8791, {8927}, 1},{'\0', 0, 8792, {0}, 0}, + {'e', 8795, 8793, {0}, 0},{'\0', 0, 8794, {0}, 0},{'e', 8797, 8795, {0}, 0}, + {'\0', 0, 8796, {0}, 0},{';', 0, 8797, {8910}, 1},{'\0', 0, 8798, {0}, 0}, + {'e', 8801, 8799, {0}, 0},{'\0', 0, 8800, {0}, 0},{'d', 8803, 8801, {0}, 0}, + {'\0', 0, 8802, {0}, 0},{'g', 8805, 8803, {0}, 0},{'\0', 0, 8804, {0}, 0}, + {'e', 8807, 8805, {0}, 0},{'\0', 0, 8806, {0}, 0},{';', 0, 8807, {8911}, 1}, + {'\0', 0, 8808, {0}, 0},{'e', 8811, 8809, {0}, 0},{'\0', 0, 8810, {0}, 0}, + {'n', 8813, 8811, {164}, 1},{'\0', 0, 8812, {0}, 0},{';', 0, 8813, {164}, 1}, + {'\0', 0, 8814, {0}, 0},{'e', 8817, 8815, {0}, 0},{'\0', 0, 8816, {0}, 0}, + {'a', 8819, 8817, {0}, 0},{'\0', 0, 8818, {0}, 0},{'r', 8821, 8819, {0}, 0}, + {'\0', 0, 8820, {0}, 0},{'r', 8823, 8821, {0}, 0},{'\0', 0, 8822, {0}, 0}, + {'o', 8825, 8823, {0}, 0},{'\0', 0, 8824, {0}, 0},{'w', 8827, 8825, {0}, 0}, + {'\0', 0, 8826, {0}, 0},{'l', 8830, 8827, {0}, 0},{'r', 8838, 8828, {0}, 0}, + {'\0', 0, 8829, {0}, 0},{'e', 8832, 8830, {0}, 0},{'\0', 0, 8831, {0}, 0}, + {'f', 8834, 8832, {0}, 0},{'\0', 0, 8833, {0}, 0},{'t', 8836, 8834, {0}, 0}, + {'\0', 0, 8835, {0}, 0},{';', 0, 8836, {8630}, 1},{'\0', 0, 8837, {0}, 0}, + {'i', 8840, 8838, {0}, 0},{'\0', 0, 8839, {0}, 0},{'g', 8842, 8840, {0}, 0}, + {'\0', 0, 8841, {0}, 0},{'h', 8844, 8842, {0}, 0},{'\0', 0, 8843, {0}, 0}, + {'t', 8846, 8844, {0}, 0},{'\0', 0, 8845, {0}, 0},{';', 0, 8846, {8631}, 1}, + {'\0', 0, 8847, {0}, 0},{'e', 8850, 8848, {0}, 0},{'\0', 0, 8849, {0}, 0}, + {'e', 8852, 8850, {0}, 0},{'\0', 0, 8851, {0}, 0},{';', 0, 8852, {8910}, 1}, + {'\0', 0, 8853, {0}, 0},{'e', 8856, 8854, {0}, 0},{'\0', 0, 8855, {0}, 0}, + {'d', 8858, 8856, {0}, 0},{'\0', 0, 8857, {0}, 0},{';', 0, 8858, {8911}, 1}, + {'\0', 0, 8859, {0}, 0},{'c', 8863, 8860, {0}, 0},{'i', 8875, 8861, {0}, 0}, + {'\0', 0, 8862, {0}, 0},{'o', 8865, 8863, {0}, 0},{'\0', 0, 8864, {0}, 0}, + {'n', 8867, 8865, {0}, 0},{'\0', 0, 8866, {0}, 0},{'i', 8869, 8867, {0}, 0}, + {'\0', 0, 8868, {0}, 0},{'n', 8871, 8869, {0}, 0},{'\0', 0, 8870, {0}, 0}, + {'t', 8873, 8871, {0}, 0},{'\0', 0, 8872, {0}, 0},{';', 0, 8873, {8754}, 1}, + {'\0', 0, 8874, {0}, 0},{'n', 8877, 8875, {0}, 0},{'\0', 0, 8876, {0}, 0}, + {'t', 8879, 8877, {0}, 0},{'\0', 0, 8878, {0}, 0},{';', 0, 8879, {8753}, 1}, + {'\0', 0, 8880, {0}, 0},{'l', 8883, 8881, {0}, 0},{'\0', 0, 8882, {0}, 0}, + {'c', 8885, 8883, {0}, 0},{'\0', 0, 8884, {0}, 0},{'t', 8887, 8885, {0}, 0}, + {'\0', 0, 8886, {0}, 0},{'y', 8889, 8887, {0}, 0},{'\0', 0, 8888, {0}, 0}, + {';', 0, 8889, {9005}, 1},{'\0', 0, 8890, {0}, 0},{'A', 8911, 8891, {0}, 0}, + {'H', 8917, 8892, {0}, 0},{'a', 8923, 8893, {0}, 0},{'b', 8955, 8894, {0}, 0}, + {'c', 8974, 8895, {0}, 0},{'d', 8987, 8896, {0}, 0},{'e', 9016, 8897, {0}, 0}, + {'f', 9038, 8898, {0}, 0},{'h', 9051, 8899, {0}, 0},{'i', 9062, 8900, {0}, 0}, + {'j', 9140, 8901, {0}, 0},{'l', 9146, 8902, {0}, 0},{'o', 9163, 8903, {0}, 0}, + {'r', 9321, 8904, {0}, 0},{'s', 9351, 8905, {0}, 0},{'t', 9374, 8906, {0}, 0}, + {'u', 9390, 8907, {0}, 0},{'w', 9405, 8908, {0}, 0},{'z', 9417, 8909, {0}, 0}, + {'\0', 0, 8910, {0}, 0},{'r', 8913, 8911, {0}, 0},{'\0', 0, 8912, {0}, 0}, + {'r', 8915, 8913, {0}, 0},{'\0', 0, 8914, {0}, 0},{';', 0, 8915, {8659}, 1}, + {'\0', 0, 8916, {0}, 0},{'a', 8919, 8917, {0}, 0},{'\0', 0, 8918, {0}, 0}, + {'r', 8921, 8919, {0}, 0},{'\0', 0, 8920, {0}, 0},{';', 0, 8921, {10597}, 1}, + {'\0', 0, 8922, {0}, 0},{'g', 8928, 8923, {0}, 0},{'l', 8936, 8924, {0}, 0}, + {'r', 8944, 8925, {0}, 0},{'s', 8948, 8926, {0}, 0},{'\0', 0, 8927, {0}, 0}, + {'g', 8930, 8928, {0}, 0},{'\0', 0, 8929, {0}, 0},{'e', 8932, 8930, {0}, 0}, + {'\0', 0, 8931, {0}, 0},{'r', 8934, 8932, {0}, 0},{'\0', 0, 8933, {0}, 0}, + {';', 0, 8934, {8224}, 1},{'\0', 0, 8935, {0}, 0},{'e', 8938, 8936, {0}, 0}, + {'\0', 0, 8937, {0}, 0},{'t', 8940, 8938, {0}, 0},{'\0', 0, 8939, {0}, 0}, + {'h', 8942, 8940, {0}, 0},{'\0', 0, 8941, {0}, 0},{';', 0, 8942, {8504}, 1}, + {'\0', 0, 8943, {0}, 0},{'r', 8946, 8944, {0}, 0},{'\0', 0, 8945, {0}, 0}, + {';', 0, 8946, {8595}, 1},{'\0', 0, 8947, {0}, 0},{'h', 8950, 8948, {0}, 0}, + {'\0', 0, 8949, {0}, 0},{';', 0, 8950, {8208}, 1},{'v', 8953, 8951, {0}, 0}, + {'\0', 0, 8952, {0}, 0},{';', 0, 8953, {8867}, 1},{'\0', 0, 8954, {0}, 0}, + {'k', 8958, 8955, {0}, 0},{'l', 8968, 8956, {0}, 0},{'\0', 0, 8957, {0}, 0}, + {'a', 8960, 8958, {0}, 0},{'\0', 0, 8959, {0}, 0},{'r', 8962, 8960, {0}, 0}, + {'\0', 0, 8961, {0}, 0},{'o', 8964, 8962, {0}, 0},{'\0', 0, 8963, {0}, 0}, + {'w', 8966, 8964, {0}, 0},{'\0', 0, 8965, {0}, 0},{';', 0, 8966, {10511}, 1}, + {'\0', 0, 8967, {0}, 0},{'a', 8970, 8968, {0}, 0},{'\0', 0, 8969, {0}, 0}, + {'c', 8972, 8970, {0}, 0},{'\0', 0, 8971, {0}, 0},{';', 0, 8972, {733}, 1}, + {'\0', 0, 8973, {0}, 0},{'a', 8977, 8974, {0}, 0},{'y', 8985, 8975, {0}, 0}, + {'\0', 0, 8976, {0}, 0},{'r', 8979, 8977, {0}, 0},{'\0', 0, 8978, {0}, 0}, + {'o', 8981, 8979, {0}, 0},{'\0', 0, 8980, {0}, 0},{'n', 8983, 8981, {0}, 0}, + {'\0', 0, 8982, {0}, 0},{';', 0, 8983, {271}, 1},{'\0', 0, 8984, {0}, 0}, + {';', 0, 8985, {1076}, 1},{'\0', 0, 8986, {0}, 0},{';', 0, 8987, {8518}, 1}, + {'a', 8991, 8988, {0}, 0},{'o', 9006, 8989, {0}, 0},{'\0', 0, 8990, {0}, 0}, + {'g', 8994, 8991, {0}, 0},{'r', 9002, 8992, {0}, 0},{'\0', 0, 8993, {0}, 0}, + {'g', 8996, 8994, {0}, 0},{'\0', 0, 8995, {0}, 0},{'e', 8998, 8996, {0}, 0}, + {'\0', 0, 8997, {0}, 0},{'r', 9000, 8998, {0}, 0},{'\0', 0, 8999, {0}, 0}, + {';', 0, 9000, {8225}, 1},{'\0', 0, 9001, {0}, 0},{'r', 9004, 9002, {0}, 0}, + {'\0', 0, 9003, {0}, 0},{';', 0, 9004, {8650}, 1},{'\0', 0, 9005, {0}, 0}, + {'t', 9008, 9006, {0}, 0},{'\0', 0, 9007, {0}, 0},{'s', 9010, 9008, {0}, 0}, + {'\0', 0, 9009, {0}, 0},{'e', 9012, 9010, {0}, 0},{'\0', 0, 9011, {0}, 0}, + {'q', 9014, 9012, {0}, 0},{'\0', 0, 9013, {0}, 0},{';', 0, 9014, {10871}, 1}, + {'\0', 0, 9015, {0}, 0},{'g', 9020, 9016, {176}, 1},{'l', 9022, 9017, {0}, 0}, + {'m', 9028, 9018, {0}, 0},{'\0', 0, 9019, {0}, 0},{';', 0, 9020, {176}, 1}, + {'\0', 0, 9021, {0}, 0},{'t', 9024, 9022, {0}, 0},{'\0', 0, 9023, {0}, 0}, + {'a', 9026, 9024, {0}, 0},{'\0', 0, 9025, {0}, 0},{';', 0, 9026, {948}, 1}, + {'\0', 0, 9027, {0}, 0},{'p', 9030, 9028, {0}, 0},{'\0', 0, 9029, {0}, 0}, + {'t', 9032, 9030, {0}, 0},{'\0', 0, 9031, {0}, 0},{'y', 9034, 9032, {0}, 0}, + {'\0', 0, 9033, {0}, 0},{'v', 9036, 9034, {0}, 0},{'\0', 0, 9035, {0}, 0}, + {';', 0, 9036, {10673}, 1},{'\0', 0, 9037, {0}, 0},{'i', 9041, 9038, {0}, 0}, + {'r', 9049, 9039, {0}, 0},{'\0', 0, 9040, {0}, 0},{'s', 9043, 9041, {0}, 0}, + {'\0', 0, 9042, {0}, 0},{'h', 9045, 9043, {0}, 0},{'\0', 0, 9044, {0}, 0}, + {'t', 9047, 9045, {0}, 0},{'\0', 0, 9046, {0}, 0},{';', 0, 9047, {10623}, 1}, + {'\0', 0, 9048, {0}, 0},{';', 0, 9049, {120097}, 1},{'\0', 0, 9050, {0}, 0}, + {'a', 9053, 9051, {0}, 0},{'\0', 0, 9052, {0}, 0},{'r', 9055, 9053, {0}, 0}, + {'\0', 0, 9054, {0}, 0},{'l', 9058, 9055, {0}, 0},{'r', 9060, 9056, {0}, 0}, + {'\0', 0, 9057, {0}, 0},{';', 0, 9058, {8643}, 1},{'\0', 0, 9059, {0}, 0}, + {';', 0, 9060, {8642}, 1},{'\0', 0, 9061, {0}, 0},{'a', 9068, 9062, {0}, 0}, + {'e', 9091, 9063, {0}, 0},{'g', 9093, 9064, {0}, 0},{'s', 9103, 9065, {0}, 0}, + {'v', 9109, 9066, {0}, 0},{'\0', 0, 9067, {0}, 0},{'m', 9070, 9068, {0}, 0}, + {'\0', 0, 9069, {0}, 0},{';', 0, 9070, {8900}, 1},{'o', 9074, 9071, {0}, 0}, + {'s', 9089, 9072, {0}, 0},{'\0', 0, 9073, {0}, 0},{'n', 9076, 9074, {0}, 0}, + {'\0', 0, 9075, {0}, 0},{'d', 9078, 9076, {0}, 0},{'\0', 0, 9077, {0}, 0}, + {';', 0, 9078, {8900}, 1},{'s', 9081, 9079, {0}, 0},{'\0', 0, 9080, {0}, 0}, + {'u', 9083, 9081, {0}, 0},{'\0', 0, 9082, {0}, 0},{'i', 9085, 9083, {0}, 0}, + {'\0', 0, 9084, {0}, 0},{'t', 9087, 9085, {0}, 0},{'\0', 0, 9086, {0}, 0}, + {';', 0, 9087, {9830}, 1},{'\0', 0, 9088, {0}, 0},{';', 0, 9089, {9830}, 1}, + {'\0', 0, 9090, {0}, 0},{';', 0, 9091, {168}, 1},{'\0', 0, 9092, {0}, 0}, + {'a', 9095, 9093, {0}, 0},{'\0', 0, 9094, {0}, 0},{'m', 9097, 9095, {0}, 0}, + {'\0', 0, 9096, {0}, 0},{'m', 9099, 9097, {0}, 0},{'\0', 0, 9098, {0}, 0}, + {'a', 9101, 9099, {0}, 0},{'\0', 0, 9100, {0}, 0},{';', 0, 9101, {989}, 1}, + {'\0', 0, 9102, {0}, 0},{'i', 9105, 9103, {0}, 0},{'\0', 0, 9104, {0}, 0}, + {'n', 9107, 9105, {0}, 0},{'\0', 0, 9106, {0}, 0},{';', 0, 9107, {8946}, 1}, + {'\0', 0, 9108, {0}, 0},{';', 0, 9109, {247}, 1},{'i', 9113, 9110, {0}, 0}, + {'o', 9134, 9111, {0}, 0},{'\0', 0, 9112, {0}, 0},{'d', 9115, 9113, {0}, 0}, + {'\0', 0, 9114, {0}, 0},{'e', 9117, 9115, {247}, 1},{'\0', 0, 9116, {0}, 0}, + {';', 0, 9117, {247}, 1},{'o', 9120, 9118, {0}, 0},{'\0', 0, 9119, {0}, 0}, + {'n', 9122, 9120, {0}, 0},{'\0', 0, 9121, {0}, 0},{'t', 9124, 9122, {0}, 0}, + {'\0', 0, 9123, {0}, 0},{'i', 9126, 9124, {0}, 0},{'\0', 0, 9125, {0}, 0}, + {'m', 9128, 9126, {0}, 0},{'\0', 0, 9127, {0}, 0},{'e', 9130, 9128, {0}, 0}, + {'\0', 0, 9129, {0}, 0},{'s', 9132, 9130, {0}, 0},{'\0', 0, 9131, {0}, 0}, + {';', 0, 9132, {8903}, 1},{'\0', 0, 9133, {0}, 0},{'n', 9136, 9134, {0}, 0}, + {'\0', 0, 9135, {0}, 0},{'x', 9138, 9136, {0}, 0},{'\0', 0, 9137, {0}, 0}, + {';', 0, 9138, {8903}, 1},{'\0', 0, 9139, {0}, 0},{'c', 9142, 9140, {0}, 0}, + {'\0', 0, 9141, {0}, 0},{'y', 9144, 9142, {0}, 0},{'\0', 0, 9143, {0}, 0}, + {';', 0, 9144, {1106}, 1},{'\0', 0, 9145, {0}, 0},{'c', 9148, 9146, {0}, 0}, + {'\0', 0, 9147, {0}, 0},{'o', 9151, 9148, {0}, 0},{'r', 9157, 9149, {0}, 0}, + {'\0', 0, 9150, {0}, 0},{'r', 9153, 9151, {0}, 0},{'\0', 0, 9152, {0}, 0}, + {'n', 9155, 9153, {0}, 0},{'\0', 0, 9154, {0}, 0},{';', 0, 9155, {8990}, 1}, + {'\0', 0, 9156, {0}, 0},{'o', 9159, 9157, {0}, 0},{'\0', 0, 9158, {0}, 0}, + {'p', 9161, 9159, {0}, 0},{'\0', 0, 9160, {0}, 0},{';', 0, 9161, {8973}, 1}, + {'\0', 0, 9162, {0}, 0},{'l', 9169, 9163, {0}, 0},{'p', 9177, 9164, {0}, 0}, + {'t', 9181, 9165, {0}, 0},{'u', 9228, 9166, {0}, 0},{'w', 9252, 9167, {0}, 0}, + {'\0', 0, 9168, {0}, 0},{'l', 9171, 9169, {0}, 0},{'\0', 0, 9170, {0}, 0}, + {'a', 9173, 9171, {0}, 0},{'\0', 0, 9172, {0}, 0},{'r', 9175, 9173, {0}, 0}, + {'\0', 0, 9174, {0}, 0},{';', 0, 9175, {36}, 1},{'\0', 0, 9176, {0}, 0}, + {'f', 9179, 9177, {0}, 0},{'\0', 0, 9178, {0}, 0},{';', 0, 9179, {120149}, 1}, + {'\0', 0, 9180, {0}, 0},{';', 0, 9181, {729}, 1},{'e', 9187, 9182, {0}, 0}, + {'m', 9198, 9183, {0}, 0},{'p', 9208, 9184, {0}, 0},{'s', 9216, 9185, {0}, 0}, + {'\0', 0, 9186, {0}, 0},{'q', 9189, 9187, {0}, 0},{'\0', 0, 9188, {0}, 0}, + {';', 0, 9189, {8784}, 1},{'d', 9192, 9190, {0}, 0},{'\0', 0, 9191, {0}, 0}, + {'o', 9194, 9192, {0}, 0},{'\0', 0, 9193, {0}, 0},{'t', 9196, 9194, {0}, 0}, + {'\0', 0, 9195, {0}, 0},{';', 0, 9196, {8785}, 1},{'\0', 0, 9197, {0}, 0}, + {'i', 9200, 9198, {0}, 0},{'\0', 0, 9199, {0}, 0},{'n', 9202, 9200, {0}, 0}, + {'\0', 0, 9201, {0}, 0},{'u', 9204, 9202, {0}, 0},{'\0', 0, 9203, {0}, 0}, + {'s', 9206, 9204, {0}, 0},{'\0', 0, 9205, {0}, 0},{';', 0, 9206, {8760}, 1}, + {'\0', 0, 9207, {0}, 0},{'l', 9210, 9208, {0}, 0},{'\0', 0, 9209, {0}, 0}, + {'u', 9212, 9210, {0}, 0},{'\0', 0, 9211, {0}, 0},{'s', 9214, 9212, {0}, 0}, + {'\0', 0, 9213, {0}, 0},{';', 0, 9214, {8724}, 1},{'\0', 0, 9215, {0}, 0}, + {'q', 9218, 9216, {0}, 0},{'\0', 0, 9217, {0}, 0},{'u', 9220, 9218, {0}, 0}, + {'\0', 0, 9219, {0}, 0},{'a', 9222, 9220, {0}, 0},{'\0', 0, 9221, {0}, 0}, + {'r', 9224, 9222, {0}, 0},{'\0', 0, 9223, {0}, 0},{'e', 9226, 9224, {0}, 0}, + {'\0', 0, 9225, {0}, 0},{';', 0, 9226, {8865}, 1},{'\0', 0, 9227, {0}, 0}, + {'b', 9230, 9228, {0}, 0},{'\0', 0, 9229, {0}, 0},{'l', 9232, 9230, {0}, 0}, + {'\0', 0, 9231, {0}, 0},{'e', 9234, 9232, {0}, 0},{'\0', 0, 9233, {0}, 0}, + {'b', 9236, 9234, {0}, 0},{'\0', 0, 9235, {0}, 0},{'a', 9238, 9236, {0}, 0}, + {'\0', 0, 9237, {0}, 0},{'r', 9240, 9238, {0}, 0},{'\0', 0, 9239, {0}, 0}, + {'w', 9242, 9240, {0}, 0},{'\0', 0, 9241, {0}, 0},{'e', 9244, 9242, {0}, 0}, + {'\0', 0, 9243, {0}, 0},{'d', 9246, 9244, {0}, 0},{'\0', 0, 9245, {0}, 0}, + {'g', 9248, 9246, {0}, 0},{'\0', 0, 9247, {0}, 0},{'e', 9250, 9248, {0}, 0}, + {'\0', 0, 9249, {0}, 0},{';', 0, 9250, {8966}, 1},{'\0', 0, 9251, {0}, 0}, + {'n', 9254, 9252, {0}, 0},{'\0', 0, 9253, {0}, 0},{'a', 9258, 9254, {0}, 0}, + {'d', 9268, 9255, {0}, 0},{'h', 9288, 9256, {0}, 0},{'\0', 0, 9257, {0}, 0}, + {'r', 9260, 9258, {0}, 0},{'\0', 0, 9259, {0}, 0},{'r', 9262, 9260, {0}, 0}, + {'\0', 0, 9261, {0}, 0},{'o', 9264, 9262, {0}, 0},{'\0', 0, 9263, {0}, 0}, + {'w', 9266, 9264, {0}, 0},{'\0', 0, 9265, {0}, 0},{';', 0, 9266, {8595}, 1}, + {'\0', 0, 9267, {0}, 0},{'o', 9270, 9268, {0}, 0},{'\0', 0, 9269, {0}, 0}, + {'w', 9272, 9270, {0}, 0},{'\0', 0, 9271, {0}, 0},{'n', 9274, 9272, {0}, 0}, + {'\0', 0, 9273, {0}, 0},{'a', 9276, 9274, {0}, 0},{'\0', 0, 9275, {0}, 0}, + {'r', 9278, 9276, {0}, 0},{'\0', 0, 9277, {0}, 0},{'r', 9280, 9278, {0}, 0}, + {'\0', 0, 9279, {0}, 0},{'o', 9282, 9280, {0}, 0},{'\0', 0, 9281, {0}, 0}, + {'w', 9284, 9282, {0}, 0},{'\0', 0, 9283, {0}, 0},{'s', 9286, 9284, {0}, 0}, + {'\0', 0, 9285, {0}, 0},{';', 0, 9286, {8650}, 1},{'\0', 0, 9287, {0}, 0}, + {'a', 9290, 9288, {0}, 0},{'\0', 0, 9289, {0}, 0},{'r', 9292, 9290, {0}, 0}, + {'\0', 0, 9291, {0}, 0},{'p', 9294, 9292, {0}, 0},{'\0', 0, 9293, {0}, 0}, + {'o', 9296, 9294, {0}, 0},{'\0', 0, 9295, {0}, 0},{'o', 9298, 9296, {0}, 0}, + {'\0', 0, 9297, {0}, 0},{'n', 9300, 9298, {0}, 0},{'\0', 0, 9299, {0}, 0}, + {'l', 9303, 9300, {0}, 0},{'r', 9311, 9301, {0}, 0},{'\0', 0, 9302, {0}, 0}, + {'e', 9305, 9303, {0}, 0},{'\0', 0, 9304, {0}, 0},{'f', 9307, 9305, {0}, 0}, + {'\0', 0, 9306, {0}, 0},{'t', 9309, 9307, {0}, 0},{'\0', 0, 9308, {0}, 0}, + {';', 0, 9309, {8643}, 1},{'\0', 0, 9310, {0}, 0},{'i', 9313, 9311, {0}, 0}, + {'\0', 0, 9312, {0}, 0},{'g', 9315, 9313, {0}, 0},{'\0', 0, 9314, {0}, 0}, + {'h', 9317, 9315, {0}, 0},{'\0', 0, 9316, {0}, 0},{'t', 9319, 9317, {0}, 0}, + {'\0', 0, 9318, {0}, 0},{';', 0, 9319, {8642}, 1},{'\0', 0, 9320, {0}, 0}, + {'b', 9324, 9321, {0}, 0},{'c', 9336, 9322, {0}, 0},{'\0', 0, 9323, {0}, 0}, + {'k', 9326, 9324, {0}, 0},{'\0', 0, 9325, {0}, 0},{'a', 9328, 9326, {0}, 0}, + {'\0', 0, 9327, {0}, 0},{'r', 9330, 9328, {0}, 0},{'\0', 0, 9329, {0}, 0}, + {'o', 9332, 9330, {0}, 0},{'\0', 0, 9331, {0}, 0},{'w', 9334, 9332, {0}, 0}, + {'\0', 0, 9333, {0}, 0},{';', 0, 9334, {10512}, 1},{'\0', 0, 9335, {0}, 0}, + {'o', 9339, 9336, {0}, 0},{'r', 9345, 9337, {0}, 0},{'\0', 0, 9338, {0}, 0}, + {'r', 9341, 9339, {0}, 0},{'\0', 0, 9340, {0}, 0},{'n', 9343, 9341, {0}, 0}, + {'\0', 0, 9342, {0}, 0},{';', 0, 9343, {8991}, 1},{'\0', 0, 9344, {0}, 0}, + {'o', 9347, 9345, {0}, 0},{'\0', 0, 9346, {0}, 0},{'p', 9349, 9347, {0}, 0}, + {'\0', 0, 9348, {0}, 0},{';', 0, 9349, {8972}, 1},{'\0', 0, 9350, {0}, 0}, + {'c', 9355, 9351, {0}, 0},{'o', 9362, 9352, {0}, 0},{'t', 9366, 9353, {0}, 0}, + {'\0', 0, 9354, {0}, 0},{'r', 9358, 9355, {0}, 0},{'y', 9360, 9356, {0}, 0}, + {'\0', 0, 9357, {0}, 0},{';', 0, 9358, {119993}, 1},{'\0', 0, 9359, {0}, 0}, + {';', 0, 9360, {1109}, 1},{'\0', 0, 9361, {0}, 0},{'l', 9364, 9362, {0}, 0}, + {'\0', 0, 9363, {0}, 0},{';', 0, 9364, {10742}, 1},{'\0', 0, 9365, {0}, 0}, + {'r', 9368, 9366, {0}, 0},{'\0', 0, 9367, {0}, 0},{'o', 9370, 9368, {0}, 0}, + {'\0', 0, 9369, {0}, 0},{'k', 9372, 9370, {0}, 0},{'\0', 0, 9371, {0}, 0}, + {';', 0, 9372, {273}, 1},{'\0', 0, 9373, {0}, 0},{'d', 9377, 9374, {0}, 0}, + {'r', 9383, 9375, {0}, 0},{'\0', 0, 9376, {0}, 0},{'o', 9379, 9377, {0}, 0}, + {'\0', 0, 9378, {0}, 0},{'t', 9381, 9379, {0}, 0},{'\0', 0, 9380, {0}, 0}, + {';', 0, 9381, {8945}, 1},{'\0', 0, 9382, {0}, 0},{'i', 9385, 9383, {0}, 0}, + {'\0', 0, 9384, {0}, 0},{';', 0, 9385, {9663}, 1},{'f', 9388, 9386, {0}, 0}, + {'\0', 0, 9387, {0}, 0},{';', 0, 9388, {9662}, 1},{'\0', 0, 9389, {0}, 0}, + {'a', 9393, 9390, {0}, 0},{'h', 9399, 9391, {0}, 0},{'\0', 0, 9392, {0}, 0}, + {'r', 9395, 9393, {0}, 0},{'\0', 0, 9394, {0}, 0},{'r', 9397, 9395, {0}, 0}, + {'\0', 0, 9396, {0}, 0},{';', 0, 9397, {8693}, 1},{'\0', 0, 9398, {0}, 0}, + {'a', 9401, 9399, {0}, 0},{'\0', 0, 9400, {0}, 0},{'r', 9403, 9401, {0}, 0}, + {'\0', 0, 9402, {0}, 0},{';', 0, 9403, {10607}, 1},{'\0', 0, 9404, {0}, 0}, + {'a', 9407, 9405, {0}, 0},{'\0', 0, 9406, {0}, 0},{'n', 9409, 9407, {0}, 0}, + {'\0', 0, 9408, {0}, 0},{'g', 9411, 9409, {0}, 0},{'\0', 0, 9410, {0}, 0}, + {'l', 9413, 9411, {0}, 0},{'\0', 0, 9412, {0}, 0},{'e', 9415, 9413, {0}, 0}, + {'\0', 0, 9414, {0}, 0},{';', 0, 9415, {10662}, 1},{'\0', 0, 9416, {0}, 0}, + {'c', 9420, 9417, {0}, 0},{'i', 9424, 9418, {0}, 0},{'\0', 0, 9419, {0}, 0}, + {'y', 9422, 9420, {0}, 0},{'\0', 0, 9421, {0}, 0},{';', 0, 9422, {1119}, 1}, + {'\0', 0, 9423, {0}, 0},{'g', 9426, 9424, {0}, 0},{'\0', 0, 9425, {0}, 0}, + {'r', 9428, 9426, {0}, 0},{'\0', 0, 9427, {0}, 0},{'a', 9430, 9428, {0}, 0}, + {'\0', 0, 9429, {0}, 0},{'r', 9432, 9430, {0}, 0},{'\0', 0, 9431, {0}, 0}, + {'r', 9434, 9432, {0}, 0},{'\0', 0, 9433, {0}, 0},{';', 0, 9434, {10239}, 1}, + {'\0', 0, 9435, {0}, 0},{'D', 9455, 9436, {0}, 0},{'a', 9468, 9437, {0}, 0}, + {'c', 9487, 9438, {0}, 0},{'d', 9517, 9439, {0}, 0},{'e', 9523, 9440, {0}, 0}, + {'f', 9525, 9441, {0}, 0},{'g', 9536, 9442, {0}, 0},{'l', 9557, 9443, {0}, 0}, + {'m', 9585, 9444, {0}, 0},{'n', 9623, 9445, {0}, 0},{'o', 9632, 9446, {0}, 0}, + {'p', 9645, 9447, {0}, 0},{'q', 9678, 9448, {0}, 0},{'r', 9767, 9449, {0}, 0}, + {'s', 9782, 9450, {0}, 0},{'t', 9800, 9451, {0}, 0},{'u', 9807, 9452, {0}, 0}, + {'x', 9818, 9453, {0}, 0},{'\0', 0, 9454, {0}, 0},{'D', 9458, 9455, {0}, 0}, + {'o', 9464, 9456, {0}, 0},{'\0', 0, 9457, {0}, 0},{'o', 9460, 9458, {0}, 0}, + {'\0', 0, 9459, {0}, 0},{'t', 9462, 9460, {0}, 0},{'\0', 0, 9461, {0}, 0}, + {';', 0, 9462, {10871}, 1},{'\0', 0, 9463, {0}, 0},{'t', 9466, 9464, {0}, 0}, + {'\0', 0, 9465, {0}, 0},{';', 0, 9466, {8785}, 1},{'\0', 0, 9467, {0}, 0}, + {'c', 9471, 9468, {0}, 0},{'s', 9479, 9469, {0}, 0},{'\0', 0, 9470, {0}, 0}, + {'u', 9473, 9471, {0}, 0},{'\0', 0, 9472, {0}, 0},{'t', 9475, 9473, {0}, 0}, + {'\0', 0, 9474, {0}, 0},{'e', 9477, 9475, {233}, 1},{'\0', 0, 9476, {0}, 0}, + {';', 0, 9477, {233}, 1},{'\0', 0, 9478, {0}, 0},{'t', 9481, 9479, {0}, 0}, + {'\0', 0, 9480, {0}, 0},{'e', 9483, 9481, {0}, 0},{'\0', 0, 9482, {0}, 0}, + {'r', 9485, 9483, {0}, 0},{'\0', 0, 9484, {0}, 0},{';', 0, 9485, {10862}, 1}, + {'\0', 0, 9486, {0}, 0},{'a', 9492, 9487, {0}, 0},{'i', 9500, 9488, {0}, 0}, + {'o', 9507, 9489, {0}, 0},{'y', 9515, 9490, {0}, 0},{'\0', 0, 9491, {0}, 0}, + {'r', 9494, 9492, {0}, 0},{'\0', 0, 9493, {0}, 0},{'o', 9496, 9494, {0}, 0}, + {'\0', 0, 9495, {0}, 0},{'n', 9498, 9496, {0}, 0},{'\0', 0, 9497, {0}, 0}, + {';', 0, 9498, {283}, 1},{'\0', 0, 9499, {0}, 0},{'r', 9502, 9500, {0}, 0}, + {'\0', 0, 9501, {0}, 0},{';', 0, 9502, {8790}, 1},{'c', 9505, 9503, {234}, 1}, + {'\0', 0, 9504, {0}, 0},{';', 0, 9505, {234}, 1},{'\0', 0, 9506, {0}, 0}, + {'l', 9509, 9507, {0}, 0},{'\0', 0, 9508, {0}, 0},{'o', 9511, 9509, {0}, 0}, + {'\0', 0, 9510, {0}, 0},{'n', 9513, 9511, {0}, 0},{'\0', 0, 9512, {0}, 0}, + {';', 0, 9513, {8789}, 1},{'\0', 0, 9514, {0}, 0},{';', 0, 9515, {1101}, 1}, + {'\0', 0, 9516, {0}, 0},{'o', 9519, 9517, {0}, 0},{'\0', 0, 9518, {0}, 0}, + {'t', 9521, 9519, {0}, 0},{'\0', 0, 9520, {0}, 0},{';', 0, 9521, {279}, 1}, + {'\0', 0, 9522, {0}, 0},{';', 0, 9523, {8519}, 1},{'\0', 0, 9524, {0}, 0}, + {'D', 9528, 9525, {0}, 0},{'r', 9534, 9526, {0}, 0},{'\0', 0, 9527, {0}, 0}, + {'o', 9530, 9528, {0}, 0},{'\0', 0, 9529, {0}, 0},{'t', 9532, 9530, {0}, 0}, + {'\0', 0, 9531, {0}, 0},{';', 0, 9532, {8786}, 1},{'\0', 0, 9533, {0}, 0}, + {';', 0, 9534, {120098}, 1},{'\0', 0, 9535, {0}, 0},{';', 0, 9536, {10906}, 1}, + {'r', 9540, 9537, {0}, 0},{'s', 9548, 9538, {0}, 0},{'\0', 0, 9539, {0}, 0}, + {'a', 9542, 9540, {0}, 0},{'\0', 0, 9541, {0}, 0},{'v', 9544, 9542, {0}, 0}, + {'\0', 0, 9543, {0}, 0},{'e', 9546, 9544, {232}, 1},{'\0', 0, 9545, {0}, 0}, + {';', 0, 9546, {232}, 1},{'\0', 0, 9547, {0}, 0},{';', 0, 9548, {10902}, 1}, + {'d', 9551, 9549, {0}, 0},{'\0', 0, 9550, {0}, 0},{'o', 9553, 9551, {0}, 0}, + {'\0', 0, 9552, {0}, 0},{'t', 9555, 9553, {0}, 0},{'\0', 0, 9554, {0}, 0}, + {';', 0, 9555, {10904}, 1},{'\0', 0, 9556, {0}, 0},{';', 0, 9557, {10905}, 1}, + {'i', 9562, 9558, {0}, 0},{'l', 9574, 9559, {0}, 0},{'s', 9576, 9560, {0}, 0}, + {'\0', 0, 9561, {0}, 0},{'n', 9564, 9562, {0}, 0},{'\0', 0, 9563, {0}, 0}, + {'t', 9566, 9564, {0}, 0},{'\0', 0, 9565, {0}, 0},{'e', 9568, 9566, {0}, 0}, + {'\0', 0, 9567, {0}, 0},{'r', 9570, 9568, {0}, 0},{'\0', 0, 9569, {0}, 0}, + {'s', 9572, 9570, {0}, 0},{'\0', 0, 9571, {0}, 0},{';', 0, 9572, {9191}, 1}, + {'\0', 0, 9573, {0}, 0},{';', 0, 9574, {8467}, 1},{'\0', 0, 9575, {0}, 0}, + {';', 0, 9576, {10901}, 1},{'d', 9579, 9577, {0}, 0},{'\0', 0, 9578, {0}, 0}, + {'o', 9581, 9579, {0}, 0},{'\0', 0, 9580, {0}, 0},{'t', 9583, 9581, {0}, 0}, + {'\0', 0, 9582, {0}, 0},{';', 0, 9583, {10903}, 1},{'\0', 0, 9584, {0}, 0}, + {'a', 9589, 9585, {0}, 0},{'p', 9595, 9586, {0}, 0},{'s', 9611, 9587, {0}, 0}, + {'\0', 0, 9588, {0}, 0},{'c', 9591, 9589, {0}, 0},{'\0', 0, 9590, {0}, 0}, + {'r', 9593, 9591, {0}, 0},{'\0', 0, 9592, {0}, 0},{';', 0, 9593, {275}, 1}, + {'\0', 0, 9594, {0}, 0},{'t', 9597, 9595, {0}, 0},{'\0', 0, 9596, {0}, 0}, + {'y', 9599, 9597, {0}, 0},{'\0', 0, 9598, {0}, 0},{';', 0, 9599, {8709}, 1}, + {'s', 9603, 9600, {0}, 0},{'v', 9609, 9601, {0}, 0},{'\0', 0, 9602, {0}, 0}, + {'e', 9605, 9603, {0}, 0},{'\0', 0, 9604, {0}, 0},{'t', 9607, 9605, {0}, 0}, + {'\0', 0, 9606, {0}, 0},{';', 0, 9607, {8709}, 1},{'\0', 0, 9608, {0}, 0}, + {';', 0, 9609, {8709}, 1},{'\0', 0, 9610, {0}, 0},{'p', 9613, 9611, {0}, 0}, + {'\0', 0, 9612, {0}, 0},{'1', 9616, 9613, {0}, 0},{';', 0, 9614, {8195}, 1}, + {'\0', 0, 9615, {0}, 0},{'3', 9619, 9616, {0}, 0},{'4', 9621, 9617, {0}, 0}, + {'\0', 0, 9618, {0}, 0},{';', 0, 9619, {8196}, 1},{'\0', 0, 9620, {0}, 0}, + {';', 0, 9621, {8197}, 1},{'\0', 0, 9622, {0}, 0},{'g', 9626, 9623, {0}, 0}, + {'s', 9628, 9624, {0}, 0},{'\0', 0, 9625, {0}, 0},{';', 0, 9626, {331}, 1}, + {'\0', 0, 9627, {0}, 0},{'p', 9630, 9628, {0}, 0},{'\0', 0, 9629, {0}, 0}, + {';', 0, 9630, {8194}, 1},{'\0', 0, 9631, {0}, 0},{'g', 9635, 9632, {0}, 0}, + {'p', 9641, 9633, {0}, 0},{'\0', 0, 9634, {0}, 0},{'o', 9637, 9635, {0}, 0}, + {'\0', 0, 9636, {0}, 0},{'n', 9639, 9637, {0}, 0},{'\0', 0, 9638, {0}, 0}, + {';', 0, 9639, {281}, 1},{'\0', 0, 9640, {0}, 0},{'f', 9643, 9641, {0}, 0}, + {'\0', 0, 9642, {0}, 0},{';', 0, 9643, {120150}, 1},{'\0', 0, 9644, {0}, 0}, + {'a', 9649, 9645, {0}, 0},{'l', 9658, 9646, {0}, 0},{'s', 9664, 9647, {0}, 0}, + {'\0', 0, 9648, {0}, 0},{'r', 9651, 9649, {0}, 0},{'\0', 0, 9650, {0}, 0}, + {';', 0, 9651, {8917}, 1},{'s', 9654, 9652, {0}, 0},{'\0', 0, 9653, {0}, 0}, + {'l', 9656, 9654, {0}, 0},{'\0', 0, 9655, {0}, 0},{';', 0, 9656, {10723}, 1}, + {'\0', 0, 9657, {0}, 0},{'u', 9660, 9658, {0}, 0},{'\0', 0, 9659, {0}, 0}, + {'s', 9662, 9660, {0}, 0},{'\0', 0, 9661, {0}, 0},{';', 0, 9662, {10865}, 1}, + {'\0', 0, 9663, {0}, 0},{'i', 9666, 9664, {0}, 0},{'\0', 0, 9665, {0}, 0}, + {';', 0, 9666, {949}, 1},{'l', 9670, 9667, {0}, 0},{'v', 9676, 9668, {0}, 0}, + {'\0', 0, 9669, {0}, 0},{'o', 9672, 9670, {0}, 0},{'\0', 0, 9671, {0}, 0}, + {'n', 9674, 9672, {0}, 0},{'\0', 0, 9673, {0}, 0},{';', 0, 9674, {949}, 1}, + {'\0', 0, 9675, {0}, 0},{';', 0, 9676, {1013}, 1},{'\0', 0, 9677, {0}, 0}, + {'c', 9683, 9678, {0}, 0},{'s', 9700, 9679, {0}, 0},{'u', 9730, 9680, {0}, 0}, + {'v', 9755, 9681, {0}, 0},{'\0', 0, 9682, {0}, 0},{'i', 9686, 9683, {0}, 0}, + {'o', 9692, 9684, {0}, 0},{'\0', 0, 9685, {0}, 0},{'r', 9688, 9686, {0}, 0}, + {'\0', 0, 9687, {0}, 0},{'c', 9690, 9688, {0}, 0},{'\0', 0, 9689, {0}, 0}, + {';', 0, 9690, {8790}, 1},{'\0', 0, 9691, {0}, 0},{'l', 9694, 9692, {0}, 0}, + {'\0', 0, 9693, {0}, 0},{'o', 9696, 9694, {0}, 0},{'\0', 0, 9695, {0}, 0}, + {'n', 9698, 9696, {0}, 0},{'\0', 0, 9697, {0}, 0},{';', 0, 9698, {8789}, 1}, + {'\0', 0, 9699, {0}, 0},{'i', 9703, 9700, {0}, 0},{'l', 9707, 9701, {0}, 0}, + {'\0', 0, 9702, {0}, 0},{'m', 9705, 9703, {0}, 0},{'\0', 0, 9704, {0}, 0}, + {';', 0, 9705, {8770}, 1},{'\0', 0, 9706, {0}, 0},{'a', 9709, 9707, {0}, 0}, + {'\0', 0, 9708, {0}, 0},{'n', 9711, 9709, {0}, 0},{'\0', 0, 9710, {0}, 0}, + {'t', 9713, 9711, {0}, 0},{'\0', 0, 9712, {0}, 0},{'g', 9716, 9713, {0}, 0}, + {'l', 9722, 9714, {0}, 0},{'\0', 0, 9715, {0}, 0},{'t', 9718, 9716, {0}, 0}, + {'\0', 0, 9717, {0}, 0},{'r', 9720, 9718, {0}, 0},{'\0', 0, 9719, {0}, 0}, + {';', 0, 9720, {10902}, 1},{'\0', 0, 9721, {0}, 0},{'e', 9724, 9722, {0}, 0}, + {'\0', 0, 9723, {0}, 0},{'s', 9726, 9724, {0}, 0},{'\0', 0, 9725, {0}, 0}, + {'s', 9728, 9726, {0}, 0},{'\0', 0, 9727, {0}, 0},{';', 0, 9728, {10901}, 1}, + {'\0', 0, 9729, {0}, 0},{'a', 9734, 9730, {0}, 0},{'e', 9740, 9731, {0}, 0}, + {'i', 9746, 9732, {0}, 0},{'\0', 0, 9733, {0}, 0},{'l', 9736, 9734, {0}, 0}, + {'\0', 0, 9735, {0}, 0},{'s', 9738, 9736, {0}, 0},{'\0', 0, 9737, {0}, 0}, + {';', 0, 9738, {61}, 1},{'\0', 0, 9739, {0}, 0},{'s', 9742, 9740, {0}, 0}, + {'\0', 0, 9741, {0}, 0},{'t', 9744, 9742, {0}, 0},{'\0', 0, 9743, {0}, 0}, + {';', 0, 9744, {8799}, 1},{'\0', 0, 9745, {0}, 0},{'v', 9748, 9746, {0}, 0}, + {'\0', 0, 9747, {0}, 0},{';', 0, 9748, {8801}, 1},{'D', 9751, 9749, {0}, 0}, + {'\0', 0, 9750, {0}, 0},{'D', 9753, 9751, {0}, 0},{'\0', 0, 9752, {0}, 0}, + {';', 0, 9753, {10872}, 1},{'\0', 0, 9754, {0}, 0},{'p', 9757, 9755, {0}, 0}, + {'\0', 0, 9756, {0}, 0},{'a', 9759, 9757, {0}, 0},{'\0', 0, 9758, {0}, 0}, + {'r', 9761, 9759, {0}, 0},{'\0', 0, 9760, {0}, 0},{'s', 9763, 9761, {0}, 0}, + {'\0', 0, 9762, {0}, 0},{'l', 9765, 9763, {0}, 0},{'\0', 0, 9764, {0}, 0}, + {';', 0, 9765, {10725}, 1},{'\0', 0, 9766, {0}, 0},{'D', 9770, 9767, {0}, 0}, + {'a', 9776, 9768, {0}, 0},{'\0', 0, 9769, {0}, 0},{'o', 9772, 9770, {0}, 0}, + {'\0', 0, 9771, {0}, 0},{'t', 9774, 9772, {0}, 0},{'\0', 0, 9773, {0}, 0}, + {';', 0, 9774, {8787}, 1},{'\0', 0, 9775, {0}, 0},{'r', 9778, 9776, {0}, 0}, + {'\0', 0, 9777, {0}, 0},{'r', 9780, 9778, {0}, 0},{'\0', 0, 9779, {0}, 0}, + {';', 0, 9780, {10609}, 1},{'\0', 0, 9781, {0}, 0},{'c', 9786, 9782, {0}, 0}, + {'d', 9790, 9783, {0}, 0},{'i', 9796, 9784, {0}, 0},{'\0', 0, 9785, {0}, 0}, + {'r', 9788, 9786, {0}, 0},{'\0', 0, 9787, {0}, 0},{';', 0, 9788, {8495}, 1}, + {'\0', 0, 9789, {0}, 0},{'o', 9792, 9790, {0}, 0},{'\0', 0, 9791, {0}, 0}, + {'t', 9794, 9792, {0}, 0},{'\0', 0, 9793, {0}, 0},{';', 0, 9794, {8784}, 1}, + {'\0', 0, 9795, {0}, 0},{'m', 9798, 9796, {0}, 0},{'\0', 0, 9797, {0}, 0}, + {';', 0, 9798, {8770}, 1},{'\0', 0, 9799, {0}, 0},{'a', 9803, 9800, {0}, 0}, + {'h', 9805, 9801, {240}, 1},{'\0', 0, 9802, {0}, 0},{';', 0, 9803, {951}, 1}, + {'\0', 0, 9804, {0}, 0},{';', 0, 9805, {240}, 1},{'\0', 0, 9806, {0}, 0}, + {'m', 9810, 9807, {0}, 0},{'r', 9814, 9808, {0}, 0},{'\0', 0, 9809, {0}, 0}, + {'l', 9812, 9810, {235}, 1},{'\0', 0, 9811, {0}, 0},{';', 0, 9812, {235}, 1}, + {'\0', 0, 9813, {0}, 0},{'o', 9816, 9814, {0}, 0},{'\0', 0, 9815, {0}, 0}, + {';', 0, 9816, {8364}, 1},{'\0', 0, 9817, {0}, 0},{'c', 9822, 9818, {0}, 0}, + {'i', 9826, 9819, {0}, 0},{'p', 9832, 9820, {0}, 0},{'\0', 0, 9821, {0}, 0}, + {'l', 9824, 9822, {0}, 0},{'\0', 0, 9823, {0}, 0},{';', 0, 9824, {33}, 1}, + {'\0', 0, 9825, {0}, 0},{'s', 9828, 9826, {0}, 0},{'\0', 0, 9827, {0}, 0}, + {'t', 9830, 9828, {0}, 0},{'\0', 0, 9829, {0}, 0},{';', 0, 9830, {8707}, 1}, + {'\0', 0, 9831, {0}, 0},{'e', 9835, 9832, {0}, 0},{'o', 9851, 9833, {0}, 0}, + {'\0', 0, 9834, {0}, 0},{'c', 9837, 9835, {0}, 0},{'\0', 0, 9836, {0}, 0}, + {'t', 9839, 9837, {0}, 0},{'\0', 0, 9838, {0}, 0},{'a', 9841, 9839, {0}, 0}, + {'\0', 0, 9840, {0}, 0},{'t', 9843, 9841, {0}, 0},{'\0', 0, 9842, {0}, 0}, + {'i', 9845, 9843, {0}, 0},{'\0', 0, 9844, {0}, 0},{'o', 9847, 9845, {0}, 0}, + {'\0', 0, 9846, {0}, 0},{'n', 9849, 9847, {0}, 0},{'\0', 0, 9848, {0}, 0}, + {';', 0, 9849, {8496}, 1},{'\0', 0, 9850, {0}, 0},{'n', 9853, 9851, {0}, 0}, + {'\0', 0, 9852, {0}, 0},{'e', 9855, 9853, {0}, 0},{'\0', 0, 9854, {0}, 0}, + {'n', 9857, 9855, {0}, 0},{'\0', 0, 9856, {0}, 0},{'t', 9859, 9857, {0}, 0}, + {'\0', 0, 9858, {0}, 0},{'i', 9861, 9859, {0}, 0},{'\0', 0, 9860, {0}, 0}, + {'a', 9863, 9861, {0}, 0},{'\0', 0, 9862, {0}, 0},{'l', 9865, 9863, {0}, 0}, + {'\0', 0, 9864, {0}, 0},{'e', 9867, 9865, {0}, 0},{'\0', 0, 9866, {0}, 0}, + {';', 0, 9867, {8519}, 1},{'\0', 0, 9868, {0}, 0},{'a', 9882, 9869, {0}, 0}, + {'c', 9906, 9870, {0}, 0},{'e', 9910, 9871, {0}, 0},{'f', 9920, 9872, {0}, 0}, + {'i', 9947, 9873, {0}, 0},{'j', 9955, 9874, {0}, 0},{'l', 9963, 9875, {0}, 0}, + {'n', 9983, 9876, {0}, 0},{'o', 9989, 9877, {0}, 0},{'p', 10010, 9878, {0}, 0}, + {'r', 10024, 9879, {0}, 0},{'s', 10098, 9880, {0}, 0},{'\0', 0, 9881, {0}, 0}, + {'l', 9884, 9882, {0}, 0},{'\0', 0, 9883, {0}, 0},{'l', 9886, 9884, {0}, 0}, + {'\0', 0, 9885, {0}, 0},{'i', 9888, 9886, {0}, 0},{'\0', 0, 9887, {0}, 0}, + {'n', 9890, 9888, {0}, 0},{'\0', 0, 9889, {0}, 0},{'g', 9892, 9890, {0}, 0}, + {'\0', 0, 9891, {0}, 0},{'d', 9894, 9892, {0}, 0},{'\0', 0, 9893, {0}, 0}, + {'o', 9896, 9894, {0}, 0},{'\0', 0, 9895, {0}, 0},{'t', 9898, 9896, {0}, 0}, + {'\0', 0, 9897, {0}, 0},{'s', 9900, 9898, {0}, 0},{'\0', 0, 9899, {0}, 0}, + {'e', 9902, 9900, {0}, 0},{'\0', 0, 9901, {0}, 0},{'q', 9904, 9902, {0}, 0}, + {'\0', 0, 9903, {0}, 0},{';', 0, 9904, {8786}, 1},{'\0', 0, 9905, {0}, 0}, + {'y', 9908, 9906, {0}, 0},{'\0', 0, 9907, {0}, 0},{';', 0, 9908, {1092}, 1}, + {'\0', 0, 9909, {0}, 0},{'m', 9912, 9910, {0}, 0},{'\0', 0, 9911, {0}, 0}, + {'a', 9914, 9912, {0}, 0},{'\0', 0, 9913, {0}, 0},{'l', 9916, 9914, {0}, 0}, + {'\0', 0, 9915, {0}, 0},{'e', 9918, 9916, {0}, 0},{'\0', 0, 9917, {0}, 0}, + {';', 0, 9918, {9792}, 1},{'\0', 0, 9919, {0}, 0},{'i', 9924, 9920, {0}, 0}, + {'l', 9932, 9921, {0}, 0},{'r', 9945, 9922, {0}, 0},{'\0', 0, 9923, {0}, 0}, + {'l', 9926, 9924, {0}, 0},{'\0', 0, 9925, {0}, 0},{'i', 9928, 9926, {0}, 0}, + {'\0', 0, 9927, {0}, 0},{'g', 9930, 9928, {0}, 0},{'\0', 0, 9929, {0}, 0}, + {';', 0, 9930, {64259}, 1},{'\0', 0, 9931, {0}, 0},{'i', 9935, 9932, {0}, 0}, + {'l', 9939, 9933, {0}, 0},{'\0', 0, 9934, {0}, 0},{'g', 9937, 9935, {0}, 0}, + {'\0', 0, 9936, {0}, 0},{';', 0, 9937, {64256}, 1},{'\0', 0, 9938, {0}, 0}, + {'i', 9941, 9939, {0}, 0},{'\0', 0, 9940, {0}, 0},{'g', 9943, 9941, {0}, 0}, + {'\0', 0, 9942, {0}, 0},{';', 0, 9943, {64260}, 1},{'\0', 0, 9944, {0}, 0}, + {';', 0, 9945, {120099}, 1},{'\0', 0, 9946, {0}, 0},{'l', 9949, 9947, {0}, 0}, + {'\0', 0, 9948, {0}, 0},{'i', 9951, 9949, {0}, 0},{'\0', 0, 9950, {0}, 0}, + {'g', 9953, 9951, {0}, 0},{'\0', 0, 9952, {0}, 0},{';', 0, 9953, {64257}, 1}, + {'\0', 0, 9954, {0}, 0},{'l', 9957, 9955, {0}, 0},{'\0', 0, 9956, {0}, 0}, + {'i', 9959, 9957, {0}, 0},{'\0', 0, 9958, {0}, 0},{'g', 9961, 9959, {0}, 0}, + {'\0', 0, 9960, {0}, 0},{';', 0, 9961, {102,106}, 2},{'\0', 0, 9962, {0}, 0}, + {'a', 9967, 9963, {0}, 0},{'l', 9971, 9964, {0}, 0},{'t', 9977, 9965, {0}, 0}, + {'\0', 0, 9966, {0}, 0},{'t', 9969, 9967, {0}, 0},{'\0', 0, 9968, {0}, 0}, + {';', 0, 9969, {9837}, 1},{'\0', 0, 9970, {0}, 0},{'i', 9973, 9971, {0}, 0}, + {'\0', 0, 9972, {0}, 0},{'g', 9975, 9973, {0}, 0},{'\0', 0, 9974, {0}, 0}, + {';', 0, 9975, {64258}, 1},{'\0', 0, 9976, {0}, 0},{'n', 9979, 9977, {0}, 0}, + {'\0', 0, 9978, {0}, 0},{'s', 9981, 9979, {0}, 0},{'\0', 0, 9980, {0}, 0}, + {';', 0, 9981, {9649}, 1},{'\0', 0, 9982, {0}, 0},{'o', 9985, 9983, {0}, 0}, + {'\0', 0, 9984, {0}, 0},{'f', 9987, 9985, {0}, 0},{'\0', 0, 9986, {0}, 0}, + {';', 0, 9987, {402}, 1},{'\0', 0, 9988, {0}, 0},{'p', 9992, 9989, {0}, 0}, + {'r', 9996, 9990, {0}, 0},{'\0', 0, 9991, {0}, 0},{'f', 9994, 9992, {0}, 0}, + {'\0', 0, 9993, {0}, 0},{';', 0, 9994, {120151}, 1},{'\0', 0, 9995, {0}, 0}, + {'a', 9999, 9996, {0}, 0},{'k', 10005, 9997, {0}, 0},{'\0', 0, 9998, {0}, 0}, + {'l', 10001, 9999, {0}, 0},{'\0', 0, 10000, {0}, 0},{'l', 10003, 10001, {0}, 0}, + {'\0', 0, 10002, {0}, 0},{';', 0, 10003, {8704}, 1},{'\0', 0, 10004, {0}, 0}, + {';', 0, 10005, {8916}, 1},{'v', 10008, 10006, {0}, 0},{'\0', 0, 10007, {0}, 0}, + {';', 0, 10008, {10969}, 1},{'\0', 0, 10009, {0}, 0},{'a', 10012, 10010, {0}, 0}, + {'\0', 0, 10011, {0}, 0},{'r', 10014, 10012, {0}, 0},{'\0', 0, 10013, {0}, 0}, + {'t', 10016, 10014, {0}, 0},{'\0', 0, 10015, {0}, 0},{'i', 10018, 10016, {0}, 0}, + {'\0', 0, 10017, {0}, 0},{'n', 10020, 10018, {0}, 0},{'\0', 0, 10019, {0}, 0}, + {'t', 10022, 10020, {0}, 0},{'\0', 0, 10021, {0}, 0},{';', 0, 10022, {10765}, 1}, + {'\0', 0, 10023, {0}, 0},{'a', 10027, 10024, {0}, 0},{'o', 10092, 10025, {0}, 0}, + {'\0', 0, 10026, {0}, 0},{'c', 10030, 10027, {0}, 0},{'s', 10088, 10028, {0}, 0}, + {'\0', 0, 10029, {0}, 0},{'1', 10037, 10030, {0}, 0},{'2', 10056, 10031, {0}, 0}, + {'3', 10063, 10032, {0}, 0},{'4', 10073, 10033, {0}, 0},{'5', 10077, 10034, {0}, 0}, + {'7', 10084, 10035, {0}, 0},{'\0', 0, 10036, {0}, 0},{'2', 10044, 10037, {189}, 1}, + {'3', 10046, 10038, {0}, 0},{'4', 10048, 10039, {188}, 1},{'5', 10050, 10040, {0}, 0}, + {'6', 10052, 10041, {0}, 0},{'8', 10054, 10042, {0}, 0},{'\0', 0, 10043, {0}, 0}, + {';', 0, 10044, {189}, 1},{'\0', 0, 10045, {0}, 0},{';', 0, 10046, {8531}, 1}, + {'\0', 0, 10047, {0}, 0},{';', 0, 10048, {188}, 1},{'\0', 0, 10049, {0}, 0}, + {';', 0, 10050, {8533}, 1},{'\0', 0, 10051, {0}, 0},{';', 0, 10052, {8537}, 1}, + {'\0', 0, 10053, {0}, 0},{';', 0, 10054, {8539}, 1},{'\0', 0, 10055, {0}, 0}, + {'3', 10059, 10056, {0}, 0},{'5', 10061, 10057, {0}, 0},{'\0', 0, 10058, {0}, 0}, + {';', 0, 10059, {8532}, 1},{'\0', 0, 10060, {0}, 0},{';', 0, 10061, {8534}, 1}, + {'\0', 0, 10062, {0}, 0},{'4', 10067, 10063, {190}, 1},{'5', 10069, 10064, {0}, 0}, + {'8', 10071, 10065, {0}, 0},{'\0', 0, 10066, {0}, 0},{';', 0, 10067, {190}, 1}, + {'\0', 0, 10068, {0}, 0},{';', 0, 10069, {8535}, 1},{'\0', 0, 10070, {0}, 0}, + {';', 0, 10071, {8540}, 1},{'\0', 0, 10072, {0}, 0},{'5', 10075, 10073, {0}, 0}, + {'\0', 0, 10074, {0}, 0},{';', 0, 10075, {8536}, 1},{'\0', 0, 10076, {0}, 0}, + {'6', 10080, 10077, {0}, 0},{'8', 10082, 10078, {0}, 0},{'\0', 0, 10079, {0}, 0}, + {';', 0, 10080, {8538}, 1},{'\0', 0, 10081, {0}, 0},{';', 0, 10082, {8541}, 1}, + {'\0', 0, 10083, {0}, 0},{'8', 10086, 10084, {0}, 0},{'\0', 0, 10085, {0}, 0}, + {';', 0, 10086, {8542}, 1},{'\0', 0, 10087, {0}, 0},{'l', 10090, 10088, {0}, 0}, + {'\0', 0, 10089, {0}, 0},{';', 0, 10090, {8260}, 1},{'\0', 0, 10091, {0}, 0}, + {'w', 10094, 10092, {0}, 0},{'\0', 0, 10093, {0}, 0},{'n', 10096, 10094, {0}, 0}, + {'\0', 0, 10095, {0}, 0},{';', 0, 10096, {8994}, 1},{'\0', 0, 10097, {0}, 0}, + {'c', 10100, 10098, {0}, 0},{'\0', 0, 10099, {0}, 0},{'r', 10102, 10100, {0}, 0}, + {'\0', 0, 10101, {0}, 0},{';', 0, 10102, {119995}, 1},{'\0', 0, 10103, {0}, 0}, + {'E', 10122, 10104, {0}, 0},{'a', 10127, 10105, {0}, 0},{'b', 10150, 10106, {0}, 0}, + {'c', 10160, 10107, {0}, 0},{'d', 10171, 10108, {0}, 0},{'e', 10177, 10109, {0}, 0}, + {'f', 10228, 10110, {0}, 0},{'g', 10232, 10111, {0}, 0},{'i', 10237, 10112, {0}, 0}, + {'j', 10245, 10113, {0}, 0},{'l', 10251, 10114, {0}, 0},{'n', 10262, 10115, {0}, 0}, + {'o', 10296, 10116, {0}, 0},{'r', 10302, 10117, {0}, 0},{'s', 10310, 10118, {0}, 0}, + {'t', 10327, 10119, {62}, 1},{'v', 10433, 10120, {0}, 0},{'\0', 0, 10121, {0}, 0}, + {';', 0, 10122, {8807}, 1},{'l', 10125, 10123, {0}, 0},{'\0', 0, 10124, {0}, 0}, + {';', 0, 10125, {10892}, 1},{'\0', 0, 10126, {0}, 0},{'c', 10131, 10127, {0}, 0}, + {'m', 10139, 10128, {0}, 0},{'p', 10148, 10129, {0}, 0},{'\0', 0, 10130, {0}, 0}, + {'u', 10133, 10131, {0}, 0},{'\0', 0, 10132, {0}, 0},{'t', 10135, 10133, {0}, 0}, + {'\0', 0, 10134, {0}, 0},{'e', 10137, 10135, {0}, 0},{'\0', 0, 10136, {0}, 0}, + {';', 0, 10137, {501}, 1},{'\0', 0, 10138, {0}, 0},{'m', 10141, 10139, {0}, 0}, + {'\0', 0, 10140, {0}, 0},{'a', 10143, 10141, {0}, 0},{'\0', 0, 10142, {0}, 0}, + {';', 0, 10143, {947}, 1},{'d', 10146, 10144, {0}, 0},{'\0', 0, 10145, {0}, 0}, + {';', 0, 10146, {989}, 1},{'\0', 0, 10147, {0}, 0},{';', 0, 10148, {10886}, 1}, + {'\0', 0, 10149, {0}, 0},{'r', 10152, 10150, {0}, 0},{'\0', 0, 10151, {0}, 0}, + {'e', 10154, 10152, {0}, 0},{'\0', 0, 10153, {0}, 0},{'v', 10156, 10154, {0}, 0}, + {'\0', 0, 10155, {0}, 0},{'e', 10158, 10156, {0}, 0},{'\0', 0, 10157, {0}, 0}, + {';', 0, 10158, {287}, 1},{'\0', 0, 10159, {0}, 0},{'i', 10163, 10160, {0}, 0}, + {'y', 10169, 10161, {0}, 0},{'\0', 0, 10162, {0}, 0},{'r', 10165, 10163, {0}, 0}, + {'\0', 0, 10164, {0}, 0},{'c', 10167, 10165, {0}, 0},{'\0', 0, 10166, {0}, 0}, + {';', 0, 10167, {285}, 1},{'\0', 0, 10168, {0}, 0},{';', 0, 10169, {1075}, 1}, + {'\0', 0, 10170, {0}, 0},{'o', 10173, 10171, {0}, 0},{'\0', 0, 10172, {0}, 0}, + {'t', 10175, 10173, {0}, 0},{'\0', 0, 10174, {0}, 0},{';', 0, 10175, {289}, 1}, + {'\0', 0, 10176, {0}, 0},{';', 0, 10177, {8805}, 1},{'l', 10182, 10178, {0}, 0}, + {'q', 10184, 10179, {0}, 0},{'s', 10200, 10180, {0}, 0},{'\0', 0, 10181, {0}, 0}, + {';', 0, 10182, {8923}, 1},{'\0', 0, 10183, {0}, 0},{';', 0, 10184, {8805}, 1}, + {'q', 10188, 10185, {0}, 0},{'s', 10190, 10186, {0}, 0},{'\0', 0, 10187, {0}, 0}, + {';', 0, 10188, {8807}, 1},{'\0', 0, 10189, {0}, 0},{'l', 10192, 10190, {0}, 0}, + {'\0', 0, 10191, {0}, 0},{'a', 10194, 10192, {0}, 0},{'\0', 0, 10193, {0}, 0}, + {'n', 10196, 10194, {0}, 0},{'\0', 0, 10195, {0}, 0},{'t', 10198, 10196, {0}, 0}, + {'\0', 0, 10197, {0}, 0},{';', 0, 10198, {10878}, 1},{'\0', 0, 10199, {0}, 0}, + {';', 0, 10200, {10878}, 1},{'c', 10205, 10201, {0}, 0},{'d', 10209, 10202, {0}, 0}, + {'l', 10221, 10203, {0}, 0},{'\0', 0, 10204, {0}, 0},{'c', 10207, 10205, {0}, 0}, + {'\0', 0, 10206, {0}, 0},{';', 0, 10207, {10921}, 1},{'\0', 0, 10208, {0}, 0}, + {'o', 10211, 10209, {0}, 0},{'\0', 0, 10210, {0}, 0},{'t', 10213, 10211, {0}, 0}, + {'\0', 0, 10212, {0}, 0},{';', 0, 10213, {10880}, 1},{'o', 10216, 10214, {0}, 0}, + {'\0', 0, 10215, {0}, 0},{';', 0, 10216, {10882}, 1},{'l', 10219, 10217, {0}, 0}, + {'\0', 0, 10218, {0}, 0},{';', 0, 10219, {10884}, 1},{'\0', 0, 10220, {0}, 0}, + {';', 0, 10221, {8923,65024}, 2},{'e', 10224, 10222, {0}, 0},{'\0', 0, 10223, {0}, 0}, + {'s', 10226, 10224, {0}, 0},{'\0', 0, 10225, {0}, 0},{';', 0, 10226, {10900}, 1}, + {'\0', 0, 10227, {0}, 0},{'r', 10230, 10228, {0}, 0},{'\0', 0, 10229, {0}, 0}, + {';', 0, 10230, {120100}, 1},{'\0', 0, 10231, {0}, 0},{';', 0, 10232, {8811}, 1}, + {'g', 10235, 10233, {0}, 0},{'\0', 0, 10234, {0}, 0},{';', 0, 10235, {8921}, 1}, + {'\0', 0, 10236, {0}, 0},{'m', 10239, 10237, {0}, 0},{'\0', 0, 10238, {0}, 0}, + {'e', 10241, 10239, {0}, 0},{'\0', 0, 10240, {0}, 0},{'l', 10243, 10241, {0}, 0}, + {'\0', 0, 10242, {0}, 0},{';', 0, 10243, {8503}, 1},{'\0', 0, 10244, {0}, 0}, + {'c', 10247, 10245, {0}, 0},{'\0', 0, 10246, {0}, 0},{'y', 10249, 10247, {0}, 0}, + {'\0', 0, 10248, {0}, 0},{';', 0, 10249, {1107}, 1},{'\0', 0, 10250, {0}, 0}, + {';', 0, 10251, {8823}, 1},{'E', 10256, 10252, {0}, 0},{'a', 10258, 10253, {0}, 0}, + {'j', 10260, 10254, {0}, 0},{'\0', 0, 10255, {0}, 0},{';', 0, 10256, {10898}, 1}, + {'\0', 0, 10257, {0}, 0},{';', 0, 10258, {10917}, 1},{'\0', 0, 10259, {0}, 0}, + {';', 0, 10260, {10916}, 1},{'\0', 0, 10261, {0}, 0},{'E', 10267, 10262, {0}, 0}, + {'a', 10269, 10263, {0}, 0},{'e', 10282, 10264, {0}, 0},{'s', 10290, 10265, {0}, 0}, + {'\0', 0, 10266, {0}, 0},{';', 0, 10267, {8809}, 1},{'\0', 0, 10268, {0}, 0}, + {'p', 10271, 10269, {0}, 0},{'\0', 0, 10270, {0}, 0},{';', 0, 10271, {10890}, 1}, + {'p', 10274, 10272, {0}, 0},{'\0', 0, 10273, {0}, 0},{'r', 10276, 10274, {0}, 0}, + {'\0', 0, 10275, {0}, 0},{'o', 10278, 10276, {0}, 0},{'\0', 0, 10277, {0}, 0}, + {'x', 10280, 10278, {0}, 0},{'\0', 0, 10279, {0}, 0},{';', 0, 10280, {10890}, 1}, + {'\0', 0, 10281, {0}, 0},{';', 0, 10282, {10888}, 1},{'q', 10285, 10283, {0}, 0}, + {'\0', 0, 10284, {0}, 0},{';', 0, 10285, {10888}, 1},{'q', 10288, 10286, {0}, 0}, + {'\0', 0, 10287, {0}, 0},{';', 0, 10288, {8809}, 1},{'\0', 0, 10289, {0}, 0}, + {'i', 10292, 10290, {0}, 0},{'\0', 0, 10291, {0}, 0},{'m', 10294, 10292, {0}, 0}, + {'\0', 0, 10293, {0}, 0},{';', 0, 10294, {8935}, 1},{'\0', 0, 10295, {0}, 0}, + {'p', 10298, 10296, {0}, 0},{'\0', 0, 10297, {0}, 0},{'f', 10300, 10298, {0}, 0}, + {'\0', 0, 10299, {0}, 0},{';', 0, 10300, {120152}, 1},{'\0', 0, 10301, {0}, 0}, + {'a', 10304, 10302, {0}, 0},{'\0', 0, 10303, {0}, 0},{'v', 10306, 10304, {0}, 0}, + {'\0', 0, 10305, {0}, 0},{'e', 10308, 10306, {0}, 0},{'\0', 0, 10307, {0}, 0}, + {';', 0, 10308, {96}, 1},{'\0', 0, 10309, {0}, 0},{'c', 10313, 10310, {0}, 0}, + {'i', 10317, 10311, {0}, 0},{'\0', 0, 10312, {0}, 0},{'r', 10315, 10313, {0}, 0}, + {'\0', 0, 10314, {0}, 0},{';', 0, 10315, {8458}, 1},{'\0', 0, 10316, {0}, 0}, + {'m', 10319, 10317, {0}, 0},{'\0', 0, 10318, {0}, 0},{';', 0, 10319, {8819}, 1}, + {'e', 10323, 10320, {0}, 0},{'l', 10325, 10321, {0}, 0},{'\0', 0, 10322, {0}, 0}, + {';', 0, 10323, {10894}, 1},{'\0', 0, 10324, {0}, 0},{';', 0, 10325, {10896}, 1}, + {'\0', 0, 10326, {0}, 0},{';', 0, 10327, {62}, 1},{'c', 10334, 10328, {0}, 0}, + {'d', 10343, 10329, {0}, 0},{'l', 10349, 10330, {0}, 0},{'q', 10357, 10331, {0}, 0}, + {'r', 10367, 10332, {0}, 0},{'\0', 0, 10333, {0}, 0},{'c', 10337, 10334, {0}, 0}, + {'i', 10339, 10335, {0}, 0},{'\0', 0, 10336, {0}, 0},{';', 0, 10337, {10919}, 1}, + {'\0', 0, 10338, {0}, 0},{'r', 10341, 10339, {0}, 0},{'\0', 0, 10340, {0}, 0}, + {';', 0, 10341, {10874}, 1},{'\0', 0, 10342, {0}, 0},{'o', 10345, 10343, {0}, 0}, + {'\0', 0, 10344, {0}, 0},{'t', 10347, 10345, {0}, 0},{'\0', 0, 10346, {0}, 0}, + {';', 0, 10347, {8919}, 1},{'\0', 0, 10348, {0}, 0},{'P', 10351, 10349, {0}, 0}, + {'\0', 0, 10350, {0}, 0},{'a', 10353, 10351, {0}, 0},{'\0', 0, 10352, {0}, 0}, + {'r', 10355, 10353, {0}, 0},{'\0', 0, 10354, {0}, 0},{';', 0, 10355, {10645}, 1}, + {'\0', 0, 10356, {0}, 0},{'u', 10359, 10357, {0}, 0},{'\0', 0, 10358, {0}, 0}, + {'e', 10361, 10359, {0}, 0},{'\0', 0, 10360, {0}, 0},{'s', 10363, 10361, {0}, 0}, + {'\0', 0, 10362, {0}, 0},{'t', 10365, 10363, {0}, 0},{'\0', 0, 10364, {0}, 0}, + {';', 0, 10365, {10876}, 1},{'\0', 0, 10366, {0}, 0},{'a', 10373, 10367, {0}, 0}, + {'d', 10390, 10368, {0}, 0},{'e', 10396, 10369, {0}, 0},{'l', 10419, 10370, {0}, 0}, + {'s', 10427, 10371, {0}, 0},{'\0', 0, 10372, {0}, 0},{'p', 10376, 10373, {0}, 0}, + {'r', 10386, 10374, {0}, 0},{'\0', 0, 10375, {0}, 0},{'p', 10378, 10376, {0}, 0}, + {'\0', 0, 10377, {0}, 0},{'r', 10380, 10378, {0}, 0},{'\0', 0, 10379, {0}, 0}, + {'o', 10382, 10380, {0}, 0},{'\0', 0, 10381, {0}, 0},{'x', 10384, 10382, {0}, 0}, + {'\0', 0, 10383, {0}, 0},{';', 0, 10384, {10886}, 1},{'\0', 0, 10385, {0}, 0}, + {'r', 10388, 10386, {0}, 0},{'\0', 0, 10387, {0}, 0},{';', 0, 10388, {10616}, 1}, + {'\0', 0, 10389, {0}, 0},{'o', 10392, 10390, {0}, 0},{'\0', 0, 10391, {0}, 0}, + {'t', 10394, 10392, {0}, 0},{'\0', 0, 10393, {0}, 0},{';', 0, 10394, {8919}, 1}, + {'\0', 0, 10395, {0}, 0},{'q', 10398, 10396, {0}, 0},{'\0', 0, 10397, {0}, 0}, + {'l', 10401, 10398, {0}, 0},{'q', 10409, 10399, {0}, 0},{'\0', 0, 10400, {0}, 0}, + {'e', 10403, 10401, {0}, 0},{'\0', 0, 10402, {0}, 0},{'s', 10405, 10403, {0}, 0}, + {'\0', 0, 10404, {0}, 0},{'s', 10407, 10405, {0}, 0},{'\0', 0, 10406, {0}, 0}, + {';', 0, 10407, {8923}, 1},{'\0', 0, 10408, {0}, 0},{'l', 10411, 10409, {0}, 0}, + {'\0', 0, 10410, {0}, 0},{'e', 10413, 10411, {0}, 0},{'\0', 0, 10412, {0}, 0}, + {'s', 10415, 10413, {0}, 0},{'\0', 0, 10414, {0}, 0},{'s', 10417, 10415, {0}, 0}, + {'\0', 0, 10416, {0}, 0},{';', 0, 10417, {10892}, 1},{'\0', 0, 10418, {0}, 0}, + {'e', 10421, 10419, {0}, 0},{'\0', 0, 10420, {0}, 0},{'s', 10423, 10421, {0}, 0}, + {'\0', 0, 10422, {0}, 0},{'s', 10425, 10423, {0}, 0},{'\0', 0, 10424, {0}, 0}, + {';', 0, 10425, {8823}, 1},{'\0', 0, 10426, {0}, 0},{'i', 10429, 10427, {0}, 0}, + {'\0', 0, 10428, {0}, 0},{'m', 10431, 10429, {0}, 0},{'\0', 0, 10430, {0}, 0}, + {';', 0, 10431, {8819}, 1},{'\0', 0, 10432, {0}, 0},{'e', 10436, 10433, {0}, 0}, + {'n', 10450, 10434, {0}, 0},{'\0', 0, 10435, {0}, 0},{'r', 10438, 10436, {0}, 0}, + {'\0', 0, 10437, {0}, 0},{'t', 10440, 10438, {0}, 0},{'\0', 0, 10439, {0}, 0}, + {'n', 10442, 10440, {0}, 0},{'\0', 0, 10441, {0}, 0},{'e', 10444, 10442, {0}, 0}, + {'\0', 0, 10443, {0}, 0},{'q', 10446, 10444, {0}, 0},{'\0', 0, 10445, {0}, 0}, + {'q', 10448, 10446, {0}, 0},{'\0', 0, 10447, {0}, 0},{';', 0, 10448, {8809,65024}, 2}, + {'\0', 0, 10449, {0}, 0},{'E', 10452, 10450, {0}, 0},{'\0', 0, 10451, {0}, 0}, + {';', 0, 10452, {8809,65024}, 2},{'\0', 0, 10453, {0}, 0},{'A', 10465, 10454, {0}, 0}, + {'a', 10471, 10455, {0}, 0},{'b', 10517, 10456, {0}, 0},{'c', 10523, 10457, {0}, 0}, + {'e', 10531, 10458, {0}, 0},{'f', 10566, 10459, {0}, 0},{'k', 10570, 10460, {0}, 0}, + {'o', 10595, 10461, {0}, 0},{'s', 10670, 10462, {0}, 0},{'y', 10694, 10463, {0}, 0}, + {'\0', 0, 10464, {0}, 0},{'r', 10467, 10465, {0}, 0},{'\0', 0, 10466, {0}, 0}, + {'r', 10469, 10467, {0}, 0},{'\0', 0, 10468, {0}, 0},{';', 0, 10469, {8660}, 1}, + {'\0', 0, 10470, {0}, 0},{'i', 10476, 10471, {0}, 0},{'l', 10484, 10472, {0}, 0}, + {'m', 10488, 10473, {0}, 0},{'r', 10496, 10474, {0}, 0},{'\0', 0, 10475, {0}, 0}, + {'r', 10478, 10476, {0}, 0},{'\0', 0, 10477, {0}, 0},{'s', 10480, 10478, {0}, 0}, + {'\0', 0, 10479, {0}, 0},{'p', 10482, 10480, {0}, 0},{'\0', 0, 10481, {0}, 0}, + {';', 0, 10482, {8202}, 1},{'\0', 0, 10483, {0}, 0},{'f', 10486, 10484, {0}, 0}, + {'\0', 0, 10485, {0}, 0},{';', 0, 10486, {189}, 1},{'\0', 0, 10487, {0}, 0}, + {'i', 10490, 10488, {0}, 0},{'\0', 0, 10489, {0}, 0},{'l', 10492, 10490, {0}, 0}, + {'\0', 0, 10491, {0}, 0},{'t', 10494, 10492, {0}, 0},{'\0', 0, 10493, {0}, 0}, + {';', 0, 10494, {8459}, 1},{'\0', 0, 10495, {0}, 0},{'d', 10499, 10496, {0}, 0}, + {'r', 10505, 10497, {0}, 0},{'\0', 0, 10498, {0}, 0},{'c', 10501, 10499, {0}, 0}, + {'\0', 0, 10500, {0}, 0},{'y', 10503, 10501, {0}, 0},{'\0', 0, 10502, {0}, 0}, + {';', 0, 10503, {1098}, 1},{'\0', 0, 10504, {0}, 0},{';', 0, 10505, {8596}, 1}, + {'c', 10509, 10506, {0}, 0},{'w', 10515, 10507, {0}, 0},{'\0', 0, 10508, {0}, 0}, + {'i', 10511, 10509, {0}, 0},{'\0', 0, 10510, {0}, 0},{'r', 10513, 10511, {0}, 0}, + {'\0', 0, 10512, {0}, 0},{';', 0, 10513, {10568}, 1},{'\0', 0, 10514, {0}, 0}, + {';', 0, 10515, {8621}, 1},{'\0', 0, 10516, {0}, 0},{'a', 10519, 10517, {0}, 0}, + {'\0', 0, 10518, {0}, 0},{'r', 10521, 10519, {0}, 0},{'\0', 0, 10520, {0}, 0}, + {';', 0, 10521, {8463}, 1},{'\0', 0, 10522, {0}, 0},{'i', 10525, 10523, {0}, 0}, + {'\0', 0, 10524, {0}, 0},{'r', 10527, 10525, {0}, 0},{'\0', 0, 10526, {0}, 0}, + {'c', 10529, 10527, {0}, 0},{'\0', 0, 10528, {0}, 0},{';', 0, 10529, {293}, 1}, + {'\0', 0, 10530, {0}, 0},{'a', 10535, 10531, {0}, 0},{'l', 10550, 10532, {0}, 0}, + {'r', 10558, 10533, {0}, 0},{'\0', 0, 10534, {0}, 0},{'r', 10537, 10535, {0}, 0}, + {'\0', 0, 10536, {0}, 0},{'t', 10539, 10537, {0}, 0},{'\0', 0, 10538, {0}, 0}, + {'s', 10541, 10539, {0}, 0},{'\0', 0, 10540, {0}, 0},{';', 0, 10541, {9829}, 1}, + {'u', 10544, 10542, {0}, 0},{'\0', 0, 10543, {0}, 0},{'i', 10546, 10544, {0}, 0}, + {'\0', 0, 10545, {0}, 0},{'t', 10548, 10546, {0}, 0},{'\0', 0, 10547, {0}, 0}, + {';', 0, 10548, {9829}, 1},{'\0', 0, 10549, {0}, 0},{'l', 10552, 10550, {0}, 0}, + {'\0', 0, 10551, {0}, 0},{'i', 10554, 10552, {0}, 0},{'\0', 0, 10553, {0}, 0}, + {'p', 10556, 10554, {0}, 0},{'\0', 0, 10555, {0}, 0},{';', 0, 10556, {8230}, 1}, + {'\0', 0, 10557, {0}, 0},{'c', 10560, 10558, {0}, 0},{'\0', 0, 10559, {0}, 0}, + {'o', 10562, 10560, {0}, 0},{'\0', 0, 10561, {0}, 0},{'n', 10564, 10562, {0}, 0}, + {'\0', 0, 10563, {0}, 0},{';', 0, 10564, {8889}, 1},{'\0', 0, 10565, {0}, 0}, + {'r', 10568, 10566, {0}, 0},{'\0', 0, 10567, {0}, 0},{';', 0, 10568, {120101}, 1}, + {'\0', 0, 10569, {0}, 0},{'s', 10572, 10570, {0}, 0},{'\0', 0, 10571, {0}, 0}, + {'e', 10575, 10572, {0}, 0},{'w', 10585, 10573, {0}, 0},{'\0', 0, 10574, {0}, 0}, + {'a', 10577, 10575, {0}, 0},{'\0', 0, 10576, {0}, 0},{'r', 10579, 10577, {0}, 0}, + {'\0', 0, 10578, {0}, 0},{'o', 10581, 10579, {0}, 0},{'\0', 0, 10580, {0}, 0}, + {'w', 10583, 10581, {0}, 0},{'\0', 0, 10582, {0}, 0},{';', 0, 10583, {10533}, 1}, + {'\0', 0, 10584, {0}, 0},{'a', 10587, 10585, {0}, 0},{'\0', 0, 10586, {0}, 0}, + {'r', 10589, 10587, {0}, 0},{'\0', 0, 10588, {0}, 0},{'o', 10591, 10589, {0}, 0}, + {'\0', 0, 10590, {0}, 0},{'w', 10593, 10591, {0}, 0},{'\0', 0, 10592, {0}, 0}, + {';', 0, 10593, {10534}, 1},{'\0', 0, 10594, {0}, 0},{'a', 10601, 10595, {0}, 0}, + {'m', 10607, 10596, {0}, 0},{'o', 10615, 10597, {0}, 0},{'p', 10658, 10598, {0}, 0}, + {'r', 10662, 10599, {0}, 0},{'\0', 0, 10600, {0}, 0},{'r', 10603, 10601, {0}, 0}, + {'\0', 0, 10602, {0}, 0},{'r', 10605, 10603, {0}, 0},{'\0', 0, 10604, {0}, 0}, + {';', 0, 10605, {8703}, 1},{'\0', 0, 10606, {0}, 0},{'t', 10609, 10607, {0}, 0}, + {'\0', 0, 10608, {0}, 0},{'h', 10611, 10609, {0}, 0},{'\0', 0, 10610, {0}, 0}, + {'t', 10613, 10611, {0}, 0},{'\0', 0, 10612, {0}, 0},{';', 0, 10613, {8763}, 1}, + {'\0', 0, 10614, {0}, 0},{'k', 10617, 10615, {0}, 0},{'\0', 0, 10616, {0}, 0}, + {'l', 10620, 10617, {0}, 0},{'r', 10638, 10618, {0}, 0},{'\0', 0, 10619, {0}, 0}, + {'e', 10622, 10620, {0}, 0},{'\0', 0, 10621, {0}, 0},{'f', 10624, 10622, {0}, 0}, + {'\0', 0, 10623, {0}, 0},{'t', 10626, 10624, {0}, 0},{'\0', 0, 10625, {0}, 0}, + {'a', 10628, 10626, {0}, 0},{'\0', 0, 10627, {0}, 0},{'r', 10630, 10628, {0}, 0}, + {'\0', 0, 10629, {0}, 0},{'r', 10632, 10630, {0}, 0},{'\0', 0, 10631, {0}, 0}, + {'o', 10634, 10632, {0}, 0},{'\0', 0, 10633, {0}, 0},{'w', 10636, 10634, {0}, 0}, + {'\0', 0, 10635, {0}, 0},{';', 0, 10636, {8617}, 1},{'\0', 0, 10637, {0}, 0}, + {'i', 10640, 10638, {0}, 0},{'\0', 0, 10639, {0}, 0},{'g', 10642, 10640, {0}, 0}, + {'\0', 0, 10641, {0}, 0},{'h', 10644, 10642, {0}, 0},{'\0', 0, 10643, {0}, 0}, + {'t', 10646, 10644, {0}, 0},{'\0', 0, 10645, {0}, 0},{'a', 10648, 10646, {0}, 0}, + {'\0', 0, 10647, {0}, 0},{'r', 10650, 10648, {0}, 0},{'\0', 0, 10649, {0}, 0}, + {'r', 10652, 10650, {0}, 0},{'\0', 0, 10651, {0}, 0},{'o', 10654, 10652, {0}, 0}, + {'\0', 0, 10653, {0}, 0},{'w', 10656, 10654, {0}, 0},{'\0', 0, 10655, {0}, 0}, + {';', 0, 10656, {8618}, 1},{'\0', 0, 10657, {0}, 0},{'f', 10660, 10658, {0}, 0}, + {'\0', 0, 10659, {0}, 0},{';', 0, 10660, {120153}, 1},{'\0', 0, 10661, {0}, 0}, + {'b', 10664, 10662, {0}, 0},{'\0', 0, 10663, {0}, 0},{'a', 10666, 10664, {0}, 0}, + {'\0', 0, 10665, {0}, 0},{'r', 10668, 10666, {0}, 0},{'\0', 0, 10667, {0}, 0}, + {';', 0, 10668, {8213}, 1},{'\0', 0, 10669, {0}, 0},{'c', 10674, 10670, {0}, 0}, + {'l', 10678, 10671, {0}, 0},{'t', 10686, 10672, {0}, 0},{'\0', 0, 10673, {0}, 0}, + {'r', 10676, 10674, {0}, 0},{'\0', 0, 10675, {0}, 0},{';', 0, 10676, {119997}, 1}, + {'\0', 0, 10677, {0}, 0},{'a', 10680, 10678, {0}, 0},{'\0', 0, 10679, {0}, 0}, + {'s', 10682, 10680, {0}, 0},{'\0', 0, 10681, {0}, 0},{'h', 10684, 10682, {0}, 0}, + {'\0', 0, 10683, {0}, 0},{';', 0, 10684, {8463}, 1},{'\0', 0, 10685, {0}, 0}, + {'r', 10688, 10686, {0}, 0},{'\0', 0, 10687, {0}, 0},{'o', 10690, 10688, {0}, 0}, + {'\0', 0, 10689, {0}, 0},{'k', 10692, 10690, {0}, 0},{'\0', 0, 10691, {0}, 0}, + {';', 0, 10692, {295}, 1},{'\0', 0, 10693, {0}, 0},{'b', 10697, 10694, {0}, 0}, + {'p', 10705, 10695, {0}, 0},{'\0', 0, 10696, {0}, 0},{'u', 10699, 10697, {0}, 0}, + {'\0', 0, 10698, {0}, 0},{'l', 10701, 10699, {0}, 0},{'\0', 0, 10700, {0}, 0}, + {'l', 10703, 10701, {0}, 0},{'\0', 0, 10702, {0}, 0},{';', 0, 10703, {8259}, 1}, + {'\0', 0, 10704, {0}, 0},{'h', 10707, 10705, {0}, 0},{'\0', 0, 10706, {0}, 0}, + {'e', 10709, 10707, {0}, 0},{'\0', 0, 10708, {0}, 0},{'n', 10711, 10709, {0}, 0}, + {'\0', 0, 10710, {0}, 0},{';', 0, 10711, {8208}, 1},{'\0', 0, 10712, {0}, 0}, + {'a', 10729, 10713, {0}, 0},{'c', 10739, 10714, {0}, 0},{'e', 10751, 10715, {0}, 0}, + {'f', 10764, 10716, {0}, 0},{'g', 10771, 10717, {0}, 0},{'i', 10781, 10718, {0}, 0}, + {'j', 10813, 10719, {0}, 0},{'m', 10821, 10720, {0}, 0},{'n', 10869, 10721, {0}, 0}, + {'o', 10953, 10722, {0}, 0},{'p', 10976, 10723, {0}, 0},{'q', 10984, 10724, {0}, 0}, + {'s', 10994, 10725, {0}, 0},{'t', 11024, 10726, {0}, 0},{'u', 11035, 10727, {0}, 0}, + {'\0', 0, 10728, {0}, 0},{'c', 10731, 10729, {0}, 0},{'\0', 0, 10730, {0}, 0}, + {'u', 10733, 10731, {0}, 0},{'\0', 0, 10732, {0}, 0},{'t', 10735, 10733, {0}, 0}, + {'\0', 0, 10734, {0}, 0},{'e', 10737, 10735, {237}, 1},{'\0', 0, 10736, {0}, 0}, + {';', 0, 10737, {237}, 1},{'\0', 0, 10738, {0}, 0},{';', 0, 10739, {8291}, 1}, + {'i', 10743, 10740, {0}, 0},{'y', 10749, 10741, {0}, 0},{'\0', 0, 10742, {0}, 0}, + {'r', 10745, 10743, {0}, 0},{'\0', 0, 10744, {0}, 0},{'c', 10747, 10745, {238}, 1}, + {'\0', 0, 10746, {0}, 0},{';', 0, 10747, {238}, 1},{'\0', 0, 10748, {0}, 0}, + {';', 0, 10749, {1080}, 1},{'\0', 0, 10750, {0}, 0},{'c', 10754, 10751, {0}, 0}, + {'x', 10758, 10752, {0}, 0},{'\0', 0, 10753, {0}, 0},{'y', 10756, 10754, {0}, 0}, + {'\0', 0, 10755, {0}, 0},{';', 0, 10756, {1077}, 1},{'\0', 0, 10757, {0}, 0}, + {'c', 10760, 10758, {0}, 0},{'\0', 0, 10759, {0}, 0},{'l', 10762, 10760, {161}, 1}, + {'\0', 0, 10761, {0}, 0},{';', 0, 10762, {161}, 1},{'\0', 0, 10763, {0}, 0}, + {'f', 10767, 10764, {0}, 0},{'r', 10769, 10765, {0}, 0},{'\0', 0, 10766, {0}, 0}, + {';', 0, 10767, {8660}, 1},{'\0', 0, 10768, {0}, 0},{';', 0, 10769, {120102}, 1}, + {'\0', 0, 10770, {0}, 0},{'r', 10773, 10771, {0}, 0},{'\0', 0, 10772, {0}, 0}, + {'a', 10775, 10773, {0}, 0},{'\0', 0, 10774, {0}, 0},{'v', 10777, 10775, {0}, 0}, + {'\0', 0, 10776, {0}, 0},{'e', 10779, 10777, {236}, 1},{'\0', 0, 10778, {0}, 0}, + {';', 0, 10779, {236}, 1},{'\0', 0, 10780, {0}, 0},{';', 0, 10781, {8520}, 1}, + {'i', 10786, 10782, {0}, 0},{'n', 10799, 10783, {0}, 0},{'o', 10807, 10784, {0}, 0}, + {'\0', 0, 10785, {0}, 0},{'i', 10789, 10786, {0}, 0},{'n', 10795, 10787, {0}, 0}, + {'\0', 0, 10788, {0}, 0},{'n', 10791, 10789, {0}, 0},{'\0', 0, 10790, {0}, 0}, + {'t', 10793, 10791, {0}, 0},{'\0', 0, 10792, {0}, 0},{';', 0, 10793, {10764}, 1}, + {'\0', 0, 10794, {0}, 0},{'t', 10797, 10795, {0}, 0},{'\0', 0, 10796, {0}, 0}, + {';', 0, 10797, {8749}, 1},{'\0', 0, 10798, {0}, 0},{'f', 10801, 10799, {0}, 0}, + {'\0', 0, 10800, {0}, 0},{'i', 10803, 10801, {0}, 0},{'\0', 0, 10802, {0}, 0}, + {'n', 10805, 10803, {0}, 0},{'\0', 0, 10804, {0}, 0},{';', 0, 10805, {10716}, 1}, + {'\0', 0, 10806, {0}, 0},{'t', 10809, 10807, {0}, 0},{'\0', 0, 10808, {0}, 0}, + {'a', 10811, 10809, {0}, 0},{'\0', 0, 10810, {0}, 0},{';', 0, 10811, {8489}, 1}, + {'\0', 0, 10812, {0}, 0},{'l', 10815, 10813, {0}, 0},{'\0', 0, 10814, {0}, 0}, + {'i', 10817, 10815, {0}, 0},{'\0', 0, 10816, {0}, 0},{'g', 10819, 10817, {0}, 0}, + {'\0', 0, 10818, {0}, 0},{';', 0, 10819, {307}, 1},{'\0', 0, 10820, {0}, 0}, + {'a', 10825, 10821, {0}, 0},{'o', 10859, 10822, {0}, 0},{'p', 10863, 10823, {0}, 0}, + {'\0', 0, 10824, {0}, 0},{'c', 10829, 10825, {0}, 0},{'g', 10833, 10826, {0}, 0}, + {'t', 10855, 10827, {0}, 0},{'\0', 0, 10828, {0}, 0},{'r', 10831, 10829, {0}, 0}, + {'\0', 0, 10830, {0}, 0},{';', 0, 10831, {299}, 1},{'\0', 0, 10832, {0}, 0}, + {'e', 10837, 10833, {0}, 0},{'l', 10839, 10834, {0}, 0},{'p', 10847, 10835, {0}, 0}, + {'\0', 0, 10836, {0}, 0},{';', 0, 10837, {8465}, 1},{'\0', 0, 10838, {0}, 0}, + {'i', 10841, 10839, {0}, 0},{'\0', 0, 10840, {0}, 0},{'n', 10843, 10841, {0}, 0}, + {'\0', 0, 10842, {0}, 0},{'e', 10845, 10843, {0}, 0},{'\0', 0, 10844, {0}, 0}, + {';', 0, 10845, {8464}, 1},{'\0', 0, 10846, {0}, 0},{'a', 10849, 10847, {0}, 0}, + {'\0', 0, 10848, {0}, 0},{'r', 10851, 10849, {0}, 0},{'\0', 0, 10850, {0}, 0}, + {'t', 10853, 10851, {0}, 0},{'\0', 0, 10852, {0}, 0},{';', 0, 10853, {8465}, 1}, + {'\0', 0, 10854, {0}, 0},{'h', 10857, 10855, {0}, 0},{'\0', 0, 10856, {0}, 0}, + {';', 0, 10857, {305}, 1},{'\0', 0, 10858, {0}, 0},{'f', 10861, 10859, {0}, 0}, + {'\0', 0, 10860, {0}, 0},{';', 0, 10861, {8887}, 1},{'\0', 0, 10862, {0}, 0}, + {'e', 10865, 10863, {0}, 0},{'\0', 0, 10864, {0}, 0},{'d', 10867, 10865, {0}, 0}, + {'\0', 0, 10866, {0}, 0},{';', 0, 10867, {437}, 1},{'\0', 0, 10868, {0}, 0}, + {';', 0, 10869, {8712}, 1},{'c', 10875, 10870, {0}, 0},{'f', 10883, 10871, {0}, 0}, + {'o', 10896, 10872, {0}, 0},{'t', 10904, 10873, {0}, 0},{'\0', 0, 10874, {0}, 0}, + {'a', 10877, 10875, {0}, 0},{'\0', 0, 10876, {0}, 0},{'r', 10879, 10877, {0}, 0}, + {'\0', 0, 10878, {0}, 0},{'e', 10881, 10879, {0}, 0},{'\0', 0, 10880, {0}, 0}, + {';', 0, 10881, {8453}, 1},{'\0', 0, 10882, {0}, 0},{'i', 10885, 10883, {0}, 0}, + {'\0', 0, 10884, {0}, 0},{'n', 10887, 10885, {0}, 0},{'\0', 0, 10886, {0}, 0}, + {';', 0, 10887, {8734}, 1},{'t', 10890, 10888, {0}, 0},{'\0', 0, 10889, {0}, 0}, + {'i', 10892, 10890, {0}, 0},{'\0', 0, 10891, {0}, 0},{'e', 10894, 10892, {0}, 0}, + {'\0', 0, 10893, {0}, 0},{';', 0, 10894, {10717}, 1},{'\0', 0, 10895, {0}, 0}, + {'d', 10898, 10896, {0}, 0},{'\0', 0, 10897, {0}, 0},{'o', 10900, 10898, {0}, 0}, + {'\0', 0, 10899, {0}, 0},{'t', 10902, 10900, {0}, 0},{'\0', 0, 10901, {0}, 0}, + {';', 0, 10902, {305}, 1},{'\0', 0, 10903, {0}, 0},{';', 0, 10904, {8747}, 1}, + {'c', 10910, 10905, {0}, 0},{'e', 10916, 10906, {0}, 0},{'l', 10935, 10907, {0}, 0}, + {'p', 10945, 10908, {0}, 0},{'\0', 0, 10909, {0}, 0},{'a', 10912, 10910, {0}, 0}, + {'\0', 0, 10911, {0}, 0},{'l', 10914, 10912, {0}, 0},{'\0', 0, 10913, {0}, 0}, + {';', 0, 10914, {8890}, 1},{'\0', 0, 10915, {0}, 0},{'g', 10919, 10916, {0}, 0}, + {'r', 10927, 10917, {0}, 0},{'\0', 0, 10918, {0}, 0},{'e', 10921, 10919, {0}, 0}, + {'\0', 0, 10920, {0}, 0},{'r', 10923, 10921, {0}, 0},{'\0', 0, 10922, {0}, 0}, + {'s', 10925, 10923, {0}, 0},{'\0', 0, 10924, {0}, 0},{';', 0, 10925, {8484}, 1}, + {'\0', 0, 10926, {0}, 0},{'c', 10929, 10927, {0}, 0},{'\0', 0, 10928, {0}, 0}, + {'a', 10931, 10929, {0}, 0},{'\0', 0, 10930, {0}, 0},{'l', 10933, 10931, {0}, 0}, + {'\0', 0, 10932, {0}, 0},{';', 0, 10933, {8890}, 1},{'\0', 0, 10934, {0}, 0}, + {'a', 10937, 10935, {0}, 0},{'\0', 0, 10936, {0}, 0},{'r', 10939, 10937, {0}, 0}, + {'\0', 0, 10938, {0}, 0},{'h', 10941, 10939, {0}, 0},{'\0', 0, 10940, {0}, 0}, + {'k', 10943, 10941, {0}, 0},{'\0', 0, 10942, {0}, 0},{';', 0, 10943, {10775}, 1}, + {'\0', 0, 10944, {0}, 0},{'r', 10947, 10945, {0}, 0},{'\0', 0, 10946, {0}, 0}, + {'o', 10949, 10947, {0}, 0},{'\0', 0, 10948, {0}, 0},{'d', 10951, 10949, {0}, 0}, + {'\0', 0, 10950, {0}, 0},{';', 0, 10951, {10812}, 1},{'\0', 0, 10952, {0}, 0}, + {'c', 10958, 10953, {0}, 0},{'g', 10962, 10954, {0}, 0},{'p', 10968, 10955, {0}, 0}, + {'t', 10972, 10956, {0}, 0},{'\0', 0, 10957, {0}, 0},{'y', 10960, 10958, {0}, 0}, + {'\0', 0, 10959, {0}, 0},{';', 0, 10960, {1105}, 1},{'\0', 0, 10961, {0}, 0}, + {'o', 10964, 10962, {0}, 0},{'\0', 0, 10963, {0}, 0},{'n', 10966, 10964, {0}, 0}, + {'\0', 0, 10965, {0}, 0},{';', 0, 10966, {303}, 1},{'\0', 0, 10967, {0}, 0}, + {'f', 10970, 10968, {0}, 0},{'\0', 0, 10969, {0}, 0},{';', 0, 10970, {120154}, 1}, + {'\0', 0, 10971, {0}, 0},{'a', 10974, 10972, {0}, 0},{'\0', 0, 10973, {0}, 0}, + {';', 0, 10974, {953}, 1},{'\0', 0, 10975, {0}, 0},{'r', 10978, 10976, {0}, 0}, + {'\0', 0, 10977, {0}, 0},{'o', 10980, 10978, {0}, 0},{'\0', 0, 10979, {0}, 0}, + {'d', 10982, 10980, {0}, 0},{'\0', 0, 10981, {0}, 0},{';', 0, 10982, {10812}, 1}, + {'\0', 0, 10983, {0}, 0},{'u', 10986, 10984, {0}, 0},{'\0', 0, 10985, {0}, 0}, + {'e', 10988, 10986, {0}, 0},{'\0', 0, 10987, {0}, 0},{'s', 10990, 10988, {0}, 0}, + {'\0', 0, 10989, {0}, 0},{'t', 10992, 10990, {191}, 1},{'\0', 0, 10991, {0}, 0}, + {';', 0, 10992, {191}, 1},{'\0', 0, 10993, {0}, 0},{'c', 10997, 10994, {0}, 0}, + {'i', 11001, 10995, {0}, 0},{'\0', 0, 10996, {0}, 0},{'r', 10999, 10997, {0}, 0}, + {'\0', 0, 10998, {0}, 0},{';', 0, 10999, {119998}, 1},{'\0', 0, 11000, {0}, 0}, + {'n', 11003, 11001, {0}, 0},{'\0', 0, 11002, {0}, 0},{';', 0, 11003, {8712}, 1}, + {'E', 11009, 11004, {0}, 0},{'d', 11011, 11005, {0}, 0},{'s', 11017, 11006, {0}, 0}, + {'v', 11022, 11007, {0}, 0},{'\0', 0, 11008, {0}, 0},{';', 0, 11009, {8953}, 1}, + {'\0', 0, 11010, {0}, 0},{'o', 11013, 11011, {0}, 0},{'\0', 0, 11012, {0}, 0}, + {'t', 11015, 11013, {0}, 0},{'\0', 0, 11014, {0}, 0},{';', 0, 11015, {8949}, 1}, + {'\0', 0, 11016, {0}, 0},{';', 0, 11017, {8948}, 1},{'v', 11020, 11018, {0}, 0}, + {'\0', 0, 11019, {0}, 0},{';', 0, 11020, {8947}, 1},{'\0', 0, 11021, {0}, 0}, + {';', 0, 11022, {8712}, 1},{'\0', 0, 11023, {0}, 0},{';', 0, 11024, {8290}, 1}, + {'i', 11027, 11025, {0}, 0},{'\0', 0, 11026, {0}, 0},{'l', 11029, 11027, {0}, 0}, + {'\0', 0, 11028, {0}, 0},{'d', 11031, 11029, {0}, 0},{'\0', 0, 11030, {0}, 0}, + {'e', 11033, 11031, {0}, 0},{'\0', 0, 11032, {0}, 0},{';', 0, 11033, {297}, 1}, + {'\0', 0, 11034, {0}, 0},{'k', 11038, 11035, {0}, 0},{'m', 11044, 11036, {0}, 0}, + {'\0', 0, 11037, {0}, 0},{'c', 11040, 11038, {0}, 0},{'\0', 0, 11039, {0}, 0}, + {'y', 11042, 11040, {0}, 0},{'\0', 0, 11041, {0}, 0},{';', 0, 11042, {1110}, 1}, + {'\0', 0, 11043, {0}, 0},{'l', 11046, 11044, {239}, 1},{'\0', 0, 11045, {0}, 0}, + {';', 0, 11046, {239}, 1},{'\0', 0, 11047, {0}, 0},{'c', 11055, 11048, {0}, 0}, + {'f', 11066, 11049, {0}, 0},{'m', 11070, 11050, {0}, 0},{'o', 11078, 11051, {0}, 0}, + {'s', 11084, 11052, {0}, 0},{'u', 11099, 11053, {0}, 0},{'\0', 0, 11054, {0}, 0}, + {'i', 11058, 11055, {0}, 0},{'y', 11064, 11056, {0}, 0},{'\0', 0, 11057, {0}, 0}, + {'r', 11060, 11058, {0}, 0},{'\0', 0, 11059, {0}, 0},{'c', 11062, 11060, {0}, 0}, + {'\0', 0, 11061, {0}, 0},{';', 0, 11062, {309}, 1},{'\0', 0, 11063, {0}, 0}, + {';', 0, 11064, {1081}, 1},{'\0', 0, 11065, {0}, 0},{'r', 11068, 11066, {0}, 0}, + {'\0', 0, 11067, {0}, 0},{';', 0, 11068, {120103}, 1},{'\0', 0, 11069, {0}, 0}, + {'a', 11072, 11070, {0}, 0},{'\0', 0, 11071, {0}, 0},{'t', 11074, 11072, {0}, 0}, + {'\0', 0, 11073, {0}, 0},{'h', 11076, 11074, {0}, 0},{'\0', 0, 11075, {0}, 0}, + {';', 0, 11076, {567}, 1},{'\0', 0, 11077, {0}, 0},{'p', 11080, 11078, {0}, 0}, + {'\0', 0, 11079, {0}, 0},{'f', 11082, 11080, {0}, 0},{'\0', 0, 11081, {0}, 0}, + {';', 0, 11082, {120155}, 1},{'\0', 0, 11083, {0}, 0},{'c', 11087, 11084, {0}, 0}, + {'e', 11091, 11085, {0}, 0},{'\0', 0, 11086, {0}, 0},{'r', 11089, 11087, {0}, 0}, + {'\0', 0, 11088, {0}, 0},{';', 0, 11089, {119999}, 1},{'\0', 0, 11090, {0}, 0}, + {'r', 11093, 11091, {0}, 0},{'\0', 0, 11092, {0}, 0},{'c', 11095, 11093, {0}, 0}, + {'\0', 0, 11094, {0}, 0},{'y', 11097, 11095, {0}, 0},{'\0', 0, 11096, {0}, 0}, + {';', 0, 11097, {1112}, 1},{'\0', 0, 11098, {0}, 0},{'k', 11101, 11099, {0}, 0}, + {'\0', 0, 11100, {0}, 0},{'c', 11103, 11101, {0}, 0},{'\0', 0, 11102, {0}, 0}, + {'y', 11105, 11103, {0}, 0},{'\0', 0, 11104, {0}, 0},{';', 0, 11105, {1108}, 1}, + {'\0', 0, 11106, {0}, 0},{'a', 11116, 11107, {0}, 0},{'c', 11127, 11108, {0}, 0}, + {'f', 11140, 11109, {0}, 0},{'g', 11144, 11110, {0}, 0},{'h', 11154, 11111, {0}, 0}, + {'j', 11160, 11112, {0}, 0},{'o', 11166, 11113, {0}, 0},{'s', 11172, 11114, {0}, 0}, + {'\0', 0, 11115, {0}, 0},{'p', 11118, 11116, {0}, 0},{'\0', 0, 11117, {0}, 0}, + {'p', 11120, 11118, {0}, 0},{'\0', 0, 11119, {0}, 0},{'a', 11122, 11120, {0}, 0}, + {'\0', 0, 11121, {0}, 0},{';', 0, 11122, {954}, 1},{'v', 11125, 11123, {0}, 0}, + {'\0', 0, 11124, {0}, 0},{';', 0, 11125, {1008}, 1},{'\0', 0, 11126, {0}, 0}, + {'e', 11130, 11127, {0}, 0},{'y', 11138, 11128, {0}, 0},{'\0', 0, 11129, {0}, 0}, + {'d', 11132, 11130, {0}, 0},{'\0', 0, 11131, {0}, 0},{'i', 11134, 11132, {0}, 0}, + {'\0', 0, 11133, {0}, 0},{'l', 11136, 11134, {0}, 0},{'\0', 0, 11135, {0}, 0}, + {';', 0, 11136, {311}, 1},{'\0', 0, 11137, {0}, 0},{';', 0, 11138, {1082}, 1}, + {'\0', 0, 11139, {0}, 0},{'r', 11142, 11140, {0}, 0},{'\0', 0, 11141, {0}, 0}, + {';', 0, 11142, {120104}, 1},{'\0', 0, 11143, {0}, 0},{'r', 11146, 11144, {0}, 0}, + {'\0', 0, 11145, {0}, 0},{'e', 11148, 11146, {0}, 0},{'\0', 0, 11147, {0}, 0}, + {'e', 11150, 11148, {0}, 0},{'\0', 0, 11149, {0}, 0},{'n', 11152, 11150, {0}, 0}, + {'\0', 0, 11151, {0}, 0},{';', 0, 11152, {312}, 1},{'\0', 0, 11153, {0}, 0}, + {'c', 11156, 11154, {0}, 0},{'\0', 0, 11155, {0}, 0},{'y', 11158, 11156, {0}, 0}, + {'\0', 0, 11157, {0}, 0},{';', 0, 11158, {1093}, 1},{'\0', 0, 11159, {0}, 0}, + {'c', 11162, 11160, {0}, 0},{'\0', 0, 11161, {0}, 0},{'y', 11164, 11162, {0}, 0}, + {'\0', 0, 11163, {0}, 0},{';', 0, 11164, {1116}, 1},{'\0', 0, 11165, {0}, 0}, + {'p', 11168, 11166, {0}, 0},{'\0', 0, 11167, {0}, 0},{'f', 11170, 11168, {0}, 0}, + {'\0', 0, 11169, {0}, 0},{';', 0, 11170, {120156}, 1},{'\0', 0, 11171, {0}, 0}, + {'c', 11174, 11172, {0}, 0},{'\0', 0, 11173, {0}, 0},{'r', 11176, 11174, {0}, 0}, + {'\0', 0, 11175, {0}, 0},{';', 0, 11176, {120000}, 1},{'\0', 0, 11177, {0}, 0}, + {'A', 11202, 11178, {0}, 0},{'B', 11224, 11179, {0}, 0},{'E', 11232, 11180, {0}, 0}, + {'H', 11237, 11181, {0}, 0},{'a', 11243, 11182, {0}, 0},{'b', 11368, 11183, {0}, 0}, + {'c', 11410, 11184, {0}, 0},{'d', 11442, 11185, {0}, 0},{'e', 11485, 11186, {0}, 0}, + {'f', 11748, 11187, {0}, 0},{'g', 11770, 11188, {0}, 0},{'h', 11775, 11189, {0}, 0}, + {'j', 11796, 11190, {0}, 0},{'l', 11802, 11191, {0}, 0},{'m', 11840, 11192, {0}, 0}, + {'n', 11868, 11193, {0}, 0},{'o', 11902, 11194, {0}, 0},{'p', 12093, 11195, {0}, 0}, + {'r', 12104, 11196, {0}, 0},{'s', 12145, 11197, {0}, 0},{'t', 12196, 11198, {60}, 1}, + {'u', 12271, 11199, {0}, 0},{'v', 12294, 11200, {0}, 0},{'\0', 0, 11201, {0}, 0}, + {'a', 11206, 11202, {0}, 0},{'r', 11212, 11203, {0}, 0},{'t', 11216, 11204, {0}, 0}, + {'\0', 0, 11205, {0}, 0},{'r', 11208, 11206, {0}, 0},{'\0', 0, 11207, {0}, 0}, + {'r', 11210, 11208, {0}, 0},{'\0', 0, 11209, {0}, 0},{';', 0, 11210, {8666}, 1}, + {'\0', 0, 11211, {0}, 0},{'r', 11214, 11212, {0}, 0},{'\0', 0, 11213, {0}, 0}, + {';', 0, 11214, {8656}, 1},{'\0', 0, 11215, {0}, 0},{'a', 11218, 11216, {0}, 0}, + {'\0', 0, 11217, {0}, 0},{'i', 11220, 11218, {0}, 0},{'\0', 0, 11219, {0}, 0}, + {'l', 11222, 11220, {0}, 0},{'\0', 0, 11221, {0}, 0},{';', 0, 11222, {10523}, 1}, + {'\0', 0, 11223, {0}, 0},{'a', 11226, 11224, {0}, 0},{'\0', 0, 11225, {0}, 0}, + {'r', 11228, 11226, {0}, 0},{'\0', 0, 11227, {0}, 0},{'r', 11230, 11228, {0}, 0}, + {'\0', 0, 11229, {0}, 0},{';', 0, 11230, {10510}, 1},{'\0', 0, 11231, {0}, 0}, + {';', 0, 11232, {8806}, 1},{'g', 11235, 11233, {0}, 0},{'\0', 0, 11234, {0}, 0}, + {';', 0, 11235, {10891}, 1},{'\0', 0, 11236, {0}, 0},{'a', 11239, 11237, {0}, 0}, + {'\0', 0, 11238, {0}, 0},{'r', 11241, 11239, {0}, 0},{'\0', 0, 11240, {0}, 0}, + {';', 0, 11241, {10594}, 1},{'\0', 0, 11242, {0}, 0},{'c', 11253, 11243, {0}, 0}, + {'e', 11261, 11244, {0}, 0},{'g', 11273, 11245, {0}, 0},{'m', 11281, 11246, {0}, 0}, + {'n', 11289, 11247, {0}, 0},{'p', 11301, 11248, {0}, 0},{'q', 11303, 11249, {0}, 0}, + {'r', 11309, 11250, {0}, 0},{'t', 11353, 11251, {0}, 0},{'\0', 0, 11252, {0}, 0}, + {'u', 11255, 11253, {0}, 0},{'\0', 0, 11254, {0}, 0},{'t', 11257, 11255, {0}, 0}, + {'\0', 0, 11256, {0}, 0},{'e', 11259, 11257, {0}, 0},{'\0', 0, 11258, {0}, 0}, + {';', 0, 11259, {314}, 1},{'\0', 0, 11260, {0}, 0},{'m', 11263, 11261, {0}, 0}, + {'\0', 0, 11262, {0}, 0},{'p', 11265, 11263, {0}, 0},{'\0', 0, 11264, {0}, 0}, + {'t', 11267, 11265, {0}, 0},{'\0', 0, 11266, {0}, 0},{'y', 11269, 11267, {0}, 0}, + {'\0', 0, 11268, {0}, 0},{'v', 11271, 11269, {0}, 0},{'\0', 0, 11270, {0}, 0}, + {';', 0, 11271, {10676}, 1},{'\0', 0, 11272, {0}, 0},{'r', 11275, 11273, {0}, 0}, + {'\0', 0, 11274, {0}, 0},{'a', 11277, 11275, {0}, 0},{'\0', 0, 11276, {0}, 0}, + {'n', 11279, 11277, {0}, 0},{'\0', 0, 11278, {0}, 0},{';', 0, 11279, {8466}, 1}, + {'\0', 0, 11280, {0}, 0},{'b', 11283, 11281, {0}, 0},{'\0', 0, 11282, {0}, 0}, + {'d', 11285, 11283, {0}, 0},{'\0', 0, 11284, {0}, 0},{'a', 11287, 11285, {0}, 0}, + {'\0', 0, 11286, {0}, 0},{';', 0, 11287, {955}, 1},{'\0', 0, 11288, {0}, 0}, + {'g', 11291, 11289, {0}, 0},{'\0', 0, 11290, {0}, 0},{';', 0, 11291, {10216}, 1}, + {'d', 11295, 11292, {0}, 0},{'l', 11297, 11293, {0}, 0},{'\0', 0, 11294, {0}, 0}, + {';', 0, 11295, {10641}, 1},{'\0', 0, 11296, {0}, 0},{'e', 11299, 11297, {0}, 0}, + {'\0', 0, 11298, {0}, 0},{';', 0, 11299, {10216}, 1},{'\0', 0, 11300, {0}, 0}, + {';', 0, 11301, {10885}, 1},{'\0', 0, 11302, {0}, 0},{'u', 11305, 11303, {0}, 0}, + {'\0', 0, 11304, {0}, 0},{'o', 11307, 11305, {171}, 1},{'\0', 0, 11306, {0}, 0}, + {';', 0, 11307, {171}, 1},{'\0', 0, 11308, {0}, 0},{'r', 11311, 11309, {0}, 0}, + {'\0', 0, 11310, {0}, 0},{';', 0, 11311, {8592}, 1},{'b', 11320, 11312, {0}, 0}, + {'f', 11327, 11313, {0}, 0},{'h', 11331, 11314, {0}, 0},{'l', 11335, 11315, {0}, 0}, + {'p', 11339, 11316, {0}, 0},{'s', 11343, 11317, {0}, 0},{'t', 11349, 11318, {0}, 0}, + {'\0', 0, 11319, {0}, 0},{';', 0, 11320, {8676}, 1},{'f', 11323, 11321, {0}, 0}, + {'\0', 0, 11322, {0}, 0},{'s', 11325, 11323, {0}, 0},{'\0', 0, 11324, {0}, 0}, + {';', 0, 11325, {10527}, 1},{'\0', 0, 11326, {0}, 0},{'s', 11329, 11327, {0}, 0}, + {'\0', 0, 11328, {0}, 0},{';', 0, 11329, {10525}, 1},{'\0', 0, 11330, {0}, 0}, + {'k', 11333, 11331, {0}, 0},{'\0', 0, 11332, {0}, 0},{';', 0, 11333, {8617}, 1}, + {'\0', 0, 11334, {0}, 0},{'p', 11337, 11335, {0}, 0},{'\0', 0, 11336, {0}, 0}, + {';', 0, 11337, {8619}, 1},{'\0', 0, 11338, {0}, 0},{'l', 11341, 11339, {0}, 0}, + {'\0', 0, 11340, {0}, 0},{';', 0, 11341, {10553}, 1},{'\0', 0, 11342, {0}, 0}, + {'i', 11345, 11343, {0}, 0},{'\0', 0, 11344, {0}, 0},{'m', 11347, 11345, {0}, 0}, + {'\0', 0, 11346, {0}, 0},{';', 0, 11347, {10611}, 1},{'\0', 0, 11348, {0}, 0}, + {'l', 11351, 11349, {0}, 0},{'\0', 0, 11350, {0}, 0},{';', 0, 11351, {8610}, 1}, + {'\0', 0, 11352, {0}, 0},{';', 0, 11353, {10923}, 1},{'a', 11357, 11354, {0}, 0}, + {'e', 11363, 11355, {0}, 0},{'\0', 0, 11356, {0}, 0},{'i', 11359, 11357, {0}, 0}, + {'\0', 0, 11358, {0}, 0},{'l', 11361, 11359, {0}, 0},{'\0', 0, 11360, {0}, 0}, + {';', 0, 11361, {10521}, 1},{'\0', 0, 11362, {0}, 0},{';', 0, 11363, {10925}, 1}, + {'s', 11366, 11364, {0}, 0},{'\0', 0, 11365, {0}, 0},{';', 0, 11366, {10925,65024}, 2}, + {'\0', 0, 11367, {0}, 0},{'a', 11372, 11368, {0}, 0},{'b', 11378, 11369, {0}, 0}, + {'r', 11384, 11370, {0}, 0},{'\0', 0, 11371, {0}, 0},{'r', 11374, 11372, {0}, 0}, + {'\0', 0, 11373, {0}, 0},{'r', 11376, 11374, {0}, 0},{'\0', 0, 11375, {0}, 0}, + {';', 0, 11376, {10508}, 1},{'\0', 0, 11377, {0}, 0},{'r', 11380, 11378, {0}, 0}, + {'\0', 0, 11379, {0}, 0},{'k', 11382, 11380, {0}, 0},{'\0', 0, 11381, {0}, 0}, + {';', 0, 11382, {10098}, 1},{'\0', 0, 11383, {0}, 0},{'a', 11387, 11384, {0}, 0}, + {'k', 11396, 11385, {0}, 0},{'\0', 0, 11386, {0}, 0},{'c', 11389, 11387, {0}, 0}, + {'\0', 0, 11388, {0}, 0},{'e', 11392, 11389, {0}, 0},{'k', 11394, 11390, {0}, 0}, + {'\0', 0, 11391, {0}, 0},{';', 0, 11392, {123}, 1},{'\0', 0, 11393, {0}, 0}, + {';', 0, 11394, {91}, 1},{'\0', 0, 11395, {0}, 0},{'e', 11399, 11396, {0}, 0}, + {'s', 11401, 11397, {0}, 0},{'\0', 0, 11398, {0}, 0},{';', 0, 11399, {10635}, 1}, + {'\0', 0, 11400, {0}, 0},{'l', 11403, 11401, {0}, 0},{'\0', 0, 11402, {0}, 0}, + {'d', 11406, 11403, {0}, 0},{'u', 11408, 11404, {0}, 0},{'\0', 0, 11405, {0}, 0}, + {';', 0, 11406, {10639}, 1},{'\0', 0, 11407, {0}, 0},{';', 0, 11408, {10637}, 1}, + {'\0', 0, 11409, {0}, 0},{'a', 11415, 11410, {0}, 0},{'e', 11423, 11411, {0}, 0}, + {'u', 11436, 11412, {0}, 0},{'y', 11440, 11413, {0}, 0},{'\0', 0, 11414, {0}, 0}, + {'r', 11417, 11415, {0}, 0},{'\0', 0, 11416, {0}, 0},{'o', 11419, 11417, {0}, 0}, + {'\0', 0, 11418, {0}, 0},{'n', 11421, 11419, {0}, 0},{'\0', 0, 11420, {0}, 0}, + {';', 0, 11421, {318}, 1},{'\0', 0, 11422, {0}, 0},{'d', 11426, 11423, {0}, 0}, + {'i', 11432, 11424, {0}, 0},{'\0', 0, 11425, {0}, 0},{'i', 11428, 11426, {0}, 0}, + {'\0', 0, 11427, {0}, 0},{'l', 11430, 11428, {0}, 0},{'\0', 0, 11429, {0}, 0}, + {';', 0, 11430, {316}, 1},{'\0', 0, 11431, {0}, 0},{'l', 11434, 11432, {0}, 0}, + {'\0', 0, 11433, {0}, 0},{';', 0, 11434, {8968}, 1},{'\0', 0, 11435, {0}, 0}, + {'b', 11438, 11436, {0}, 0},{'\0', 0, 11437, {0}, 0},{';', 0, 11438, {123}, 1}, + {'\0', 0, 11439, {0}, 0},{';', 0, 11440, {1083}, 1},{'\0', 0, 11441, {0}, 0}, + {'c', 11447, 11442, {0}, 0},{'q', 11451, 11443, {0}, 0},{'r', 11460, 11444, {0}, 0}, + {'s', 11481, 11445, {0}, 0},{'\0', 0, 11446, {0}, 0},{'a', 11449, 11447, {0}, 0}, + {'\0', 0, 11448, {0}, 0},{';', 0, 11449, {10550}, 1},{'\0', 0, 11450, {0}, 0}, + {'u', 11453, 11451, {0}, 0},{'\0', 0, 11452, {0}, 0},{'o', 11455, 11453, {0}, 0}, + {'\0', 0, 11454, {0}, 0},{';', 0, 11455, {8220}, 1},{'r', 11458, 11456, {0}, 0}, + {'\0', 0, 11457, {0}, 0},{';', 0, 11458, {8222}, 1},{'\0', 0, 11459, {0}, 0}, + {'d', 11463, 11460, {0}, 0},{'u', 11471, 11461, {0}, 0},{'\0', 0, 11462, {0}, 0}, + {'h', 11465, 11463, {0}, 0},{'\0', 0, 11464, {0}, 0},{'a', 11467, 11465, {0}, 0}, + {'\0', 0, 11466, {0}, 0},{'r', 11469, 11467, {0}, 0},{'\0', 0, 11468, {0}, 0}, + {';', 0, 11469, {10599}, 1},{'\0', 0, 11470, {0}, 0},{'s', 11473, 11471, {0}, 0}, + {'\0', 0, 11472, {0}, 0},{'h', 11475, 11473, {0}, 0},{'\0', 0, 11474, {0}, 0}, + {'a', 11477, 11475, {0}, 0},{'\0', 0, 11476, {0}, 0},{'r', 11479, 11477, {0}, 0}, + {'\0', 0, 11478, {0}, 0},{';', 0, 11479, {10571}, 1},{'\0', 0, 11480, {0}, 0}, + {'h', 11483, 11481, {0}, 0},{'\0', 0, 11482, {0}, 0},{';', 0, 11483, {8626}, 1}, + {'\0', 0, 11484, {0}, 0},{';', 0, 11485, {8804}, 1},{'f', 11491, 11486, {0}, 0}, + {'g', 11646, 11487, {0}, 0},{'q', 11648, 11488, {0}, 0},{'s', 11664, 11489, {0}, 0}, + {'\0', 0, 11490, {0}, 0},{'t', 11493, 11491, {0}, 0},{'\0', 0, 11492, {0}, 0}, + {'a', 11499, 11493, {0}, 0},{'h', 11518, 11494, {0}, 0},{'l', 11545, 11495, {0}, 0}, + {'r', 11565, 11496, {0}, 0},{'t', 11626, 11497, {0}, 0},{'\0', 0, 11498, {0}, 0}, + {'r', 11501, 11499, {0}, 0},{'\0', 0, 11500, {0}, 0},{'r', 11503, 11501, {0}, 0}, + {'\0', 0, 11502, {0}, 0},{'o', 11505, 11503, {0}, 0},{'\0', 0, 11504, {0}, 0}, + {'w', 11507, 11505, {0}, 0},{'\0', 0, 11506, {0}, 0},{';', 0, 11507, {8592}, 1}, + {'t', 11510, 11508, {0}, 0},{'\0', 0, 11509, {0}, 0},{'a', 11512, 11510, {0}, 0}, + {'\0', 0, 11511, {0}, 0},{'i', 11514, 11512, {0}, 0},{'\0', 0, 11513, {0}, 0}, + {'l', 11516, 11514, {0}, 0},{'\0', 0, 11515, {0}, 0},{';', 0, 11516, {8610}, 1}, + {'\0', 0, 11517, {0}, 0},{'a', 11520, 11518, {0}, 0},{'\0', 0, 11519, {0}, 0}, + {'r', 11522, 11520, {0}, 0},{'\0', 0, 11521, {0}, 0},{'p', 11524, 11522, {0}, 0}, + {'\0', 0, 11523, {0}, 0},{'o', 11526, 11524, {0}, 0},{'\0', 0, 11525, {0}, 0}, + {'o', 11528, 11526, {0}, 0},{'\0', 0, 11527, {0}, 0},{'n', 11530, 11528, {0}, 0}, + {'\0', 0, 11529, {0}, 0},{'d', 11533, 11530, {0}, 0},{'u', 11541, 11531, {0}, 0}, + {'\0', 0, 11532, {0}, 0},{'o', 11535, 11533, {0}, 0},{'\0', 0, 11534, {0}, 0}, + {'w', 11537, 11535, {0}, 0},{'\0', 0, 11536, {0}, 0},{'n', 11539, 11537, {0}, 0}, + {'\0', 0, 11538, {0}, 0},{';', 0, 11539, {8637}, 1},{'\0', 0, 11540, {0}, 0}, + {'p', 11543, 11541, {0}, 0},{'\0', 0, 11542, {0}, 0},{';', 0, 11543, {8636}, 1}, + {'\0', 0, 11544, {0}, 0},{'e', 11547, 11545, {0}, 0},{'\0', 0, 11546, {0}, 0}, + {'f', 11549, 11547, {0}, 0},{'\0', 0, 11548, {0}, 0},{'t', 11551, 11549, {0}, 0}, + {'\0', 0, 11550, {0}, 0},{'a', 11553, 11551, {0}, 0},{'\0', 0, 11552, {0}, 0}, + {'r', 11555, 11553, {0}, 0},{'\0', 0, 11554, {0}, 0},{'r', 11557, 11555, {0}, 0}, + {'\0', 0, 11556, {0}, 0},{'o', 11559, 11557, {0}, 0},{'\0', 0, 11558, {0}, 0}, + {'w', 11561, 11559, {0}, 0},{'\0', 0, 11560, {0}, 0},{'s', 11563, 11561, {0}, 0}, + {'\0', 0, 11562, {0}, 0},{';', 0, 11563, {8647}, 1},{'\0', 0, 11564, {0}, 0}, + {'i', 11567, 11565, {0}, 0},{'\0', 0, 11566, {0}, 0},{'g', 11569, 11567, {0}, 0}, + {'\0', 0, 11568, {0}, 0},{'h', 11571, 11569, {0}, 0},{'\0', 0, 11570, {0}, 0}, + {'t', 11573, 11571, {0}, 0},{'\0', 0, 11572, {0}, 0},{'a', 11577, 11573, {0}, 0}, + {'h', 11590, 11574, {0}, 0},{'s', 11606, 11575, {0}, 0},{'\0', 0, 11576, {0}, 0}, + {'r', 11579, 11577, {0}, 0},{'\0', 0, 11578, {0}, 0},{'r', 11581, 11579, {0}, 0}, + {'\0', 0, 11580, {0}, 0},{'o', 11583, 11581, {0}, 0},{'\0', 0, 11582, {0}, 0}, + {'w', 11585, 11583, {0}, 0},{'\0', 0, 11584, {0}, 0},{';', 0, 11585, {8596}, 1}, + {'s', 11588, 11586, {0}, 0},{'\0', 0, 11587, {0}, 0},{';', 0, 11588, {8646}, 1}, + {'\0', 0, 11589, {0}, 0},{'a', 11592, 11590, {0}, 0},{'\0', 0, 11591, {0}, 0}, + {'r', 11594, 11592, {0}, 0},{'\0', 0, 11593, {0}, 0},{'p', 11596, 11594, {0}, 0}, + {'\0', 0, 11595, {0}, 0},{'o', 11598, 11596, {0}, 0},{'\0', 0, 11597, {0}, 0}, + {'o', 11600, 11598, {0}, 0},{'\0', 0, 11599, {0}, 0},{'n', 11602, 11600, {0}, 0}, + {'\0', 0, 11601, {0}, 0},{'s', 11604, 11602, {0}, 0},{'\0', 0, 11603, {0}, 0}, + {';', 0, 11604, {8651}, 1},{'\0', 0, 11605, {0}, 0},{'q', 11608, 11606, {0}, 0}, + {'\0', 0, 11607, {0}, 0},{'u', 11610, 11608, {0}, 0},{'\0', 0, 11609, {0}, 0}, + {'i', 11612, 11610, {0}, 0},{'\0', 0, 11611, {0}, 0},{'g', 11614, 11612, {0}, 0}, + {'\0', 0, 11613, {0}, 0},{'a', 11616, 11614, {0}, 0},{'\0', 0, 11615, {0}, 0}, + {'r', 11618, 11616, {0}, 0},{'\0', 0, 11617, {0}, 0},{'r', 11620, 11618, {0}, 0}, + {'\0', 0, 11619, {0}, 0},{'o', 11622, 11620, {0}, 0},{'\0', 0, 11621, {0}, 0}, + {'w', 11624, 11622, {0}, 0},{'\0', 0, 11623, {0}, 0},{';', 0, 11624, {8621}, 1}, + {'\0', 0, 11625, {0}, 0},{'h', 11628, 11626, {0}, 0},{'\0', 0, 11627, {0}, 0}, + {'r', 11630, 11628, {0}, 0},{'\0', 0, 11629, {0}, 0},{'e', 11632, 11630, {0}, 0}, + {'\0', 0, 11631, {0}, 0},{'e', 11634, 11632, {0}, 0},{'\0', 0, 11633, {0}, 0}, + {'t', 11636, 11634, {0}, 0},{'\0', 0, 11635, {0}, 0},{'i', 11638, 11636, {0}, 0}, + {'\0', 0, 11637, {0}, 0},{'m', 11640, 11638, {0}, 0},{'\0', 0, 11639, {0}, 0}, + {'e', 11642, 11640, {0}, 0},{'\0', 0, 11641, {0}, 0},{'s', 11644, 11642, {0}, 0}, + {'\0', 0, 11643, {0}, 0},{';', 0, 11644, {8907}, 1},{'\0', 0, 11645, {0}, 0}, + {';', 0, 11646, {8922}, 1},{'\0', 0, 11647, {0}, 0},{';', 0, 11648, {8804}, 1}, + {'q', 11652, 11649, {0}, 0},{'s', 11654, 11650, {0}, 0},{'\0', 0, 11651, {0}, 0}, + {';', 0, 11652, {8806}, 1},{'\0', 0, 11653, {0}, 0},{'l', 11656, 11654, {0}, 0}, + {'\0', 0, 11655, {0}, 0},{'a', 11658, 11656, {0}, 0},{'\0', 0, 11657, {0}, 0}, + {'n', 11660, 11658, {0}, 0},{'\0', 0, 11659, {0}, 0},{'t', 11662, 11660, {0}, 0}, + {'\0', 0, 11661, {0}, 0},{';', 0, 11662, {10877}, 1},{'\0', 0, 11663, {0}, 0}, + {';', 0, 11664, {10877}, 1},{'c', 11670, 11665, {0}, 0},{'d', 11674, 11666, {0}, 0}, + {'g', 11686, 11667, {0}, 0},{'s', 11693, 11668, {0}, 0},{'\0', 0, 11669, {0}, 0}, + {'c', 11672, 11670, {0}, 0},{'\0', 0, 11671, {0}, 0},{';', 0, 11672, {10920}, 1}, + {'\0', 0, 11673, {0}, 0},{'o', 11676, 11674, {0}, 0},{'\0', 0, 11675, {0}, 0}, + {'t', 11678, 11676, {0}, 0},{'\0', 0, 11677, {0}, 0},{';', 0, 11678, {10879}, 1}, + {'o', 11681, 11679, {0}, 0},{'\0', 0, 11680, {0}, 0},{';', 0, 11681, {10881}, 1}, + {'r', 11684, 11682, {0}, 0},{'\0', 0, 11683, {0}, 0},{';', 0, 11684, {10883}, 1}, + {'\0', 0, 11685, {0}, 0},{';', 0, 11686, {8922,65024}, 2},{'e', 11689, 11687, {0}, 0}, + {'\0', 0, 11688, {0}, 0},{'s', 11691, 11689, {0}, 0},{'\0', 0, 11690, {0}, 0}, + {';', 0, 11691, {10899}, 1},{'\0', 0, 11692, {0}, 0},{'a', 11699, 11693, {0}, 0}, + {'d', 11711, 11694, {0}, 0},{'e', 11717, 11695, {0}, 0},{'g', 11736, 11696, {0}, 0}, + {'s', 11742, 11697, {0}, 0},{'\0', 0, 11698, {0}, 0},{'p', 11701, 11699, {0}, 0}, + {'\0', 0, 11700, {0}, 0},{'p', 11703, 11701, {0}, 0},{'\0', 0, 11702, {0}, 0}, + {'r', 11705, 11703, {0}, 0},{'\0', 0, 11704, {0}, 0},{'o', 11707, 11705, {0}, 0}, + {'\0', 0, 11706, {0}, 0},{'x', 11709, 11707, {0}, 0},{'\0', 0, 11708, {0}, 0}, + {';', 0, 11709, {10885}, 1},{'\0', 0, 11710, {0}, 0},{'o', 11713, 11711, {0}, 0}, + {'\0', 0, 11712, {0}, 0},{'t', 11715, 11713, {0}, 0},{'\0', 0, 11714, {0}, 0}, + {';', 0, 11715, {8918}, 1},{'\0', 0, 11716, {0}, 0},{'q', 11719, 11717, {0}, 0}, + {'\0', 0, 11718, {0}, 0},{'g', 11722, 11719, {0}, 0},{'q', 11728, 11720, {0}, 0}, + {'\0', 0, 11721, {0}, 0},{'t', 11724, 11722, {0}, 0},{'\0', 0, 11723, {0}, 0}, + {'r', 11726, 11724, {0}, 0},{'\0', 0, 11725, {0}, 0},{';', 0, 11726, {8922}, 1}, + {'\0', 0, 11727, {0}, 0},{'g', 11730, 11728, {0}, 0},{'\0', 0, 11729, {0}, 0}, + {'t', 11732, 11730, {0}, 0},{'\0', 0, 11731, {0}, 0},{'r', 11734, 11732, {0}, 0}, + {'\0', 0, 11733, {0}, 0},{';', 0, 11734, {10891}, 1},{'\0', 0, 11735, {0}, 0}, + {'t', 11738, 11736, {0}, 0},{'\0', 0, 11737, {0}, 0},{'r', 11740, 11738, {0}, 0}, + {'\0', 0, 11739, {0}, 0},{';', 0, 11740, {8822}, 1},{'\0', 0, 11741, {0}, 0}, + {'i', 11744, 11742, {0}, 0},{'\0', 0, 11743, {0}, 0},{'m', 11746, 11744, {0}, 0}, + {'\0', 0, 11745, {0}, 0},{';', 0, 11746, {8818}, 1},{'\0', 0, 11747, {0}, 0}, + {'i', 11752, 11748, {0}, 0},{'l', 11760, 11749, {0}, 0},{'r', 11768, 11750, {0}, 0}, + {'\0', 0, 11751, {0}, 0},{'s', 11754, 11752, {0}, 0},{'\0', 0, 11753, {0}, 0}, + {'h', 11756, 11754, {0}, 0},{'\0', 0, 11755, {0}, 0},{'t', 11758, 11756, {0}, 0}, + {'\0', 0, 11757, {0}, 0},{';', 0, 11758, {10620}, 1},{'\0', 0, 11759, {0}, 0}, + {'o', 11762, 11760, {0}, 0},{'\0', 0, 11761, {0}, 0},{'o', 11764, 11762, {0}, 0}, + {'\0', 0, 11763, {0}, 0},{'r', 11766, 11764, {0}, 0},{'\0', 0, 11765, {0}, 0}, + {';', 0, 11766, {8970}, 1},{'\0', 0, 11767, {0}, 0},{';', 0, 11768, {120105}, 1}, + {'\0', 0, 11769, {0}, 0},{';', 0, 11770, {8822}, 1},{'E', 11773, 11771, {0}, 0}, + {'\0', 0, 11772, {0}, 0},{';', 0, 11773, {10897}, 1},{'\0', 0, 11774, {0}, 0}, + {'a', 11778, 11775, {0}, 0},{'b', 11790, 11776, {0}, 0},{'\0', 0, 11777, {0}, 0}, + {'r', 11780, 11778, {0}, 0},{'\0', 0, 11779, {0}, 0},{'d', 11783, 11780, {0}, 0}, + {'u', 11785, 11781, {0}, 0},{'\0', 0, 11782, {0}, 0},{';', 0, 11783, {8637}, 1}, + {'\0', 0, 11784, {0}, 0},{';', 0, 11785, {8636}, 1},{'l', 11788, 11786, {0}, 0}, + {'\0', 0, 11787, {0}, 0},{';', 0, 11788, {10602}, 1},{'\0', 0, 11789, {0}, 0}, + {'l', 11792, 11790, {0}, 0},{'\0', 0, 11791, {0}, 0},{'k', 11794, 11792, {0}, 0}, + {'\0', 0, 11793, {0}, 0},{';', 0, 11794, {9604}, 1},{'\0', 0, 11795, {0}, 0}, + {'c', 11798, 11796, {0}, 0},{'\0', 0, 11797, {0}, 0},{'y', 11800, 11798, {0}, 0}, + {'\0', 0, 11799, {0}, 0},{';', 0, 11800, {1113}, 1},{'\0', 0, 11801, {0}, 0}, + {';', 0, 11802, {8810}, 1},{'a', 11808, 11803, {0}, 0},{'c', 11814, 11804, {0}, 0}, + {'h', 11826, 11805, {0}, 0},{'t', 11834, 11806, {0}, 0},{'\0', 0, 11807, {0}, 0}, + {'r', 11810, 11808, {0}, 0},{'\0', 0, 11809, {0}, 0},{'r', 11812, 11810, {0}, 0}, + {'\0', 0, 11811, {0}, 0},{';', 0, 11812, {8647}, 1},{'\0', 0, 11813, {0}, 0}, + {'o', 11816, 11814, {0}, 0},{'\0', 0, 11815, {0}, 0},{'r', 11818, 11816, {0}, 0}, + {'\0', 0, 11817, {0}, 0},{'n', 11820, 11818, {0}, 0},{'\0', 0, 11819, {0}, 0}, + {'e', 11822, 11820, {0}, 0},{'\0', 0, 11821, {0}, 0},{'r', 11824, 11822, {0}, 0}, + {'\0', 0, 11823, {0}, 0},{';', 0, 11824, {8990}, 1},{'\0', 0, 11825, {0}, 0}, + {'a', 11828, 11826, {0}, 0},{'\0', 0, 11827, {0}, 0},{'r', 11830, 11828, {0}, 0}, + {'\0', 0, 11829, {0}, 0},{'d', 11832, 11830, {0}, 0},{'\0', 0, 11831, {0}, 0}, + {';', 0, 11832, {10603}, 1},{'\0', 0, 11833, {0}, 0},{'r', 11836, 11834, {0}, 0}, + {'\0', 0, 11835, {0}, 0},{'i', 11838, 11836, {0}, 0},{'\0', 0, 11837, {0}, 0}, + {';', 0, 11838, {9722}, 1},{'\0', 0, 11839, {0}, 0},{'i', 11843, 11840, {0}, 0}, + {'o', 11851, 11841, {0}, 0},{'\0', 0, 11842, {0}, 0},{'d', 11845, 11843, {0}, 0}, + {'\0', 0, 11844, {0}, 0},{'o', 11847, 11845, {0}, 0},{'\0', 0, 11846, {0}, 0}, + {'t', 11849, 11847, {0}, 0},{'\0', 0, 11848, {0}, 0},{';', 0, 11849, {320}, 1}, + {'\0', 0, 11850, {0}, 0},{'u', 11853, 11851, {0}, 0},{'\0', 0, 11852, {0}, 0}, + {'s', 11855, 11853, {0}, 0},{'\0', 0, 11854, {0}, 0},{'t', 11857, 11855, {0}, 0}, + {'\0', 0, 11856, {0}, 0},{';', 0, 11857, {9136}, 1},{'a', 11860, 11858, {0}, 0}, + {'\0', 0, 11859, {0}, 0},{'c', 11862, 11860, {0}, 0},{'\0', 0, 11861, {0}, 0}, + {'h', 11864, 11862, {0}, 0},{'\0', 0, 11863, {0}, 0},{'e', 11866, 11864, {0}, 0}, + {'\0', 0, 11865, {0}, 0},{';', 0, 11866, {9136}, 1},{'\0', 0, 11867, {0}, 0}, + {'E', 11873, 11868, {0}, 0},{'a', 11875, 11869, {0}, 0},{'e', 11888, 11870, {0}, 0}, + {'s', 11896, 11871, {0}, 0},{'\0', 0, 11872, {0}, 0},{';', 0, 11873, {8808}, 1}, + {'\0', 0, 11874, {0}, 0},{'p', 11877, 11875, {0}, 0},{'\0', 0, 11876, {0}, 0}, + {';', 0, 11877, {10889}, 1},{'p', 11880, 11878, {0}, 0},{'\0', 0, 11879, {0}, 0}, + {'r', 11882, 11880, {0}, 0},{'\0', 0, 11881, {0}, 0},{'o', 11884, 11882, {0}, 0}, + {'\0', 0, 11883, {0}, 0},{'x', 11886, 11884, {0}, 0},{'\0', 0, 11885, {0}, 0}, + {';', 0, 11886, {10889}, 1},{'\0', 0, 11887, {0}, 0},{';', 0, 11888, {10887}, 1}, + {'q', 11891, 11889, {0}, 0},{'\0', 0, 11890, {0}, 0},{';', 0, 11891, {10887}, 1}, + {'q', 11894, 11892, {0}, 0},{'\0', 0, 11893, {0}, 0},{';', 0, 11894, {8808}, 1}, + {'\0', 0, 11895, {0}, 0},{'i', 11898, 11896, {0}, 0},{'\0', 0, 11897, {0}, 0}, + {'m', 11900, 11898, {0}, 0},{'\0', 0, 11899, {0}, 0},{';', 0, 11900, {8934}, 1}, + {'\0', 0, 11901, {0}, 0},{'a', 11911, 11902, {0}, 0},{'b', 11922, 11903, {0}, 0}, + {'n', 11928, 11904, {0}, 0},{'o', 12005, 11905, {0}, 0},{'p', 12038, 11906, {0}, 0}, + {'t', 12054, 11907, {0}, 0},{'w', 12064, 11908, {0}, 0},{'z', 12079, 11909, {0}, 0}, + {'\0', 0, 11910, {0}, 0},{'n', 11914, 11911, {0}, 0},{'r', 11918, 11912, {0}, 0}, + {'\0', 0, 11913, {0}, 0},{'g', 11916, 11914, {0}, 0},{'\0', 0, 11915, {0}, 0}, + {';', 0, 11916, {10220}, 1},{'\0', 0, 11917, {0}, 0},{'r', 11920, 11918, {0}, 0}, + {'\0', 0, 11919, {0}, 0},{';', 0, 11920, {8701}, 1},{'\0', 0, 11921, {0}, 0}, + {'r', 11924, 11922, {0}, 0},{'\0', 0, 11923, {0}, 0},{'k', 11926, 11924, {0}, 0}, + {'\0', 0, 11925, {0}, 0},{';', 0, 11926, {10214}, 1},{'\0', 0, 11927, {0}, 0}, + {'g', 11930, 11928, {0}, 0},{'\0', 0, 11929, {0}, 0},{'l', 11934, 11930, {0}, 0}, + {'m', 11973, 11931, {0}, 0},{'r', 11985, 11932, {0}, 0},{'\0', 0, 11933, {0}, 0}, + {'e', 11936, 11934, {0}, 0},{'\0', 0, 11935, {0}, 0},{'f', 11938, 11936, {0}, 0}, + {'\0', 0, 11937, {0}, 0},{'t', 11940, 11938, {0}, 0},{'\0', 0, 11939, {0}, 0}, + {'a', 11943, 11940, {0}, 0},{'r', 11953, 11941, {0}, 0},{'\0', 0, 11942, {0}, 0}, + {'r', 11945, 11943, {0}, 0},{'\0', 0, 11944, {0}, 0},{'r', 11947, 11945, {0}, 0}, + {'\0', 0, 11946, {0}, 0},{'o', 11949, 11947, {0}, 0},{'\0', 0, 11948, {0}, 0}, + {'w', 11951, 11949, {0}, 0},{'\0', 0, 11950, {0}, 0},{';', 0, 11951, {10229}, 1}, + {'\0', 0, 11952, {0}, 0},{'i', 11955, 11953, {0}, 0},{'\0', 0, 11954, {0}, 0}, + {'g', 11957, 11955, {0}, 0},{'\0', 0, 11956, {0}, 0},{'h', 11959, 11957, {0}, 0}, + {'\0', 0, 11958, {0}, 0},{'t', 11961, 11959, {0}, 0},{'\0', 0, 11960, {0}, 0}, + {'a', 11963, 11961, {0}, 0},{'\0', 0, 11962, {0}, 0},{'r', 11965, 11963, {0}, 0}, + {'\0', 0, 11964, {0}, 0},{'r', 11967, 11965, {0}, 0},{'\0', 0, 11966, {0}, 0}, + {'o', 11969, 11967, {0}, 0},{'\0', 0, 11968, {0}, 0},{'w', 11971, 11969, {0}, 0}, + {'\0', 0, 11970, {0}, 0},{';', 0, 11971, {10231}, 1},{'\0', 0, 11972, {0}, 0}, + {'a', 11975, 11973, {0}, 0},{'\0', 0, 11974, {0}, 0},{'p', 11977, 11975, {0}, 0}, + {'\0', 0, 11976, {0}, 0},{'s', 11979, 11977, {0}, 0},{'\0', 0, 11978, {0}, 0}, + {'t', 11981, 11979, {0}, 0},{'\0', 0, 11980, {0}, 0},{'o', 11983, 11981, {0}, 0}, + {'\0', 0, 11982, {0}, 0},{';', 0, 11983, {10236}, 1},{'\0', 0, 11984, {0}, 0}, + {'i', 11987, 11985, {0}, 0},{'\0', 0, 11986, {0}, 0},{'g', 11989, 11987, {0}, 0}, + {'\0', 0, 11988, {0}, 0},{'h', 11991, 11989, {0}, 0},{'\0', 0, 11990, {0}, 0}, + {'t', 11993, 11991, {0}, 0},{'\0', 0, 11992, {0}, 0},{'a', 11995, 11993, {0}, 0}, + {'\0', 0, 11994, {0}, 0},{'r', 11997, 11995, {0}, 0},{'\0', 0, 11996, {0}, 0}, + {'r', 11999, 11997, {0}, 0},{'\0', 0, 11998, {0}, 0},{'o', 12001, 11999, {0}, 0}, + {'\0', 0, 12000, {0}, 0},{'w', 12003, 12001, {0}, 0},{'\0', 0, 12002, {0}, 0}, + {';', 0, 12003, {10230}, 1},{'\0', 0, 12004, {0}, 0},{'p', 12007, 12005, {0}, 0}, + {'\0', 0, 12006, {0}, 0},{'a', 12009, 12007, {0}, 0},{'\0', 0, 12008, {0}, 0}, + {'r', 12011, 12009, {0}, 0},{'\0', 0, 12010, {0}, 0},{'r', 12013, 12011, {0}, 0}, + {'\0', 0, 12012, {0}, 0},{'o', 12015, 12013, {0}, 0},{'\0', 0, 12014, {0}, 0}, + {'w', 12017, 12015, {0}, 0},{'\0', 0, 12016, {0}, 0},{'l', 12020, 12017, {0}, 0}, + {'r', 12028, 12018, {0}, 0},{'\0', 0, 12019, {0}, 0},{'e', 12022, 12020, {0}, 0}, + {'\0', 0, 12021, {0}, 0},{'f', 12024, 12022, {0}, 0},{'\0', 0, 12023, {0}, 0}, + {'t', 12026, 12024, {0}, 0},{'\0', 0, 12025, {0}, 0},{';', 0, 12026, {8619}, 1}, + {'\0', 0, 12027, {0}, 0},{'i', 12030, 12028, {0}, 0},{'\0', 0, 12029, {0}, 0}, + {'g', 12032, 12030, {0}, 0},{'\0', 0, 12031, {0}, 0},{'h', 12034, 12032, {0}, 0}, + {'\0', 0, 12033, {0}, 0},{'t', 12036, 12034, {0}, 0},{'\0', 0, 12035, {0}, 0}, + {';', 0, 12036, {8620}, 1},{'\0', 0, 12037, {0}, 0},{'a', 12042, 12038, {0}, 0}, + {'f', 12046, 12039, {0}, 0},{'l', 12048, 12040, {0}, 0},{'\0', 0, 12041, {0}, 0}, + {'r', 12044, 12042, {0}, 0},{'\0', 0, 12043, {0}, 0},{';', 0, 12044, {10629}, 1}, + {'\0', 0, 12045, {0}, 0},{';', 0, 12046, {120157}, 1},{'\0', 0, 12047, {0}, 0}, + {'u', 12050, 12048, {0}, 0},{'\0', 0, 12049, {0}, 0},{'s', 12052, 12050, {0}, 0}, + {'\0', 0, 12051, {0}, 0},{';', 0, 12052, {10797}, 1},{'\0', 0, 12053, {0}, 0}, + {'i', 12056, 12054, {0}, 0},{'\0', 0, 12055, {0}, 0},{'m', 12058, 12056, {0}, 0}, + {'\0', 0, 12057, {0}, 0},{'e', 12060, 12058, {0}, 0},{'\0', 0, 12059, {0}, 0}, + {'s', 12062, 12060, {0}, 0},{'\0', 0, 12061, {0}, 0},{';', 0, 12062, {10804}, 1}, + {'\0', 0, 12063, {0}, 0},{'a', 12067, 12064, {0}, 0},{'b', 12073, 12065, {0}, 0}, + {'\0', 0, 12066, {0}, 0},{'s', 12069, 12067, {0}, 0},{'\0', 0, 12068, {0}, 0}, + {'t', 12071, 12069, {0}, 0},{'\0', 0, 12070, {0}, 0},{';', 0, 12071, {8727}, 1}, + {'\0', 0, 12072, {0}, 0},{'a', 12075, 12073, {0}, 0},{'\0', 0, 12074, {0}, 0}, + {'r', 12077, 12075, {0}, 0},{'\0', 0, 12076, {0}, 0},{';', 0, 12077, {95}, 1}, + {'\0', 0, 12078, {0}, 0},{';', 0, 12079, {9674}, 1},{'e', 12083, 12080, {0}, 0}, + {'f', 12091, 12081, {0}, 0},{'\0', 0, 12082, {0}, 0},{'n', 12085, 12083, {0}, 0}, + {'\0', 0, 12084, {0}, 0},{'g', 12087, 12085, {0}, 0},{'\0', 0, 12086, {0}, 0}, + {'e', 12089, 12087, {0}, 0},{'\0', 0, 12088, {0}, 0},{';', 0, 12089, {9674}, 1}, + {'\0', 0, 12090, {0}, 0},{';', 0, 12091, {10731}, 1},{'\0', 0, 12092, {0}, 0}, + {'a', 12095, 12093, {0}, 0},{'\0', 0, 12094, {0}, 0},{'r', 12097, 12095, {0}, 0}, + {'\0', 0, 12096, {0}, 0},{';', 0, 12097, {40}, 1},{'l', 12100, 12098, {0}, 0}, + {'\0', 0, 12099, {0}, 0},{'t', 12102, 12100, {0}, 0},{'\0', 0, 12101, {0}, 0}, + {';', 0, 12102, {10643}, 1},{'\0', 0, 12103, {0}, 0},{'a', 12110, 12104, {0}, 0}, + {'c', 12116, 12105, {0}, 0},{'h', 12128, 12106, {0}, 0},{'m', 12137, 12107, {0}, 0}, + {'t', 12139, 12108, {0}, 0},{'\0', 0, 12109, {0}, 0},{'r', 12112, 12110, {0}, 0}, + {'\0', 0, 12111, {0}, 0},{'r', 12114, 12112, {0}, 0},{'\0', 0, 12113, {0}, 0}, + {';', 0, 12114, {8646}, 1},{'\0', 0, 12115, {0}, 0},{'o', 12118, 12116, {0}, 0}, + {'\0', 0, 12117, {0}, 0},{'r', 12120, 12118, {0}, 0},{'\0', 0, 12119, {0}, 0}, + {'n', 12122, 12120, {0}, 0},{'\0', 0, 12121, {0}, 0},{'e', 12124, 12122, {0}, 0}, + {'\0', 0, 12123, {0}, 0},{'r', 12126, 12124, {0}, 0},{'\0', 0, 12125, {0}, 0}, + {';', 0, 12126, {8991}, 1},{'\0', 0, 12127, {0}, 0},{'a', 12130, 12128, {0}, 0}, + {'\0', 0, 12129, {0}, 0},{'r', 12132, 12130, {0}, 0},{'\0', 0, 12131, {0}, 0}, + {';', 0, 12132, {8651}, 1},{'d', 12135, 12133, {0}, 0},{'\0', 0, 12134, {0}, 0}, + {';', 0, 12135, {10605}, 1},{'\0', 0, 12136, {0}, 0},{';', 0, 12137, {8206}, 1}, + {'\0', 0, 12138, {0}, 0},{'r', 12141, 12139, {0}, 0},{'\0', 0, 12140, {0}, 0}, + {'i', 12143, 12141, {0}, 0},{'\0', 0, 12142, {0}, 0},{';', 0, 12143, {8895}, 1}, + {'\0', 0, 12144, {0}, 0},{'a', 12152, 12145, {0}, 0},{'c', 12160, 12146, {0}, 0}, + {'h', 12164, 12147, {0}, 0},{'i', 12166, 12148, {0}, 0},{'q', 12176, 12149, {0}, 0}, + {'t', 12188, 12150, {0}, 0},{'\0', 0, 12151, {0}, 0},{'q', 12154, 12152, {0}, 0}, + {'\0', 0, 12153, {0}, 0},{'u', 12156, 12154, {0}, 0},{'\0', 0, 12155, {0}, 0}, + {'o', 12158, 12156, {0}, 0},{'\0', 0, 12157, {0}, 0},{';', 0, 12158, {8249}, 1}, + {'\0', 0, 12159, {0}, 0},{'r', 12162, 12160, {0}, 0},{'\0', 0, 12161, {0}, 0}, + {';', 0, 12162, {120001}, 1},{'\0', 0, 12163, {0}, 0},{';', 0, 12164, {8624}, 1}, + {'\0', 0, 12165, {0}, 0},{'m', 12168, 12166, {0}, 0},{'\0', 0, 12167, {0}, 0}, + {';', 0, 12168, {8818}, 1},{'e', 12172, 12169, {0}, 0},{'g', 12174, 12170, {0}, 0}, + {'\0', 0, 12171, {0}, 0},{';', 0, 12172, {10893}, 1},{'\0', 0, 12173, {0}, 0}, + {';', 0, 12174, {10895}, 1},{'\0', 0, 12175, {0}, 0},{'b', 12179, 12176, {0}, 0}, + {'u', 12181, 12177, {0}, 0},{'\0', 0, 12178, {0}, 0},{';', 0, 12179, {91}, 1}, + {'\0', 0, 12180, {0}, 0},{'o', 12183, 12181, {0}, 0},{'\0', 0, 12182, {0}, 0}, + {';', 0, 12183, {8216}, 1},{'r', 12186, 12184, {0}, 0},{'\0', 0, 12185, {0}, 0}, + {';', 0, 12186, {8218}, 1},{'\0', 0, 12187, {0}, 0},{'r', 12190, 12188, {0}, 0}, + {'\0', 0, 12189, {0}, 0},{'o', 12192, 12190, {0}, 0},{'\0', 0, 12191, {0}, 0}, + {'k', 12194, 12192, {0}, 0},{'\0', 0, 12193, {0}, 0},{';', 0, 12194, {322}, 1}, + {'\0', 0, 12195, {0}, 0},{';', 0, 12196, {60}, 1},{'c', 12205, 12197, {0}, 0}, + {'d', 12214, 12198, {0}, 0},{'h', 12220, 12199, {0}, 0},{'i', 12228, 12200, {0}, 0}, + {'l', 12236, 12201, {0}, 0},{'q', 12244, 12202, {0}, 0},{'r', 12254, 12203, {0}, 0}, + {'\0', 0, 12204, {0}, 0},{'c', 12208, 12205, {0}, 0},{'i', 12210, 12206, {0}, 0}, + {'\0', 0, 12207, {0}, 0},{';', 0, 12208, {10918}, 1},{'\0', 0, 12209, {0}, 0}, + {'r', 12212, 12210, {0}, 0},{'\0', 0, 12211, {0}, 0},{';', 0, 12212, {10873}, 1}, + {'\0', 0, 12213, {0}, 0},{'o', 12216, 12214, {0}, 0},{'\0', 0, 12215, {0}, 0}, + {'t', 12218, 12216, {0}, 0},{'\0', 0, 12217, {0}, 0},{';', 0, 12218, {8918}, 1}, + {'\0', 0, 12219, {0}, 0},{'r', 12222, 12220, {0}, 0},{'\0', 0, 12221, {0}, 0}, + {'e', 12224, 12222, {0}, 0},{'\0', 0, 12223, {0}, 0},{'e', 12226, 12224, {0}, 0}, + {'\0', 0, 12225, {0}, 0},{';', 0, 12226, {8907}, 1},{'\0', 0, 12227, {0}, 0}, + {'m', 12230, 12228, {0}, 0},{'\0', 0, 12229, {0}, 0},{'e', 12232, 12230, {0}, 0}, + {'\0', 0, 12231, {0}, 0},{'s', 12234, 12232, {0}, 0},{'\0', 0, 12233, {0}, 0}, + {';', 0, 12234, {8905}, 1},{'\0', 0, 12235, {0}, 0},{'a', 12238, 12236, {0}, 0}, + {'\0', 0, 12237, {0}, 0},{'r', 12240, 12238, {0}, 0},{'\0', 0, 12239, {0}, 0}, + {'r', 12242, 12240, {0}, 0},{'\0', 0, 12241, {0}, 0},{';', 0, 12242, {10614}, 1}, + {'\0', 0, 12243, {0}, 0},{'u', 12246, 12244, {0}, 0},{'\0', 0, 12245, {0}, 0}, + {'e', 12248, 12246, {0}, 0},{'\0', 0, 12247, {0}, 0},{'s', 12250, 12248, {0}, 0}, + {'\0', 0, 12249, {0}, 0},{'t', 12252, 12250, {0}, 0},{'\0', 0, 12251, {0}, 0}, + {';', 0, 12252, {10875}, 1},{'\0', 0, 12253, {0}, 0},{'P', 12257, 12254, {0}, 0}, + {'i', 12263, 12255, {0}, 0},{'\0', 0, 12256, {0}, 0},{'a', 12259, 12257, {0}, 0}, + {'\0', 0, 12258, {0}, 0},{'r', 12261, 12259, {0}, 0},{'\0', 0, 12260, {0}, 0}, + {';', 0, 12261, {10646}, 1},{'\0', 0, 12262, {0}, 0},{';', 0, 12263, {9667}, 1}, + {'e', 12267, 12264, {0}, 0},{'f', 12269, 12265, {0}, 0},{'\0', 0, 12266, {0}, 0}, + {';', 0, 12267, {8884}, 1},{'\0', 0, 12268, {0}, 0},{';', 0, 12269, {9666}, 1}, + {'\0', 0, 12270, {0}, 0},{'r', 12273, 12271, {0}, 0},{'\0', 0, 12272, {0}, 0}, + {'d', 12276, 12273, {0}, 0},{'u', 12286, 12274, {0}, 0},{'\0', 0, 12275, {0}, 0}, + {'s', 12278, 12276, {0}, 0},{'\0', 0, 12277, {0}, 0},{'h', 12280, 12278, {0}, 0}, + {'\0', 0, 12279, {0}, 0},{'a', 12282, 12280, {0}, 0},{'\0', 0, 12281, {0}, 0}, + {'r', 12284, 12282, {0}, 0},{'\0', 0, 12283, {0}, 0},{';', 0, 12284, {10570}, 1}, + {'\0', 0, 12285, {0}, 0},{'h', 12288, 12286, {0}, 0},{'\0', 0, 12287, {0}, 0}, + {'a', 12290, 12288, {0}, 0},{'\0', 0, 12289, {0}, 0},{'r', 12292, 12290, {0}, 0}, + {'\0', 0, 12291, {0}, 0},{';', 0, 12292, {10598}, 1},{'\0', 0, 12293, {0}, 0}, + {'e', 12297, 12294, {0}, 0},{'n', 12311, 12295, {0}, 0},{'\0', 0, 12296, {0}, 0}, + {'r', 12299, 12297, {0}, 0},{'\0', 0, 12298, {0}, 0},{'t', 12301, 12299, {0}, 0}, + {'\0', 0, 12300, {0}, 0},{'n', 12303, 12301, {0}, 0},{'\0', 0, 12302, {0}, 0}, + {'e', 12305, 12303, {0}, 0},{'\0', 0, 12304, {0}, 0},{'q', 12307, 12305, {0}, 0}, + {'\0', 0, 12306, {0}, 0},{'q', 12309, 12307, {0}, 0},{'\0', 0, 12308, {0}, 0}, + {';', 0, 12309, {8808,65024}, 2},{'\0', 0, 12310, {0}, 0},{'E', 12313, 12311, {0}, 0}, + {'\0', 0, 12312, {0}, 0},{';', 0, 12313, {8808,65024}, 2},{'\0', 0, 12314, {0}, 0}, + {'D', 12330, 12315, {0}, 0},{'a', 12338, 12316, {0}, 0},{'c', 12401, 12317, {0}, 0}, + {'d', 12414, 12318, {0}, 0},{'e', 12422, 12319, {0}, 0},{'f', 12446, 12320, {0}, 0}, + {'h', 12450, 12321, {0}, 0},{'i', 12454, 12322, {0}, 0},{'l', 12502, 12323, {0}, 0}, + {'n', 12513, 12324, {0}, 0},{'o', 12523, 12325, {0}, 0},{'p', 12538, 12326, {0}, 0}, + {'s', 12540, 12327, {0}, 0},{'u', 12555, 12328, {0}, 0},{'\0', 0, 12329, {0}, 0}, + {'D', 12332, 12330, {0}, 0},{'\0', 0, 12331, {0}, 0},{'o', 12334, 12332, {0}, 0}, + {'\0', 0, 12333, {0}, 0},{'t', 12336, 12334, {0}, 0},{'\0', 0, 12335, {0}, 0}, + {';', 0, 12336, {8762}, 1},{'\0', 0, 12337, {0}, 0},{'c', 12343, 12338, {0}, 0}, + {'l', 12347, 12339, {0}, 0},{'p', 12361, 12340, {0}, 0},{'r', 12393, 12341, {0}, 0}, + {'\0', 0, 12342, {0}, 0},{'r', 12345, 12343, {175}, 1},{'\0', 0, 12344, {0}, 0}, + {';', 0, 12345, {175}, 1},{'\0', 0, 12346, {0}, 0},{'e', 12350, 12347, {0}, 0}, + {'t', 12352, 12348, {0}, 0},{'\0', 0, 12349, {0}, 0},{';', 0, 12350, {9794}, 1}, + {'\0', 0, 12351, {0}, 0},{';', 0, 12352, {10016}, 1},{'e', 12355, 12353, {0}, 0}, + {'\0', 0, 12354, {0}, 0},{'s', 12357, 12355, {0}, 0},{'\0', 0, 12356, {0}, 0}, + {'e', 12359, 12357, {0}, 0},{'\0', 0, 12358, {0}, 0},{';', 0, 12359, {10016}, 1}, + {'\0', 0, 12360, {0}, 0},{';', 0, 12361, {8614}, 1},{'s', 12364, 12362, {0}, 0}, + {'\0', 0, 12363, {0}, 0},{'t', 12366, 12364, {0}, 0},{'\0', 0, 12365, {0}, 0}, + {'o', 12368, 12366, {0}, 0},{'\0', 0, 12367, {0}, 0},{';', 0, 12368, {8614}, 1}, + {'d', 12373, 12369, {0}, 0},{'l', 12381, 12370, {0}, 0},{'u', 12389, 12371, {0}, 0}, + {'\0', 0, 12372, {0}, 0},{'o', 12375, 12373, {0}, 0},{'\0', 0, 12374, {0}, 0}, + {'w', 12377, 12375, {0}, 0},{'\0', 0, 12376, {0}, 0},{'n', 12379, 12377, {0}, 0}, + {'\0', 0, 12378, {0}, 0},{';', 0, 12379, {8615}, 1},{'\0', 0, 12380, {0}, 0}, + {'e', 12383, 12381, {0}, 0},{'\0', 0, 12382, {0}, 0},{'f', 12385, 12383, {0}, 0}, + {'\0', 0, 12384, {0}, 0},{'t', 12387, 12385, {0}, 0},{'\0', 0, 12386, {0}, 0}, + {';', 0, 12387, {8612}, 1},{'\0', 0, 12388, {0}, 0},{'p', 12391, 12389, {0}, 0}, + {'\0', 0, 12390, {0}, 0},{';', 0, 12391, {8613}, 1},{'\0', 0, 12392, {0}, 0}, + {'k', 12395, 12393, {0}, 0},{'\0', 0, 12394, {0}, 0},{'e', 12397, 12395, {0}, 0}, + {'\0', 0, 12396, {0}, 0},{'r', 12399, 12397, {0}, 0},{'\0', 0, 12398, {0}, 0}, + {';', 0, 12399, {9646}, 1},{'\0', 0, 12400, {0}, 0},{'o', 12404, 12401, {0}, 0}, + {'y', 12412, 12402, {0}, 0},{'\0', 0, 12403, {0}, 0},{'m', 12406, 12404, {0}, 0}, + {'\0', 0, 12405, {0}, 0},{'m', 12408, 12406, {0}, 0},{'\0', 0, 12407, {0}, 0}, + {'a', 12410, 12408, {0}, 0},{'\0', 0, 12409, {0}, 0},{';', 0, 12410, {10793}, 1}, + {'\0', 0, 12411, {0}, 0},{';', 0, 12412, {1084}, 1},{'\0', 0, 12413, {0}, 0}, + {'a', 12416, 12414, {0}, 0},{'\0', 0, 12415, {0}, 0},{'s', 12418, 12416, {0}, 0}, + {'\0', 0, 12417, {0}, 0},{'h', 12420, 12418, {0}, 0},{'\0', 0, 12419, {0}, 0}, + {';', 0, 12420, {8212}, 1},{'\0', 0, 12421, {0}, 0},{'a', 12424, 12422, {0}, 0}, + {'\0', 0, 12423, {0}, 0},{'s', 12426, 12424, {0}, 0},{'\0', 0, 12425, {0}, 0}, + {'u', 12428, 12426, {0}, 0},{'\0', 0, 12427, {0}, 0},{'r', 12430, 12428, {0}, 0}, + {'\0', 0, 12429, {0}, 0},{'e', 12432, 12430, {0}, 0},{'\0', 0, 12431, {0}, 0}, + {'d', 12434, 12432, {0}, 0},{'\0', 0, 12433, {0}, 0},{'a', 12436, 12434, {0}, 0}, + {'\0', 0, 12435, {0}, 0},{'n', 12438, 12436, {0}, 0},{'\0', 0, 12437, {0}, 0}, + {'g', 12440, 12438, {0}, 0},{'\0', 0, 12439, {0}, 0},{'l', 12442, 12440, {0}, 0}, + {'\0', 0, 12441, {0}, 0},{'e', 12444, 12442, {0}, 0},{'\0', 0, 12443, {0}, 0}, + {';', 0, 12444, {8737}, 1},{'\0', 0, 12445, {0}, 0},{'r', 12448, 12446, {0}, 0}, + {'\0', 0, 12447, {0}, 0},{';', 0, 12448, {120106}, 1},{'\0', 0, 12449, {0}, 0}, + {'o', 12452, 12450, {0}, 0},{'\0', 0, 12451, {0}, 0},{';', 0, 12452, {8487}, 1}, + {'\0', 0, 12453, {0}, 0},{'c', 12458, 12454, {0}, 0},{'d', 12464, 12455, {0}, 0}, + {'n', 12487, 12456, {0}, 0},{'\0', 0, 12457, {0}, 0},{'r', 12460, 12458, {0}, 0}, + {'\0', 0, 12459, {0}, 0},{'o', 12462, 12460, {181}, 1},{'\0', 0, 12461, {0}, 0}, + {';', 0, 12462, {181}, 1},{'\0', 0, 12463, {0}, 0},{';', 0, 12464, {8739}, 1}, + {'a', 12469, 12465, {0}, 0},{'c', 12475, 12466, {0}, 0},{'d', 12481, 12467, {0}, 0}, + {'\0', 0, 12468, {0}, 0},{'s', 12471, 12469, {0}, 0},{'\0', 0, 12470, {0}, 0}, + {'t', 12473, 12471, {0}, 0},{'\0', 0, 12472, {0}, 0},{';', 0, 12473, {42}, 1}, + {'\0', 0, 12474, {0}, 0},{'i', 12477, 12475, {0}, 0},{'\0', 0, 12476, {0}, 0}, + {'r', 12479, 12477, {0}, 0},{'\0', 0, 12478, {0}, 0},{';', 0, 12479, {10992}, 1}, + {'\0', 0, 12480, {0}, 0},{'o', 12483, 12481, {0}, 0},{'\0', 0, 12482, {0}, 0}, + {'t', 12485, 12483, {183}, 1},{'\0', 0, 12484, {0}, 0},{';', 0, 12485, {183}, 1}, + {'\0', 0, 12486, {0}, 0},{'u', 12489, 12487, {0}, 0},{'\0', 0, 12488, {0}, 0}, + {'s', 12491, 12489, {0}, 0},{'\0', 0, 12490, {0}, 0},{';', 0, 12491, {8722}, 1}, + {'b', 12495, 12492, {0}, 0},{'d', 12497, 12493, {0}, 0},{'\0', 0, 12494, {0}, 0}, + {';', 0, 12495, {8863}, 1},{'\0', 0, 12496, {0}, 0},{';', 0, 12497, {8760}, 1}, + {'u', 12500, 12498, {0}, 0},{'\0', 0, 12499, {0}, 0},{';', 0, 12500, {10794}, 1}, + {'\0', 0, 12501, {0}, 0},{'c', 12505, 12502, {0}, 0},{'d', 12509, 12503, {0}, 0}, + {'\0', 0, 12504, {0}, 0},{'p', 12507, 12505, {0}, 0},{'\0', 0, 12506, {0}, 0}, + {';', 0, 12507, {10971}, 1},{'\0', 0, 12508, {0}, 0},{'r', 12511, 12509, {0}, 0}, + {'\0', 0, 12510, {0}, 0},{';', 0, 12511, {8230}, 1},{'\0', 0, 12512, {0}, 0}, + {'p', 12515, 12513, {0}, 0},{'\0', 0, 12514, {0}, 0},{'l', 12517, 12515, {0}, 0}, + {'\0', 0, 12516, {0}, 0},{'u', 12519, 12517, {0}, 0},{'\0', 0, 12518, {0}, 0}, + {'s', 12521, 12519, {0}, 0},{'\0', 0, 12520, {0}, 0},{';', 0, 12521, {8723}, 1}, + {'\0', 0, 12522, {0}, 0},{'d', 12526, 12523, {0}, 0},{'p', 12534, 12524, {0}, 0}, + {'\0', 0, 12525, {0}, 0},{'e', 12528, 12526, {0}, 0},{'\0', 0, 12527, {0}, 0}, + {'l', 12530, 12528, {0}, 0},{'\0', 0, 12529, {0}, 0},{'s', 12532, 12530, {0}, 0}, + {'\0', 0, 12531, {0}, 0},{';', 0, 12532, {8871}, 1},{'\0', 0, 12533, {0}, 0}, + {'f', 12536, 12534, {0}, 0},{'\0', 0, 12535, {0}, 0},{';', 0, 12536, {120158}, 1}, + {'\0', 0, 12537, {0}, 0},{';', 0, 12538, {8723}, 1},{'\0', 0, 12539, {0}, 0}, + {'c', 12543, 12540, {0}, 0},{'t', 12547, 12541, {0}, 0},{'\0', 0, 12542, {0}, 0}, + {'r', 12545, 12543, {0}, 0},{'\0', 0, 12544, {0}, 0},{';', 0, 12545, {120002}, 1}, + {'\0', 0, 12546, {0}, 0},{'p', 12549, 12547, {0}, 0},{'\0', 0, 12548, {0}, 0}, + {'o', 12551, 12549, {0}, 0},{'\0', 0, 12550, {0}, 0},{'s', 12553, 12551, {0}, 0}, + {'\0', 0, 12552, {0}, 0},{';', 0, 12553, {8766}, 1},{'\0', 0, 12554, {0}, 0}, + {';', 0, 12555, {956}, 1},{'l', 12559, 12556, {0}, 0},{'m', 12571, 12557, {0}, 0}, + {'\0', 0, 12558, {0}, 0},{'t', 12561, 12559, {0}, 0},{'\0', 0, 12560, {0}, 0}, + {'i', 12563, 12561, {0}, 0},{'\0', 0, 12562, {0}, 0},{'m', 12565, 12563, {0}, 0}, + {'\0', 0, 12564, {0}, 0},{'a', 12567, 12565, {0}, 0},{'\0', 0, 12566, {0}, 0}, + {'p', 12569, 12567, {0}, 0},{'\0', 0, 12568, {0}, 0},{';', 0, 12569, {8888}, 1}, + {'\0', 0, 12570, {0}, 0},{'a', 12573, 12571, {0}, 0},{'\0', 0, 12572, {0}, 0}, + {'p', 12575, 12573, {0}, 0},{'\0', 0, 12574, {0}, 0},{';', 0, 12575, {8888}, 1}, + {'\0', 0, 12576, {0}, 0},{'G', 12602, 12577, {0}, 0},{'L', 12612, 12578, {0}, 0}, + {'R', 12660, 12579, {0}, 0},{'V', 12680, 12580, {0}, 0},{'a', 12699, 12581, {0}, 0}, + {'b', 12761, 12582, {0}, 0},{'c', 12777, 12583, {0}, 0},{'d', 12821, 12584, {0}, 0}, + {'e', 12829, 12585, {0}, 0},{'f', 12897, 12586, {0}, 0},{'g', 12901, 12587, {0}, 0}, + {'h', 12941, 12588, {0}, 0},{'i', 12963, 12589, {0}, 0},{'j', 12974, 12590, {0}, 0}, + {'l', 12980, 12591, {0}, 0},{'m', 13083, 12592, {0}, 0},{'o', 13089, 12593, {0}, 0}, + {'p', 13140, 12594, {0}, 0},{'r', 13197, 12595, {0}, 0},{'s', 13247, 12596, {0}, 0}, + {'t', 13397, 12597, {0}, 0},{'u', 13461, 12598, {0}, 0},{'v', 13478, 12599, {0}, 0}, + {'w', 13577, 12600, {0}, 0},{'\0', 0, 12601, {0}, 0},{'g', 12605, 12602, {0}, 0}, + {'t', 12607, 12603, {0}, 0},{'\0', 0, 12604, {0}, 0},{';', 0, 12605, {8921,824}, 2}, + {'\0', 0, 12606, {0}, 0},{';', 0, 12607, {8811,8402}, 2},{'v', 12610, 12608, {0}, 0}, + {'\0', 0, 12609, {0}, 0},{';', 0, 12610, {8811,824}, 2},{'\0', 0, 12611, {0}, 0}, + {'e', 12616, 12612, {0}, 0},{'l', 12653, 12613, {0}, 0},{'t', 12655, 12614, {0}, 0}, + {'\0', 0, 12615, {0}, 0},{'f', 12618, 12616, {0}, 0},{'\0', 0, 12617, {0}, 0}, + {'t', 12620, 12618, {0}, 0},{'\0', 0, 12619, {0}, 0},{'a', 12623, 12620, {0}, 0}, + {'r', 12633, 12621, {0}, 0},{'\0', 0, 12622, {0}, 0},{'r', 12625, 12623, {0}, 0}, + {'\0', 0, 12624, {0}, 0},{'r', 12627, 12625, {0}, 0},{'\0', 0, 12626, {0}, 0}, + {'o', 12629, 12627, {0}, 0},{'\0', 0, 12628, {0}, 0},{'w', 12631, 12629, {0}, 0}, + {'\0', 0, 12630, {0}, 0},{';', 0, 12631, {8653}, 1},{'\0', 0, 12632, {0}, 0}, + {'i', 12635, 12633, {0}, 0},{'\0', 0, 12634, {0}, 0},{'g', 12637, 12635, {0}, 0}, + {'\0', 0, 12636, {0}, 0},{'h', 12639, 12637, {0}, 0},{'\0', 0, 12638, {0}, 0}, + {'t', 12641, 12639, {0}, 0},{'\0', 0, 12640, {0}, 0},{'a', 12643, 12641, {0}, 0}, + {'\0', 0, 12642, {0}, 0},{'r', 12645, 12643, {0}, 0},{'\0', 0, 12644, {0}, 0}, + {'r', 12647, 12645, {0}, 0},{'\0', 0, 12646, {0}, 0},{'o', 12649, 12647, {0}, 0}, + {'\0', 0, 12648, {0}, 0},{'w', 12651, 12649, {0}, 0},{'\0', 0, 12650, {0}, 0}, + {';', 0, 12651, {8654}, 1},{'\0', 0, 12652, {0}, 0},{';', 0, 12653, {8920,824}, 2}, + {'\0', 0, 12654, {0}, 0},{';', 0, 12655, {8810,8402}, 2},{'v', 12658, 12656, {0}, 0}, + {'\0', 0, 12657, {0}, 0},{';', 0, 12658, {8810,824}, 2},{'\0', 0, 12659, {0}, 0}, + {'i', 12662, 12660, {0}, 0},{'\0', 0, 12661, {0}, 0},{'g', 12664, 12662, {0}, 0}, + {'\0', 0, 12663, {0}, 0},{'h', 12666, 12664, {0}, 0},{'\0', 0, 12665, {0}, 0}, + {'t', 12668, 12666, {0}, 0},{'\0', 0, 12667, {0}, 0},{'a', 12670, 12668, {0}, 0}, + {'\0', 0, 12669, {0}, 0},{'r', 12672, 12670, {0}, 0},{'\0', 0, 12671, {0}, 0}, + {'r', 12674, 12672, {0}, 0},{'\0', 0, 12673, {0}, 0},{'o', 12676, 12674, {0}, 0}, + {'\0', 0, 12675, {0}, 0},{'w', 12678, 12676, {0}, 0},{'\0', 0, 12677, {0}, 0}, + {';', 0, 12678, {8655}, 1},{'\0', 0, 12679, {0}, 0},{'D', 12683, 12680, {0}, 0}, + {'d', 12691, 12681, {0}, 0},{'\0', 0, 12682, {0}, 0},{'a', 12685, 12683, {0}, 0}, + {'\0', 0, 12684, {0}, 0},{'s', 12687, 12685, {0}, 0},{'\0', 0, 12686, {0}, 0}, + {'h', 12689, 12687, {0}, 0},{'\0', 0, 12688, {0}, 0},{';', 0, 12689, {8879}, 1}, + {'\0', 0, 12690, {0}, 0},{'a', 12693, 12691, {0}, 0},{'\0', 0, 12692, {0}, 0}, + {'s', 12695, 12693, {0}, 0},{'\0', 0, 12694, {0}, 0},{'h', 12697, 12695, {0}, 0}, + {'\0', 0, 12696, {0}, 0},{';', 0, 12697, {8878}, 1},{'\0', 0, 12698, {0}, 0}, + {'b', 12705, 12699, {0}, 0},{'c', 12711, 12700, {0}, 0},{'n', 12719, 12701, {0}, 0}, + {'p', 12723, 12702, {0}, 0},{'t', 12747, 12703, {0}, 0},{'\0', 0, 12704, {0}, 0}, + {'l', 12707, 12705, {0}, 0},{'\0', 0, 12706, {0}, 0},{'a', 12709, 12707, {0}, 0}, + {'\0', 0, 12708, {0}, 0},{';', 0, 12709, {8711}, 1},{'\0', 0, 12710, {0}, 0}, + {'u', 12713, 12711, {0}, 0},{'\0', 0, 12712, {0}, 0},{'t', 12715, 12713, {0}, 0}, + {'\0', 0, 12714, {0}, 0},{'e', 12717, 12715, {0}, 0},{'\0', 0, 12716, {0}, 0}, + {';', 0, 12717, {324}, 1},{'\0', 0, 12718, {0}, 0},{'g', 12721, 12719, {0}, 0}, + {'\0', 0, 12720, {0}, 0},{';', 0, 12721, {8736,8402}, 2},{'\0', 0, 12722, {0}, 0}, + {';', 0, 12723, {8777}, 1},{'E', 12729, 12724, {0}, 0},{'i', 12731, 12725, {0}, 0}, + {'o', 12735, 12726, {0}, 0},{'p', 12739, 12727, {0}, 0},{'\0', 0, 12728, {0}, 0}, + {';', 0, 12729, {10864,824}, 2},{'\0', 0, 12730, {0}, 0},{'d', 12733, 12731, {0}, 0}, + {'\0', 0, 12732, {0}, 0},{';', 0, 12733, {8779,824}, 2},{'\0', 0, 12734, {0}, 0}, + {'s', 12737, 12735, {0}, 0},{'\0', 0, 12736, {0}, 0},{';', 0, 12737, {329}, 1}, + {'\0', 0, 12738, {0}, 0},{'r', 12741, 12739, {0}, 0},{'\0', 0, 12740, {0}, 0}, + {'o', 12743, 12741, {0}, 0},{'\0', 0, 12742, {0}, 0},{'x', 12745, 12743, {0}, 0}, + {'\0', 0, 12744, {0}, 0},{';', 0, 12745, {8777}, 1},{'\0', 0, 12746, {0}, 0}, + {'u', 12749, 12747, {0}, 0},{'\0', 0, 12748, {0}, 0},{'r', 12751, 12749, {0}, 0}, + {'\0', 0, 12750, {0}, 0},{';', 0, 12751, {9838}, 1},{'a', 12754, 12752, {0}, 0}, + {'\0', 0, 12753, {0}, 0},{'l', 12756, 12754, {0}, 0},{'\0', 0, 12755, {0}, 0}, + {';', 0, 12756, {9838}, 1},{'s', 12759, 12757, {0}, 0},{'\0', 0, 12758, {0}, 0}, + {';', 0, 12759, {8469}, 1},{'\0', 0, 12760, {0}, 0},{'s', 12764, 12761, {0}, 0}, + {'u', 12768, 12762, {0}, 0},{'\0', 0, 12763, {0}, 0},{'p', 12766, 12764, {160}, 1}, + {'\0', 0, 12765, {0}, 0},{';', 0, 12766, {160}, 1},{'\0', 0, 12767, {0}, 0}, + {'m', 12770, 12768, {0}, 0},{'\0', 0, 12769, {0}, 0},{'p', 12772, 12770, {0}, 0}, + {'\0', 0, 12771, {0}, 0},{';', 0, 12772, {8782,824}, 2},{'e', 12775, 12773, {0}, 0}, + {'\0', 0, 12774, {0}, 0},{';', 0, 12775, {8783,824}, 2},{'\0', 0, 12776, {0}, 0}, + {'a', 12783, 12777, {0}, 0},{'e', 12794, 12778, {0}, 0},{'o', 12802, 12779, {0}, 0}, + {'u', 12815, 12780, {0}, 0},{'y', 12819, 12781, {0}, 0},{'\0', 0, 12782, {0}, 0}, + {'p', 12786, 12783, {0}, 0},{'r', 12788, 12784, {0}, 0},{'\0', 0, 12785, {0}, 0}, + {';', 0, 12786, {10819}, 1},{'\0', 0, 12787, {0}, 0},{'o', 12790, 12788, {0}, 0}, + {'\0', 0, 12789, {0}, 0},{'n', 12792, 12790, {0}, 0},{'\0', 0, 12791, {0}, 0}, + {';', 0, 12792, {328}, 1},{'\0', 0, 12793, {0}, 0},{'d', 12796, 12794, {0}, 0}, + {'\0', 0, 12795, {0}, 0},{'i', 12798, 12796, {0}, 0},{'\0', 0, 12797, {0}, 0}, + {'l', 12800, 12798, {0}, 0},{'\0', 0, 12799, {0}, 0},{';', 0, 12800, {326}, 1}, + {'\0', 0, 12801, {0}, 0},{'n', 12804, 12802, {0}, 0},{'\0', 0, 12803, {0}, 0}, + {'g', 12806, 12804, {0}, 0},{'\0', 0, 12805, {0}, 0},{';', 0, 12806, {8775}, 1}, + {'d', 12809, 12807, {0}, 0},{'\0', 0, 12808, {0}, 0},{'o', 12811, 12809, {0}, 0}, + {'\0', 0, 12810, {0}, 0},{'t', 12813, 12811, {0}, 0},{'\0', 0, 12812, {0}, 0}, + {';', 0, 12813, {10861,824}, 2},{'\0', 0, 12814, {0}, 0},{'p', 12817, 12815, {0}, 0}, + {'\0', 0, 12816, {0}, 0},{';', 0, 12817, {10818}, 1},{'\0', 0, 12818, {0}, 0}, + {';', 0, 12819, {1085}, 1},{'\0', 0, 12820, {0}, 0},{'a', 12823, 12821, {0}, 0}, + {'\0', 0, 12822, {0}, 0},{'s', 12825, 12823, {0}, 0},{'\0', 0, 12824, {0}, 0}, + {'h', 12827, 12825, {0}, 0},{'\0', 0, 12826, {0}, 0},{';', 0, 12827, {8211}, 1}, + {'\0', 0, 12828, {0}, 0},{';', 0, 12829, {8800}, 1},{'A', 12837, 12830, {0}, 0}, + {'a', 12843, 12831, {0}, 0},{'d', 12859, 12832, {0}, 0},{'q', 12865, 12833, {0}, 0}, + {'s', 12873, 12834, {0}, 0},{'x', 12886, 12835, {0}, 0},{'\0', 0, 12836, {0}, 0}, + {'r', 12839, 12837, {0}, 0},{'\0', 0, 12838, {0}, 0},{'r', 12841, 12839, {0}, 0}, + {'\0', 0, 12840, {0}, 0},{';', 0, 12841, {8663}, 1},{'\0', 0, 12842, {0}, 0}, + {'r', 12845, 12843, {0}, 0},{'\0', 0, 12844, {0}, 0},{'h', 12848, 12845, {0}, 0}, + {'r', 12852, 12846, {0}, 0},{'\0', 0, 12847, {0}, 0},{'k', 12850, 12848, {0}, 0}, + {'\0', 0, 12849, {0}, 0},{';', 0, 12850, {10532}, 1},{'\0', 0, 12851, {0}, 0}, + {';', 0, 12852, {8599}, 1},{'o', 12855, 12853, {0}, 0},{'\0', 0, 12854, {0}, 0}, + {'w', 12857, 12855, {0}, 0},{'\0', 0, 12856, {0}, 0},{';', 0, 12857, {8599}, 1}, + {'\0', 0, 12858, {0}, 0},{'o', 12861, 12859, {0}, 0},{'\0', 0, 12860, {0}, 0}, + {'t', 12863, 12861, {0}, 0},{'\0', 0, 12862, {0}, 0},{';', 0, 12863, {8784,824}, 2}, + {'\0', 0, 12864, {0}, 0},{'u', 12867, 12865, {0}, 0},{'\0', 0, 12866, {0}, 0}, + {'i', 12869, 12867, {0}, 0},{'\0', 0, 12868, {0}, 0},{'v', 12871, 12869, {0}, 0}, + {'\0', 0, 12870, {0}, 0},{';', 0, 12871, {8802}, 1},{'\0', 0, 12872, {0}, 0}, + {'e', 12876, 12873, {0}, 0},{'i', 12882, 12874, {0}, 0},{'\0', 0, 12875, {0}, 0}, + {'a', 12878, 12876, {0}, 0},{'\0', 0, 12877, {0}, 0},{'r', 12880, 12878, {0}, 0}, + {'\0', 0, 12879, {0}, 0},{';', 0, 12880, {10536}, 1},{'\0', 0, 12881, {0}, 0}, + {'m', 12884, 12882, {0}, 0},{'\0', 0, 12883, {0}, 0},{';', 0, 12884, {8770,824}, 2}, + {'\0', 0, 12885, {0}, 0},{'i', 12888, 12886, {0}, 0},{'\0', 0, 12887, {0}, 0}, + {'s', 12890, 12888, {0}, 0},{'\0', 0, 12889, {0}, 0},{'t', 12892, 12890, {0}, 0}, + {'\0', 0, 12891, {0}, 0},{';', 0, 12892, {8708}, 1},{'s', 12895, 12893, {0}, 0}, + {'\0', 0, 12894, {0}, 0},{';', 0, 12895, {8708}, 1},{'\0', 0, 12896, {0}, 0}, + {'r', 12899, 12897, {0}, 0},{'\0', 0, 12898, {0}, 0},{';', 0, 12899, {120107}, 1}, + {'\0', 0, 12900, {0}, 0},{'E', 12906, 12901, {0}, 0},{'e', 12908, 12902, {0}, 0}, + {'s', 12930, 12903, {0}, 0},{'t', 12936, 12904, {0}, 0},{'\0', 0, 12905, {0}, 0}, + {';', 0, 12906, {8807,824}, 2},{'\0', 0, 12907, {0}, 0},{';', 0, 12908, {8817}, 1}, + {'q', 12912, 12909, {0}, 0},{'s', 12928, 12910, {0}, 0},{'\0', 0, 12911, {0}, 0}, + {';', 0, 12912, {8817}, 1},{'q', 12916, 12913, {0}, 0},{'s', 12918, 12914, {0}, 0}, + {'\0', 0, 12915, {0}, 0},{';', 0, 12916, {8807,824}, 2},{'\0', 0, 12917, {0}, 0}, + {'l', 12920, 12918, {0}, 0},{'\0', 0, 12919, {0}, 0},{'a', 12922, 12920, {0}, 0}, + {'\0', 0, 12921, {0}, 0},{'n', 12924, 12922, {0}, 0},{'\0', 0, 12923, {0}, 0}, + {'t', 12926, 12924, {0}, 0},{'\0', 0, 12925, {0}, 0},{';', 0, 12926, {10878,824}, 2}, + {'\0', 0, 12927, {0}, 0},{';', 0, 12928, {10878,824}, 2},{'\0', 0, 12929, {0}, 0}, + {'i', 12932, 12930, {0}, 0},{'\0', 0, 12931, {0}, 0},{'m', 12934, 12932, {0}, 0}, + {'\0', 0, 12933, {0}, 0},{';', 0, 12934, {8821}, 1},{'\0', 0, 12935, {0}, 0}, + {';', 0, 12936, {8815}, 1},{'r', 12939, 12937, {0}, 0},{'\0', 0, 12938, {0}, 0}, + {';', 0, 12939, {8815}, 1},{'\0', 0, 12940, {0}, 0},{'A', 12945, 12941, {0}, 0}, + {'a', 12951, 12942, {0}, 0},{'p', 12957, 12943, {0}, 0},{'\0', 0, 12944, {0}, 0}, + {'r', 12947, 12945, {0}, 0},{'\0', 0, 12946, {0}, 0},{'r', 12949, 12947, {0}, 0}, + {'\0', 0, 12948, {0}, 0},{';', 0, 12949, {8654}, 1},{'\0', 0, 12950, {0}, 0}, + {'r', 12953, 12951, {0}, 0},{'\0', 0, 12952, {0}, 0},{'r', 12955, 12953, {0}, 0}, + {'\0', 0, 12954, {0}, 0},{';', 0, 12955, {8622}, 1},{'\0', 0, 12956, {0}, 0}, + {'a', 12959, 12957, {0}, 0},{'\0', 0, 12958, {0}, 0},{'r', 12961, 12959, {0}, 0}, + {'\0', 0, 12960, {0}, 0},{';', 0, 12961, {10994}, 1},{'\0', 0, 12962, {0}, 0}, + {';', 0, 12963, {8715}, 1},{'s', 12967, 12964, {0}, 0},{'v', 12972, 12965, {0}, 0}, + {'\0', 0, 12966, {0}, 0},{';', 0, 12967, {8956}, 1},{'d', 12970, 12968, {0}, 0}, + {'\0', 0, 12969, {0}, 0},{';', 0, 12970, {8954}, 1},{'\0', 0, 12971, {0}, 0}, + {';', 0, 12972, {8715}, 1},{'\0', 0, 12973, {0}, 0},{'c', 12976, 12974, {0}, 0}, + {'\0', 0, 12975, {0}, 0},{'y', 12978, 12976, {0}, 0},{'\0', 0, 12977, {0}, 0}, + {';', 0, 12978, {1114}, 1},{'\0', 0, 12979, {0}, 0},{'A', 12988, 12980, {0}, 0}, + {'E', 12994, 12981, {0}, 0},{'a', 12996, 12982, {0}, 0},{'d', 13002, 12983, {0}, 0}, + {'e', 13006, 12984, {0}, 0},{'s', 13067, 12985, {0}, 0},{'t', 13073, 12986, {0}, 0}, + {'\0', 0, 12987, {0}, 0},{'r', 12990, 12988, {0}, 0},{'\0', 0, 12989, {0}, 0}, + {'r', 12992, 12990, {0}, 0},{'\0', 0, 12991, {0}, 0},{';', 0, 12992, {8653}, 1}, + {'\0', 0, 12993, {0}, 0},{';', 0, 12994, {8806,824}, 2},{'\0', 0, 12995, {0}, 0}, + {'r', 12998, 12996, {0}, 0},{'\0', 0, 12997, {0}, 0},{'r', 13000, 12998, {0}, 0}, + {'\0', 0, 12999, {0}, 0},{';', 0, 13000, {8602}, 1},{'\0', 0, 13001, {0}, 0}, + {'r', 13004, 13002, {0}, 0},{'\0', 0, 13003, {0}, 0},{';', 0, 13004, {8229}, 1}, + {'\0', 0, 13005, {0}, 0},{';', 0, 13006, {8816}, 1},{'f', 13011, 13007, {0}, 0}, + {'q', 13046, 13008, {0}, 0},{'s', 13062, 13009, {0}, 0},{'\0', 0, 13010, {0}, 0}, + {'t', 13013, 13011, {0}, 0},{'\0', 0, 13012, {0}, 0},{'a', 13016, 13013, {0}, 0}, + {'r', 13026, 13014, {0}, 0},{'\0', 0, 13015, {0}, 0},{'r', 13018, 13016, {0}, 0}, + {'\0', 0, 13017, {0}, 0},{'r', 13020, 13018, {0}, 0},{'\0', 0, 13019, {0}, 0}, + {'o', 13022, 13020, {0}, 0},{'\0', 0, 13021, {0}, 0},{'w', 13024, 13022, {0}, 0}, + {'\0', 0, 13023, {0}, 0},{';', 0, 13024, {8602}, 1},{'\0', 0, 13025, {0}, 0}, + {'i', 13028, 13026, {0}, 0},{'\0', 0, 13027, {0}, 0},{'g', 13030, 13028, {0}, 0}, + {'\0', 0, 13029, {0}, 0},{'h', 13032, 13030, {0}, 0},{'\0', 0, 13031, {0}, 0}, + {'t', 13034, 13032, {0}, 0},{'\0', 0, 13033, {0}, 0},{'a', 13036, 13034, {0}, 0}, + {'\0', 0, 13035, {0}, 0},{'r', 13038, 13036, {0}, 0},{'\0', 0, 13037, {0}, 0}, + {'r', 13040, 13038, {0}, 0},{'\0', 0, 13039, {0}, 0},{'o', 13042, 13040, {0}, 0}, + {'\0', 0, 13041, {0}, 0},{'w', 13044, 13042, {0}, 0},{'\0', 0, 13043, {0}, 0}, + {';', 0, 13044, {8622}, 1},{'\0', 0, 13045, {0}, 0},{';', 0, 13046, {8816}, 1}, + {'q', 13050, 13047, {0}, 0},{'s', 13052, 13048, {0}, 0},{'\0', 0, 13049, {0}, 0}, + {';', 0, 13050, {8806,824}, 2},{'\0', 0, 13051, {0}, 0},{'l', 13054, 13052, {0}, 0}, + {'\0', 0, 13053, {0}, 0},{'a', 13056, 13054, {0}, 0},{'\0', 0, 13055, {0}, 0}, + {'n', 13058, 13056, {0}, 0},{'\0', 0, 13057, {0}, 0},{'t', 13060, 13058, {0}, 0}, + {'\0', 0, 13059, {0}, 0},{';', 0, 13060, {10877,824}, 2},{'\0', 0, 13061, {0}, 0}, + {';', 0, 13062, {10877,824}, 2},{'s', 13065, 13063, {0}, 0},{'\0', 0, 13064, {0}, 0}, + {';', 0, 13065, {8814}, 1},{'\0', 0, 13066, {0}, 0},{'i', 13069, 13067, {0}, 0}, + {'\0', 0, 13068, {0}, 0},{'m', 13071, 13069, {0}, 0},{'\0', 0, 13070, {0}, 0}, + {';', 0, 13071, {8820}, 1},{'\0', 0, 13072, {0}, 0},{';', 0, 13073, {8814}, 1}, + {'r', 13076, 13074, {0}, 0},{'\0', 0, 13075, {0}, 0},{'i', 13078, 13076, {0}, 0}, + {'\0', 0, 13077, {0}, 0},{';', 0, 13078, {8938}, 1},{'e', 13081, 13079, {0}, 0}, + {'\0', 0, 13080, {0}, 0},{';', 0, 13081, {8940}, 1},{'\0', 0, 13082, {0}, 0}, + {'i', 13085, 13083, {0}, 0},{'\0', 0, 13084, {0}, 0},{'d', 13087, 13085, {0}, 0}, + {'\0', 0, 13086, {0}, 0},{';', 0, 13087, {8740}, 1},{'\0', 0, 13088, {0}, 0}, + {'p', 13092, 13089, {0}, 0},{'t', 13096, 13090, {172}, 1},{'\0', 0, 13091, {0}, 0}, + {'f', 13094, 13092, {0}, 0},{'\0', 0, 13093, {0}, 0},{';', 0, 13094, {120159}, 1}, + {'\0', 0, 13095, {0}, 0},{';', 0, 13096, {172}, 1},{'i', 13100, 13097, {0}, 0}, + {'n', 13125, 13098, {0}, 0},{'\0', 0, 13099, {0}, 0},{'n', 13102, 13100, {0}, 0}, + {'\0', 0, 13101, {0}, 0},{';', 0, 13102, {8713}, 1},{'E', 13107, 13103, {0}, 0}, + {'d', 13109, 13104, {0}, 0},{'v', 13115, 13105, {0}, 0},{'\0', 0, 13106, {0}, 0}, + {';', 0, 13107, {8953,824}, 2},{'\0', 0, 13108, {0}, 0},{'o', 13111, 13109, {0}, 0}, + {'\0', 0, 13110, {0}, 0},{'t', 13113, 13111, {0}, 0},{'\0', 0, 13112, {0}, 0}, + {';', 0, 13113, {8949,824}, 2},{'\0', 0, 13114, {0}, 0},{'a', 13119, 13115, {0}, 0}, + {'b', 13121, 13116, {0}, 0},{'c', 13123, 13117, {0}, 0},{'\0', 0, 13118, {0}, 0}, + {';', 0, 13119, {8713}, 1},{'\0', 0, 13120, {0}, 0},{';', 0, 13121, {8951}, 1}, + {'\0', 0, 13122, {0}, 0},{';', 0, 13123, {8950}, 1},{'\0', 0, 13124, {0}, 0}, + {'i', 13127, 13125, {0}, 0},{'\0', 0, 13126, {0}, 0},{';', 0, 13127, {8716}, 1}, + {'v', 13130, 13128, {0}, 0},{'\0', 0, 13129, {0}, 0},{'a', 13134, 13130, {0}, 0}, + {'b', 13136, 13131, {0}, 0},{'c', 13138, 13132, {0}, 0},{'\0', 0, 13133, {0}, 0}, + {';', 0, 13134, {8716}, 1},{'\0', 0, 13135, {0}, 0},{';', 0, 13136, {8958}, 1}, + {'\0', 0, 13137, {0}, 0},{';', 0, 13138, {8957}, 1},{'\0', 0, 13139, {0}, 0}, + {'a', 13144, 13140, {0}, 0},{'o', 13167, 13141, {0}, 0},{'r', 13177, 13142, {0}, 0}, + {'\0', 0, 13143, {0}, 0},{'r', 13146, 13144, {0}, 0},{'\0', 0, 13145, {0}, 0}, + {';', 0, 13146, {8742}, 1},{'a', 13151, 13147, {0}, 0},{'s', 13161, 13148, {0}, 0}, + {'t', 13165, 13149, {0}, 0},{'\0', 0, 13150, {0}, 0},{'l', 13153, 13151, {0}, 0}, + {'\0', 0, 13152, {0}, 0},{'l', 13155, 13153, {0}, 0},{'\0', 0, 13154, {0}, 0}, + {'e', 13157, 13155, {0}, 0},{'\0', 0, 13156, {0}, 0},{'l', 13159, 13157, {0}, 0}, + {'\0', 0, 13158, {0}, 0},{';', 0, 13159, {8742}, 1},{'\0', 0, 13160, {0}, 0}, + {'l', 13163, 13161, {0}, 0},{'\0', 0, 13162, {0}, 0},{';', 0, 13163, {11005,8421}, 2}, + {'\0', 0, 13164, {0}, 0},{';', 0, 13165, {8706,824}, 2},{'\0', 0, 13166, {0}, 0}, + {'l', 13169, 13167, {0}, 0},{'\0', 0, 13168, {0}, 0},{'i', 13171, 13169, {0}, 0}, + {'\0', 0, 13170, {0}, 0},{'n', 13173, 13171, {0}, 0},{'\0', 0, 13172, {0}, 0}, + {'t', 13175, 13173, {0}, 0},{'\0', 0, 13174, {0}, 0},{';', 0, 13175, {10772}, 1}, + {'\0', 0, 13176, {0}, 0},{';', 0, 13177, {8832}, 1},{'c', 13181, 13178, {0}, 0}, + {'e', 13187, 13179, {0}, 0},{'\0', 0, 13180, {0}, 0},{'u', 13183, 13181, {0}, 0}, + {'\0', 0, 13182, {0}, 0},{'e', 13185, 13183, {0}, 0},{'\0', 0, 13184, {0}, 0}, + {';', 0, 13185, {8928}, 1},{'\0', 0, 13186, {0}, 0},{';', 0, 13187, {10927,824}, 2}, + {'c', 13190, 13188, {0}, 0},{'\0', 0, 13189, {0}, 0},{';', 0, 13190, {8832}, 1}, + {'e', 13193, 13191, {0}, 0},{'\0', 0, 13192, {0}, 0},{'q', 13195, 13193, {0}, 0}, + {'\0', 0, 13194, {0}, 0},{';', 0, 13195, {10927,824}, 2},{'\0', 0, 13196, {0}, 0}, + {'A', 13202, 13197, {0}, 0},{'a', 13208, 13198, {0}, 0},{'i', 13220, 13199, {0}, 0}, + {'t', 13238, 13200, {0}, 0},{'\0', 0, 13201, {0}, 0},{'r', 13204, 13202, {0}, 0}, + {'\0', 0, 13203, {0}, 0},{'r', 13206, 13204, {0}, 0},{'\0', 0, 13205, {0}, 0}, + {';', 0, 13206, {8655}, 1},{'\0', 0, 13207, {0}, 0},{'r', 13210, 13208, {0}, 0}, + {'\0', 0, 13209, {0}, 0},{'r', 13212, 13210, {0}, 0},{'\0', 0, 13211, {0}, 0}, + {';', 0, 13212, {8603}, 1},{'c', 13216, 13213, {0}, 0},{'w', 13218, 13214, {0}, 0}, + {'\0', 0, 13215, {0}, 0},{';', 0, 13216, {10547,824}, 2},{'\0', 0, 13217, {0}, 0}, + {';', 0, 13218, {8605,824}, 2},{'\0', 0, 13219, {0}, 0},{'g', 13222, 13220, {0}, 0}, + {'\0', 0, 13221, {0}, 0},{'h', 13224, 13222, {0}, 0},{'\0', 0, 13223, {0}, 0}, + {'t', 13226, 13224, {0}, 0},{'\0', 0, 13225, {0}, 0},{'a', 13228, 13226, {0}, 0}, + {'\0', 0, 13227, {0}, 0},{'r', 13230, 13228, {0}, 0},{'\0', 0, 13229, {0}, 0}, + {'r', 13232, 13230, {0}, 0},{'\0', 0, 13231, {0}, 0},{'o', 13234, 13232, {0}, 0}, + {'\0', 0, 13233, {0}, 0},{'w', 13236, 13234, {0}, 0},{'\0', 0, 13235, {0}, 0}, + {';', 0, 13236, {8603}, 1},{'\0', 0, 13237, {0}, 0},{'r', 13240, 13238, {0}, 0}, + {'\0', 0, 13239, {0}, 0},{'i', 13242, 13240, {0}, 0},{'\0', 0, 13241, {0}, 0}, + {';', 0, 13242, {8939}, 1},{'e', 13245, 13243, {0}, 0},{'\0', 0, 13244, {0}, 0}, + {';', 0, 13245, {8941}, 1},{'\0', 0, 13246, {0}, 0},{'c', 13255, 13247, {0}, 0}, + {'h', 13270, 13248, {0}, 0},{'i', 13301, 13249, {0}, 0},{'m', 13311, 13250, {0}, 0}, + {'p', 13317, 13251, {0}, 0},{'q', 13323, 13252, {0}, 0},{'u', 13338, 13253, {0}, 0}, + {'\0', 0, 13254, {0}, 0},{';', 0, 13255, {8833}, 1},{'c', 13260, 13256, {0}, 0}, + {'e', 13266, 13257, {0}, 0},{'r', 13268, 13258, {0}, 0},{'\0', 0, 13259, {0}, 0}, + {'u', 13262, 13260, {0}, 0},{'\0', 0, 13261, {0}, 0},{'e', 13264, 13262, {0}, 0}, + {'\0', 0, 13263, {0}, 0},{';', 0, 13264, {8929}, 1},{'\0', 0, 13265, {0}, 0}, + {';', 0, 13266, {10928,824}, 2},{'\0', 0, 13267, {0}, 0},{';', 0, 13268, {120003}, 1}, + {'\0', 0, 13269, {0}, 0},{'o', 13272, 13270, {0}, 0},{'\0', 0, 13271, {0}, 0}, + {'r', 13274, 13272, {0}, 0},{'\0', 0, 13273, {0}, 0},{'t', 13276, 13274, {0}, 0}, + {'\0', 0, 13275, {0}, 0},{'m', 13279, 13276, {0}, 0},{'p', 13285, 13277, {0}, 0}, + {'\0', 0, 13278, {0}, 0},{'i', 13281, 13279, {0}, 0},{'\0', 0, 13280, {0}, 0}, + {'d', 13283, 13281, {0}, 0},{'\0', 0, 13282, {0}, 0},{';', 0, 13283, {8740}, 1}, + {'\0', 0, 13284, {0}, 0},{'a', 13287, 13285, {0}, 0},{'\0', 0, 13286, {0}, 0}, + {'r', 13289, 13287, {0}, 0},{'\0', 0, 13288, {0}, 0},{'a', 13291, 13289, {0}, 0}, + {'\0', 0, 13290, {0}, 0},{'l', 13293, 13291, {0}, 0},{'\0', 0, 13292, {0}, 0}, + {'l', 13295, 13293, {0}, 0},{'\0', 0, 13294, {0}, 0},{'e', 13297, 13295, {0}, 0}, + {'\0', 0, 13296, {0}, 0},{'l', 13299, 13297, {0}, 0},{'\0', 0, 13298, {0}, 0}, + {';', 0, 13299, {8742}, 1},{'\0', 0, 13300, {0}, 0},{'m', 13303, 13301, {0}, 0}, + {'\0', 0, 13302, {0}, 0},{';', 0, 13303, {8769}, 1},{'e', 13306, 13304, {0}, 0}, + {'\0', 0, 13305, {0}, 0},{';', 0, 13306, {8772}, 1},{'q', 13309, 13307, {0}, 0}, + {'\0', 0, 13308, {0}, 0},{';', 0, 13309, {8772}, 1},{'\0', 0, 13310, {0}, 0}, + {'i', 13313, 13311, {0}, 0},{'\0', 0, 13312, {0}, 0},{'d', 13315, 13313, {0}, 0}, + {'\0', 0, 13314, {0}, 0},{';', 0, 13315, {8740}, 1},{'\0', 0, 13316, {0}, 0}, + {'a', 13319, 13317, {0}, 0},{'\0', 0, 13318, {0}, 0},{'r', 13321, 13319, {0}, 0}, + {'\0', 0, 13320, {0}, 0},{';', 0, 13321, {8742}, 1},{'\0', 0, 13322, {0}, 0}, + {'s', 13325, 13323, {0}, 0},{'\0', 0, 13324, {0}, 0},{'u', 13327, 13325, {0}, 0}, + {'\0', 0, 13326, {0}, 0},{'b', 13330, 13327, {0}, 0},{'p', 13334, 13328, {0}, 0}, + {'\0', 0, 13329, {0}, 0},{'e', 13332, 13330, {0}, 0},{'\0', 0, 13331, {0}, 0}, + {';', 0, 13332, {8930}, 1},{'\0', 0, 13333, {0}, 0},{'e', 13336, 13334, {0}, 0}, + {'\0', 0, 13335, {0}, 0},{';', 0, 13336, {8931}, 1},{'\0', 0, 13337, {0}, 0}, + {'b', 13342, 13338, {0}, 0},{'c', 13365, 13339, {0}, 0},{'p', 13374, 13340, {0}, 0}, + {'\0', 0, 13341, {0}, 0},{';', 0, 13342, {8836}, 1},{'E', 13347, 13343, {0}, 0}, + {'e', 13349, 13344, {0}, 0},{'s', 13351, 13345, {0}, 0},{'\0', 0, 13346, {0}, 0}, + {';', 0, 13347, {10949,824}, 2},{'\0', 0, 13348, {0}, 0},{';', 0, 13349, {8840}, 1}, + {'\0', 0, 13350, {0}, 0},{'e', 13353, 13351, {0}, 0},{'\0', 0, 13352, {0}, 0}, + {'t', 13355, 13353, {0}, 0},{'\0', 0, 13354, {0}, 0},{';', 0, 13355, {8834,8402}, 2}, + {'e', 13358, 13356, {0}, 0},{'\0', 0, 13357, {0}, 0},{'q', 13360, 13358, {0}, 0}, + {'\0', 0, 13359, {0}, 0},{';', 0, 13360, {8840}, 1},{'q', 13363, 13361, {0}, 0}, + {'\0', 0, 13362, {0}, 0},{';', 0, 13363, {10949,824}, 2},{'\0', 0, 13364, {0}, 0}, + {'c', 13367, 13365, {0}, 0},{'\0', 0, 13366, {0}, 0},{';', 0, 13367, {8833}, 1}, + {'e', 13370, 13368, {0}, 0},{'\0', 0, 13369, {0}, 0},{'q', 13372, 13370, {0}, 0}, + {'\0', 0, 13371, {0}, 0},{';', 0, 13372, {10928,824}, 2},{'\0', 0, 13373, {0}, 0}, + {';', 0, 13374, {8837}, 1},{'E', 13379, 13375, {0}, 0},{'e', 13381, 13376, {0}, 0}, + {'s', 13383, 13377, {0}, 0},{'\0', 0, 13378, {0}, 0},{';', 0, 13379, {10950,824}, 2}, + {'\0', 0, 13380, {0}, 0},{';', 0, 13381, {8841}, 1},{'\0', 0, 13382, {0}, 0}, + {'e', 13385, 13383, {0}, 0},{'\0', 0, 13384, {0}, 0},{'t', 13387, 13385, {0}, 0}, + {'\0', 0, 13386, {0}, 0},{';', 0, 13387, {8835,8402}, 2},{'e', 13390, 13388, {0}, 0}, + {'\0', 0, 13389, {0}, 0},{'q', 13392, 13390, {0}, 0},{'\0', 0, 13391, {0}, 0}, + {';', 0, 13392, {8841}, 1},{'q', 13395, 13393, {0}, 0},{'\0', 0, 13394, {0}, 0}, + {';', 0, 13395, {10950,824}, 2},{'\0', 0, 13396, {0}, 0},{'g', 13402, 13397, {0}, 0}, + {'i', 13406, 13398, {0}, 0},{'l', 13414, 13399, {0}, 0},{'r', 13418, 13400, {0}, 0}, + {'\0', 0, 13401, {0}, 0},{'l', 13404, 13402, {0}, 0},{'\0', 0, 13403, {0}, 0}, + {';', 0, 13404, {8825}, 1},{'\0', 0, 13405, {0}, 0},{'l', 13408, 13406, {0}, 0}, + {'\0', 0, 13407, {0}, 0},{'d', 13410, 13408, {0}, 0},{'\0', 0, 13409, {0}, 0}, + {'e', 13412, 13410, {241}, 1},{'\0', 0, 13411, {0}, 0},{';', 0, 13412, {241}, 1}, + {'\0', 0, 13413, {0}, 0},{'g', 13416, 13414, {0}, 0},{'\0', 0, 13415, {0}, 0}, + {';', 0, 13416, {8824}, 1},{'\0', 0, 13417, {0}, 0},{'i', 13420, 13418, {0}, 0}, + {'\0', 0, 13419, {0}, 0},{'a', 13422, 13420, {0}, 0},{'\0', 0, 13421, {0}, 0}, + {'n', 13424, 13422, {0}, 0},{'\0', 0, 13423, {0}, 0},{'g', 13426, 13424, {0}, 0}, + {'\0', 0, 13425, {0}, 0},{'l', 13428, 13426, {0}, 0},{'\0', 0, 13427, {0}, 0}, + {'e', 13430, 13428, {0}, 0},{'\0', 0, 13429, {0}, 0},{'l', 13433, 13430, {0}, 0}, + {'r', 13446, 13431, {0}, 0},{'\0', 0, 13432, {0}, 0},{'e', 13435, 13433, {0}, 0}, + {'\0', 0, 13434, {0}, 0},{'f', 13437, 13435, {0}, 0},{'\0', 0, 13436, {0}, 0}, + {'t', 13439, 13437, {0}, 0},{'\0', 0, 13438, {0}, 0},{';', 0, 13439, {8938}, 1}, + {'e', 13442, 13440, {0}, 0},{'\0', 0, 13441, {0}, 0},{'q', 13444, 13442, {0}, 0}, + {'\0', 0, 13443, {0}, 0},{';', 0, 13444, {8940}, 1},{'\0', 0, 13445, {0}, 0}, + {'i', 13448, 13446, {0}, 0},{'\0', 0, 13447, {0}, 0},{'g', 13450, 13448, {0}, 0}, + {'\0', 0, 13449, {0}, 0},{'h', 13452, 13450, {0}, 0},{'\0', 0, 13451, {0}, 0}, + {'t', 13454, 13452, {0}, 0},{'\0', 0, 13453, {0}, 0},{';', 0, 13454, {8939}, 1}, + {'e', 13457, 13455, {0}, 0},{'\0', 0, 13456, {0}, 0},{'q', 13459, 13457, {0}, 0}, + {'\0', 0, 13458, {0}, 0},{';', 0, 13459, {8941}, 1},{'\0', 0, 13460, {0}, 0}, + {';', 0, 13461, {957}, 1},{'m', 13464, 13462, {0}, 0},{'\0', 0, 13463, {0}, 0}, + {';', 0, 13464, {35}, 1},{'e', 13468, 13465, {0}, 0},{'s', 13474, 13466, {0}, 0}, + {'\0', 0, 13467, {0}, 0},{'r', 13470, 13468, {0}, 0},{'\0', 0, 13469, {0}, 0}, + {'o', 13472, 13470, {0}, 0},{'\0', 0, 13471, {0}, 0},{';', 0, 13472, {8470}, 1}, + {'\0', 0, 13473, {0}, 0},{'p', 13476, 13474, {0}, 0},{'\0', 0, 13475, {0}, 0}, + {';', 0, 13476, {8199}, 1},{'\0', 0, 13477, {0}, 0},{'D', 13488, 13478, {0}, 0}, + {'H', 13496, 13479, {0}, 0},{'a', 13504, 13480, {0}, 0},{'d', 13508, 13481, {0}, 0}, + {'g', 13516, 13482, {0}, 0},{'i', 13523, 13483, {0}, 0},{'l', 13533, 13484, {0}, 0}, + {'r', 13554, 13485, {0}, 0},{'s', 13571, 13486, {0}, 0},{'\0', 0, 13487, {0}, 0}, + {'a', 13490, 13488, {0}, 0},{'\0', 0, 13489, {0}, 0},{'s', 13492, 13490, {0}, 0}, + {'\0', 0, 13491, {0}, 0},{'h', 13494, 13492, {0}, 0},{'\0', 0, 13493, {0}, 0}, + {';', 0, 13494, {8877}, 1},{'\0', 0, 13495, {0}, 0},{'a', 13498, 13496, {0}, 0}, + {'\0', 0, 13497, {0}, 0},{'r', 13500, 13498, {0}, 0},{'\0', 0, 13499, {0}, 0}, + {'r', 13502, 13500, {0}, 0},{'\0', 0, 13501, {0}, 0},{';', 0, 13502, {10500}, 1}, + {'\0', 0, 13503, {0}, 0},{'p', 13506, 13504, {0}, 0},{'\0', 0, 13505, {0}, 0}, + {';', 0, 13506, {8781,8402}, 2},{'\0', 0, 13507, {0}, 0},{'a', 13510, 13508, {0}, 0}, + {'\0', 0, 13509, {0}, 0},{'s', 13512, 13510, {0}, 0},{'\0', 0, 13511, {0}, 0}, + {'h', 13514, 13512, {0}, 0},{'\0', 0, 13513, {0}, 0},{';', 0, 13514, {8876}, 1}, + {'\0', 0, 13515, {0}, 0},{'e', 13519, 13516, {0}, 0},{'t', 13521, 13517, {0}, 0}, + {'\0', 0, 13518, {0}, 0},{';', 0, 13519, {8805,8402}, 2},{'\0', 0, 13520, {0}, 0}, + {';', 0, 13521, {62,8402}, 2},{'\0', 0, 13522, {0}, 0},{'n', 13525, 13523, {0}, 0}, + {'\0', 0, 13524, {0}, 0},{'f', 13527, 13525, {0}, 0},{'\0', 0, 13526, {0}, 0}, + {'i', 13529, 13527, {0}, 0},{'\0', 0, 13528, {0}, 0},{'n', 13531, 13529, {0}, 0}, + {'\0', 0, 13530, {0}, 0},{';', 0, 13531, {10718}, 1},{'\0', 0, 13532, {0}, 0}, + {'A', 13537, 13533, {0}, 0},{'e', 13543, 13534, {0}, 0},{'t', 13545, 13535, {0}, 0}, + {'\0', 0, 13536, {0}, 0},{'r', 13539, 13537, {0}, 0},{'\0', 0, 13538, {0}, 0}, + {'r', 13541, 13539, {0}, 0},{'\0', 0, 13540, {0}, 0},{';', 0, 13541, {10498}, 1}, + {'\0', 0, 13542, {0}, 0},{';', 0, 13543, {8804,8402}, 2},{'\0', 0, 13544, {0}, 0}, + {';', 0, 13545, {60,8402}, 2},{'r', 13548, 13546, {0}, 0},{'\0', 0, 13547, {0}, 0}, + {'i', 13550, 13548, {0}, 0},{'\0', 0, 13549, {0}, 0},{'e', 13552, 13550, {0}, 0}, + {'\0', 0, 13551, {0}, 0},{';', 0, 13552, {8884,8402}, 2},{'\0', 0, 13553, {0}, 0}, + {'A', 13557, 13554, {0}, 0},{'t', 13563, 13555, {0}, 0},{'\0', 0, 13556, {0}, 0}, + {'r', 13559, 13557, {0}, 0},{'\0', 0, 13558, {0}, 0},{'r', 13561, 13559, {0}, 0}, + {'\0', 0, 13560, {0}, 0},{';', 0, 13561, {10499}, 1},{'\0', 0, 13562, {0}, 0}, + {'r', 13565, 13563, {0}, 0},{'\0', 0, 13564, {0}, 0},{'i', 13567, 13565, {0}, 0}, + {'\0', 0, 13566, {0}, 0},{'e', 13569, 13567, {0}, 0},{'\0', 0, 13568, {0}, 0}, + {';', 0, 13569, {8885,8402}, 2},{'\0', 0, 13570, {0}, 0},{'i', 13573, 13571, {0}, 0}, + {'\0', 0, 13572, {0}, 0},{'m', 13575, 13573, {0}, 0},{'\0', 0, 13574, {0}, 0}, + {';', 0, 13575, {8764,8402}, 2},{'\0', 0, 13576, {0}, 0},{'A', 13581, 13577, {0}, 0}, + {'a', 13587, 13578, {0}, 0},{'n', 13603, 13579, {0}, 0},{'\0', 0, 13580, {0}, 0}, + {'r', 13583, 13581, {0}, 0},{'\0', 0, 13582, {0}, 0},{'r', 13585, 13583, {0}, 0}, + {'\0', 0, 13584, {0}, 0},{';', 0, 13585, {8662}, 1},{'\0', 0, 13586, {0}, 0}, + {'r', 13589, 13587, {0}, 0},{'\0', 0, 13588, {0}, 0},{'h', 13592, 13589, {0}, 0}, + {'r', 13596, 13590, {0}, 0},{'\0', 0, 13591, {0}, 0},{'k', 13594, 13592, {0}, 0}, + {'\0', 0, 13593, {0}, 0},{';', 0, 13594, {10531}, 1},{'\0', 0, 13595, {0}, 0}, + {';', 0, 13596, {8598}, 1},{'o', 13599, 13597, {0}, 0},{'\0', 0, 13598, {0}, 0}, + {'w', 13601, 13599, {0}, 0},{'\0', 0, 13600, {0}, 0},{';', 0, 13601, {8598}, 1}, + {'\0', 0, 13602, {0}, 0},{'e', 13605, 13603, {0}, 0},{'\0', 0, 13604, {0}, 0}, + {'a', 13607, 13605, {0}, 0},{'\0', 0, 13606, {0}, 0},{'r', 13609, 13607, {0}, 0}, + {'\0', 0, 13608, {0}, 0},{';', 0, 13609, {10535}, 1},{'\0', 0, 13610, {0}, 0}, + {'S', 13630, 13611, {0}, 0},{'a', 13632, 13612, {0}, 0},{'c', 13647, 13613, {0}, 0}, + {'d', 13659, 13614, {0}, 0},{'e', 13695, 13615, {0}, 0},{'f', 13703, 13616, {0}, 0}, + {'g', 13714, 13617, {0}, 0},{'h', 13732, 13618, {0}, 0},{'i', 13743, 13619, {0}, 0}, + {'l', 13749, 13620, {0}, 0},{'m', 13783, 13621, {0}, 0},{'o', 13819, 13622, {0}, 0}, + {'p', 13825, 13623, {0}, 0},{'r', 13845, 13624, {0}, 0},{'s', 13901, 13625, {0}, 0}, + {'t', 13921, 13626, {0}, 0},{'u', 13943, 13627, {0}, 0},{'v', 13949, 13628, {0}, 0}, + {'\0', 0, 13629, {0}, 0},{';', 0, 13630, {9416}, 1},{'\0', 0, 13631, {0}, 0}, + {'c', 13635, 13632, {0}, 0},{'s', 13643, 13633, {0}, 0},{'\0', 0, 13634, {0}, 0}, + {'u', 13637, 13635, {0}, 0},{'\0', 0, 13636, {0}, 0},{'t', 13639, 13637, {0}, 0}, + {'\0', 0, 13638, {0}, 0},{'e', 13641, 13639, {243}, 1},{'\0', 0, 13640, {0}, 0}, + {';', 0, 13641, {243}, 1},{'\0', 0, 13642, {0}, 0},{'t', 13645, 13643, {0}, 0}, + {'\0', 0, 13644, {0}, 0},{';', 0, 13645, {8859}, 1},{'\0', 0, 13646, {0}, 0}, + {'i', 13650, 13647, {0}, 0},{'y', 13657, 13648, {0}, 0},{'\0', 0, 13649, {0}, 0}, + {'r', 13652, 13650, {0}, 0},{'\0', 0, 13651, {0}, 0},{';', 0, 13652, {8858}, 1}, + {'c', 13655, 13653, {244}, 1},{'\0', 0, 13654, {0}, 0},{';', 0, 13655, {244}, 1}, + {'\0', 0, 13656, {0}, 0},{';', 0, 13657, {1086}, 1},{'\0', 0, 13658, {0}, 0}, + {'a', 13665, 13659, {0}, 0},{'b', 13671, 13660, {0}, 0},{'i', 13679, 13661, {0}, 0}, + {'o', 13683, 13662, {0}, 0},{'s', 13687, 13663, {0}, 0},{'\0', 0, 13664, {0}, 0}, + {'s', 13667, 13665, {0}, 0},{'\0', 0, 13666, {0}, 0},{'h', 13669, 13667, {0}, 0}, + {'\0', 0, 13668, {0}, 0},{';', 0, 13669, {8861}, 1},{'\0', 0, 13670, {0}, 0}, + {'l', 13673, 13671, {0}, 0},{'\0', 0, 13672, {0}, 0},{'a', 13675, 13673, {0}, 0}, + {'\0', 0, 13674, {0}, 0},{'c', 13677, 13675, {0}, 0},{'\0', 0, 13676, {0}, 0}, + {';', 0, 13677, {337}, 1},{'\0', 0, 13678, {0}, 0},{'v', 13681, 13679, {0}, 0}, + {'\0', 0, 13680, {0}, 0},{';', 0, 13681, {10808}, 1},{'\0', 0, 13682, {0}, 0}, + {'t', 13685, 13683, {0}, 0},{'\0', 0, 13684, {0}, 0},{';', 0, 13685, {8857}, 1}, + {'\0', 0, 13686, {0}, 0},{'o', 13689, 13687, {0}, 0},{'\0', 0, 13688, {0}, 0}, + {'l', 13691, 13689, {0}, 0},{'\0', 0, 13690, {0}, 0},{'d', 13693, 13691, {0}, 0}, + {'\0', 0, 13692, {0}, 0},{';', 0, 13693, {10684}, 1},{'\0', 0, 13694, {0}, 0}, + {'l', 13697, 13695, {0}, 0},{'\0', 0, 13696, {0}, 0},{'i', 13699, 13697, {0}, 0}, + {'\0', 0, 13698, {0}, 0},{'g', 13701, 13699, {0}, 0},{'\0', 0, 13700, {0}, 0}, + {';', 0, 13701, {339}, 1},{'\0', 0, 13702, {0}, 0},{'c', 13706, 13703, {0}, 0}, + {'r', 13712, 13704, {0}, 0},{'\0', 0, 13705, {0}, 0},{'i', 13708, 13706, {0}, 0}, + {'\0', 0, 13707, {0}, 0},{'r', 13710, 13708, {0}, 0},{'\0', 0, 13709, {0}, 0}, + {';', 0, 13710, {10687}, 1},{'\0', 0, 13711, {0}, 0},{';', 0, 13712, {120108}, 1}, + {'\0', 0, 13713, {0}, 0},{'o', 13718, 13714, {0}, 0},{'r', 13722, 13715, {0}, 0}, + {'t', 13730, 13716, {0}, 0},{'\0', 0, 13717, {0}, 0},{'n', 13720, 13718, {0}, 0}, + {'\0', 0, 13719, {0}, 0},{';', 0, 13720, {731}, 1},{'\0', 0, 13721, {0}, 0}, + {'a', 13724, 13722, {0}, 0},{'\0', 0, 13723, {0}, 0},{'v', 13726, 13724, {0}, 0}, + {'\0', 0, 13725, {0}, 0},{'e', 13728, 13726, {242}, 1},{'\0', 0, 13727, {0}, 0}, + {';', 0, 13728, {242}, 1},{'\0', 0, 13729, {0}, 0},{';', 0, 13730, {10689}, 1}, + {'\0', 0, 13731, {0}, 0},{'b', 13735, 13732, {0}, 0},{'m', 13741, 13733, {0}, 0}, + {'\0', 0, 13734, {0}, 0},{'a', 13737, 13735, {0}, 0},{'\0', 0, 13736, {0}, 0}, + {'r', 13739, 13737, {0}, 0},{'\0', 0, 13738, {0}, 0},{';', 0, 13739, {10677}, 1}, + {'\0', 0, 13740, {0}, 0},{';', 0, 13741, {937}, 1},{'\0', 0, 13742, {0}, 0}, + {'n', 13745, 13743, {0}, 0},{'\0', 0, 13744, {0}, 0},{'t', 13747, 13745, {0}, 0}, + {'\0', 0, 13746, {0}, 0},{';', 0, 13747, {8750}, 1},{'\0', 0, 13748, {0}, 0}, + {'a', 13754, 13749, {0}, 0},{'c', 13760, 13750, {0}, 0},{'i', 13775, 13751, {0}, 0}, + {'t', 13781, 13752, {0}, 0},{'\0', 0, 13753, {0}, 0},{'r', 13756, 13754, {0}, 0}, + {'\0', 0, 13755, {0}, 0},{'r', 13758, 13756, {0}, 0},{'\0', 0, 13757, {0}, 0}, + {';', 0, 13758, {8634}, 1},{'\0', 0, 13759, {0}, 0},{'i', 13763, 13760, {0}, 0}, + {'r', 13767, 13761, {0}, 0},{'\0', 0, 13762, {0}, 0},{'r', 13765, 13763, {0}, 0}, + {'\0', 0, 13764, {0}, 0},{';', 0, 13765, {10686}, 1},{'\0', 0, 13766, {0}, 0}, + {'o', 13769, 13767, {0}, 0},{'\0', 0, 13768, {0}, 0},{'s', 13771, 13769, {0}, 0}, + {'\0', 0, 13770, {0}, 0},{'s', 13773, 13771, {0}, 0},{'\0', 0, 13772, {0}, 0}, + {';', 0, 13773, {10683}, 1},{'\0', 0, 13774, {0}, 0},{'n', 13777, 13775, {0}, 0}, + {'\0', 0, 13776, {0}, 0},{'e', 13779, 13777, {0}, 0},{'\0', 0, 13778, {0}, 0}, + {';', 0, 13779, {8254}, 1},{'\0', 0, 13780, {0}, 0},{';', 0, 13781, {10688}, 1}, + {'\0', 0, 13782, {0}, 0},{'a', 13787, 13783, {0}, 0},{'e', 13793, 13784, {0}, 0}, + {'i', 13799, 13785, {0}, 0},{'\0', 0, 13786, {0}, 0},{'c', 13789, 13787, {0}, 0}, + {'\0', 0, 13788, {0}, 0},{'r', 13791, 13789, {0}, 0},{'\0', 0, 13790, {0}, 0}, + {';', 0, 13791, {333}, 1},{'\0', 0, 13792, {0}, 0},{'g', 13795, 13793, {0}, 0}, + {'\0', 0, 13794, {0}, 0},{'a', 13797, 13795, {0}, 0},{'\0', 0, 13796, {0}, 0}, + {';', 0, 13797, {969}, 1},{'\0', 0, 13798, {0}, 0},{'c', 13803, 13799, {0}, 0}, + {'d', 13811, 13800, {0}, 0},{'n', 13813, 13801, {0}, 0},{'\0', 0, 13802, {0}, 0}, + {'r', 13805, 13803, {0}, 0},{'\0', 0, 13804, {0}, 0},{'o', 13807, 13805, {0}, 0}, + {'\0', 0, 13806, {0}, 0},{'n', 13809, 13807, {0}, 0},{'\0', 0, 13808, {0}, 0}, + {';', 0, 13809, {959}, 1},{'\0', 0, 13810, {0}, 0},{';', 0, 13811, {10678}, 1}, + {'\0', 0, 13812, {0}, 0},{'u', 13815, 13813, {0}, 0},{'\0', 0, 13814, {0}, 0}, + {'s', 13817, 13815, {0}, 0},{'\0', 0, 13816, {0}, 0},{';', 0, 13817, {8854}, 1}, + {'\0', 0, 13818, {0}, 0},{'p', 13821, 13819, {0}, 0},{'\0', 0, 13820, {0}, 0}, + {'f', 13823, 13821, {0}, 0},{'\0', 0, 13822, {0}, 0},{';', 0, 13823, {120160}, 1}, + {'\0', 0, 13824, {0}, 0},{'a', 13829, 13825, {0}, 0},{'e', 13833, 13826, {0}, 0}, + {'l', 13839, 13827, {0}, 0},{'\0', 0, 13828, {0}, 0},{'r', 13831, 13829, {0}, 0}, + {'\0', 0, 13830, {0}, 0},{';', 0, 13831, {10679}, 1},{'\0', 0, 13832, {0}, 0}, + {'r', 13835, 13833, {0}, 0},{'\0', 0, 13834, {0}, 0},{'p', 13837, 13835, {0}, 0}, + {'\0', 0, 13836, {0}, 0},{';', 0, 13837, {10681}, 1},{'\0', 0, 13838, {0}, 0}, + {'u', 13841, 13839, {0}, 0},{'\0', 0, 13840, {0}, 0},{'s', 13843, 13841, {0}, 0}, + {'\0', 0, 13842, {0}, 0},{';', 0, 13843, {8853}, 1},{'\0', 0, 13844, {0}, 0}, + {';', 0, 13845, {8744}, 1},{'a', 13853, 13846, {0}, 0},{'d', 13859, 13847, {0}, 0}, + {'i', 13877, 13848, {0}, 0},{'o', 13885, 13849, {0}, 0},{'s', 13889, 13850, {0}, 0}, + {'v', 13899, 13851, {0}, 0},{'\0', 0, 13852, {0}, 0},{'r', 13855, 13853, {0}, 0}, + {'\0', 0, 13854, {0}, 0},{'r', 13857, 13855, {0}, 0},{'\0', 0, 13856, {0}, 0}, + {';', 0, 13857, {8635}, 1},{'\0', 0, 13858, {0}, 0},{';', 0, 13859, {10845}, 1}, + {'e', 13864, 13860, {0}, 0},{'f', 13873, 13861, {170}, 1},{'m', 13875, 13862, {186}, 1}, + {'\0', 0, 13863, {0}, 0},{'r', 13866, 13864, {0}, 0},{'\0', 0, 13865, {0}, 0}, + {';', 0, 13866, {8500}, 1},{'o', 13869, 13867, {0}, 0},{'\0', 0, 13868, {0}, 0}, + {'f', 13871, 13869, {0}, 0},{'\0', 0, 13870, {0}, 0},{';', 0, 13871, {8500}, 1}, + {'\0', 0, 13872, {0}, 0},{';', 0, 13873, {170}, 1},{'\0', 0, 13874, {0}, 0}, + {';', 0, 13875, {186}, 1},{'\0', 0, 13876, {0}, 0},{'g', 13879, 13877, {0}, 0}, + {'\0', 0, 13878, {0}, 0},{'o', 13881, 13879, {0}, 0},{'\0', 0, 13880, {0}, 0}, + {'f', 13883, 13881, {0}, 0},{'\0', 0, 13882, {0}, 0},{';', 0, 13883, {8886}, 1}, + {'\0', 0, 13884, {0}, 0},{'r', 13887, 13885, {0}, 0},{'\0', 0, 13886, {0}, 0}, + {';', 0, 13887, {10838}, 1},{'\0', 0, 13888, {0}, 0},{'l', 13891, 13889, {0}, 0}, + {'\0', 0, 13890, {0}, 0},{'o', 13893, 13891, {0}, 0},{'\0', 0, 13892, {0}, 0}, + {'p', 13895, 13893, {0}, 0},{'\0', 0, 13894, {0}, 0},{'e', 13897, 13895, {0}, 0}, + {'\0', 0, 13896, {0}, 0},{';', 0, 13897, {10839}, 1},{'\0', 0, 13898, {0}, 0}, + {';', 0, 13899, {10843}, 1},{'\0', 0, 13900, {0}, 0},{'c', 13905, 13901, {0}, 0}, + {'l', 13909, 13902, {0}, 0},{'o', 13917, 13903, {0}, 0},{'\0', 0, 13904, {0}, 0}, + {'r', 13907, 13905, {0}, 0},{'\0', 0, 13906, {0}, 0},{';', 0, 13907, {8500}, 1}, + {'\0', 0, 13908, {0}, 0},{'a', 13911, 13909, {0}, 0},{'\0', 0, 13910, {0}, 0}, + {'s', 13913, 13911, {0}, 0},{'\0', 0, 13912, {0}, 0},{'h', 13915, 13913, {248}, 1}, + {'\0', 0, 13914, {0}, 0},{';', 0, 13915, {248}, 1},{'\0', 0, 13916, {0}, 0}, + {'l', 13919, 13917, {0}, 0},{'\0', 0, 13918, {0}, 0},{';', 0, 13919, {8856}, 1}, + {'\0', 0, 13920, {0}, 0},{'i', 13923, 13921, {0}, 0},{'\0', 0, 13922, {0}, 0}, + {'l', 13926, 13923, {0}, 0},{'m', 13932, 13924, {0}, 0},{'\0', 0, 13925, {0}, 0}, + {'d', 13928, 13926, {0}, 0},{'\0', 0, 13927, {0}, 0},{'e', 13930, 13928, {245}, 1}, + {'\0', 0, 13929, {0}, 0},{';', 0, 13930, {245}, 1},{'\0', 0, 13931, {0}, 0}, + {'e', 13934, 13932, {0}, 0},{'\0', 0, 13933, {0}, 0},{'s', 13936, 13934, {0}, 0}, + {'\0', 0, 13935, {0}, 0},{';', 0, 13936, {8855}, 1},{'a', 13939, 13937, {0}, 0}, + {'\0', 0, 13938, {0}, 0},{'s', 13941, 13939, {0}, 0},{'\0', 0, 13940, {0}, 0}, + {';', 0, 13941, {10806}, 1},{'\0', 0, 13942, {0}, 0},{'m', 13945, 13943, {0}, 0}, + {'\0', 0, 13944, {0}, 0},{'l', 13947, 13945, {246}, 1},{'\0', 0, 13946, {0}, 0}, + {';', 0, 13947, {246}, 1},{'\0', 0, 13948, {0}, 0},{'b', 13951, 13949, {0}, 0}, + {'\0', 0, 13950, {0}, 0},{'a', 13953, 13951, {0}, 0},{'\0', 0, 13952, {0}, 0}, + {'r', 13955, 13953, {0}, 0},{'\0', 0, 13954, {0}, 0},{';', 0, 13955, {9021}, 1}, + {'\0', 0, 13956, {0}, 0},{'a', 13970, 13957, {0}, 0},{'c', 13999, 13958, {0}, 0}, + {'e', 14003, 13959, {0}, 0},{'f', 14039, 13960, {0}, 0},{'h', 14043, 13961, {0}, 0}, + {'i', 14066, 13962, {0}, 0},{'l', 14086, 13963, {0}, 0},{'m', 14158, 13964, {0}, 0}, + {'o', 14160, 13965, {0}, 0},{'r', 14186, 13966, {0}, 0},{'s', 14363, 13967, {0}, 0}, + {'u', 14372, 13968, {0}, 0},{'\0', 0, 13969, {0}, 0},{'r', 13972, 13970, {0}, 0}, + {'\0', 0, 13971, {0}, 0},{';', 0, 13972, {8741}, 1},{'a', 13977, 13973, {182}, 1}, + {'s', 13988, 13974, {0}, 0},{'t', 13997, 13975, {0}, 0},{'\0', 0, 13976, {0}, 0}, + {';', 0, 13977, {182}, 1},{'l', 13980, 13978, {0}, 0},{'\0', 0, 13979, {0}, 0}, + {'l', 13982, 13980, {0}, 0},{'\0', 0, 13981, {0}, 0},{'e', 13984, 13982, {0}, 0}, + {'\0', 0, 13983, {0}, 0},{'l', 13986, 13984, {0}, 0},{'\0', 0, 13985, {0}, 0}, + {';', 0, 13986, {8741}, 1},{'\0', 0, 13987, {0}, 0},{'i', 13991, 13988, {0}, 0}, + {'l', 13995, 13989, {0}, 0},{'\0', 0, 13990, {0}, 0},{'m', 13993, 13991, {0}, 0}, + {'\0', 0, 13992, {0}, 0},{';', 0, 13993, {10995}, 1},{'\0', 0, 13994, {0}, 0}, + {';', 0, 13995, {11005}, 1},{'\0', 0, 13996, {0}, 0},{';', 0, 13997, {8706}, 1}, + {'\0', 0, 13998, {0}, 0},{'y', 14001, 13999, {0}, 0},{'\0', 0, 14000, {0}, 0}, + {';', 0, 14001, {1087}, 1},{'\0', 0, 14002, {0}, 0},{'r', 14005, 14003, {0}, 0}, + {'\0', 0, 14004, {0}, 0},{'c', 14011, 14005, {0}, 0},{'i', 14017, 14006, {0}, 0}, + {'m', 14023, 14007, {0}, 0},{'p', 14029, 14008, {0}, 0},{'t', 14031, 14009, {0}, 0}, + {'\0', 0, 14010, {0}, 0},{'n', 14013, 14011, {0}, 0},{'\0', 0, 14012, {0}, 0}, + {'t', 14015, 14013, {0}, 0},{'\0', 0, 14014, {0}, 0},{';', 0, 14015, {37}, 1}, + {'\0', 0, 14016, {0}, 0},{'o', 14019, 14017, {0}, 0},{'\0', 0, 14018, {0}, 0}, + {'d', 14021, 14019, {0}, 0},{'\0', 0, 14020, {0}, 0},{';', 0, 14021, {46}, 1}, + {'\0', 0, 14022, {0}, 0},{'i', 14025, 14023, {0}, 0},{'\0', 0, 14024, {0}, 0}, + {'l', 14027, 14025, {0}, 0},{'\0', 0, 14026, {0}, 0},{';', 0, 14027, {8240}, 1}, + {'\0', 0, 14028, {0}, 0},{';', 0, 14029, {8869}, 1},{'\0', 0, 14030, {0}, 0}, + {'e', 14033, 14031, {0}, 0},{'\0', 0, 14032, {0}, 0},{'n', 14035, 14033, {0}, 0}, + {'\0', 0, 14034, {0}, 0},{'k', 14037, 14035, {0}, 0},{'\0', 0, 14036, {0}, 0}, + {';', 0, 14037, {8241}, 1},{'\0', 0, 14038, {0}, 0},{'r', 14041, 14039, {0}, 0}, + {'\0', 0, 14040, {0}, 0},{';', 0, 14041, {120109}, 1},{'\0', 0, 14042, {0}, 0}, + {'i', 14047, 14043, {0}, 0},{'m', 14052, 14044, {0}, 0},{'o', 14060, 14045, {0}, 0}, + {'\0', 0, 14046, {0}, 0},{';', 0, 14047, {966}, 1},{'v', 14050, 14048, {0}, 0}, + {'\0', 0, 14049, {0}, 0},{';', 0, 14050, {981}, 1},{'\0', 0, 14051, {0}, 0}, + {'m', 14054, 14052, {0}, 0},{'\0', 0, 14053, {0}, 0},{'a', 14056, 14054, {0}, 0}, + {'\0', 0, 14055, {0}, 0},{'t', 14058, 14056, {0}, 0},{'\0', 0, 14057, {0}, 0}, + {';', 0, 14058, {8499}, 1},{'\0', 0, 14059, {0}, 0},{'n', 14062, 14060, {0}, 0}, + {'\0', 0, 14061, {0}, 0},{'e', 14064, 14062, {0}, 0},{'\0', 0, 14063, {0}, 0}, + {';', 0, 14064, {9742}, 1},{'\0', 0, 14065, {0}, 0},{';', 0, 14066, {960}, 1}, + {'t', 14070, 14067, {0}, 0},{'v', 14084, 14068, {0}, 0},{'\0', 0, 14069, {0}, 0}, + {'c', 14072, 14070, {0}, 0},{'\0', 0, 14071, {0}, 0},{'h', 14074, 14072, {0}, 0}, + {'\0', 0, 14073, {0}, 0},{'f', 14076, 14074, {0}, 0},{'\0', 0, 14075, {0}, 0}, + {'o', 14078, 14076, {0}, 0},{'\0', 0, 14077, {0}, 0},{'r', 14080, 14078, {0}, 0}, + {'\0', 0, 14079, {0}, 0},{'k', 14082, 14080, {0}, 0},{'\0', 0, 14081, {0}, 0}, + {';', 0, 14082, {8916}, 1},{'\0', 0, 14083, {0}, 0},{';', 0, 14084, {982}, 1}, + {'\0', 0, 14085, {0}, 0},{'a', 14089, 14086, {0}, 0},{'u', 14105, 14087, {0}, 0}, + {'\0', 0, 14088, {0}, 0},{'n', 14091, 14089, {0}, 0},{'\0', 0, 14090, {0}, 0}, + {'c', 14094, 14091, {0}, 0},{'k', 14101, 14092, {0}, 0},{'\0', 0, 14093, {0}, 0}, + {'k', 14096, 14094, {0}, 0},{'\0', 0, 14095, {0}, 0},{';', 0, 14096, {8463}, 1}, + {'h', 14099, 14097, {0}, 0},{'\0', 0, 14098, {0}, 0},{';', 0, 14099, {8462}, 1}, + {'\0', 0, 14100, {0}, 0},{'v', 14103, 14101, {0}, 0},{'\0', 0, 14102, {0}, 0}, + {';', 0, 14103, {8463}, 1},{'\0', 0, 14104, {0}, 0},{'s', 14107, 14105, {0}, 0}, + {'\0', 0, 14106, {0}, 0},{';', 0, 14107, {43}, 1},{'a', 14117, 14108, {0}, 0}, + {'b', 14125, 14109, {0}, 0},{'c', 14127, 14110, {0}, 0},{'d', 14133, 14111, {0}, 0}, + {'e', 14140, 14112, {0}, 0},{'m', 14142, 14113, {0}, 0},{'s', 14146, 14114, {0}, 0}, + {'t', 14152, 14115, {0}, 0},{'\0', 0, 14116, {0}, 0},{'c', 14119, 14117, {0}, 0}, + {'\0', 0, 14118, {0}, 0},{'i', 14121, 14119, {0}, 0},{'\0', 0, 14120, {0}, 0}, + {'r', 14123, 14121, {0}, 0},{'\0', 0, 14122, {0}, 0},{';', 0, 14123, {10787}, 1}, + {'\0', 0, 14124, {0}, 0},{';', 0, 14125, {8862}, 1},{'\0', 0, 14126, {0}, 0}, + {'i', 14129, 14127, {0}, 0},{'\0', 0, 14128, {0}, 0},{'r', 14131, 14129, {0}, 0}, + {'\0', 0, 14130, {0}, 0},{';', 0, 14131, {10786}, 1},{'\0', 0, 14132, {0}, 0}, + {'o', 14136, 14133, {0}, 0},{'u', 14138, 14134, {0}, 0},{'\0', 0, 14135, {0}, 0}, + {';', 0, 14136, {8724}, 1},{'\0', 0, 14137, {0}, 0},{';', 0, 14138, {10789}, 1}, + {'\0', 0, 14139, {0}, 0},{';', 0, 14140, {10866}, 1},{'\0', 0, 14141, {0}, 0}, + {'n', 14144, 14142, {177}, 1},{'\0', 0, 14143, {0}, 0},{';', 0, 14144, {177}, 1}, + {'\0', 0, 14145, {0}, 0},{'i', 14148, 14146, {0}, 0},{'\0', 0, 14147, {0}, 0}, + {'m', 14150, 14148, {0}, 0},{'\0', 0, 14149, {0}, 0},{';', 0, 14150, {10790}, 1}, + {'\0', 0, 14151, {0}, 0},{'w', 14154, 14152, {0}, 0},{'\0', 0, 14153, {0}, 0}, + {'o', 14156, 14154, {0}, 0},{'\0', 0, 14155, {0}, 0},{';', 0, 14156, {10791}, 1}, + {'\0', 0, 14157, {0}, 0},{';', 0, 14158, {177}, 1},{'\0', 0, 14159, {0}, 0}, + {'i', 14164, 14160, {0}, 0},{'p', 14176, 14161, {0}, 0},{'u', 14180, 14162, {0}, 0}, + {'\0', 0, 14163, {0}, 0},{'n', 14166, 14164, {0}, 0},{'\0', 0, 14165, {0}, 0}, + {'t', 14168, 14166, {0}, 0},{'\0', 0, 14167, {0}, 0},{'i', 14170, 14168, {0}, 0}, + {'\0', 0, 14169, {0}, 0},{'n', 14172, 14170, {0}, 0},{'\0', 0, 14171, {0}, 0}, + {'t', 14174, 14172, {0}, 0},{'\0', 0, 14173, {0}, 0},{';', 0, 14174, {10773}, 1}, + {'\0', 0, 14175, {0}, 0},{'f', 14178, 14176, {0}, 0},{'\0', 0, 14177, {0}, 0}, + {';', 0, 14178, {120161}, 1},{'\0', 0, 14179, {0}, 0},{'n', 14182, 14180, {0}, 0}, + {'\0', 0, 14181, {0}, 0},{'d', 14184, 14182, {163}, 1},{'\0', 0, 14183, {0}, 0}, + {';', 0, 14184, {163}, 1},{'\0', 0, 14185, {0}, 0},{';', 0, 14186, {8826}, 1}, + {'E', 14197, 14187, {0}, 0},{'a', 14199, 14188, {0}, 0},{'c', 14203, 14189, {0}, 0}, + {'e', 14209, 14190, {0}, 0},{'i', 14283, 14191, {0}, 0},{'n', 14292, 14192, {0}, 0}, + {'o', 14308, 14193, {0}, 0},{'s', 14349, 14194, {0}, 0},{'u', 14355, 14195, {0}, 0}, + {'\0', 0, 14196, {0}, 0},{';', 0, 14197, {10931}, 1},{'\0', 0, 14198, {0}, 0}, + {'p', 14201, 14199, {0}, 0},{'\0', 0, 14200, {0}, 0},{';', 0, 14201, {10935}, 1}, + {'\0', 0, 14202, {0}, 0},{'u', 14205, 14203, {0}, 0},{'\0', 0, 14204, {0}, 0}, + {'e', 14207, 14205, {0}, 0},{'\0', 0, 14206, {0}, 0},{';', 0, 14207, {8828}, 1}, + {'\0', 0, 14208, {0}, 0},{';', 0, 14209, {10927}, 1},{'c', 14212, 14210, {0}, 0}, + {'\0', 0, 14211, {0}, 0},{';', 0, 14212, {8826}, 1},{'a', 14219, 14213, {0}, 0}, + {'c', 14231, 14214, {0}, 0},{'e', 14245, 14215, {0}, 0},{'n', 14249, 14216, {0}, 0}, + {'s', 14277, 14217, {0}, 0},{'\0', 0, 14218, {0}, 0},{'p', 14221, 14219, {0}, 0}, + {'\0', 0, 14220, {0}, 0},{'p', 14223, 14221, {0}, 0},{'\0', 0, 14222, {0}, 0}, + {'r', 14225, 14223, {0}, 0},{'\0', 0, 14224, {0}, 0},{'o', 14227, 14225, {0}, 0}, + {'\0', 0, 14226, {0}, 0},{'x', 14229, 14227, {0}, 0},{'\0', 0, 14228, {0}, 0}, + {';', 0, 14229, {10935}, 1},{'\0', 0, 14230, {0}, 0},{'u', 14233, 14231, {0}, 0}, + {'\0', 0, 14232, {0}, 0},{'r', 14235, 14233, {0}, 0},{'\0', 0, 14234, {0}, 0}, + {'l', 14237, 14235, {0}, 0},{'\0', 0, 14236, {0}, 0},{'y', 14239, 14237, {0}, 0}, + {'\0', 0, 14238, {0}, 0},{'e', 14241, 14239, {0}, 0},{'\0', 0, 14240, {0}, 0}, + {'q', 14243, 14241, {0}, 0},{'\0', 0, 14242, {0}, 0},{';', 0, 14243, {8828}, 1}, + {'\0', 0, 14244, {0}, 0},{'q', 14247, 14245, {0}, 0},{'\0', 0, 14246, {0}, 0}, + {';', 0, 14247, {10927}, 1},{'\0', 0, 14248, {0}, 0},{'a', 14253, 14249, {0}, 0}, + {'e', 14265, 14250, {0}, 0},{'s', 14271, 14251, {0}, 0},{'\0', 0, 14252, {0}, 0}, + {'p', 14255, 14253, {0}, 0},{'\0', 0, 14254, {0}, 0},{'p', 14257, 14255, {0}, 0}, + {'\0', 0, 14256, {0}, 0},{'r', 14259, 14257, {0}, 0},{'\0', 0, 14258, {0}, 0}, + {'o', 14261, 14259, {0}, 0},{'\0', 0, 14260, {0}, 0},{'x', 14263, 14261, {0}, 0}, + {'\0', 0, 14262, {0}, 0},{';', 0, 14263, {10937}, 1},{'\0', 0, 14264, {0}, 0}, + {'q', 14267, 14265, {0}, 0},{'\0', 0, 14266, {0}, 0},{'q', 14269, 14267, {0}, 0}, + {'\0', 0, 14268, {0}, 0},{';', 0, 14269, {10933}, 1},{'\0', 0, 14270, {0}, 0}, + {'i', 14273, 14271, {0}, 0},{'\0', 0, 14272, {0}, 0},{'m', 14275, 14273, {0}, 0}, + {'\0', 0, 14274, {0}, 0},{';', 0, 14275, {8936}, 1},{'\0', 0, 14276, {0}, 0}, + {'i', 14279, 14277, {0}, 0},{'\0', 0, 14278, {0}, 0},{'m', 14281, 14279, {0}, 0}, + {'\0', 0, 14280, {0}, 0},{';', 0, 14281, {8830}, 1},{'\0', 0, 14282, {0}, 0}, + {'m', 14285, 14283, {0}, 0},{'\0', 0, 14284, {0}, 0},{'e', 14287, 14285, {0}, 0}, + {'\0', 0, 14286, {0}, 0},{';', 0, 14287, {8242}, 1},{'s', 14290, 14288, {0}, 0}, + {'\0', 0, 14289, {0}, 0},{';', 0, 14290, {8473}, 1},{'\0', 0, 14291, {0}, 0}, + {'E', 14296, 14292, {0}, 0},{'a', 14298, 14293, {0}, 0},{'s', 14302, 14294, {0}, 0}, + {'\0', 0, 14295, {0}, 0},{';', 0, 14296, {10933}, 1},{'\0', 0, 14297, {0}, 0}, + {'p', 14300, 14298, {0}, 0},{'\0', 0, 14299, {0}, 0},{';', 0, 14300, {10937}, 1}, + {'\0', 0, 14301, {0}, 0},{'i', 14304, 14302, {0}, 0},{'\0', 0, 14303, {0}, 0}, + {'m', 14306, 14304, {0}, 0},{'\0', 0, 14305, {0}, 0},{';', 0, 14306, {8936}, 1}, + {'\0', 0, 14307, {0}, 0},{'d', 14312, 14308, {0}, 0},{'f', 14314, 14309, {0}, 0}, + {'p', 14342, 14310, {0}, 0},{'\0', 0, 14311, {0}, 0},{';', 0, 14312, {8719}, 1}, + {'\0', 0, 14313, {0}, 0},{'a', 14318, 14314, {0}, 0},{'l', 14326, 14315, {0}, 0}, + {'s', 14334, 14316, {0}, 0},{'\0', 0, 14317, {0}, 0},{'l', 14320, 14318, {0}, 0}, + {'\0', 0, 14319, {0}, 0},{'a', 14322, 14320, {0}, 0},{'\0', 0, 14321, {0}, 0}, + {'r', 14324, 14322, {0}, 0},{'\0', 0, 14323, {0}, 0},{';', 0, 14324, {9006}, 1}, + {'\0', 0, 14325, {0}, 0},{'i', 14328, 14326, {0}, 0},{'\0', 0, 14327, {0}, 0}, + {'n', 14330, 14328, {0}, 0},{'\0', 0, 14329, {0}, 0},{'e', 14332, 14330, {0}, 0}, + {'\0', 0, 14331, {0}, 0},{';', 0, 14332, {8978}, 1},{'\0', 0, 14333, {0}, 0}, + {'u', 14336, 14334, {0}, 0},{'\0', 0, 14335, {0}, 0},{'r', 14338, 14336, {0}, 0}, + {'\0', 0, 14337, {0}, 0},{'f', 14340, 14338, {0}, 0},{'\0', 0, 14339, {0}, 0}, + {';', 0, 14340, {8979}, 1},{'\0', 0, 14341, {0}, 0},{';', 0, 14342, {8733}, 1}, + {'t', 14345, 14343, {0}, 0},{'\0', 0, 14344, {0}, 0},{'o', 14347, 14345, {0}, 0}, + {'\0', 0, 14346, {0}, 0},{';', 0, 14347, {8733}, 1},{'\0', 0, 14348, {0}, 0}, + {'i', 14351, 14349, {0}, 0},{'\0', 0, 14350, {0}, 0},{'m', 14353, 14351, {0}, 0}, + {'\0', 0, 14352, {0}, 0},{';', 0, 14353, {8830}, 1},{'\0', 0, 14354, {0}, 0}, + {'r', 14357, 14355, {0}, 0},{'\0', 0, 14356, {0}, 0},{'e', 14359, 14357, {0}, 0}, + {'\0', 0, 14358, {0}, 0},{'l', 14361, 14359, {0}, 0},{'\0', 0, 14360, {0}, 0}, + {';', 0, 14361, {8880}, 1},{'\0', 0, 14362, {0}, 0},{'c', 14366, 14363, {0}, 0}, + {'i', 14370, 14364, {0}, 0},{'\0', 0, 14365, {0}, 0},{'r', 14368, 14366, {0}, 0}, + {'\0', 0, 14367, {0}, 0},{';', 0, 14368, {120005}, 1},{'\0', 0, 14369, {0}, 0}, + {';', 0, 14370, {968}, 1},{'\0', 0, 14371, {0}, 0},{'n', 14374, 14372, {0}, 0}, + {'\0', 0, 14373, {0}, 0},{'c', 14376, 14374, {0}, 0},{'\0', 0, 14375, {0}, 0}, + {'s', 14378, 14376, {0}, 0},{'\0', 0, 14377, {0}, 0},{'p', 14380, 14378, {0}, 0}, + {'\0', 0, 14379, {0}, 0},{';', 0, 14380, {8200}, 1},{'\0', 0, 14381, {0}, 0}, + {'f', 14389, 14382, {0}, 0},{'i', 14393, 14383, {0}, 0},{'o', 14399, 14384, {0}, 0}, + {'p', 14405, 14385, {0}, 0},{'s', 14415, 14386, {0}, 0},{'u', 14421, 14387, {0}, 0}, + {'\0', 0, 14388, {0}, 0},{'r', 14391, 14389, {0}, 0},{'\0', 0, 14390, {0}, 0}, + {';', 0, 14391, {120110}, 1},{'\0', 0, 14392, {0}, 0},{'n', 14395, 14393, {0}, 0}, + {'\0', 0, 14394, {0}, 0},{'t', 14397, 14395, {0}, 0},{'\0', 0, 14396, {0}, 0}, + {';', 0, 14397, {10764}, 1},{'\0', 0, 14398, {0}, 0},{'p', 14401, 14399, {0}, 0}, + {'\0', 0, 14400, {0}, 0},{'f', 14403, 14401, {0}, 0},{'\0', 0, 14402, {0}, 0}, + {';', 0, 14403, {120162}, 1},{'\0', 0, 14404, {0}, 0},{'r', 14407, 14405, {0}, 0}, + {'\0', 0, 14406, {0}, 0},{'i', 14409, 14407, {0}, 0},{'\0', 0, 14408, {0}, 0}, + {'m', 14411, 14409, {0}, 0},{'\0', 0, 14410, {0}, 0},{'e', 14413, 14411, {0}, 0}, + {'\0', 0, 14412, {0}, 0},{';', 0, 14413, {8279}, 1},{'\0', 0, 14414, {0}, 0}, + {'c', 14417, 14415, {0}, 0},{'\0', 0, 14416, {0}, 0},{'r', 14419, 14417, {0}, 0}, + {'\0', 0, 14418, {0}, 0},{';', 0, 14419, {120006}, 1},{'\0', 0, 14420, {0}, 0}, + {'a', 14425, 14421, {0}, 0},{'e', 14450, 14422, {0}, 0},{'o', 14461, 14423, {0}, 0}, + {'\0', 0, 14424, {0}, 0},{'t', 14427, 14425, {0}, 0},{'\0', 0, 14426, {0}, 0}, + {'e', 14430, 14427, {0}, 0},{'i', 14444, 14428, {0}, 0},{'\0', 0, 14429, {0}, 0}, + {'r', 14432, 14430, {0}, 0},{'\0', 0, 14431, {0}, 0},{'n', 14434, 14432, {0}, 0}, + {'\0', 0, 14433, {0}, 0},{'i', 14436, 14434, {0}, 0},{'\0', 0, 14435, {0}, 0}, + {'o', 14438, 14436, {0}, 0},{'\0', 0, 14437, {0}, 0},{'n', 14440, 14438, {0}, 0}, + {'\0', 0, 14439, {0}, 0},{'s', 14442, 14440, {0}, 0},{'\0', 0, 14441, {0}, 0}, + {';', 0, 14442, {8461}, 1},{'\0', 0, 14443, {0}, 0},{'n', 14446, 14444, {0}, 0}, + {'\0', 0, 14445, {0}, 0},{'t', 14448, 14446, {0}, 0},{'\0', 0, 14447, {0}, 0}, + {';', 0, 14448, {10774}, 1},{'\0', 0, 14449, {0}, 0},{'s', 14452, 14450, {0}, 0}, + {'\0', 0, 14451, {0}, 0},{'t', 14454, 14452, {0}, 0},{'\0', 0, 14453, {0}, 0}, + {';', 0, 14454, {63}, 1},{'e', 14457, 14455, {0}, 0},{'\0', 0, 14456, {0}, 0}, + {'q', 14459, 14457, {0}, 0},{'\0', 0, 14458, {0}, 0},{';', 0, 14459, {8799}, 1}, + {'\0', 0, 14460, {0}, 0},{'t', 14463, 14461, {34}, 1},{'\0', 0, 14462, {0}, 0}, + {';', 0, 14463, {34}, 1},{'\0', 0, 14464, {0}, 0},{'A', 14487, 14465, {0}, 0}, + {'B', 14509, 14466, {0}, 0},{'H', 14517, 14467, {0}, 0},{'a', 14523, 14468, {0}, 0}, + {'b', 14658, 14469, {0}, 0},{'c', 14700, 14470, {0}, 0},{'d', 14732, 14471, {0}, 0}, + {'e', 14764, 14472, {0}, 0},{'f', 14797, 14473, {0}, 0},{'h', 14819, 14474, {0}, 0}, + {'i', 14839, 14475, {0}, 0},{'l', 15023, 14476, {0}, 0},{'m', 15041, 14477, {0}, 0}, + {'n', 15060, 14478, {0}, 0},{'o', 15068, 14479, {0}, 0},{'p', 15116, 14480, {0}, 0}, + {'r', 15140, 14481, {0}, 0},{'s', 15148, 14482, {0}, 0},{'t', 15179, 14483, {0}, 0}, + {'u', 15218, 14484, {0}, 0},{'x', 15230, 14485, {0}, 0},{'\0', 0, 14486, {0}, 0}, + {'a', 14491, 14487, {0}, 0},{'r', 14497, 14488, {0}, 0},{'t', 14501, 14489, {0}, 0}, + {'\0', 0, 14490, {0}, 0},{'r', 14493, 14491, {0}, 0},{'\0', 0, 14492, {0}, 0}, + {'r', 14495, 14493, {0}, 0},{'\0', 0, 14494, {0}, 0},{';', 0, 14495, {8667}, 1}, + {'\0', 0, 14496, {0}, 0},{'r', 14499, 14497, {0}, 0},{'\0', 0, 14498, {0}, 0}, + {';', 0, 14499, {8658}, 1},{'\0', 0, 14500, {0}, 0},{'a', 14503, 14501, {0}, 0}, + {'\0', 0, 14502, {0}, 0},{'i', 14505, 14503, {0}, 0},{'\0', 0, 14504, {0}, 0}, + {'l', 14507, 14505, {0}, 0},{'\0', 0, 14506, {0}, 0},{';', 0, 14507, {10524}, 1}, + {'\0', 0, 14508, {0}, 0},{'a', 14511, 14509, {0}, 0},{'\0', 0, 14510, {0}, 0}, + {'r', 14513, 14511, {0}, 0},{'\0', 0, 14512, {0}, 0},{'r', 14515, 14513, {0}, 0}, + {'\0', 0, 14514, {0}, 0},{';', 0, 14515, {10511}, 1},{'\0', 0, 14516, {0}, 0}, + {'a', 14519, 14517, {0}, 0},{'\0', 0, 14518, {0}, 0},{'r', 14521, 14519, {0}, 0}, + {'\0', 0, 14520, {0}, 0},{';', 0, 14521, {10596}, 1},{'\0', 0, 14522, {0}, 0}, + {'c', 14531, 14523, {0}, 0},{'d', 14542, 14524, {0}, 0},{'e', 14548, 14525, {0}, 0}, + {'n', 14560, 14526, {0}, 0},{'q', 14575, 14527, {0}, 0},{'r', 14581, 14528, {0}, 0}, + {'t', 14636, 14529, {0}, 0},{'\0', 0, 14530, {0}, 0},{'e', 14534, 14531, {0}, 0}, + {'u', 14536, 14532, {0}, 0},{'\0', 0, 14533, {0}, 0},{';', 0, 14534, {8765,817}, 2}, + {'\0', 0, 14535, {0}, 0},{'t', 14538, 14536, {0}, 0},{'\0', 0, 14537, {0}, 0}, + {'e', 14540, 14538, {0}, 0},{'\0', 0, 14539, {0}, 0},{';', 0, 14540, {341}, 1}, + {'\0', 0, 14541, {0}, 0},{'i', 14544, 14542, {0}, 0},{'\0', 0, 14543, {0}, 0}, + {'c', 14546, 14544, {0}, 0},{'\0', 0, 14545, {0}, 0},{';', 0, 14546, {8730}, 1}, + {'\0', 0, 14547, {0}, 0},{'m', 14550, 14548, {0}, 0},{'\0', 0, 14549, {0}, 0}, + {'p', 14552, 14550, {0}, 0},{'\0', 0, 14551, {0}, 0},{'t', 14554, 14552, {0}, 0}, + {'\0', 0, 14553, {0}, 0},{'y', 14556, 14554, {0}, 0},{'\0', 0, 14555, {0}, 0}, + {'v', 14558, 14556, {0}, 0},{'\0', 0, 14557, {0}, 0},{';', 0, 14558, {10675}, 1}, + {'\0', 0, 14559, {0}, 0},{'g', 14562, 14560, {0}, 0},{'\0', 0, 14561, {0}, 0}, + {';', 0, 14562, {10217}, 1},{'d', 14567, 14563, {0}, 0},{'e', 14569, 14564, {0}, 0}, + {'l', 14571, 14565, {0}, 0},{'\0', 0, 14566, {0}, 0},{';', 0, 14567, {10642}, 1}, + {'\0', 0, 14568, {0}, 0},{';', 0, 14569, {10661}, 1},{'\0', 0, 14570, {0}, 0}, + {'e', 14573, 14571, {0}, 0},{'\0', 0, 14572, {0}, 0},{';', 0, 14573, {10217}, 1}, + {'\0', 0, 14574, {0}, 0},{'u', 14577, 14575, {0}, 0},{'\0', 0, 14576, {0}, 0}, + {'o', 14579, 14577, {187}, 1},{'\0', 0, 14578, {0}, 0},{';', 0, 14579, {187}, 1}, + {'\0', 0, 14580, {0}, 0},{'r', 14583, 14581, {0}, 0},{'\0', 0, 14582, {0}, 0}, + {';', 0, 14583, {8594}, 1},{'a', 14595, 14584, {0}, 0},{'b', 14599, 14585, {0}, 0}, + {'c', 14606, 14586, {0}, 0},{'f', 14608, 14587, {0}, 0},{'h', 14612, 14588, {0}, 0}, + {'l', 14616, 14589, {0}, 0},{'p', 14620, 14590, {0}, 0},{'s', 14624, 14591, {0}, 0}, + {'t', 14630, 14592, {0}, 0},{'w', 14634, 14593, {0}, 0},{'\0', 0, 14594, {0}, 0}, + {'p', 14597, 14595, {0}, 0},{'\0', 0, 14596, {0}, 0},{';', 0, 14597, {10613}, 1}, + {'\0', 0, 14598, {0}, 0},{';', 0, 14599, {8677}, 1},{'f', 14602, 14600, {0}, 0}, + {'\0', 0, 14601, {0}, 0},{'s', 14604, 14602, {0}, 0},{'\0', 0, 14603, {0}, 0}, + {';', 0, 14604, {10528}, 1},{'\0', 0, 14605, {0}, 0},{';', 0, 14606, {10547}, 1}, + {'\0', 0, 14607, {0}, 0},{'s', 14610, 14608, {0}, 0},{'\0', 0, 14609, {0}, 0}, + {';', 0, 14610, {10526}, 1},{'\0', 0, 14611, {0}, 0},{'k', 14614, 14612, {0}, 0}, + {'\0', 0, 14613, {0}, 0},{';', 0, 14614, {8618}, 1},{'\0', 0, 14615, {0}, 0}, + {'p', 14618, 14616, {0}, 0},{'\0', 0, 14617, {0}, 0},{';', 0, 14618, {8620}, 1}, + {'\0', 0, 14619, {0}, 0},{'l', 14622, 14620, {0}, 0},{'\0', 0, 14621, {0}, 0}, + {';', 0, 14622, {10565}, 1},{'\0', 0, 14623, {0}, 0},{'i', 14626, 14624, {0}, 0}, + {'\0', 0, 14625, {0}, 0},{'m', 14628, 14626, {0}, 0},{'\0', 0, 14627, {0}, 0}, + {';', 0, 14628, {10612}, 1},{'\0', 0, 14629, {0}, 0},{'l', 14632, 14630, {0}, 0}, + {'\0', 0, 14631, {0}, 0},{';', 0, 14632, {8611}, 1},{'\0', 0, 14633, {0}, 0}, + {';', 0, 14634, {8605}, 1},{'\0', 0, 14635, {0}, 0},{'a', 14639, 14636, {0}, 0}, + {'i', 14645, 14637, {0}, 0},{'\0', 0, 14638, {0}, 0},{'i', 14641, 14639, {0}, 0}, + {'\0', 0, 14640, {0}, 0},{'l', 14643, 14641, {0}, 0},{'\0', 0, 14642, {0}, 0}, + {';', 0, 14643, {10522}, 1},{'\0', 0, 14644, {0}, 0},{'o', 14647, 14645, {0}, 0}, + {'\0', 0, 14646, {0}, 0},{';', 0, 14647, {8758}, 1},{'n', 14650, 14648, {0}, 0}, + {'\0', 0, 14649, {0}, 0},{'a', 14652, 14650, {0}, 0},{'\0', 0, 14651, {0}, 0}, + {'l', 14654, 14652, {0}, 0},{'\0', 0, 14653, {0}, 0},{'s', 14656, 14654, {0}, 0}, + {'\0', 0, 14655, {0}, 0},{';', 0, 14656, {8474}, 1},{'\0', 0, 14657, {0}, 0}, + {'a', 14662, 14658, {0}, 0},{'b', 14668, 14659, {0}, 0},{'r', 14674, 14660, {0}, 0}, + {'\0', 0, 14661, {0}, 0},{'r', 14664, 14662, {0}, 0},{'\0', 0, 14663, {0}, 0}, + {'r', 14666, 14664, {0}, 0},{'\0', 0, 14665, {0}, 0},{';', 0, 14666, {10509}, 1}, + {'\0', 0, 14667, {0}, 0},{'r', 14670, 14668, {0}, 0},{'\0', 0, 14669, {0}, 0}, + {'k', 14672, 14670, {0}, 0},{'\0', 0, 14671, {0}, 0},{';', 0, 14672, {10099}, 1}, + {'\0', 0, 14673, {0}, 0},{'a', 14677, 14674, {0}, 0},{'k', 14686, 14675, {0}, 0}, + {'\0', 0, 14676, {0}, 0},{'c', 14679, 14677, {0}, 0},{'\0', 0, 14678, {0}, 0}, + {'e', 14682, 14679, {0}, 0},{'k', 14684, 14680, {0}, 0},{'\0', 0, 14681, {0}, 0}, + {';', 0, 14682, {125}, 1},{'\0', 0, 14683, {0}, 0},{';', 0, 14684, {93}, 1}, + {'\0', 0, 14685, {0}, 0},{'e', 14689, 14686, {0}, 0},{'s', 14691, 14687, {0}, 0}, + {'\0', 0, 14688, {0}, 0},{';', 0, 14689, {10636}, 1},{'\0', 0, 14690, {0}, 0}, + {'l', 14693, 14691, {0}, 0},{'\0', 0, 14692, {0}, 0},{'d', 14696, 14693, {0}, 0}, + {'u', 14698, 14694, {0}, 0},{'\0', 0, 14695, {0}, 0},{';', 0, 14696, {10638}, 1}, + {'\0', 0, 14697, {0}, 0},{';', 0, 14698, {10640}, 1},{'\0', 0, 14699, {0}, 0}, + {'a', 14705, 14700, {0}, 0},{'e', 14713, 14701, {0}, 0},{'u', 14726, 14702, {0}, 0}, + {'y', 14730, 14703, {0}, 0},{'\0', 0, 14704, {0}, 0},{'r', 14707, 14705, {0}, 0}, + {'\0', 0, 14706, {0}, 0},{'o', 14709, 14707, {0}, 0},{'\0', 0, 14708, {0}, 0}, + {'n', 14711, 14709, {0}, 0},{'\0', 0, 14710, {0}, 0},{';', 0, 14711, {345}, 1}, + {'\0', 0, 14712, {0}, 0},{'d', 14716, 14713, {0}, 0},{'i', 14722, 14714, {0}, 0}, + {'\0', 0, 14715, {0}, 0},{'i', 14718, 14716, {0}, 0},{'\0', 0, 14717, {0}, 0}, + {'l', 14720, 14718, {0}, 0},{'\0', 0, 14719, {0}, 0},{';', 0, 14720, {343}, 1}, + {'\0', 0, 14721, {0}, 0},{'l', 14724, 14722, {0}, 0},{'\0', 0, 14723, {0}, 0}, + {';', 0, 14724, {8969}, 1},{'\0', 0, 14725, {0}, 0},{'b', 14728, 14726, {0}, 0}, + {'\0', 0, 14727, {0}, 0},{';', 0, 14728, {125}, 1},{'\0', 0, 14729, {0}, 0}, + {';', 0, 14730, {1088}, 1},{'\0', 0, 14731, {0}, 0},{'c', 14737, 14732, {0}, 0}, + {'l', 14741, 14733, {0}, 0},{'q', 14751, 14734, {0}, 0},{'s', 14760, 14735, {0}, 0}, + {'\0', 0, 14736, {0}, 0},{'a', 14739, 14737, {0}, 0},{'\0', 0, 14738, {0}, 0}, + {';', 0, 14739, {10551}, 1},{'\0', 0, 14740, {0}, 0},{'d', 14743, 14741, {0}, 0}, + {'\0', 0, 14742, {0}, 0},{'h', 14745, 14743, {0}, 0},{'\0', 0, 14744, {0}, 0}, + {'a', 14747, 14745, {0}, 0},{'\0', 0, 14746, {0}, 0},{'r', 14749, 14747, {0}, 0}, + {'\0', 0, 14748, {0}, 0},{';', 0, 14749, {10601}, 1},{'\0', 0, 14750, {0}, 0}, + {'u', 14753, 14751, {0}, 0},{'\0', 0, 14752, {0}, 0},{'o', 14755, 14753, {0}, 0}, + {'\0', 0, 14754, {0}, 0},{';', 0, 14755, {8221}, 1},{'r', 14758, 14756, {0}, 0}, + {'\0', 0, 14757, {0}, 0},{';', 0, 14758, {8221}, 1},{'\0', 0, 14759, {0}, 0}, + {'h', 14762, 14760, {0}, 0},{'\0', 0, 14761, {0}, 0},{';', 0, 14762, {8627}, 1}, + {'\0', 0, 14763, {0}, 0},{'a', 14768, 14764, {0}, 0},{'c', 14791, 14765, {0}, 0}, + {'g', 14795, 14766, {174}, 1},{'\0', 0, 14767, {0}, 0},{'l', 14770, 14768, {0}, 0}, + {'\0', 0, 14769, {0}, 0},{';', 0, 14770, {8476}, 1},{'i', 14775, 14771, {0}, 0}, + {'p', 14781, 14772, {0}, 0},{'s', 14789, 14773, {0}, 0},{'\0', 0, 14774, {0}, 0}, + {'n', 14777, 14775, {0}, 0},{'\0', 0, 14776, {0}, 0},{'e', 14779, 14777, {0}, 0}, + {'\0', 0, 14778, {0}, 0},{';', 0, 14779, {8475}, 1},{'\0', 0, 14780, {0}, 0}, + {'a', 14783, 14781, {0}, 0},{'\0', 0, 14782, {0}, 0},{'r', 14785, 14783, {0}, 0}, + {'\0', 0, 14784, {0}, 0},{'t', 14787, 14785, {0}, 0},{'\0', 0, 14786, {0}, 0}, + {';', 0, 14787, {8476}, 1},{'\0', 0, 14788, {0}, 0},{';', 0, 14789, {8477}, 1}, + {'\0', 0, 14790, {0}, 0},{'t', 14793, 14791, {0}, 0},{'\0', 0, 14792, {0}, 0}, + {';', 0, 14793, {9645}, 1},{'\0', 0, 14794, {0}, 0},{';', 0, 14795, {174}, 1}, + {'\0', 0, 14796, {0}, 0},{'i', 14801, 14797, {0}, 0},{'l', 14809, 14798, {0}, 0}, + {'r', 14817, 14799, {0}, 0},{'\0', 0, 14800, {0}, 0},{'s', 14803, 14801, {0}, 0}, + {'\0', 0, 14802, {0}, 0},{'h', 14805, 14803, {0}, 0},{'\0', 0, 14804, {0}, 0}, + {'t', 14807, 14805, {0}, 0},{'\0', 0, 14806, {0}, 0},{';', 0, 14807, {10621}, 1}, + {'\0', 0, 14808, {0}, 0},{'o', 14811, 14809, {0}, 0},{'\0', 0, 14810, {0}, 0}, + {'o', 14813, 14811, {0}, 0},{'\0', 0, 14812, {0}, 0},{'r', 14815, 14813, {0}, 0}, + {'\0', 0, 14814, {0}, 0},{';', 0, 14815, {8971}, 1},{'\0', 0, 14816, {0}, 0}, + {';', 0, 14817, {120111}, 1},{'\0', 0, 14818, {0}, 0},{'a', 14822, 14819, {0}, 0}, + {'o', 14834, 14820, {0}, 0},{'\0', 0, 14821, {0}, 0},{'r', 14824, 14822, {0}, 0}, + {'\0', 0, 14823, {0}, 0},{'d', 14827, 14824, {0}, 0},{'u', 14829, 14825, {0}, 0}, + {'\0', 0, 14826, {0}, 0},{';', 0, 14827, {8641}, 1},{'\0', 0, 14828, {0}, 0}, + {';', 0, 14829, {8640}, 1},{'l', 14832, 14830, {0}, 0},{'\0', 0, 14831, {0}, 0}, + {';', 0, 14832, {10604}, 1},{'\0', 0, 14833, {0}, 0},{';', 0, 14834, {961}, 1}, + {'v', 14837, 14835, {0}, 0},{'\0', 0, 14836, {0}, 0},{';', 0, 14837, {1009}, 1}, + {'\0', 0, 14838, {0}, 0},{'g', 14843, 14839, {0}, 0},{'n', 14999, 14840, {0}, 0}, + {'s', 15003, 14841, {0}, 0},{'\0', 0, 14842, {0}, 0},{'h', 14845, 14843, {0}, 0}, + {'\0', 0, 14844, {0}, 0},{'t', 14847, 14845, {0}, 0},{'\0', 0, 14846, {0}, 0}, + {'a', 14854, 14847, {0}, 0},{'h', 14873, 14848, {0}, 0},{'l', 14900, 14849, {0}, 0}, + {'r', 14937, 14850, {0}, 0},{'s', 14959, 14851, {0}, 0},{'t', 14979, 14852, {0}, 0}, + {'\0', 0, 14853, {0}, 0},{'r', 14856, 14854, {0}, 0},{'\0', 0, 14855, {0}, 0}, + {'r', 14858, 14856, {0}, 0},{'\0', 0, 14857, {0}, 0},{'o', 14860, 14858, {0}, 0}, + {'\0', 0, 14859, {0}, 0},{'w', 14862, 14860, {0}, 0},{'\0', 0, 14861, {0}, 0}, + {';', 0, 14862, {8594}, 1},{'t', 14865, 14863, {0}, 0},{'\0', 0, 14864, {0}, 0}, + {'a', 14867, 14865, {0}, 0},{'\0', 0, 14866, {0}, 0},{'i', 14869, 14867, {0}, 0}, + {'\0', 0, 14868, {0}, 0},{'l', 14871, 14869, {0}, 0},{'\0', 0, 14870, {0}, 0}, + {';', 0, 14871, {8611}, 1},{'\0', 0, 14872, {0}, 0},{'a', 14875, 14873, {0}, 0}, + {'\0', 0, 14874, {0}, 0},{'r', 14877, 14875, {0}, 0},{'\0', 0, 14876, {0}, 0}, + {'p', 14879, 14877, {0}, 0},{'\0', 0, 14878, {0}, 0},{'o', 14881, 14879, {0}, 0}, + {'\0', 0, 14880, {0}, 0},{'o', 14883, 14881, {0}, 0},{'\0', 0, 14882, {0}, 0}, + {'n', 14885, 14883, {0}, 0},{'\0', 0, 14884, {0}, 0},{'d', 14888, 14885, {0}, 0}, + {'u', 14896, 14886, {0}, 0},{'\0', 0, 14887, {0}, 0},{'o', 14890, 14888, {0}, 0}, + {'\0', 0, 14889, {0}, 0},{'w', 14892, 14890, {0}, 0},{'\0', 0, 14891, {0}, 0}, + {'n', 14894, 14892, {0}, 0},{'\0', 0, 14893, {0}, 0},{';', 0, 14894, {8641}, 1}, + {'\0', 0, 14895, {0}, 0},{'p', 14898, 14896, {0}, 0},{'\0', 0, 14897, {0}, 0}, + {';', 0, 14898, {8640}, 1},{'\0', 0, 14899, {0}, 0},{'e', 14902, 14900, {0}, 0}, + {'\0', 0, 14901, {0}, 0},{'f', 14904, 14902, {0}, 0},{'\0', 0, 14903, {0}, 0}, + {'t', 14906, 14904, {0}, 0},{'\0', 0, 14905, {0}, 0},{'a', 14909, 14906, {0}, 0}, + {'h', 14921, 14907, {0}, 0},{'\0', 0, 14908, {0}, 0},{'r', 14911, 14909, {0}, 0}, + {'\0', 0, 14910, {0}, 0},{'r', 14913, 14911, {0}, 0},{'\0', 0, 14912, {0}, 0}, + {'o', 14915, 14913, {0}, 0},{'\0', 0, 14914, {0}, 0},{'w', 14917, 14915, {0}, 0}, + {'\0', 0, 14916, {0}, 0},{'s', 14919, 14917, {0}, 0},{'\0', 0, 14918, {0}, 0}, + {';', 0, 14919, {8644}, 1},{'\0', 0, 14920, {0}, 0},{'a', 14923, 14921, {0}, 0}, + {'\0', 0, 14922, {0}, 0},{'r', 14925, 14923, {0}, 0},{'\0', 0, 14924, {0}, 0}, + {'p', 14927, 14925, {0}, 0},{'\0', 0, 14926, {0}, 0},{'o', 14929, 14927, {0}, 0}, + {'\0', 0, 14928, {0}, 0},{'o', 14931, 14929, {0}, 0},{'\0', 0, 14930, {0}, 0}, + {'n', 14933, 14931, {0}, 0},{'\0', 0, 14932, {0}, 0},{'s', 14935, 14933, {0}, 0}, + {'\0', 0, 14934, {0}, 0},{';', 0, 14935, {8652}, 1},{'\0', 0, 14936, {0}, 0}, + {'i', 14939, 14937, {0}, 0},{'\0', 0, 14938, {0}, 0},{'g', 14941, 14939, {0}, 0}, + {'\0', 0, 14940, {0}, 0},{'h', 14943, 14941, {0}, 0},{'\0', 0, 14942, {0}, 0}, + {'t', 14945, 14943, {0}, 0},{'\0', 0, 14944, {0}, 0},{'a', 14947, 14945, {0}, 0}, + {'\0', 0, 14946, {0}, 0},{'r', 14949, 14947, {0}, 0},{'\0', 0, 14948, {0}, 0}, + {'r', 14951, 14949, {0}, 0},{'\0', 0, 14950, {0}, 0},{'o', 14953, 14951, {0}, 0}, + {'\0', 0, 14952, {0}, 0},{'w', 14955, 14953, {0}, 0},{'\0', 0, 14954, {0}, 0}, + {'s', 14957, 14955, {0}, 0},{'\0', 0, 14956, {0}, 0},{';', 0, 14957, {8649}, 1}, + {'\0', 0, 14958, {0}, 0},{'q', 14961, 14959, {0}, 0},{'\0', 0, 14960, {0}, 0}, + {'u', 14963, 14961, {0}, 0},{'\0', 0, 14962, {0}, 0},{'i', 14965, 14963, {0}, 0}, + {'\0', 0, 14964, {0}, 0},{'g', 14967, 14965, {0}, 0},{'\0', 0, 14966, {0}, 0}, + {'a', 14969, 14967, {0}, 0},{'\0', 0, 14968, {0}, 0},{'r', 14971, 14969, {0}, 0}, + {'\0', 0, 14970, {0}, 0},{'r', 14973, 14971, {0}, 0},{'\0', 0, 14972, {0}, 0}, + {'o', 14975, 14973, {0}, 0},{'\0', 0, 14974, {0}, 0},{'w', 14977, 14975, {0}, 0}, + {'\0', 0, 14976, {0}, 0},{';', 0, 14977, {8605}, 1},{'\0', 0, 14978, {0}, 0}, + {'h', 14981, 14979, {0}, 0},{'\0', 0, 14980, {0}, 0},{'r', 14983, 14981, {0}, 0}, + {'\0', 0, 14982, {0}, 0},{'e', 14985, 14983, {0}, 0},{'\0', 0, 14984, {0}, 0}, + {'e', 14987, 14985, {0}, 0},{'\0', 0, 14986, {0}, 0},{'t', 14989, 14987, {0}, 0}, + {'\0', 0, 14988, {0}, 0},{'i', 14991, 14989, {0}, 0},{'\0', 0, 14990, {0}, 0}, + {'m', 14993, 14991, {0}, 0},{'\0', 0, 14992, {0}, 0},{'e', 14995, 14993, {0}, 0}, + {'\0', 0, 14994, {0}, 0},{'s', 14997, 14995, {0}, 0},{'\0', 0, 14996, {0}, 0}, + {';', 0, 14997, {8908}, 1},{'\0', 0, 14998, {0}, 0},{'g', 15001, 14999, {0}, 0}, + {'\0', 0, 15000, {0}, 0},{';', 0, 15001, {730}, 1},{'\0', 0, 15002, {0}, 0}, + {'i', 15005, 15003, {0}, 0},{'\0', 0, 15004, {0}, 0},{'n', 15007, 15005, {0}, 0}, + {'\0', 0, 15006, {0}, 0},{'g', 15009, 15007, {0}, 0},{'\0', 0, 15008, {0}, 0}, + {'d', 15011, 15009, {0}, 0},{'\0', 0, 15010, {0}, 0},{'o', 15013, 15011, {0}, 0}, + {'\0', 0, 15012, {0}, 0},{'t', 15015, 15013, {0}, 0},{'\0', 0, 15014, {0}, 0}, + {'s', 15017, 15015, {0}, 0},{'\0', 0, 15016, {0}, 0},{'e', 15019, 15017, {0}, 0}, + {'\0', 0, 15018, {0}, 0},{'q', 15021, 15019, {0}, 0},{'\0', 0, 15020, {0}, 0}, + {';', 0, 15021, {8787}, 1},{'\0', 0, 15022, {0}, 0},{'a', 15027, 15023, {0}, 0}, + {'h', 15033, 15024, {0}, 0},{'m', 15039, 15025, {0}, 0},{'\0', 0, 15026, {0}, 0}, + {'r', 15029, 15027, {0}, 0},{'\0', 0, 15028, {0}, 0},{'r', 15031, 15029, {0}, 0}, + {'\0', 0, 15030, {0}, 0},{';', 0, 15031, {8644}, 1},{'\0', 0, 15032, {0}, 0}, + {'a', 15035, 15033, {0}, 0},{'\0', 0, 15034, {0}, 0},{'r', 15037, 15035, {0}, 0}, + {'\0', 0, 15036, {0}, 0},{';', 0, 15037, {8652}, 1},{'\0', 0, 15038, {0}, 0}, + {';', 0, 15039, {8207}, 1},{'\0', 0, 15040, {0}, 0},{'o', 15043, 15041, {0}, 0}, + {'\0', 0, 15042, {0}, 0},{'u', 15045, 15043, {0}, 0},{'\0', 0, 15044, {0}, 0}, + {'s', 15047, 15045, {0}, 0},{'\0', 0, 15046, {0}, 0},{'t', 15049, 15047, {0}, 0}, + {'\0', 0, 15048, {0}, 0},{';', 0, 15049, {9137}, 1},{'a', 15052, 15050, {0}, 0}, + {'\0', 0, 15051, {0}, 0},{'c', 15054, 15052, {0}, 0},{'\0', 0, 15053, {0}, 0}, + {'h', 15056, 15054, {0}, 0},{'\0', 0, 15055, {0}, 0},{'e', 15058, 15056, {0}, 0}, + {'\0', 0, 15057, {0}, 0},{';', 0, 15058, {9137}, 1},{'\0', 0, 15059, {0}, 0}, + {'m', 15062, 15060, {0}, 0},{'\0', 0, 15061, {0}, 0},{'i', 15064, 15062, {0}, 0}, + {'\0', 0, 15063, {0}, 0},{'d', 15066, 15064, {0}, 0},{'\0', 0, 15065, {0}, 0}, + {';', 0, 15066, {10990}, 1},{'\0', 0, 15067, {0}, 0},{'a', 15073, 15068, {0}, 0}, + {'b', 15084, 15069, {0}, 0},{'p', 15090, 15070, {0}, 0},{'t', 15106, 15071, {0}, 0}, + {'\0', 0, 15072, {0}, 0},{'n', 15076, 15073, {0}, 0},{'r', 15080, 15074, {0}, 0}, + {'\0', 0, 15075, {0}, 0},{'g', 15078, 15076, {0}, 0},{'\0', 0, 15077, {0}, 0}, + {';', 0, 15078, {10221}, 1},{'\0', 0, 15079, {0}, 0},{'r', 15082, 15080, {0}, 0}, + {'\0', 0, 15081, {0}, 0},{';', 0, 15082, {8702}, 1},{'\0', 0, 15083, {0}, 0}, + {'r', 15086, 15084, {0}, 0},{'\0', 0, 15085, {0}, 0},{'k', 15088, 15086, {0}, 0}, + {'\0', 0, 15087, {0}, 0},{';', 0, 15088, {10215}, 1},{'\0', 0, 15089, {0}, 0}, + {'a', 15094, 15090, {0}, 0},{'f', 15098, 15091, {0}, 0},{'l', 15100, 15092, {0}, 0}, + {'\0', 0, 15093, {0}, 0},{'r', 15096, 15094, {0}, 0},{'\0', 0, 15095, {0}, 0}, + {';', 0, 15096, {10630}, 1},{'\0', 0, 15097, {0}, 0},{';', 0, 15098, {120163}, 1}, + {'\0', 0, 15099, {0}, 0},{'u', 15102, 15100, {0}, 0},{'\0', 0, 15101, {0}, 0}, + {'s', 15104, 15102, {0}, 0},{'\0', 0, 15103, {0}, 0},{';', 0, 15104, {10798}, 1}, + {'\0', 0, 15105, {0}, 0},{'i', 15108, 15106, {0}, 0},{'\0', 0, 15107, {0}, 0}, + {'m', 15110, 15108, {0}, 0},{'\0', 0, 15109, {0}, 0},{'e', 15112, 15110, {0}, 0}, + {'\0', 0, 15111, {0}, 0},{'s', 15114, 15112, {0}, 0},{'\0', 0, 15113, {0}, 0}, + {';', 0, 15114, {10805}, 1},{'\0', 0, 15115, {0}, 0},{'a', 15119, 15116, {0}, 0}, + {'p', 15128, 15117, {0}, 0},{'\0', 0, 15118, {0}, 0},{'r', 15121, 15119, {0}, 0}, + {'\0', 0, 15120, {0}, 0},{';', 0, 15121, {41}, 1},{'g', 15124, 15122, {0}, 0}, + {'\0', 0, 15123, {0}, 0},{'t', 15126, 15124, {0}, 0},{'\0', 0, 15125, {0}, 0}, + {';', 0, 15126, {10644}, 1},{'\0', 0, 15127, {0}, 0},{'o', 15130, 15128, {0}, 0}, + {'\0', 0, 15129, {0}, 0},{'l', 15132, 15130, {0}, 0},{'\0', 0, 15131, {0}, 0}, + {'i', 15134, 15132, {0}, 0},{'\0', 0, 15133, {0}, 0},{'n', 15136, 15134, {0}, 0}, + {'\0', 0, 15135, {0}, 0},{'t', 15138, 15136, {0}, 0},{'\0', 0, 15137, {0}, 0}, + {';', 0, 15138, {10770}, 1},{'\0', 0, 15139, {0}, 0},{'a', 15142, 15140, {0}, 0}, + {'\0', 0, 15141, {0}, 0},{'r', 15144, 15142, {0}, 0},{'\0', 0, 15143, {0}, 0}, + {'r', 15146, 15144, {0}, 0},{'\0', 0, 15145, {0}, 0},{';', 0, 15146, {8649}, 1}, + {'\0', 0, 15147, {0}, 0},{'a', 15153, 15148, {0}, 0},{'c', 15161, 15149, {0}, 0}, + {'h', 15165, 15150, {0}, 0},{'q', 15167, 15151, {0}, 0},{'\0', 0, 15152, {0}, 0}, + {'q', 15155, 15153, {0}, 0},{'\0', 0, 15154, {0}, 0},{'u', 15157, 15155, {0}, 0}, + {'\0', 0, 15156, {0}, 0},{'o', 15159, 15157, {0}, 0},{'\0', 0, 15158, {0}, 0}, + {';', 0, 15159, {8250}, 1},{'\0', 0, 15160, {0}, 0},{'r', 15163, 15161, {0}, 0}, + {'\0', 0, 15162, {0}, 0},{';', 0, 15163, {120007}, 1},{'\0', 0, 15164, {0}, 0}, + {';', 0, 15165, {8625}, 1},{'\0', 0, 15166, {0}, 0},{'b', 15170, 15167, {0}, 0}, + {'u', 15172, 15168, {0}, 0},{'\0', 0, 15169, {0}, 0},{';', 0, 15170, {93}, 1}, + {'\0', 0, 15171, {0}, 0},{'o', 15174, 15172, {0}, 0},{'\0', 0, 15173, {0}, 0}, + {';', 0, 15174, {8217}, 1},{'r', 15177, 15175, {0}, 0},{'\0', 0, 15176, {0}, 0}, + {';', 0, 15177, {8217}, 1},{'\0', 0, 15178, {0}, 0},{'h', 15183, 15179, {0}, 0}, + {'i', 15191, 15180, {0}, 0},{'r', 15199, 15181, {0}, 0},{'\0', 0, 15182, {0}, 0}, + {'r', 15185, 15183, {0}, 0},{'\0', 0, 15184, {0}, 0},{'e', 15187, 15185, {0}, 0}, + {'\0', 0, 15186, {0}, 0},{'e', 15189, 15187, {0}, 0},{'\0', 0, 15188, {0}, 0}, + {';', 0, 15189, {8908}, 1},{'\0', 0, 15190, {0}, 0},{'m', 15193, 15191, {0}, 0}, + {'\0', 0, 15192, {0}, 0},{'e', 15195, 15193, {0}, 0},{'\0', 0, 15194, {0}, 0}, + {'s', 15197, 15195, {0}, 0},{'\0', 0, 15196, {0}, 0},{';', 0, 15197, {8906}, 1}, + {'\0', 0, 15198, {0}, 0},{'i', 15201, 15199, {0}, 0},{'\0', 0, 15200, {0}, 0}, + {';', 0, 15201, {9657}, 1},{'e', 15206, 15202, {0}, 0},{'f', 15208, 15203, {0}, 0}, + {'l', 15210, 15204, {0}, 0},{'\0', 0, 15205, {0}, 0},{';', 0, 15206, {8885}, 1}, + {'\0', 0, 15207, {0}, 0},{';', 0, 15208, {9656}, 1},{'\0', 0, 15209, {0}, 0}, + {'t', 15212, 15210, {0}, 0},{'\0', 0, 15211, {0}, 0},{'r', 15214, 15212, {0}, 0}, + {'\0', 0, 15213, {0}, 0},{'i', 15216, 15214, {0}, 0},{'\0', 0, 15215, {0}, 0}, + {';', 0, 15216, {10702}, 1},{'\0', 0, 15217, {0}, 0},{'l', 15220, 15218, {0}, 0}, + {'\0', 0, 15219, {0}, 0},{'u', 15222, 15220, {0}, 0},{'\0', 0, 15221, {0}, 0}, + {'h', 15224, 15222, {0}, 0},{'\0', 0, 15223, {0}, 0},{'a', 15226, 15224, {0}, 0}, + {'\0', 0, 15225, {0}, 0},{'r', 15228, 15226, {0}, 0},{'\0', 0, 15227, {0}, 0}, + {';', 0, 15228, {10600}, 1},{'\0', 0, 15229, {0}, 0},{';', 0, 15230, {8478}, 1}, + {'\0', 0, 15231, {0}, 0},{'a', 15252, 15232, {0}, 0},{'b', 15262, 15233, {0}, 0}, + {'c', 15270, 15234, {0}, 0},{'d', 15351, 15235, {0}, 0},{'e', 15363, 15236, {0}, 0}, + {'f', 15428, 15237, {0}, 0},{'h', 15439, 15238, {0}, 0},{'i', 15492, 15239, {0}, 0}, + {'l', 15557, 15240, {0}, 0},{'m', 15565, 15241, {0}, 0},{'o', 15628, 15242, {0}, 0}, + {'p', 15654, 15243, {0}, 0},{'q', 15674, 15244, {0}, 0},{'r', 15749, 15245, {0}, 0}, + {'s', 15757, 15246, {0}, 0},{'t', 15790, 15247, {0}, 0},{'u', 15838, 15248, {0}, 0}, + {'w', 16143, 15249, {0}, 0},{'z', 16177, 15250, {0}, 0},{'\0', 0, 15251, {0}, 0}, + {'c', 15254, 15252, {0}, 0},{'\0', 0, 15253, {0}, 0},{'u', 15256, 15254, {0}, 0}, + {'\0', 0, 15255, {0}, 0},{'t', 15258, 15256, {0}, 0},{'\0', 0, 15257, {0}, 0}, + {'e', 15260, 15258, {0}, 0},{'\0', 0, 15259, {0}, 0},{';', 0, 15260, {347}, 1}, + {'\0', 0, 15261, {0}, 0},{'q', 15264, 15262, {0}, 0},{'\0', 0, 15263, {0}, 0}, + {'u', 15266, 15264, {0}, 0},{'\0', 0, 15265, {0}, 0},{'o', 15268, 15266, {0}, 0}, + {'\0', 0, 15267, {0}, 0},{';', 0, 15268, {8218}, 1},{'\0', 0, 15269, {0}, 0}, + {';', 0, 15270, {8827}, 1},{'E', 15281, 15271, {0}, 0},{'a', 15283, 15272, {0}, 0}, + {'c', 15294, 15273, {0}, 0},{'e', 15300, 15274, {0}, 0},{'i', 15309, 15275, {0}, 0}, + {'n', 15315, 15276, {0}, 0},{'p', 15331, 15277, {0}, 0},{'s', 15343, 15278, {0}, 0}, + {'y', 15349, 15279, {0}, 0},{'\0', 0, 15280, {0}, 0},{';', 0, 15281, {10932}, 1}, + {'\0', 0, 15282, {0}, 0},{'p', 15286, 15283, {0}, 0},{'r', 15288, 15284, {0}, 0}, + {'\0', 0, 15285, {0}, 0},{';', 0, 15286, {10936}, 1},{'\0', 0, 15287, {0}, 0}, + {'o', 15290, 15288, {0}, 0},{'\0', 0, 15289, {0}, 0},{'n', 15292, 15290, {0}, 0}, + {'\0', 0, 15291, {0}, 0},{';', 0, 15292, {353}, 1},{'\0', 0, 15293, {0}, 0}, + {'u', 15296, 15294, {0}, 0},{'\0', 0, 15295, {0}, 0},{'e', 15298, 15296, {0}, 0}, + {'\0', 0, 15297, {0}, 0},{';', 0, 15298, {8829}, 1},{'\0', 0, 15299, {0}, 0}, + {';', 0, 15300, {10928}, 1},{'d', 15303, 15301, {0}, 0},{'\0', 0, 15302, {0}, 0}, + {'i', 15305, 15303, {0}, 0},{'\0', 0, 15304, {0}, 0},{'l', 15307, 15305, {0}, 0}, + {'\0', 0, 15306, {0}, 0},{';', 0, 15307, {351}, 1},{'\0', 0, 15308, {0}, 0}, + {'r', 15311, 15309, {0}, 0},{'\0', 0, 15310, {0}, 0},{'c', 15313, 15311, {0}, 0}, + {'\0', 0, 15312, {0}, 0},{';', 0, 15313, {349}, 1},{'\0', 0, 15314, {0}, 0}, + {'E', 15319, 15315, {0}, 0},{'a', 15321, 15316, {0}, 0},{'s', 15325, 15317, {0}, 0}, + {'\0', 0, 15318, {0}, 0},{';', 0, 15319, {10934}, 1},{'\0', 0, 15320, {0}, 0}, + {'p', 15323, 15321, {0}, 0},{'\0', 0, 15322, {0}, 0},{';', 0, 15323, {10938}, 1}, + {'\0', 0, 15324, {0}, 0},{'i', 15327, 15325, {0}, 0},{'\0', 0, 15326, {0}, 0}, + {'m', 15329, 15327, {0}, 0},{'\0', 0, 15328, {0}, 0},{';', 0, 15329, {8937}, 1}, + {'\0', 0, 15330, {0}, 0},{'o', 15333, 15331, {0}, 0},{'\0', 0, 15332, {0}, 0}, + {'l', 15335, 15333, {0}, 0},{'\0', 0, 15334, {0}, 0},{'i', 15337, 15335, {0}, 0}, + {'\0', 0, 15336, {0}, 0},{'n', 15339, 15337, {0}, 0},{'\0', 0, 15338, {0}, 0}, + {'t', 15341, 15339, {0}, 0},{'\0', 0, 15340, {0}, 0},{';', 0, 15341, {10771}, 1}, + {'\0', 0, 15342, {0}, 0},{'i', 15345, 15343, {0}, 0},{'\0', 0, 15344, {0}, 0}, + {'m', 15347, 15345, {0}, 0},{'\0', 0, 15346, {0}, 0},{';', 0, 15347, {8831}, 1}, + {'\0', 0, 15348, {0}, 0},{';', 0, 15349, {1089}, 1},{'\0', 0, 15350, {0}, 0}, + {'o', 15353, 15351, {0}, 0},{'\0', 0, 15352, {0}, 0},{'t', 15355, 15353, {0}, 0}, + {'\0', 0, 15354, {0}, 0},{';', 0, 15355, {8901}, 1},{'b', 15359, 15356, {0}, 0}, + {'e', 15361, 15357, {0}, 0},{'\0', 0, 15358, {0}, 0},{';', 0, 15359, {8865}, 1}, + {'\0', 0, 15360, {0}, 0},{';', 0, 15361, {10854}, 1},{'\0', 0, 15362, {0}, 0}, + {'A', 15371, 15363, {0}, 0},{'a', 15377, 15364, {0}, 0},{'c', 15393, 15365, {0}, 0}, + {'m', 15397, 15366, {0}, 0},{'s', 15401, 15367, {0}, 0},{'t', 15409, 15368, {0}, 0}, + {'x', 15424, 15369, {0}, 0},{'\0', 0, 15370, {0}, 0},{'r', 15373, 15371, {0}, 0}, + {'\0', 0, 15372, {0}, 0},{'r', 15375, 15373, {0}, 0},{'\0', 0, 15374, {0}, 0}, + {';', 0, 15375, {8664}, 1},{'\0', 0, 15376, {0}, 0},{'r', 15379, 15377, {0}, 0}, + {'\0', 0, 15378, {0}, 0},{'h', 15382, 15379, {0}, 0},{'r', 15386, 15380, {0}, 0}, + {'\0', 0, 15381, {0}, 0},{'k', 15384, 15382, {0}, 0},{'\0', 0, 15383, {0}, 0}, + {';', 0, 15384, {10533}, 1},{'\0', 0, 15385, {0}, 0},{';', 0, 15386, {8600}, 1}, + {'o', 15389, 15387, {0}, 0},{'\0', 0, 15388, {0}, 0},{'w', 15391, 15389, {0}, 0}, + {'\0', 0, 15390, {0}, 0},{';', 0, 15391, {8600}, 1},{'\0', 0, 15392, {0}, 0}, + {'t', 15395, 15393, {167}, 1},{'\0', 0, 15394, {0}, 0},{';', 0, 15395, {167}, 1}, + {'\0', 0, 15396, {0}, 0},{'i', 15399, 15397, {0}, 0},{'\0', 0, 15398, {0}, 0}, + {';', 0, 15399, {59}, 1},{'\0', 0, 15400, {0}, 0},{'w', 15403, 15401, {0}, 0}, + {'\0', 0, 15402, {0}, 0},{'a', 15405, 15403, {0}, 0},{'\0', 0, 15404, {0}, 0}, + {'r', 15407, 15405, {0}, 0},{'\0', 0, 15406, {0}, 0},{';', 0, 15407, {10537}, 1}, + {'\0', 0, 15408, {0}, 0},{'m', 15411, 15409, {0}, 0},{'\0', 0, 15410, {0}, 0}, + {'i', 15414, 15411, {0}, 0},{'n', 15422, 15412, {0}, 0},{'\0', 0, 15413, {0}, 0}, + {'n', 15416, 15414, {0}, 0},{'\0', 0, 15415, {0}, 0},{'u', 15418, 15416, {0}, 0}, + {'\0', 0, 15417, {0}, 0},{'s', 15420, 15418, {0}, 0},{'\0', 0, 15419, {0}, 0}, + {';', 0, 15420, {8726}, 1},{'\0', 0, 15421, {0}, 0},{';', 0, 15422, {8726}, 1}, + {'\0', 0, 15423, {0}, 0},{'t', 15426, 15424, {0}, 0},{'\0', 0, 15425, {0}, 0}, + {';', 0, 15426, {10038}, 1},{'\0', 0, 15427, {0}, 0},{'r', 15430, 15428, {0}, 0}, + {'\0', 0, 15429, {0}, 0},{';', 0, 15430, {120112}, 1},{'o', 15433, 15431, {0}, 0}, + {'\0', 0, 15432, {0}, 0},{'w', 15435, 15433, {0}, 0},{'\0', 0, 15434, {0}, 0}, + {'n', 15437, 15435, {0}, 0},{'\0', 0, 15436, {0}, 0},{';', 0, 15437, {8994}, 1}, + {'\0', 0, 15438, {0}, 0},{'a', 15444, 15439, {0}, 0},{'c', 15450, 15440, {0}, 0}, + {'o', 15461, 15441, {0}, 0},{'y', 15490, 15442, {173}, 1},{'\0', 0, 15443, {0}, 0}, + {'r', 15446, 15444, {0}, 0},{'\0', 0, 15445, {0}, 0},{'p', 15448, 15446, {0}, 0}, + {'\0', 0, 15447, {0}, 0},{';', 0, 15448, {9839}, 1},{'\0', 0, 15449, {0}, 0}, + {'h', 15453, 15450, {0}, 0},{'y', 15459, 15451, {0}, 0},{'\0', 0, 15452, {0}, 0}, + {'c', 15455, 15453, {0}, 0},{'\0', 0, 15454, {0}, 0},{'y', 15457, 15455, {0}, 0}, + {'\0', 0, 15456, {0}, 0},{';', 0, 15457, {1097}, 1},{'\0', 0, 15458, {0}, 0}, + {';', 0, 15459, {1096}, 1},{'\0', 0, 15460, {0}, 0},{'r', 15463, 15461, {0}, 0}, + {'\0', 0, 15462, {0}, 0},{'t', 15465, 15463, {0}, 0},{'\0', 0, 15464, {0}, 0}, + {'m', 15468, 15465, {0}, 0},{'p', 15474, 15466, {0}, 0},{'\0', 0, 15467, {0}, 0}, + {'i', 15470, 15468, {0}, 0},{'\0', 0, 15469, {0}, 0},{'d', 15472, 15470, {0}, 0}, + {'\0', 0, 15471, {0}, 0},{';', 0, 15472, {8739}, 1},{'\0', 0, 15473, {0}, 0}, + {'a', 15476, 15474, {0}, 0},{'\0', 0, 15475, {0}, 0},{'r', 15478, 15476, {0}, 0}, + {'\0', 0, 15477, {0}, 0},{'a', 15480, 15478, {0}, 0},{'\0', 0, 15479, {0}, 0}, + {'l', 15482, 15480, {0}, 0},{'\0', 0, 15481, {0}, 0},{'l', 15484, 15482, {0}, 0}, + {'\0', 0, 15483, {0}, 0},{'e', 15486, 15484, {0}, 0},{'\0', 0, 15485, {0}, 0}, + {'l', 15488, 15486, {0}, 0},{'\0', 0, 15487, {0}, 0},{';', 0, 15488, {8741}, 1}, + {'\0', 0, 15489, {0}, 0},{';', 0, 15490, {173}, 1},{'\0', 0, 15491, {0}, 0}, + {'g', 15495, 15492, {0}, 0},{'m', 15507, 15493, {0}, 0},{'\0', 0, 15494, {0}, 0}, + {'m', 15497, 15495, {0}, 0},{'\0', 0, 15496, {0}, 0},{'a', 15499, 15497, {0}, 0}, + {'\0', 0, 15498, {0}, 0},{';', 0, 15499, {963}, 1},{'f', 15503, 15500, {0}, 0}, + {'v', 15505, 15501, {0}, 0},{'\0', 0, 15502, {0}, 0},{';', 0, 15503, {962}, 1}, + {'\0', 0, 15504, {0}, 0},{';', 0, 15505, {962}, 1},{'\0', 0, 15506, {0}, 0}, + {';', 0, 15507, {8764}, 1},{'d', 15516, 15508, {0}, 0},{'e', 15522, 15509, {0}, 0}, + {'g', 15527, 15510, {0}, 0},{'l', 15532, 15511, {0}, 0},{'n', 15537, 15512, {0}, 0}, + {'p', 15541, 15513, {0}, 0},{'r', 15549, 15514, {0}, 0},{'\0', 0, 15515, {0}, 0}, + {'o', 15518, 15516, {0}, 0},{'\0', 0, 15517, {0}, 0},{'t', 15520, 15518, {0}, 0}, + {'\0', 0, 15519, {0}, 0},{';', 0, 15520, {10858}, 1},{'\0', 0, 15521, {0}, 0}, + {';', 0, 15522, {8771}, 1},{'q', 15525, 15523, {0}, 0},{'\0', 0, 15524, {0}, 0}, + {';', 0, 15525, {8771}, 1},{'\0', 0, 15526, {0}, 0},{';', 0, 15527, {10910}, 1}, + {'E', 15530, 15528, {0}, 0},{'\0', 0, 15529, {0}, 0},{';', 0, 15530, {10912}, 1}, + {'\0', 0, 15531, {0}, 0},{';', 0, 15532, {10909}, 1},{'E', 15535, 15533, {0}, 0}, + {'\0', 0, 15534, {0}, 0},{';', 0, 15535, {10911}, 1},{'\0', 0, 15536, {0}, 0}, + {'e', 15539, 15537, {0}, 0},{'\0', 0, 15538, {0}, 0},{';', 0, 15539, {8774}, 1}, + {'\0', 0, 15540, {0}, 0},{'l', 15543, 15541, {0}, 0},{'\0', 0, 15542, {0}, 0}, + {'u', 15545, 15543, {0}, 0},{'\0', 0, 15544, {0}, 0},{'s', 15547, 15545, {0}, 0}, + {'\0', 0, 15546, {0}, 0},{';', 0, 15547, {10788}, 1},{'\0', 0, 15548, {0}, 0}, + {'a', 15551, 15549, {0}, 0},{'\0', 0, 15550, {0}, 0},{'r', 15553, 15551, {0}, 0}, + {'\0', 0, 15552, {0}, 0},{'r', 15555, 15553, {0}, 0},{'\0', 0, 15554, {0}, 0}, + {';', 0, 15555, {10610}, 1},{'\0', 0, 15556, {0}, 0},{'a', 15559, 15557, {0}, 0}, + {'\0', 0, 15558, {0}, 0},{'r', 15561, 15559, {0}, 0},{'\0', 0, 15560, {0}, 0}, + {'r', 15563, 15561, {0}, 0},{'\0', 0, 15562, {0}, 0},{';', 0, 15563, {8592}, 1}, + {'\0', 0, 15564, {0}, 0},{'a', 15570, 15565, {0}, 0},{'e', 15599, 15566, {0}, 0}, + {'i', 15611, 15567, {0}, 0},{'t', 15620, 15568, {0}, 0},{'\0', 0, 15569, {0}, 0}, + {'l', 15573, 15570, {0}, 0},{'s', 15593, 15571, {0}, 0},{'\0', 0, 15572, {0}, 0}, + {'l', 15575, 15573, {0}, 0},{'\0', 0, 15574, {0}, 0},{'s', 15577, 15575, {0}, 0}, + {'\0', 0, 15576, {0}, 0},{'e', 15579, 15577, {0}, 0},{'\0', 0, 15578, {0}, 0}, + {'t', 15581, 15579, {0}, 0},{'\0', 0, 15580, {0}, 0},{'m', 15583, 15581, {0}, 0}, + {'\0', 0, 15582, {0}, 0},{'i', 15585, 15583, {0}, 0},{'\0', 0, 15584, {0}, 0}, + {'n', 15587, 15585, {0}, 0},{'\0', 0, 15586, {0}, 0},{'u', 15589, 15587, {0}, 0}, + {'\0', 0, 15588, {0}, 0},{'s', 15591, 15589, {0}, 0},{'\0', 0, 15590, {0}, 0}, + {';', 0, 15591, {8726}, 1},{'\0', 0, 15592, {0}, 0},{'h', 15595, 15593, {0}, 0}, + {'\0', 0, 15594, {0}, 0},{'p', 15597, 15595, {0}, 0},{'\0', 0, 15596, {0}, 0}, + {';', 0, 15597, {10803}, 1},{'\0', 0, 15598, {0}, 0},{'p', 15601, 15599, {0}, 0}, + {'\0', 0, 15600, {0}, 0},{'a', 15603, 15601, {0}, 0},{'\0', 0, 15602, {0}, 0}, + {'r', 15605, 15603, {0}, 0},{'\0', 0, 15604, {0}, 0},{'s', 15607, 15605, {0}, 0}, + {'\0', 0, 15606, {0}, 0},{'l', 15609, 15607, {0}, 0},{'\0', 0, 15608, {0}, 0}, + {';', 0, 15609, {10724}, 1},{'\0', 0, 15610, {0}, 0},{'d', 15614, 15611, {0}, 0}, + {'l', 15616, 15612, {0}, 0},{'\0', 0, 15613, {0}, 0},{';', 0, 15614, {8739}, 1}, + {'\0', 0, 15615, {0}, 0},{'e', 15618, 15616, {0}, 0},{'\0', 0, 15617, {0}, 0}, + {';', 0, 15618, {8995}, 1},{'\0', 0, 15619, {0}, 0},{';', 0, 15620, {10922}, 1}, + {'e', 15623, 15621, {0}, 0},{'\0', 0, 15622, {0}, 0},{';', 0, 15623, {10924}, 1}, + {'s', 15626, 15624, {0}, 0},{'\0', 0, 15625, {0}, 0},{';', 0, 15626, {10924,65024}, 2}, + {'\0', 0, 15627, {0}, 0},{'f', 15632, 15628, {0}, 0},{'l', 15640, 15629, {0}, 0}, + {'p', 15650, 15630, {0}, 0},{'\0', 0, 15631, {0}, 0},{'t', 15634, 15632, {0}, 0}, + {'\0', 0, 15633, {0}, 0},{'c', 15636, 15634, {0}, 0},{'\0', 0, 15635, {0}, 0}, + {'y', 15638, 15636, {0}, 0},{'\0', 0, 15637, {0}, 0},{';', 0, 15638, {1100}, 1}, + {'\0', 0, 15639, {0}, 0},{';', 0, 15640, {47}, 1},{'b', 15643, 15641, {0}, 0}, + {'\0', 0, 15642, {0}, 0},{';', 0, 15643, {10692}, 1},{'a', 15646, 15644, {0}, 0}, + {'\0', 0, 15645, {0}, 0},{'r', 15648, 15646, {0}, 0},{'\0', 0, 15647, {0}, 0}, + {';', 0, 15648, {9023}, 1},{'\0', 0, 15649, {0}, 0},{'f', 15652, 15650, {0}, 0}, + {'\0', 0, 15651, {0}, 0},{';', 0, 15652, {120164}, 1},{'\0', 0, 15653, {0}, 0}, + {'a', 15656, 15654, {0}, 0},{'\0', 0, 15655, {0}, 0},{'d', 15659, 15656, {0}, 0}, + {'r', 15672, 15657, {0}, 0},{'\0', 0, 15658, {0}, 0},{'e', 15661, 15659, {0}, 0}, + {'\0', 0, 15660, {0}, 0},{'s', 15663, 15661, {0}, 0},{'\0', 0, 15662, {0}, 0}, + {';', 0, 15663, {9824}, 1},{'u', 15666, 15664, {0}, 0},{'\0', 0, 15665, {0}, 0}, + {'i', 15668, 15666, {0}, 0},{'\0', 0, 15667, {0}, 0},{'t', 15670, 15668, {0}, 0}, + {'\0', 0, 15669, {0}, 0},{';', 0, 15670, {9824}, 1},{'\0', 0, 15671, {0}, 0}, + {';', 0, 15672, {8741}, 1},{'\0', 0, 15673, {0}, 0},{'c', 15678, 15674, {0}, 0}, + {'s', 15695, 15675, {0}, 0},{'u', 15734, 15676, {0}, 0},{'\0', 0, 15677, {0}, 0}, + {'a', 15681, 15678, {0}, 0},{'u', 15688, 15679, {0}, 0},{'\0', 0, 15680, {0}, 0}, + {'p', 15683, 15681, {0}, 0},{'\0', 0, 15682, {0}, 0},{';', 0, 15683, {8851}, 1}, + {'s', 15686, 15684, {0}, 0},{'\0', 0, 15685, {0}, 0},{';', 0, 15686, {8851,65024}, 2}, + {'\0', 0, 15687, {0}, 0},{'p', 15690, 15688, {0}, 0},{'\0', 0, 15689, {0}, 0}, + {';', 0, 15690, {8852}, 1},{'s', 15693, 15691, {0}, 0},{'\0', 0, 15692, {0}, 0}, + {';', 0, 15693, {8852,65024}, 2},{'\0', 0, 15694, {0}, 0},{'u', 15697, 15695, {0}, 0}, + {'\0', 0, 15696, {0}, 0},{'b', 15700, 15697, {0}, 0},{'p', 15717, 15698, {0}, 0}, + {'\0', 0, 15699, {0}, 0},{';', 0, 15700, {8847}, 1},{'e', 15704, 15701, {0}, 0}, + {'s', 15706, 15702, {0}, 0},{'\0', 0, 15703, {0}, 0},{';', 0, 15704, {8849}, 1}, + {'\0', 0, 15705, {0}, 0},{'e', 15708, 15706, {0}, 0},{'\0', 0, 15707, {0}, 0}, + {'t', 15710, 15708, {0}, 0},{'\0', 0, 15709, {0}, 0},{';', 0, 15710, {8847}, 1}, + {'e', 15713, 15711, {0}, 0},{'\0', 0, 15712, {0}, 0},{'q', 15715, 15713, {0}, 0}, + {'\0', 0, 15714, {0}, 0},{';', 0, 15715, {8849}, 1},{'\0', 0, 15716, {0}, 0}, + {';', 0, 15717, {8848}, 1},{'e', 15721, 15718, {0}, 0},{'s', 15723, 15719, {0}, 0}, + {'\0', 0, 15720, {0}, 0},{';', 0, 15721, {8850}, 1},{'\0', 0, 15722, {0}, 0}, + {'e', 15725, 15723, {0}, 0},{'\0', 0, 15724, {0}, 0},{'t', 15727, 15725, {0}, 0}, + {'\0', 0, 15726, {0}, 0},{';', 0, 15727, {8848}, 1},{'e', 15730, 15728, {0}, 0}, + {'\0', 0, 15729, {0}, 0},{'q', 15732, 15730, {0}, 0},{'\0', 0, 15731, {0}, 0}, + {';', 0, 15732, {8850}, 1},{'\0', 0, 15733, {0}, 0},{';', 0, 15734, {9633}, 1}, + {'a', 15738, 15735, {0}, 0},{'f', 15747, 15736, {0}, 0},{'\0', 0, 15737, {0}, 0}, + {'r', 15740, 15738, {0}, 0},{'\0', 0, 15739, {0}, 0},{'e', 15743, 15740, {0}, 0}, + {'f', 15745, 15741, {0}, 0},{'\0', 0, 15742, {0}, 0},{';', 0, 15743, {9633}, 1}, + {'\0', 0, 15744, {0}, 0},{';', 0, 15745, {9642}, 1},{'\0', 0, 15746, {0}, 0}, + {';', 0, 15747, {9642}, 1},{'\0', 0, 15748, {0}, 0},{'a', 15751, 15749, {0}, 0}, + {'\0', 0, 15750, {0}, 0},{'r', 15753, 15751, {0}, 0},{'\0', 0, 15752, {0}, 0}, + {'r', 15755, 15753, {0}, 0},{'\0', 0, 15754, {0}, 0},{';', 0, 15755, {8594}, 1}, + {'\0', 0, 15756, {0}, 0},{'c', 15762, 15757, {0}, 0},{'e', 15766, 15758, {0}, 0}, + {'m', 15774, 15759, {0}, 0},{'t', 15782, 15760, {0}, 0},{'\0', 0, 15761, {0}, 0}, + {'r', 15764, 15762, {0}, 0},{'\0', 0, 15763, {0}, 0},{';', 0, 15764, {120008}, 1}, + {'\0', 0, 15765, {0}, 0},{'t', 15768, 15766, {0}, 0},{'\0', 0, 15767, {0}, 0}, + {'m', 15770, 15768, {0}, 0},{'\0', 0, 15769, {0}, 0},{'n', 15772, 15770, {0}, 0}, + {'\0', 0, 15771, {0}, 0},{';', 0, 15772, {8726}, 1},{'\0', 0, 15773, {0}, 0}, + {'i', 15776, 15774, {0}, 0},{'\0', 0, 15775, {0}, 0},{'l', 15778, 15776, {0}, 0}, + {'\0', 0, 15777, {0}, 0},{'e', 15780, 15778, {0}, 0},{'\0', 0, 15779, {0}, 0}, + {';', 0, 15780, {8995}, 1},{'\0', 0, 15781, {0}, 0},{'a', 15784, 15782, {0}, 0}, + {'\0', 0, 15783, {0}, 0},{'r', 15786, 15784, {0}, 0},{'\0', 0, 15785, {0}, 0}, + {'f', 15788, 15786, {0}, 0},{'\0', 0, 15787, {0}, 0},{';', 0, 15788, {8902}, 1}, + {'\0', 0, 15789, {0}, 0},{'a', 15793, 15790, {0}, 0},{'r', 15800, 15791, {0}, 0}, + {'\0', 0, 15792, {0}, 0},{'r', 15795, 15793, {0}, 0},{'\0', 0, 15794, {0}, 0}, + {';', 0, 15795, {9734}, 1},{'f', 15798, 15796, {0}, 0},{'\0', 0, 15797, {0}, 0}, + {';', 0, 15798, {9733}, 1},{'\0', 0, 15799, {0}, 0},{'a', 15803, 15800, {0}, 0}, + {'n', 15834, 15801, {0}, 0},{'\0', 0, 15802, {0}, 0},{'i', 15805, 15803, {0}, 0}, + {'\0', 0, 15804, {0}, 0},{'g', 15807, 15805, {0}, 0},{'\0', 0, 15806, {0}, 0}, + {'h', 15809, 15807, {0}, 0},{'\0', 0, 15808, {0}, 0},{'t', 15811, 15809, {0}, 0}, + {'\0', 0, 15810, {0}, 0},{'e', 15814, 15811, {0}, 0},{'p', 15828, 15812, {0}, 0}, + {'\0', 0, 15813, {0}, 0},{'p', 15816, 15814, {0}, 0},{'\0', 0, 15815, {0}, 0}, + {'s', 15818, 15816, {0}, 0},{'\0', 0, 15817, {0}, 0},{'i', 15820, 15818, {0}, 0}, + {'\0', 0, 15819, {0}, 0},{'l', 15822, 15820, {0}, 0},{'\0', 0, 15821, {0}, 0}, + {'o', 15824, 15822, {0}, 0},{'\0', 0, 15823, {0}, 0},{'n', 15826, 15824, {0}, 0}, + {'\0', 0, 15825, {0}, 0},{';', 0, 15826, {1013}, 1},{'\0', 0, 15827, {0}, 0}, + {'h', 15830, 15828, {0}, 0},{'\0', 0, 15829, {0}, 0},{'i', 15832, 15830, {0}, 0}, + {'\0', 0, 15831, {0}, 0},{';', 0, 15832, {981}, 1},{'\0', 0, 15833, {0}, 0}, + {'s', 15836, 15834, {0}, 0},{'\0', 0, 15835, {0}, 0},{';', 0, 15836, {175}, 1}, + {'\0', 0, 15837, {0}, 0},{'b', 15844, 15838, {0}, 0},{'c', 15939, 15839, {0}, 0}, + {'m', 16012, 15840, {0}, 0},{'n', 16014, 15841, {0}, 0},{'p', 16018, 15842, {0}, 0}, + {'\0', 0, 15843, {0}, 0},{';', 0, 15844, {8834}, 1},{'E', 15854, 15845, {0}, 0}, + {'d', 15856, 15846, {0}, 0},{'e', 15862, 15847, {0}, 0},{'m', 15871, 15848, {0}, 0}, + {'n', 15879, 15849, {0}, 0},{'p', 15886, 15850, {0}, 0},{'r', 15894, 15851, {0}, 0}, + {'s', 15902, 15852, {0}, 0},{'\0', 0, 15853, {0}, 0},{';', 0, 15854, {10949}, 1}, + {'\0', 0, 15855, {0}, 0},{'o', 15858, 15856, {0}, 0},{'\0', 0, 15857, {0}, 0}, + {'t', 15860, 15858, {0}, 0},{'\0', 0, 15859, {0}, 0},{';', 0, 15860, {10941}, 1}, + {'\0', 0, 15861, {0}, 0},{';', 0, 15862, {8838}, 1},{'d', 15865, 15863, {0}, 0}, + {'\0', 0, 15864, {0}, 0},{'o', 15867, 15865, {0}, 0},{'\0', 0, 15866, {0}, 0}, + {'t', 15869, 15867, {0}, 0},{'\0', 0, 15868, {0}, 0},{';', 0, 15869, {10947}, 1}, + {'\0', 0, 15870, {0}, 0},{'u', 15873, 15871, {0}, 0},{'\0', 0, 15872, {0}, 0}, + {'l', 15875, 15873, {0}, 0},{'\0', 0, 15874, {0}, 0},{'t', 15877, 15875, {0}, 0}, + {'\0', 0, 15876, {0}, 0},{';', 0, 15877, {10945}, 1},{'\0', 0, 15878, {0}, 0}, + {'E', 15882, 15879, {0}, 0},{'e', 15884, 15880, {0}, 0},{'\0', 0, 15881, {0}, 0}, + {';', 0, 15882, {10955}, 1},{'\0', 0, 15883, {0}, 0},{';', 0, 15884, {8842}, 1}, + {'\0', 0, 15885, {0}, 0},{'l', 15888, 15886, {0}, 0},{'\0', 0, 15887, {0}, 0}, + {'u', 15890, 15888, {0}, 0},{'\0', 0, 15889, {0}, 0},{'s', 15892, 15890, {0}, 0}, + {'\0', 0, 15891, {0}, 0},{';', 0, 15892, {10943}, 1},{'\0', 0, 15893, {0}, 0}, + {'a', 15896, 15894, {0}, 0},{'\0', 0, 15895, {0}, 0},{'r', 15898, 15896, {0}, 0}, + {'\0', 0, 15897, {0}, 0},{'r', 15900, 15898, {0}, 0},{'\0', 0, 15899, {0}, 0}, + {';', 0, 15900, {10617}, 1},{'\0', 0, 15901, {0}, 0},{'e', 15906, 15902, {0}, 0}, + {'i', 15928, 15903, {0}, 0},{'u', 15932, 15904, {0}, 0},{'\0', 0, 15905, {0}, 0}, + {'t', 15908, 15906, {0}, 0},{'\0', 0, 15907, {0}, 0},{';', 0, 15908, {8834}, 1}, + {'e', 15912, 15909, {0}, 0},{'n', 15919, 15910, {0}, 0},{'\0', 0, 15911, {0}, 0}, + {'q', 15914, 15912, {0}, 0},{'\0', 0, 15913, {0}, 0},{';', 0, 15914, {8838}, 1}, + {'q', 15917, 15915, {0}, 0},{'\0', 0, 15916, {0}, 0},{';', 0, 15917, {10949}, 1}, + {'\0', 0, 15918, {0}, 0},{'e', 15921, 15919, {0}, 0},{'\0', 0, 15920, {0}, 0}, + {'q', 15923, 15921, {0}, 0},{'\0', 0, 15922, {0}, 0},{';', 0, 15923, {8842}, 1}, + {'q', 15926, 15924, {0}, 0},{'\0', 0, 15925, {0}, 0},{';', 0, 15926, {10955}, 1}, + {'\0', 0, 15927, {0}, 0},{'m', 15930, 15928, {0}, 0},{'\0', 0, 15929, {0}, 0}, + {';', 0, 15930, {10951}, 1},{'\0', 0, 15931, {0}, 0},{'b', 15935, 15932, {0}, 0}, + {'p', 15937, 15933, {0}, 0},{'\0', 0, 15934, {0}, 0},{';', 0, 15935, {10965}, 1}, + {'\0', 0, 15936, {0}, 0},{';', 0, 15937, {10963}, 1},{'\0', 0, 15938, {0}, 0}, + {'c', 15941, 15939, {0}, 0},{'\0', 0, 15940, {0}, 0},{';', 0, 15941, {8827}, 1}, + {'a', 15948, 15942, {0}, 0},{'c', 15960, 15943, {0}, 0},{'e', 15974, 15944, {0}, 0}, + {'n', 15978, 15945, {0}, 0},{'s', 16006, 15946, {0}, 0},{'\0', 0, 15947, {0}, 0}, + {'p', 15950, 15948, {0}, 0},{'\0', 0, 15949, {0}, 0},{'p', 15952, 15950, {0}, 0}, + {'\0', 0, 15951, {0}, 0},{'r', 15954, 15952, {0}, 0},{'\0', 0, 15953, {0}, 0}, + {'o', 15956, 15954, {0}, 0},{'\0', 0, 15955, {0}, 0},{'x', 15958, 15956, {0}, 0}, + {'\0', 0, 15957, {0}, 0},{';', 0, 15958, {10936}, 1},{'\0', 0, 15959, {0}, 0}, + {'u', 15962, 15960, {0}, 0},{'\0', 0, 15961, {0}, 0},{'r', 15964, 15962, {0}, 0}, + {'\0', 0, 15963, {0}, 0},{'l', 15966, 15964, {0}, 0},{'\0', 0, 15965, {0}, 0}, + {'y', 15968, 15966, {0}, 0},{'\0', 0, 15967, {0}, 0},{'e', 15970, 15968, {0}, 0}, + {'\0', 0, 15969, {0}, 0},{'q', 15972, 15970, {0}, 0},{'\0', 0, 15971, {0}, 0}, + {';', 0, 15972, {8829}, 1},{'\0', 0, 15973, {0}, 0},{'q', 15976, 15974, {0}, 0}, + {'\0', 0, 15975, {0}, 0},{';', 0, 15976, {10928}, 1},{'\0', 0, 15977, {0}, 0}, + {'a', 15982, 15978, {0}, 0},{'e', 15994, 15979, {0}, 0},{'s', 16000, 15980, {0}, 0}, + {'\0', 0, 15981, {0}, 0},{'p', 15984, 15982, {0}, 0},{'\0', 0, 15983, {0}, 0}, + {'p', 15986, 15984, {0}, 0},{'\0', 0, 15985, {0}, 0},{'r', 15988, 15986, {0}, 0}, + {'\0', 0, 15987, {0}, 0},{'o', 15990, 15988, {0}, 0},{'\0', 0, 15989, {0}, 0}, + {'x', 15992, 15990, {0}, 0},{'\0', 0, 15991, {0}, 0},{';', 0, 15992, {10938}, 1}, + {'\0', 0, 15993, {0}, 0},{'q', 15996, 15994, {0}, 0},{'\0', 0, 15995, {0}, 0}, + {'q', 15998, 15996, {0}, 0},{'\0', 0, 15997, {0}, 0},{';', 0, 15998, {10934}, 1}, + {'\0', 0, 15999, {0}, 0},{'i', 16002, 16000, {0}, 0},{'\0', 0, 16001, {0}, 0}, + {'m', 16004, 16002, {0}, 0},{'\0', 0, 16003, {0}, 0},{';', 0, 16004, {8937}, 1}, + {'\0', 0, 16005, {0}, 0},{'i', 16008, 16006, {0}, 0},{'\0', 0, 16007, {0}, 0}, + {'m', 16010, 16008, {0}, 0},{'\0', 0, 16009, {0}, 0},{';', 0, 16010, {8831}, 1}, + {'\0', 0, 16011, {0}, 0},{';', 0, 16012, {8721}, 1},{'\0', 0, 16013, {0}, 0}, + {'g', 16016, 16014, {0}, 0},{'\0', 0, 16015, {0}, 0},{';', 0, 16016, {9834}, 1}, + {'\0', 0, 16017, {0}, 0},{'1', 16032, 16018, {185}, 1},{'2', 16034, 16019, {178}, 1}, + {'3', 16036, 16020, {179}, 1},{';', 0, 16021, {8835}, 1},{'E', 16038, 16022, {0}, 0}, + {'d', 16040, 16023, {0}, 0},{'e', 16053, 16024, {0}, 0},{'h', 16062, 16025, {0}, 0}, + {'l', 16075, 16026, {0}, 0},{'m', 16083, 16027, {0}, 0},{'n', 16091, 16028, {0}, 0}, + {'p', 16098, 16029, {0}, 0},{'s', 16106, 16030, {0}, 0},{'\0', 0, 16031, {0}, 0}, + {';', 0, 16032, {185}, 1},{'\0', 0, 16033, {0}, 0},{';', 0, 16034, {178}, 1}, + {'\0', 0, 16035, {0}, 0},{';', 0, 16036, {179}, 1},{'\0', 0, 16037, {0}, 0}, + {';', 0, 16038, {10950}, 1},{'\0', 0, 16039, {0}, 0},{'o', 16043, 16040, {0}, 0}, + {'s', 16047, 16041, {0}, 0},{'\0', 0, 16042, {0}, 0},{'t', 16045, 16043, {0}, 0}, + {'\0', 0, 16044, {0}, 0},{';', 0, 16045, {10942}, 1},{'\0', 0, 16046, {0}, 0}, + {'u', 16049, 16047, {0}, 0},{'\0', 0, 16048, {0}, 0},{'b', 16051, 16049, {0}, 0}, + {'\0', 0, 16050, {0}, 0},{';', 0, 16051, {10968}, 1},{'\0', 0, 16052, {0}, 0}, + {';', 0, 16053, {8839}, 1},{'d', 16056, 16054, {0}, 0},{'\0', 0, 16055, {0}, 0}, + {'o', 16058, 16056, {0}, 0},{'\0', 0, 16057, {0}, 0},{'t', 16060, 16058, {0}, 0}, + {'\0', 0, 16059, {0}, 0},{';', 0, 16060, {10948}, 1},{'\0', 0, 16061, {0}, 0}, + {'s', 16064, 16062, {0}, 0},{'\0', 0, 16063, {0}, 0},{'o', 16067, 16064, {0}, 0}, + {'u', 16071, 16065, {0}, 0},{'\0', 0, 16066, {0}, 0},{'l', 16069, 16067, {0}, 0}, + {'\0', 0, 16068, {0}, 0},{';', 0, 16069, {10185}, 1},{'\0', 0, 16070, {0}, 0}, + {'b', 16073, 16071, {0}, 0},{'\0', 0, 16072, {0}, 0},{';', 0, 16073, {10967}, 1}, + {'\0', 0, 16074, {0}, 0},{'a', 16077, 16075, {0}, 0},{'\0', 0, 16076, {0}, 0}, + {'r', 16079, 16077, {0}, 0},{'\0', 0, 16078, {0}, 0},{'r', 16081, 16079, {0}, 0}, + {'\0', 0, 16080, {0}, 0},{';', 0, 16081, {10619}, 1},{'\0', 0, 16082, {0}, 0}, + {'u', 16085, 16083, {0}, 0},{'\0', 0, 16084, {0}, 0},{'l', 16087, 16085, {0}, 0}, + {'\0', 0, 16086, {0}, 0},{'t', 16089, 16087, {0}, 0},{'\0', 0, 16088, {0}, 0}, + {';', 0, 16089, {10946}, 1},{'\0', 0, 16090, {0}, 0},{'E', 16094, 16091, {0}, 0}, + {'e', 16096, 16092, {0}, 0},{'\0', 0, 16093, {0}, 0},{';', 0, 16094, {10956}, 1}, + {'\0', 0, 16095, {0}, 0},{';', 0, 16096, {8843}, 1},{'\0', 0, 16097, {0}, 0}, + {'l', 16100, 16098, {0}, 0},{'\0', 0, 16099, {0}, 0},{'u', 16102, 16100, {0}, 0}, + {'\0', 0, 16101, {0}, 0},{'s', 16104, 16102, {0}, 0},{'\0', 0, 16103, {0}, 0}, + {';', 0, 16104, {10944}, 1},{'\0', 0, 16105, {0}, 0},{'e', 16110, 16106, {0}, 0}, + {'i', 16132, 16107, {0}, 0},{'u', 16136, 16108, {0}, 0},{'\0', 0, 16109, {0}, 0}, + {'t', 16112, 16110, {0}, 0},{'\0', 0, 16111, {0}, 0},{';', 0, 16112, {8835}, 1}, + {'e', 16116, 16113, {0}, 0},{'n', 16123, 16114, {0}, 0},{'\0', 0, 16115, {0}, 0}, + {'q', 16118, 16116, {0}, 0},{'\0', 0, 16117, {0}, 0},{';', 0, 16118, {8839}, 1}, + {'q', 16121, 16119, {0}, 0},{'\0', 0, 16120, {0}, 0},{';', 0, 16121, {10950}, 1}, + {'\0', 0, 16122, {0}, 0},{'e', 16125, 16123, {0}, 0},{'\0', 0, 16124, {0}, 0}, + {'q', 16127, 16125, {0}, 0},{'\0', 0, 16126, {0}, 0},{';', 0, 16127, {8843}, 1}, + {'q', 16130, 16128, {0}, 0},{'\0', 0, 16129, {0}, 0},{';', 0, 16130, {10956}, 1}, + {'\0', 0, 16131, {0}, 0},{'m', 16134, 16132, {0}, 0},{'\0', 0, 16133, {0}, 0}, + {';', 0, 16134, {10952}, 1},{'\0', 0, 16135, {0}, 0},{'b', 16139, 16136, {0}, 0}, + {'p', 16141, 16137, {0}, 0},{'\0', 0, 16138, {0}, 0},{';', 0, 16139, {10964}, 1}, + {'\0', 0, 16140, {0}, 0},{';', 0, 16141, {10966}, 1},{'\0', 0, 16142, {0}, 0}, + {'A', 16147, 16143, {0}, 0},{'a', 16153, 16144, {0}, 0},{'n', 16169, 16145, {0}, 0}, + {'\0', 0, 16146, {0}, 0},{'r', 16149, 16147, {0}, 0},{'\0', 0, 16148, {0}, 0}, + {'r', 16151, 16149, {0}, 0},{'\0', 0, 16150, {0}, 0},{';', 0, 16151, {8665}, 1}, + {'\0', 0, 16152, {0}, 0},{'r', 16155, 16153, {0}, 0},{'\0', 0, 16154, {0}, 0}, + {'h', 16158, 16155, {0}, 0},{'r', 16162, 16156, {0}, 0},{'\0', 0, 16157, {0}, 0}, + {'k', 16160, 16158, {0}, 0},{'\0', 0, 16159, {0}, 0},{';', 0, 16160, {10534}, 1}, + {'\0', 0, 16161, {0}, 0},{';', 0, 16162, {8601}, 1},{'o', 16165, 16163, {0}, 0}, + {'\0', 0, 16164, {0}, 0},{'w', 16167, 16165, {0}, 0},{'\0', 0, 16166, {0}, 0}, + {';', 0, 16167, {8601}, 1},{'\0', 0, 16168, {0}, 0},{'w', 16171, 16169, {0}, 0}, + {'\0', 0, 16170, {0}, 0},{'a', 16173, 16171, {0}, 0},{'\0', 0, 16172, {0}, 0}, + {'r', 16175, 16173, {0}, 0},{'\0', 0, 16174, {0}, 0},{';', 0, 16175, {10538}, 1}, + {'\0', 0, 16176, {0}, 0},{'l', 16179, 16177, {0}, 0},{'\0', 0, 16178, {0}, 0}, + {'i', 16181, 16179, {0}, 0},{'\0', 0, 16180, {0}, 0},{'g', 16183, 16181, {223}, 1}, + {'\0', 0, 16182, {0}, 0},{';', 0, 16183, {223}, 1},{'\0', 0, 16184, {0}, 0}, + {'a', 16199, 16185, {0}, 0},{'b', 16212, 16186, {0}, 0},{'c', 16218, 16187, {0}, 0}, + {'d', 16240, 16188, {0}, 0},{'e', 16246, 16189, {0}, 0},{'f', 16256, 16190, {0}, 0}, + {'h', 16260, 16191, {0}, 0},{'i', 16348, 16192, {0}, 0},{'o', 16379, 16193, {0}, 0}, + {'p', 16417, 16194, {0}, 0},{'r', 16427, 16195, {0}, 0},{'s', 16547, 16196, {0}, 0}, + {'w', 16572, 16197, {0}, 0},{'\0', 0, 16198, {0}, 0},{'r', 16202, 16199, {0}, 0}, + {'u', 16210, 16200, {0}, 0},{'\0', 0, 16201, {0}, 0},{'g', 16204, 16202, {0}, 0}, + {'\0', 0, 16203, {0}, 0},{'e', 16206, 16204, {0}, 0},{'\0', 0, 16205, {0}, 0}, + {'t', 16208, 16206, {0}, 0},{'\0', 0, 16207, {0}, 0},{';', 0, 16208, {8982}, 1}, + {'\0', 0, 16209, {0}, 0},{';', 0, 16210, {964}, 1},{'\0', 0, 16211, {0}, 0}, + {'r', 16214, 16212, {0}, 0},{'\0', 0, 16213, {0}, 0},{'k', 16216, 16214, {0}, 0}, + {'\0', 0, 16215, {0}, 0},{';', 0, 16216, {9140}, 1},{'\0', 0, 16217, {0}, 0}, + {'a', 16222, 16218, {0}, 0},{'e', 16230, 16219, {0}, 0},{'y', 16238, 16220, {0}, 0}, + {'\0', 0, 16221, {0}, 0},{'r', 16224, 16222, {0}, 0},{'\0', 0, 16223, {0}, 0}, + {'o', 16226, 16224, {0}, 0},{'\0', 0, 16225, {0}, 0},{'n', 16228, 16226, {0}, 0}, + {'\0', 0, 16227, {0}, 0},{';', 0, 16228, {357}, 1},{'\0', 0, 16229, {0}, 0}, + {'d', 16232, 16230, {0}, 0},{'\0', 0, 16231, {0}, 0},{'i', 16234, 16232, {0}, 0}, + {'\0', 0, 16233, {0}, 0},{'l', 16236, 16234, {0}, 0},{'\0', 0, 16235, {0}, 0}, + {';', 0, 16236, {355}, 1},{'\0', 0, 16237, {0}, 0},{';', 0, 16238, {1090}, 1}, + {'\0', 0, 16239, {0}, 0},{'o', 16242, 16240, {0}, 0},{'\0', 0, 16241, {0}, 0}, + {'t', 16244, 16242, {0}, 0},{'\0', 0, 16243, {0}, 0},{';', 0, 16244, {8411}, 1}, + {'\0', 0, 16245, {0}, 0},{'l', 16248, 16246, {0}, 0},{'\0', 0, 16247, {0}, 0}, + {'r', 16250, 16248, {0}, 0},{'\0', 0, 16249, {0}, 0},{'e', 16252, 16250, {0}, 0}, + {'\0', 0, 16251, {0}, 0},{'c', 16254, 16252, {0}, 0},{'\0', 0, 16253, {0}, 0}, + {';', 0, 16254, {8981}, 1},{'\0', 0, 16255, {0}, 0},{'r', 16258, 16256, {0}, 0}, + {'\0', 0, 16257, {0}, 0},{';', 0, 16258, {120113}, 1},{'\0', 0, 16259, {0}, 0}, + {'e', 16265, 16260, {0}, 0},{'i', 16297, 16261, {0}, 0},{'k', 16329, 16262, {0}, 0}, + {'o', 16342, 16263, {0}, 0},{'\0', 0, 16264, {0}, 0},{'r', 16268, 16265, {0}, 0}, + {'t', 16283, 16266, {0}, 0},{'\0', 0, 16267, {0}, 0},{'e', 16270, 16268, {0}, 0}, + {'\0', 0, 16269, {0}, 0},{'4', 16273, 16270, {0}, 0},{'f', 16275, 16271, {0}, 0}, + {'\0', 0, 16272, {0}, 0},{';', 0, 16273, {8756}, 1},{'\0', 0, 16274, {0}, 0}, + {'o', 16277, 16275, {0}, 0},{'\0', 0, 16276, {0}, 0},{'r', 16279, 16277, {0}, 0}, + {'\0', 0, 16278, {0}, 0},{'e', 16281, 16279, {0}, 0},{'\0', 0, 16280, {0}, 0}, + {';', 0, 16281, {8756}, 1},{'\0', 0, 16282, {0}, 0},{'a', 16285, 16283, {0}, 0}, + {'\0', 0, 16284, {0}, 0},{';', 0, 16285, {952}, 1},{'s', 16289, 16286, {0}, 0}, + {'v', 16295, 16287, {0}, 0},{'\0', 0, 16288, {0}, 0},{'y', 16291, 16289, {0}, 0}, + {'\0', 0, 16290, {0}, 0},{'m', 16293, 16291, {0}, 0},{'\0', 0, 16292, {0}, 0}, + {';', 0, 16293, {977}, 1},{'\0', 0, 16294, {0}, 0},{';', 0, 16295, {977}, 1}, + {'\0', 0, 16296, {0}, 0},{'c', 16300, 16297, {0}, 0},{'n', 16323, 16298, {0}, 0}, + {'\0', 0, 16299, {0}, 0},{'k', 16302, 16300, {0}, 0},{'\0', 0, 16301, {0}, 0}, + {'a', 16305, 16302, {0}, 0},{'s', 16317, 16303, {0}, 0},{'\0', 0, 16304, {0}, 0}, + {'p', 16307, 16305, {0}, 0},{'\0', 0, 16306, {0}, 0},{'p', 16309, 16307, {0}, 0}, + {'\0', 0, 16308, {0}, 0},{'r', 16311, 16309, {0}, 0},{'\0', 0, 16310, {0}, 0}, + {'o', 16313, 16311, {0}, 0},{'\0', 0, 16312, {0}, 0},{'x', 16315, 16313, {0}, 0}, + {'\0', 0, 16314, {0}, 0},{';', 0, 16315, {8776}, 1},{'\0', 0, 16316, {0}, 0}, + {'i', 16319, 16317, {0}, 0},{'\0', 0, 16318, {0}, 0},{'m', 16321, 16319, {0}, 0}, + {'\0', 0, 16320, {0}, 0},{';', 0, 16321, {8764}, 1},{'\0', 0, 16322, {0}, 0}, + {'s', 16325, 16323, {0}, 0},{'\0', 0, 16324, {0}, 0},{'p', 16327, 16325, {0}, 0}, + {'\0', 0, 16326, {0}, 0},{';', 0, 16327, {8201}, 1},{'\0', 0, 16328, {0}, 0}, + {'a', 16332, 16329, {0}, 0},{'s', 16336, 16330, {0}, 0},{'\0', 0, 16331, {0}, 0}, + {'p', 16334, 16332, {0}, 0},{'\0', 0, 16333, {0}, 0},{';', 0, 16334, {8776}, 1}, + {'\0', 0, 16335, {0}, 0},{'i', 16338, 16336, {0}, 0},{'\0', 0, 16337, {0}, 0}, + {'m', 16340, 16338, {0}, 0},{'\0', 0, 16339, {0}, 0},{';', 0, 16340, {8764}, 1}, + {'\0', 0, 16341, {0}, 0},{'r', 16344, 16342, {0}, 0},{'\0', 0, 16343, {0}, 0}, + {'n', 16346, 16344, {254}, 1},{'\0', 0, 16345, {0}, 0},{';', 0, 16346, {254}, 1}, + {'\0', 0, 16347, {0}, 0},{'l', 16352, 16348, {0}, 0},{'m', 16358, 16349, {0}, 0}, + {'n', 16375, 16350, {0}, 0},{'\0', 0, 16351, {0}, 0},{'d', 16354, 16352, {0}, 0}, + {'\0', 0, 16353, {0}, 0},{'e', 16356, 16354, {0}, 0},{'\0', 0, 16355, {0}, 0}, + {';', 0, 16356, {732}, 1},{'\0', 0, 16357, {0}, 0},{'e', 16360, 16358, {0}, 0}, + {'\0', 0, 16359, {0}, 0},{'s', 16362, 16360, {215}, 1},{'\0', 0, 16361, {0}, 0}, + {';', 0, 16362, {215}, 1},{'b', 16366, 16363, {0}, 0},{'d', 16373, 16364, {0}, 0}, + {'\0', 0, 16365, {0}, 0},{';', 0, 16366, {8864}, 1},{'a', 16369, 16367, {0}, 0}, + {'\0', 0, 16368, {0}, 0},{'r', 16371, 16369, {0}, 0},{'\0', 0, 16370, {0}, 0}, + {';', 0, 16371, {10801}, 1},{'\0', 0, 16372, {0}, 0},{';', 0, 16373, {10800}, 1}, + {'\0', 0, 16374, {0}, 0},{'t', 16377, 16375, {0}, 0},{'\0', 0, 16376, {0}, 0}, + {';', 0, 16377, {8749}, 1},{'\0', 0, 16378, {0}, 0},{'e', 16383, 16379, {0}, 0}, + {'p', 16387, 16380, {0}, 0},{'s', 16413, 16381, {0}, 0},{'\0', 0, 16382, {0}, 0}, + {'a', 16385, 16383, {0}, 0},{'\0', 0, 16384, {0}, 0},{';', 0, 16385, {10536}, 1}, + {'\0', 0, 16386, {0}, 0},{';', 0, 16387, {8868}, 1},{'b', 16392, 16388, {0}, 0}, + {'c', 16398, 16389, {0}, 0},{'f', 16404, 16390, {0}, 0},{'\0', 0, 16391, {0}, 0}, + {'o', 16394, 16392, {0}, 0},{'\0', 0, 16393, {0}, 0},{'t', 16396, 16394, {0}, 0}, + {'\0', 0, 16395, {0}, 0},{';', 0, 16396, {9014}, 1},{'\0', 0, 16397, {0}, 0}, + {'i', 16400, 16398, {0}, 0},{'\0', 0, 16399, {0}, 0},{'r', 16402, 16400, {0}, 0}, + {'\0', 0, 16401, {0}, 0},{';', 0, 16402, {10993}, 1},{'\0', 0, 16403, {0}, 0}, + {';', 0, 16404, {120165}, 1},{'o', 16407, 16405, {0}, 0},{'\0', 0, 16406, {0}, 0}, + {'r', 16409, 16407, {0}, 0},{'\0', 0, 16408, {0}, 0},{'k', 16411, 16409, {0}, 0}, + {'\0', 0, 16410, {0}, 0},{';', 0, 16411, {10970}, 1},{'\0', 0, 16412, {0}, 0}, + {'a', 16415, 16413, {0}, 0},{'\0', 0, 16414, {0}, 0},{';', 0, 16415, {10537}, 1}, + {'\0', 0, 16416, {0}, 0},{'r', 16419, 16417, {0}, 0},{'\0', 0, 16418, {0}, 0}, + {'i', 16421, 16419, {0}, 0},{'\0', 0, 16420, {0}, 0},{'m', 16423, 16421, {0}, 0}, + {'\0', 0, 16422, {0}, 0},{'e', 16425, 16423, {0}, 0},{'\0', 0, 16424, {0}, 0}, + {';', 0, 16425, {8244}, 1},{'\0', 0, 16426, {0}, 0},{'a', 16431, 16427, {0}, 0}, + {'i', 16437, 16428, {0}, 0},{'p', 16535, 16429, {0}, 0},{'\0', 0, 16430, {0}, 0}, + {'d', 16433, 16431, {0}, 0},{'\0', 0, 16432, {0}, 0},{'e', 16435, 16433, {0}, 0}, + {'\0', 0, 16434, {0}, 0},{';', 0, 16435, {8482}, 1},{'\0', 0, 16436, {0}, 0}, + {'a', 16445, 16437, {0}, 0},{'d', 16497, 16438, {0}, 0},{'e', 16503, 16439, {0}, 0}, + {'m', 16505, 16440, {0}, 0},{'p', 16515, 16441, {0}, 0},{'s', 16523, 16442, {0}, 0}, + {'t', 16527, 16443, {0}, 0},{'\0', 0, 16444, {0}, 0},{'n', 16447, 16445, {0}, 0}, + {'\0', 0, 16446, {0}, 0},{'g', 16449, 16447, {0}, 0},{'\0', 0, 16448, {0}, 0}, + {'l', 16451, 16449, {0}, 0},{'\0', 0, 16450, {0}, 0},{'e', 16453, 16451, {0}, 0}, + {'\0', 0, 16452, {0}, 0},{';', 0, 16453, {9653}, 1},{'d', 16459, 16454, {0}, 0}, + {'l', 16467, 16455, {0}, 0},{'q', 16480, 16456, {0}, 0},{'r', 16482, 16457, {0}, 0}, + {'\0', 0, 16458, {0}, 0},{'o', 16461, 16459, {0}, 0},{'\0', 0, 16460, {0}, 0}, + {'w', 16463, 16461, {0}, 0},{'\0', 0, 16462, {0}, 0},{'n', 16465, 16463, {0}, 0}, + {'\0', 0, 16464, {0}, 0},{';', 0, 16465, {9663}, 1},{'\0', 0, 16466, {0}, 0}, + {'e', 16469, 16467, {0}, 0},{'\0', 0, 16468, {0}, 0},{'f', 16471, 16469, {0}, 0}, + {'\0', 0, 16470, {0}, 0},{'t', 16473, 16471, {0}, 0},{'\0', 0, 16472, {0}, 0}, + {';', 0, 16473, {9667}, 1},{'e', 16476, 16474, {0}, 0},{'\0', 0, 16475, {0}, 0}, + {'q', 16478, 16476, {0}, 0},{'\0', 0, 16477, {0}, 0},{';', 0, 16478, {8884}, 1}, + {'\0', 0, 16479, {0}, 0},{';', 0, 16480, {8796}, 1},{'\0', 0, 16481, {0}, 0}, + {'i', 16484, 16482, {0}, 0},{'\0', 0, 16483, {0}, 0},{'g', 16486, 16484, {0}, 0}, + {'\0', 0, 16485, {0}, 0},{'h', 16488, 16486, {0}, 0},{'\0', 0, 16487, {0}, 0}, + {'t', 16490, 16488, {0}, 0},{'\0', 0, 16489, {0}, 0},{';', 0, 16490, {9657}, 1}, + {'e', 16493, 16491, {0}, 0},{'\0', 0, 16492, {0}, 0},{'q', 16495, 16493, {0}, 0}, + {'\0', 0, 16494, {0}, 0},{';', 0, 16495, {8885}, 1},{'\0', 0, 16496, {0}, 0}, + {'o', 16499, 16497, {0}, 0},{'\0', 0, 16498, {0}, 0},{'t', 16501, 16499, {0}, 0}, + {'\0', 0, 16500, {0}, 0},{';', 0, 16501, {9708}, 1},{'\0', 0, 16502, {0}, 0}, + {';', 0, 16503, {8796}, 1},{'\0', 0, 16504, {0}, 0},{'i', 16507, 16505, {0}, 0}, + {'\0', 0, 16506, {0}, 0},{'n', 16509, 16507, {0}, 0},{'\0', 0, 16508, {0}, 0}, + {'u', 16511, 16509, {0}, 0},{'\0', 0, 16510, {0}, 0},{'s', 16513, 16511, {0}, 0}, + {'\0', 0, 16512, {0}, 0},{';', 0, 16513, {10810}, 1},{'\0', 0, 16514, {0}, 0}, + {'l', 16517, 16515, {0}, 0},{'\0', 0, 16516, {0}, 0},{'u', 16519, 16517, {0}, 0}, + {'\0', 0, 16518, {0}, 0},{'s', 16521, 16519, {0}, 0},{'\0', 0, 16520, {0}, 0}, + {';', 0, 16521, {10809}, 1},{'\0', 0, 16522, {0}, 0},{'b', 16525, 16523, {0}, 0}, + {'\0', 0, 16524, {0}, 0},{';', 0, 16525, {10701}, 1},{'\0', 0, 16526, {0}, 0}, + {'i', 16529, 16527, {0}, 0},{'\0', 0, 16528, {0}, 0},{'m', 16531, 16529, {0}, 0}, + {'\0', 0, 16530, {0}, 0},{'e', 16533, 16531, {0}, 0},{'\0', 0, 16532, {0}, 0}, + {';', 0, 16533, {10811}, 1},{'\0', 0, 16534, {0}, 0},{'e', 16537, 16535, {0}, 0}, + {'\0', 0, 16536, {0}, 0},{'z', 16539, 16537, {0}, 0},{'\0', 0, 16538, {0}, 0}, + {'i', 16541, 16539, {0}, 0},{'\0', 0, 16540, {0}, 0},{'u', 16543, 16541, {0}, 0}, + {'\0', 0, 16542, {0}, 0},{'m', 16545, 16543, {0}, 0},{'\0', 0, 16544, {0}, 0}, + {';', 0, 16545, {9186}, 1},{'\0', 0, 16546, {0}, 0},{'c', 16551, 16547, {0}, 0}, + {'h', 16558, 16548, {0}, 0},{'t', 16564, 16549, {0}, 0},{'\0', 0, 16550, {0}, 0}, + {'r', 16554, 16551, {0}, 0},{'y', 16556, 16552, {0}, 0},{'\0', 0, 16553, {0}, 0}, + {';', 0, 16554, {120009}, 1},{'\0', 0, 16555, {0}, 0},{';', 0, 16556, {1094}, 1}, + {'\0', 0, 16557, {0}, 0},{'c', 16560, 16558, {0}, 0},{'\0', 0, 16559, {0}, 0}, + {'y', 16562, 16560, {0}, 0},{'\0', 0, 16561, {0}, 0},{';', 0, 16562, {1115}, 1}, + {'\0', 0, 16563, {0}, 0},{'r', 16566, 16564, {0}, 0},{'\0', 0, 16565, {0}, 0}, + {'o', 16568, 16566, {0}, 0},{'\0', 0, 16567, {0}, 0},{'k', 16570, 16568, {0}, 0}, + {'\0', 0, 16569, {0}, 0},{';', 0, 16570, {359}, 1},{'\0', 0, 16571, {0}, 0}, + {'i', 16575, 16572, {0}, 0},{'o', 16581, 16573, {0}, 0},{'\0', 0, 16574, {0}, 0}, + {'x', 16577, 16575, {0}, 0},{'\0', 0, 16576, {0}, 0},{'t', 16579, 16577, {0}, 0}, + {'\0', 0, 16578, {0}, 0},{';', 0, 16579, {8812}, 1},{'\0', 0, 16580, {0}, 0}, + {'h', 16583, 16581, {0}, 0},{'\0', 0, 16582, {0}, 0},{'e', 16585, 16583, {0}, 0}, + {'\0', 0, 16584, {0}, 0},{'a', 16587, 16585, {0}, 0},{'\0', 0, 16586, {0}, 0}, + {'d', 16589, 16587, {0}, 0},{'\0', 0, 16588, {0}, 0},{'l', 16592, 16589, {0}, 0}, + {'r', 16610, 16590, {0}, 0},{'\0', 0, 16591, {0}, 0},{'e', 16594, 16592, {0}, 0}, + {'\0', 0, 16593, {0}, 0},{'f', 16596, 16594, {0}, 0},{'\0', 0, 16595, {0}, 0}, + {'t', 16598, 16596, {0}, 0},{'\0', 0, 16597, {0}, 0},{'a', 16600, 16598, {0}, 0}, + {'\0', 0, 16599, {0}, 0},{'r', 16602, 16600, {0}, 0},{'\0', 0, 16601, {0}, 0}, + {'r', 16604, 16602, {0}, 0},{'\0', 0, 16603, {0}, 0},{'o', 16606, 16604, {0}, 0}, + {'\0', 0, 16605, {0}, 0},{'w', 16608, 16606, {0}, 0},{'\0', 0, 16607, {0}, 0}, + {';', 0, 16608, {8606}, 1},{'\0', 0, 16609, {0}, 0},{'i', 16612, 16610, {0}, 0}, + {'\0', 0, 16611, {0}, 0},{'g', 16614, 16612, {0}, 0},{'\0', 0, 16613, {0}, 0}, + {'h', 16616, 16614, {0}, 0},{'\0', 0, 16615, {0}, 0},{'t', 16618, 16616, {0}, 0}, + {'\0', 0, 16617, {0}, 0},{'a', 16620, 16618, {0}, 0},{'\0', 0, 16619, {0}, 0}, + {'r', 16622, 16620, {0}, 0},{'\0', 0, 16621, {0}, 0},{'r', 16624, 16622, {0}, 0}, + {'\0', 0, 16623, {0}, 0},{'o', 16626, 16624, {0}, 0},{'\0', 0, 16625, {0}, 0}, + {'w', 16628, 16626, {0}, 0},{'\0', 0, 16627, {0}, 0},{';', 0, 16628, {8608}, 1}, + {'\0', 0, 16629, {0}, 0},{'A', 16649, 16630, {0}, 0},{'H', 16655, 16631, {0}, 0}, + {'a', 16661, 16632, {0}, 0},{'b', 16676, 16633, {0}, 0},{'c', 16691, 16634, {0}, 0}, + {'d', 16702, 16635, {0}, 0},{'f', 16726, 16636, {0}, 0},{'g', 16739, 16637, {0}, 0}, + {'h', 16749, 16638, {0}, 0},{'l', 16767, 16639, {0}, 0},{'m', 16796, 16640, {0}, 0}, + {'o', 16807, 16641, {0}, 0},{'p', 16820, 16642, {0}, 0},{'r', 16924, 16643, {0}, 0}, + {'s', 16960, 16644, {0}, 0},{'t', 16966, 16645, {0}, 0},{'u', 16991, 16646, {0}, 0}, + {'w', 17004, 16647, {0}, 0},{'\0', 0, 16648, {0}, 0},{'r', 16651, 16649, {0}, 0}, + {'\0', 0, 16650, {0}, 0},{'r', 16653, 16651, {0}, 0},{'\0', 0, 16652, {0}, 0}, + {';', 0, 16653, {8657}, 1},{'\0', 0, 16654, {0}, 0},{'a', 16657, 16655, {0}, 0}, + {'\0', 0, 16656, {0}, 0},{'r', 16659, 16657, {0}, 0},{'\0', 0, 16658, {0}, 0}, + {';', 0, 16659, {10595}, 1},{'\0', 0, 16660, {0}, 0},{'c', 16664, 16661, {0}, 0}, + {'r', 16672, 16662, {0}, 0},{'\0', 0, 16663, {0}, 0},{'u', 16666, 16664, {0}, 0}, + {'\0', 0, 16665, {0}, 0},{'t', 16668, 16666, {0}, 0},{'\0', 0, 16667, {0}, 0}, + {'e', 16670, 16668, {250}, 1},{'\0', 0, 16669, {0}, 0},{';', 0, 16670, {250}, 1}, + {'\0', 0, 16671, {0}, 0},{'r', 16674, 16672, {0}, 0},{'\0', 0, 16673, {0}, 0}, + {';', 0, 16674, {8593}, 1},{'\0', 0, 16675, {0}, 0},{'r', 16678, 16676, {0}, 0}, + {'\0', 0, 16677, {0}, 0},{'c', 16681, 16678, {0}, 0},{'e', 16685, 16679, {0}, 0}, + {'\0', 0, 16680, {0}, 0},{'y', 16683, 16681, {0}, 0},{'\0', 0, 16682, {0}, 0}, + {';', 0, 16683, {1118}, 1},{'\0', 0, 16684, {0}, 0},{'v', 16687, 16685, {0}, 0}, + {'\0', 0, 16686, {0}, 0},{'e', 16689, 16687, {0}, 0},{'\0', 0, 16688, {0}, 0}, + {';', 0, 16689, {365}, 1},{'\0', 0, 16690, {0}, 0},{'i', 16694, 16691, {0}, 0}, + {'y', 16700, 16692, {0}, 0},{'\0', 0, 16693, {0}, 0},{'r', 16696, 16694, {0}, 0}, + {'\0', 0, 16695, {0}, 0},{'c', 16698, 16696, {251}, 1},{'\0', 0, 16697, {0}, 0}, + {';', 0, 16698, {251}, 1},{'\0', 0, 16699, {0}, 0},{';', 0, 16700, {1091}, 1}, + {'\0', 0, 16701, {0}, 0},{'a', 16706, 16702, {0}, 0},{'b', 16712, 16703, {0}, 0}, + {'h', 16720, 16704, {0}, 0},{'\0', 0, 16705, {0}, 0},{'r', 16708, 16706, {0}, 0}, + {'\0', 0, 16707, {0}, 0},{'r', 16710, 16708, {0}, 0},{'\0', 0, 16709, {0}, 0}, + {';', 0, 16710, {8645}, 1},{'\0', 0, 16711, {0}, 0},{'l', 16714, 16712, {0}, 0}, + {'\0', 0, 16713, {0}, 0},{'a', 16716, 16714, {0}, 0},{'\0', 0, 16715, {0}, 0}, + {'c', 16718, 16716, {0}, 0},{'\0', 0, 16717, {0}, 0},{';', 0, 16718, {369}, 1}, + {'\0', 0, 16719, {0}, 0},{'a', 16722, 16720, {0}, 0},{'\0', 0, 16721, {0}, 0}, + {'r', 16724, 16722, {0}, 0},{'\0', 0, 16723, {0}, 0},{';', 0, 16724, {10606}, 1}, + {'\0', 0, 16725, {0}, 0},{'i', 16729, 16726, {0}, 0},{'r', 16737, 16727, {0}, 0}, + {'\0', 0, 16728, {0}, 0},{'s', 16731, 16729, {0}, 0},{'\0', 0, 16730, {0}, 0}, + {'h', 16733, 16731, {0}, 0},{'\0', 0, 16732, {0}, 0},{'t', 16735, 16733, {0}, 0}, + {'\0', 0, 16734, {0}, 0},{';', 0, 16735, {10622}, 1},{'\0', 0, 16736, {0}, 0}, + {';', 0, 16737, {120114}, 1},{'\0', 0, 16738, {0}, 0},{'r', 16741, 16739, {0}, 0}, + {'\0', 0, 16740, {0}, 0},{'a', 16743, 16741, {0}, 0},{'\0', 0, 16742, {0}, 0}, + {'v', 16745, 16743, {0}, 0},{'\0', 0, 16744, {0}, 0},{'e', 16747, 16745, {249}, 1}, + {'\0', 0, 16746, {0}, 0},{';', 0, 16747, {249}, 1},{'\0', 0, 16748, {0}, 0}, + {'a', 16752, 16749, {0}, 0},{'b', 16761, 16750, {0}, 0},{'\0', 0, 16751, {0}, 0}, + {'r', 16754, 16752, {0}, 0},{'\0', 0, 16753, {0}, 0},{'l', 16757, 16754, {0}, 0}, + {'r', 16759, 16755, {0}, 0},{'\0', 0, 16756, {0}, 0},{';', 0, 16757, {8639}, 1}, + {'\0', 0, 16758, {0}, 0},{';', 0, 16759, {8638}, 1},{'\0', 0, 16760, {0}, 0}, + {'l', 16763, 16761, {0}, 0},{'\0', 0, 16762, {0}, 0},{'k', 16765, 16763, {0}, 0}, + {'\0', 0, 16764, {0}, 0},{';', 0, 16765, {9600}, 1},{'\0', 0, 16766, {0}, 0}, + {'c', 16770, 16767, {0}, 0},{'t', 16790, 16768, {0}, 0},{'\0', 0, 16769, {0}, 0}, + {'o', 16773, 16770, {0}, 0},{'r', 16784, 16771, {0}, 0},{'\0', 0, 16772, {0}, 0}, + {'r', 16775, 16773, {0}, 0},{'\0', 0, 16774, {0}, 0},{'n', 16777, 16775, {0}, 0}, + {'\0', 0, 16776, {0}, 0},{';', 0, 16777, {8988}, 1},{'e', 16780, 16778, {0}, 0}, + {'\0', 0, 16779, {0}, 0},{'r', 16782, 16780, {0}, 0},{'\0', 0, 16781, {0}, 0}, + {';', 0, 16782, {8988}, 1},{'\0', 0, 16783, {0}, 0},{'o', 16786, 16784, {0}, 0}, + {'\0', 0, 16785, {0}, 0},{'p', 16788, 16786, {0}, 0},{'\0', 0, 16787, {0}, 0}, + {';', 0, 16788, {8975}, 1},{'\0', 0, 16789, {0}, 0},{'r', 16792, 16790, {0}, 0}, + {'\0', 0, 16791, {0}, 0},{'i', 16794, 16792, {0}, 0},{'\0', 0, 16793, {0}, 0}, + {';', 0, 16794, {9720}, 1},{'\0', 0, 16795, {0}, 0},{'a', 16799, 16796, {0}, 0}, + {'l', 16805, 16797, {168}, 1},{'\0', 0, 16798, {0}, 0},{'c', 16801, 16799, {0}, 0}, + {'\0', 0, 16800, {0}, 0},{'r', 16803, 16801, {0}, 0},{'\0', 0, 16802, {0}, 0}, + {';', 0, 16803, {363}, 1},{'\0', 0, 16804, {0}, 0},{';', 0, 16805, {168}, 1}, + {'\0', 0, 16806, {0}, 0},{'g', 16810, 16807, {0}, 0},{'p', 16816, 16808, {0}, 0}, + {'\0', 0, 16809, {0}, 0},{'o', 16812, 16810, {0}, 0},{'\0', 0, 16811, {0}, 0}, + {'n', 16814, 16812, {0}, 0},{'\0', 0, 16813, {0}, 0},{';', 0, 16814, {371}, 1}, + {'\0', 0, 16815, {0}, 0},{'f', 16818, 16816, {0}, 0},{'\0', 0, 16817, {0}, 0}, + {';', 0, 16818, {120166}, 1},{'\0', 0, 16819, {0}, 0},{'a', 16827, 16820, {0}, 0}, + {'d', 16837, 16821, {0}, 0},{'h', 16855, 16822, {0}, 0},{'l', 16888, 16823, {0}, 0}, + {'s', 16894, 16824, {0}, 0},{'u', 16908, 16825, {0}, 0},{'\0', 0, 16826, {0}, 0}, + {'r', 16829, 16827, {0}, 0},{'\0', 0, 16828, {0}, 0},{'r', 16831, 16829, {0}, 0}, + {'\0', 0, 16830, {0}, 0},{'o', 16833, 16831, {0}, 0},{'\0', 0, 16832, {0}, 0}, + {'w', 16835, 16833, {0}, 0},{'\0', 0, 16834, {0}, 0},{';', 0, 16835, {8593}, 1}, + {'\0', 0, 16836, {0}, 0},{'o', 16839, 16837, {0}, 0},{'\0', 0, 16838, {0}, 0}, + {'w', 16841, 16839, {0}, 0},{'\0', 0, 16840, {0}, 0},{'n', 16843, 16841, {0}, 0}, + {'\0', 0, 16842, {0}, 0},{'a', 16845, 16843, {0}, 0},{'\0', 0, 16844, {0}, 0}, + {'r', 16847, 16845, {0}, 0},{'\0', 0, 16846, {0}, 0},{'r', 16849, 16847, {0}, 0}, + {'\0', 0, 16848, {0}, 0},{'o', 16851, 16849, {0}, 0},{'\0', 0, 16850, {0}, 0}, + {'w', 16853, 16851, {0}, 0},{'\0', 0, 16852, {0}, 0},{';', 0, 16853, {8597}, 1}, + {'\0', 0, 16854, {0}, 0},{'a', 16857, 16855, {0}, 0},{'\0', 0, 16856, {0}, 0}, + {'r', 16859, 16857, {0}, 0},{'\0', 0, 16858, {0}, 0},{'p', 16861, 16859, {0}, 0}, + {'\0', 0, 16860, {0}, 0},{'o', 16863, 16861, {0}, 0},{'\0', 0, 16862, {0}, 0}, + {'o', 16865, 16863, {0}, 0},{'\0', 0, 16864, {0}, 0},{'n', 16867, 16865, {0}, 0}, + {'\0', 0, 16866, {0}, 0},{'l', 16870, 16867, {0}, 0},{'r', 16878, 16868, {0}, 0}, + {'\0', 0, 16869, {0}, 0},{'e', 16872, 16870, {0}, 0},{'\0', 0, 16871, {0}, 0}, + {'f', 16874, 16872, {0}, 0},{'\0', 0, 16873, {0}, 0},{'t', 16876, 16874, {0}, 0}, + {'\0', 0, 16875, {0}, 0},{';', 0, 16876, {8639}, 1},{'\0', 0, 16877, {0}, 0}, + {'i', 16880, 16878, {0}, 0},{'\0', 0, 16879, {0}, 0},{'g', 16882, 16880, {0}, 0}, + {'\0', 0, 16881, {0}, 0},{'h', 16884, 16882, {0}, 0},{'\0', 0, 16883, {0}, 0}, + {'t', 16886, 16884, {0}, 0},{'\0', 0, 16885, {0}, 0},{';', 0, 16886, {8638}, 1}, + {'\0', 0, 16887, {0}, 0},{'u', 16890, 16888, {0}, 0},{'\0', 0, 16889, {0}, 0}, + {'s', 16892, 16890, {0}, 0},{'\0', 0, 16891, {0}, 0},{';', 0, 16892, {8846}, 1}, + {'\0', 0, 16893, {0}, 0},{'i', 16896, 16894, {0}, 0},{'\0', 0, 16895, {0}, 0}, + {';', 0, 16896, {965}, 1},{'h', 16900, 16897, {0}, 0},{'l', 16902, 16898, {0}, 0}, + {'\0', 0, 16899, {0}, 0},{';', 0, 16900, {978}, 1},{'\0', 0, 16901, {0}, 0}, + {'o', 16904, 16902, {0}, 0},{'\0', 0, 16903, {0}, 0},{'n', 16906, 16904, {0}, 0}, + {'\0', 0, 16905, {0}, 0},{';', 0, 16906, {965}, 1},{'\0', 0, 16907, {0}, 0}, + {'p', 16910, 16908, {0}, 0},{'\0', 0, 16909, {0}, 0},{'a', 16912, 16910, {0}, 0}, + {'\0', 0, 16911, {0}, 0},{'r', 16914, 16912, {0}, 0},{'\0', 0, 16913, {0}, 0}, + {'r', 16916, 16914, {0}, 0},{'\0', 0, 16915, {0}, 0},{'o', 16918, 16916, {0}, 0}, + {'\0', 0, 16917, {0}, 0},{'w', 16920, 16918, {0}, 0},{'\0', 0, 16919, {0}, 0}, + {'s', 16922, 16920, {0}, 0},{'\0', 0, 16921, {0}, 0},{';', 0, 16922, {8648}, 1}, + {'\0', 0, 16923, {0}, 0},{'c', 16928, 16924, {0}, 0},{'i', 16948, 16925, {0}, 0}, + {'t', 16954, 16926, {0}, 0},{'\0', 0, 16927, {0}, 0},{'o', 16931, 16928, {0}, 0}, + {'r', 16942, 16929, {0}, 0},{'\0', 0, 16930, {0}, 0},{'r', 16933, 16931, {0}, 0}, + {'\0', 0, 16932, {0}, 0},{'n', 16935, 16933, {0}, 0},{'\0', 0, 16934, {0}, 0}, + {';', 0, 16935, {8989}, 1},{'e', 16938, 16936, {0}, 0},{'\0', 0, 16937, {0}, 0}, + {'r', 16940, 16938, {0}, 0},{'\0', 0, 16939, {0}, 0},{';', 0, 16940, {8989}, 1}, + {'\0', 0, 16941, {0}, 0},{'o', 16944, 16942, {0}, 0},{'\0', 0, 16943, {0}, 0}, + {'p', 16946, 16944, {0}, 0},{'\0', 0, 16945, {0}, 0},{';', 0, 16946, {8974}, 1}, + {'\0', 0, 16947, {0}, 0},{'n', 16950, 16948, {0}, 0},{'\0', 0, 16949, {0}, 0}, + {'g', 16952, 16950, {0}, 0},{'\0', 0, 16951, {0}, 0},{';', 0, 16952, {367}, 1}, + {'\0', 0, 16953, {0}, 0},{'r', 16956, 16954, {0}, 0},{'\0', 0, 16955, {0}, 0}, + {'i', 16958, 16956, {0}, 0},{'\0', 0, 16957, {0}, 0},{';', 0, 16958, {9721}, 1}, + {'\0', 0, 16959, {0}, 0},{'c', 16962, 16960, {0}, 0},{'\0', 0, 16961, {0}, 0}, + {'r', 16964, 16962, {0}, 0},{'\0', 0, 16963, {0}, 0},{';', 0, 16964, {120010}, 1}, + {'\0', 0, 16965, {0}, 0},{'d', 16970, 16966, {0}, 0},{'i', 16976, 16967, {0}, 0}, + {'r', 16984, 16968, {0}, 0},{'\0', 0, 16969, {0}, 0},{'o', 16972, 16970, {0}, 0}, + {'\0', 0, 16971, {0}, 0},{'t', 16974, 16972, {0}, 0},{'\0', 0, 16973, {0}, 0}, + {';', 0, 16974, {8944}, 1},{'\0', 0, 16975, {0}, 0},{'l', 16978, 16976, {0}, 0}, + {'\0', 0, 16977, {0}, 0},{'d', 16980, 16978, {0}, 0},{'\0', 0, 16979, {0}, 0}, + {'e', 16982, 16980, {0}, 0},{'\0', 0, 16981, {0}, 0},{';', 0, 16982, {361}, 1}, + {'\0', 0, 16983, {0}, 0},{'i', 16986, 16984, {0}, 0},{'\0', 0, 16985, {0}, 0}, + {';', 0, 16986, {9653}, 1},{'f', 16989, 16987, {0}, 0},{'\0', 0, 16988, {0}, 0}, + {';', 0, 16989, {9652}, 1},{'\0', 0, 16990, {0}, 0},{'a', 16994, 16991, {0}, 0}, + {'m', 17000, 16992, {0}, 0},{'\0', 0, 16993, {0}, 0},{'r', 16996, 16994, {0}, 0}, + {'\0', 0, 16995, {0}, 0},{'r', 16998, 16996, {0}, 0},{'\0', 0, 16997, {0}, 0}, + {';', 0, 16998, {8648}, 1},{'\0', 0, 16999, {0}, 0},{'l', 17002, 17000, {252}, 1}, + {'\0', 0, 17001, {0}, 0},{';', 0, 17002, {252}, 1},{'\0', 0, 17003, {0}, 0}, + {'a', 17006, 17004, {0}, 0},{'\0', 0, 17005, {0}, 0},{'n', 17008, 17006, {0}, 0}, + {'\0', 0, 17007, {0}, 0},{'g', 17010, 17008, {0}, 0},{'\0', 0, 17009, {0}, 0}, + {'l', 17012, 17010, {0}, 0},{'\0', 0, 17011, {0}, 0},{'e', 17014, 17012, {0}, 0}, + {'\0', 0, 17013, {0}, 0},{';', 0, 17014, {10663}, 1},{'\0', 0, 17015, {0}, 0}, + {'A', 17032, 17016, {0}, 0},{'B', 17038, 17017, {0}, 0},{'D', 17047, 17018, {0}, 0}, + {'a', 17055, 17019, {0}, 0},{'c', 17231, 17020, {0}, 0},{'d', 17235, 17021, {0}, 0}, + {'e', 17243, 17022, {0}, 0},{'f', 17280, 17023, {0}, 0},{'l', 17284, 17024, {0}, 0}, + {'n', 17292, 17025, {0}, 0},{'o', 17303, 17026, {0}, 0},{'p', 17309, 17027, {0}, 0}, + {'r', 17317, 17028, {0}, 0},{'s', 17325, 17029, {0}, 0},{'z', 17353, 17030, {0}, 0}, + {'\0', 0, 17031, {0}, 0},{'r', 17034, 17032, {0}, 0},{'\0', 0, 17033, {0}, 0}, + {'r', 17036, 17034, {0}, 0},{'\0', 0, 17035, {0}, 0},{';', 0, 17036, {8661}, 1}, + {'\0', 0, 17037, {0}, 0},{'a', 17040, 17038, {0}, 0},{'\0', 0, 17039, {0}, 0}, + {'r', 17042, 17040, {0}, 0},{'\0', 0, 17041, {0}, 0},{';', 0, 17042, {10984}, 1}, + {'v', 17045, 17043, {0}, 0},{'\0', 0, 17044, {0}, 0},{';', 0, 17045, {10985}, 1}, + {'\0', 0, 17046, {0}, 0},{'a', 17049, 17047, {0}, 0},{'\0', 0, 17048, {0}, 0}, + {'s', 17051, 17049, {0}, 0},{'\0', 0, 17050, {0}, 0},{'h', 17053, 17051, {0}, 0}, + {'\0', 0, 17052, {0}, 0},{';', 0, 17053, {8872}, 1},{'\0', 0, 17054, {0}, 0}, + {'n', 17058, 17055, {0}, 0},{'r', 17066, 17056, {0}, 0},{'\0', 0, 17057, {0}, 0}, + {'g', 17060, 17058, {0}, 0},{'\0', 0, 17059, {0}, 0},{'r', 17062, 17060, {0}, 0}, + {'\0', 0, 17061, {0}, 0},{'t', 17064, 17062, {0}, 0},{'\0', 0, 17063, {0}, 0}, + {';', 0, 17064, {10652}, 1},{'\0', 0, 17065, {0}, 0},{'e', 17074, 17066, {0}, 0}, + {'k', 17088, 17067, {0}, 0},{'n', 17098, 17068, {0}, 0},{'p', 17112, 17069, {0}, 0}, + {'r', 17132, 17070, {0}, 0},{'s', 17139, 17071, {0}, 0},{'t', 17187, 17072, {0}, 0}, + {'\0', 0, 17073, {0}, 0},{'p', 17076, 17074, {0}, 0},{'\0', 0, 17075, {0}, 0}, + {'s', 17078, 17076, {0}, 0},{'\0', 0, 17077, {0}, 0},{'i', 17080, 17078, {0}, 0}, + {'\0', 0, 17079, {0}, 0},{'l', 17082, 17080, {0}, 0},{'\0', 0, 17081, {0}, 0}, + {'o', 17084, 17082, {0}, 0},{'\0', 0, 17083, {0}, 0},{'n', 17086, 17084, {0}, 0}, + {'\0', 0, 17085, {0}, 0},{';', 0, 17086, {1013}, 1},{'\0', 0, 17087, {0}, 0}, + {'a', 17090, 17088, {0}, 0},{'\0', 0, 17089, {0}, 0},{'p', 17092, 17090, {0}, 0}, + {'\0', 0, 17091, {0}, 0},{'p', 17094, 17092, {0}, 0},{'\0', 0, 17093, {0}, 0}, + {'a', 17096, 17094, {0}, 0},{'\0', 0, 17095, {0}, 0},{';', 0, 17096, {1008}, 1}, + {'\0', 0, 17097, {0}, 0},{'o', 17100, 17098, {0}, 0},{'\0', 0, 17099, {0}, 0}, + {'t', 17102, 17100, {0}, 0},{'\0', 0, 17101, {0}, 0},{'h', 17104, 17102, {0}, 0}, + {'\0', 0, 17103, {0}, 0},{'i', 17106, 17104, {0}, 0},{'\0', 0, 17105, {0}, 0}, + {'n', 17108, 17106, {0}, 0},{'\0', 0, 17107, {0}, 0},{'g', 17110, 17108, {0}, 0}, + {'\0', 0, 17109, {0}, 0},{';', 0, 17110, {8709}, 1},{'\0', 0, 17111, {0}, 0}, + {'h', 17116, 17112, {0}, 0},{'i', 17120, 17113, {0}, 0},{'r', 17122, 17114, {0}, 0}, + {'\0', 0, 17115, {0}, 0},{'i', 17118, 17116, {0}, 0},{'\0', 0, 17117, {0}, 0}, + {';', 0, 17118, {981}, 1},{'\0', 0, 17119, {0}, 0},{';', 0, 17120, {982}, 1}, + {'\0', 0, 17121, {0}, 0},{'o', 17124, 17122, {0}, 0},{'\0', 0, 17123, {0}, 0}, + {'p', 17126, 17124, {0}, 0},{'\0', 0, 17125, {0}, 0},{'t', 17128, 17126, {0}, 0}, + {'\0', 0, 17127, {0}, 0},{'o', 17130, 17128, {0}, 0},{'\0', 0, 17129, {0}, 0}, + {';', 0, 17130, {8733}, 1},{'\0', 0, 17131, {0}, 0},{';', 0, 17132, {8597}, 1}, + {'h', 17135, 17133, {0}, 0},{'\0', 0, 17134, {0}, 0},{'o', 17137, 17135, {0}, 0}, + {'\0', 0, 17136, {0}, 0},{';', 0, 17137, {1009}, 1},{'\0', 0, 17138, {0}, 0}, + {'i', 17142, 17139, {0}, 0},{'u', 17150, 17140, {0}, 0},{'\0', 0, 17141, {0}, 0}, + {'g', 17144, 17142, {0}, 0},{'\0', 0, 17143, {0}, 0},{'m', 17146, 17144, {0}, 0}, + {'\0', 0, 17145, {0}, 0},{'a', 17148, 17146, {0}, 0},{'\0', 0, 17147, {0}, 0}, + {';', 0, 17148, {962}, 1},{'\0', 0, 17149, {0}, 0},{'b', 17153, 17150, {0}, 0}, + {'p', 17170, 17151, {0}, 0},{'\0', 0, 17152, {0}, 0},{'s', 17155, 17153, {0}, 0}, + {'\0', 0, 17154, {0}, 0},{'e', 17157, 17155, {0}, 0},{'\0', 0, 17156, {0}, 0}, + {'t', 17159, 17157, {0}, 0},{'\0', 0, 17158, {0}, 0},{'n', 17161, 17159, {0}, 0}, + {'\0', 0, 17160, {0}, 0},{'e', 17163, 17161, {0}, 0},{'\0', 0, 17162, {0}, 0}, + {'q', 17165, 17163, {0}, 0},{'\0', 0, 17164, {0}, 0},{';', 0, 17165, {8842,65024}, 2}, + {'q', 17168, 17166, {0}, 0},{'\0', 0, 17167, {0}, 0},{';', 0, 17168, {10955,65024}, 2}, + {'\0', 0, 17169, {0}, 0},{'s', 17172, 17170, {0}, 0},{'\0', 0, 17171, {0}, 0}, + {'e', 17174, 17172, {0}, 0},{'\0', 0, 17173, {0}, 0},{'t', 17176, 17174, {0}, 0}, + {'\0', 0, 17175, {0}, 0},{'n', 17178, 17176, {0}, 0},{'\0', 0, 17177, {0}, 0}, + {'e', 17180, 17178, {0}, 0},{'\0', 0, 17179, {0}, 0},{'q', 17182, 17180, {0}, 0}, + {'\0', 0, 17181, {0}, 0},{';', 0, 17182, {8843,65024}, 2},{'q', 17185, 17183, {0}, 0}, + {'\0', 0, 17184, {0}, 0},{';', 0, 17185, {10956,65024}, 2},{'\0', 0, 17186, {0}, 0}, + {'h', 17190, 17187, {0}, 0},{'r', 17198, 17188, {0}, 0},{'\0', 0, 17189, {0}, 0}, + {'e', 17192, 17190, {0}, 0},{'\0', 0, 17191, {0}, 0},{'t', 17194, 17192, {0}, 0}, + {'\0', 0, 17193, {0}, 0},{'a', 17196, 17194, {0}, 0},{'\0', 0, 17195, {0}, 0}, + {';', 0, 17196, {977}, 1},{'\0', 0, 17197, {0}, 0},{'i', 17200, 17198, {0}, 0}, + {'\0', 0, 17199, {0}, 0},{'a', 17202, 17200, {0}, 0},{'\0', 0, 17201, {0}, 0}, + {'n', 17204, 17202, {0}, 0},{'\0', 0, 17203, {0}, 0},{'g', 17206, 17204, {0}, 0}, + {'\0', 0, 17205, {0}, 0},{'l', 17208, 17206, {0}, 0},{'\0', 0, 17207, {0}, 0}, + {'e', 17210, 17208, {0}, 0},{'\0', 0, 17209, {0}, 0},{'l', 17213, 17210, {0}, 0}, + {'r', 17221, 17211, {0}, 0},{'\0', 0, 17212, {0}, 0},{'e', 17215, 17213, {0}, 0}, + {'\0', 0, 17214, {0}, 0},{'f', 17217, 17215, {0}, 0},{'\0', 0, 17216, {0}, 0}, + {'t', 17219, 17217, {0}, 0},{'\0', 0, 17218, {0}, 0},{';', 0, 17219, {8882}, 1}, + {'\0', 0, 17220, {0}, 0},{'i', 17223, 17221, {0}, 0},{'\0', 0, 17222, {0}, 0}, + {'g', 17225, 17223, {0}, 0},{'\0', 0, 17224, {0}, 0},{'h', 17227, 17225, {0}, 0}, + {'\0', 0, 17226, {0}, 0},{'t', 17229, 17227, {0}, 0},{'\0', 0, 17228, {0}, 0}, + {';', 0, 17229, {8883}, 1},{'\0', 0, 17230, {0}, 0},{'y', 17233, 17231, {0}, 0}, + {'\0', 0, 17232, {0}, 0},{';', 0, 17233, {1074}, 1},{'\0', 0, 17234, {0}, 0}, + {'a', 17237, 17235, {0}, 0},{'\0', 0, 17236, {0}, 0},{'s', 17239, 17237, {0}, 0}, + {'\0', 0, 17238, {0}, 0},{'h', 17241, 17239, {0}, 0},{'\0', 0, 17240, {0}, 0}, + {';', 0, 17241, {8866}, 1},{'\0', 0, 17242, {0}, 0},{'e', 17247, 17243, {0}, 0}, + {'l', 17261, 17244, {0}, 0},{'r', 17269, 17245, {0}, 0},{'\0', 0, 17246, {0}, 0}, + {';', 0, 17247, {8744}, 1},{'b', 17251, 17248, {0}, 0},{'e', 17257, 17249, {0}, 0}, + {'\0', 0, 17250, {0}, 0},{'a', 17253, 17251, {0}, 0},{'\0', 0, 17252, {0}, 0}, + {'r', 17255, 17253, {0}, 0},{'\0', 0, 17254, {0}, 0},{';', 0, 17255, {8891}, 1}, + {'\0', 0, 17256, {0}, 0},{'q', 17259, 17257, {0}, 0},{'\0', 0, 17258, {0}, 0}, + {';', 0, 17259, {8794}, 1},{'\0', 0, 17260, {0}, 0},{'l', 17263, 17261, {0}, 0}, + {'\0', 0, 17262, {0}, 0},{'i', 17265, 17263, {0}, 0},{'\0', 0, 17264, {0}, 0}, + {'p', 17267, 17265, {0}, 0},{'\0', 0, 17266, {0}, 0},{';', 0, 17267, {8942}, 1}, + {'\0', 0, 17268, {0}, 0},{'b', 17272, 17269, {0}, 0},{'t', 17278, 17270, {0}, 0}, + {'\0', 0, 17271, {0}, 0},{'a', 17274, 17272, {0}, 0},{'\0', 0, 17273, {0}, 0}, + {'r', 17276, 17274, {0}, 0},{'\0', 0, 17275, {0}, 0},{';', 0, 17276, {124}, 1}, + {'\0', 0, 17277, {0}, 0},{';', 0, 17278, {124}, 1},{'\0', 0, 17279, {0}, 0}, + {'r', 17282, 17280, {0}, 0},{'\0', 0, 17281, {0}, 0},{';', 0, 17282, {120115}, 1}, + {'\0', 0, 17283, {0}, 0},{'t', 17286, 17284, {0}, 0},{'\0', 0, 17285, {0}, 0}, + {'r', 17288, 17286, {0}, 0},{'\0', 0, 17287, {0}, 0},{'i', 17290, 17288, {0}, 0}, + {'\0', 0, 17289, {0}, 0},{';', 0, 17290, {8882}, 1},{'\0', 0, 17291, {0}, 0}, + {'s', 17294, 17292, {0}, 0},{'\0', 0, 17293, {0}, 0},{'u', 17296, 17294, {0}, 0}, + {'\0', 0, 17295, {0}, 0},{'b', 17299, 17296, {0}, 0},{'p', 17301, 17297, {0}, 0}, + {'\0', 0, 17298, {0}, 0},{';', 0, 17299, {8834,8402}, 2},{'\0', 0, 17300, {0}, 0}, + {';', 0, 17301, {8835,8402}, 2},{'\0', 0, 17302, {0}, 0},{'p', 17305, 17303, {0}, 0}, + {'\0', 0, 17304, {0}, 0},{'f', 17307, 17305, {0}, 0},{'\0', 0, 17306, {0}, 0}, + {';', 0, 17307, {120167}, 1},{'\0', 0, 17308, {0}, 0},{'r', 17311, 17309, {0}, 0}, + {'\0', 0, 17310, {0}, 0},{'o', 17313, 17311, {0}, 0},{'\0', 0, 17312, {0}, 0}, + {'p', 17315, 17313, {0}, 0},{'\0', 0, 17314, {0}, 0},{';', 0, 17315, {8733}, 1}, + {'\0', 0, 17316, {0}, 0},{'t', 17319, 17317, {0}, 0},{'\0', 0, 17318, {0}, 0}, + {'r', 17321, 17319, {0}, 0},{'\0', 0, 17320, {0}, 0},{'i', 17323, 17321, {0}, 0}, + {'\0', 0, 17322, {0}, 0},{';', 0, 17323, {8883}, 1},{'\0', 0, 17324, {0}, 0}, + {'c', 17328, 17325, {0}, 0},{'u', 17332, 17326, {0}, 0},{'\0', 0, 17327, {0}, 0}, + {'r', 17330, 17328, {0}, 0},{'\0', 0, 17329, {0}, 0},{';', 0, 17330, {120011}, 1}, + {'\0', 0, 17331, {0}, 0},{'b', 17335, 17332, {0}, 0},{'p', 17344, 17333, {0}, 0}, + {'\0', 0, 17334, {0}, 0},{'n', 17337, 17335, {0}, 0},{'\0', 0, 17336, {0}, 0}, + {'E', 17340, 17337, {0}, 0},{'e', 17342, 17338, {0}, 0},{'\0', 0, 17339, {0}, 0}, + {';', 0, 17340, {10955,65024}, 2},{'\0', 0, 17341, {0}, 0},{';', 0, 17342, {8842,65024}, 2}, + {'\0', 0, 17343, {0}, 0},{'n', 17346, 17344, {0}, 0},{'\0', 0, 17345, {0}, 0}, + {'E', 17349, 17346, {0}, 0},{'e', 17351, 17347, {0}, 0},{'\0', 0, 17348, {0}, 0}, + {';', 0, 17349, {10956,65024}, 2},{'\0', 0, 17350, {0}, 0},{';', 0, 17351, {8843,65024}, 2}, + {'\0', 0, 17352, {0}, 0},{'i', 17355, 17353, {0}, 0},{'\0', 0, 17354, {0}, 0}, + {'g', 17357, 17355, {0}, 0},{'\0', 0, 17356, {0}, 0},{'z', 17359, 17357, {0}, 0}, + {'\0', 0, 17358, {0}, 0},{'a', 17361, 17359, {0}, 0},{'\0', 0, 17360, {0}, 0}, + {'g', 17363, 17361, {0}, 0},{'\0', 0, 17362, {0}, 0},{';', 0, 17363, {10650}, 1}, + {'\0', 0, 17364, {0}, 0},{'c', 17373, 17365, {0}, 0},{'e', 17381, 17366, {0}, 0}, + {'f', 17408, 17367, {0}, 0},{'o', 17412, 17368, {0}, 0},{'p', 17418, 17369, {0}, 0}, + {'r', 17420, 17370, {0}, 0},{'s', 17431, 17371, {0}, 0},{'\0', 0, 17372, {0}, 0}, + {'i', 17375, 17373, {0}, 0},{'\0', 0, 17374, {0}, 0},{'r', 17377, 17375, {0}, 0}, + {'\0', 0, 17376, {0}, 0},{'c', 17379, 17377, {0}, 0},{'\0', 0, 17378, {0}, 0}, + {';', 0, 17379, {373}, 1},{'\0', 0, 17380, {0}, 0},{'d', 17384, 17381, {0}, 0}, + {'i', 17400, 17382, {0}, 0},{'\0', 0, 17383, {0}, 0},{'b', 17387, 17384, {0}, 0}, + {'g', 17393, 17385, {0}, 0},{'\0', 0, 17386, {0}, 0},{'a', 17389, 17387, {0}, 0}, + {'\0', 0, 17388, {0}, 0},{'r', 17391, 17389, {0}, 0},{'\0', 0, 17390, {0}, 0}, + {';', 0, 17391, {10847}, 1},{'\0', 0, 17392, {0}, 0},{'e', 17395, 17393, {0}, 0}, + {'\0', 0, 17394, {0}, 0},{';', 0, 17395, {8743}, 1},{'q', 17398, 17396, {0}, 0}, + {'\0', 0, 17397, {0}, 0},{';', 0, 17398, {8793}, 1},{'\0', 0, 17399, {0}, 0}, + {'e', 17402, 17400, {0}, 0},{'\0', 0, 17401, {0}, 0},{'r', 17404, 17402, {0}, 0}, + {'\0', 0, 17403, {0}, 0},{'p', 17406, 17404, {0}, 0},{'\0', 0, 17405, {0}, 0}, + {';', 0, 17406, {8472}, 1},{'\0', 0, 17407, {0}, 0},{'r', 17410, 17408, {0}, 0}, + {'\0', 0, 17409, {0}, 0},{';', 0, 17410, {120116}, 1},{'\0', 0, 17411, {0}, 0}, + {'p', 17414, 17412, {0}, 0},{'\0', 0, 17413, {0}, 0},{'f', 17416, 17414, {0}, 0}, + {'\0', 0, 17415, {0}, 0},{';', 0, 17416, {120168}, 1},{'\0', 0, 17417, {0}, 0}, + {';', 0, 17418, {8472}, 1},{'\0', 0, 17419, {0}, 0},{';', 0, 17420, {8768}, 1}, + {'e', 17423, 17421, {0}, 0},{'\0', 0, 17422, {0}, 0},{'a', 17425, 17423, {0}, 0}, + {'\0', 0, 17424, {0}, 0},{'t', 17427, 17425, {0}, 0},{'\0', 0, 17426, {0}, 0}, + {'h', 17429, 17427, {0}, 0},{'\0', 0, 17428, {0}, 0},{';', 0, 17429, {8768}, 1}, + {'\0', 0, 17430, {0}, 0},{'c', 17433, 17431, {0}, 0},{'\0', 0, 17432, {0}, 0}, + {'r', 17435, 17433, {0}, 0},{'\0', 0, 17434, {0}, 0},{';', 0, 17435, {120012}, 1}, + {'\0', 0, 17436, {0}, 0},{'c', 17452, 17437, {0}, 0},{'d', 17470, 17438, {0}, 0}, + {'f', 17478, 17439, {0}, 0},{'h', 17482, 17440, {0}, 0},{'i', 17497, 17441, {0}, 0}, + {'l', 17499, 17442, {0}, 0},{'m', 17514, 17443, {0}, 0},{'n', 17520, 17444, {0}, 0}, + {'o', 17526, 17445, {0}, 0},{'r', 17555, 17446, {0}, 0},{'s', 17570, 17447, {0}, 0}, + {'u', 17585, 17448, {0}, 0},{'v', 17602, 17449, {0}, 0},{'w', 17608, 17450, {0}, 0}, + {'\0', 0, 17451, {0}, 0},{'a', 17456, 17452, {0}, 0},{'i', 17460, 17453, {0}, 0}, + {'u', 17466, 17454, {0}, 0},{'\0', 0, 17455, {0}, 0},{'p', 17458, 17456, {0}, 0}, + {'\0', 0, 17457, {0}, 0},{';', 0, 17458, {8898}, 1},{'\0', 0, 17459, {0}, 0}, + {'r', 17462, 17460, {0}, 0},{'\0', 0, 17461, {0}, 0},{'c', 17464, 17462, {0}, 0}, + {'\0', 0, 17463, {0}, 0},{';', 0, 17464, {9711}, 1},{'\0', 0, 17465, {0}, 0}, + {'p', 17468, 17466, {0}, 0},{'\0', 0, 17467, {0}, 0},{';', 0, 17468, {8899}, 1}, + {'\0', 0, 17469, {0}, 0},{'t', 17472, 17470, {0}, 0},{'\0', 0, 17471, {0}, 0}, + {'r', 17474, 17472, {0}, 0},{'\0', 0, 17473, {0}, 0},{'i', 17476, 17474, {0}, 0}, + {'\0', 0, 17475, {0}, 0},{';', 0, 17476, {9661}, 1},{'\0', 0, 17477, {0}, 0}, + {'r', 17480, 17478, {0}, 0},{'\0', 0, 17479, {0}, 0},{';', 0, 17480, {120117}, 1}, + {'\0', 0, 17481, {0}, 0},{'A', 17485, 17482, {0}, 0},{'a', 17491, 17483, {0}, 0}, + {'\0', 0, 17484, {0}, 0},{'r', 17487, 17485, {0}, 0},{'\0', 0, 17486, {0}, 0}, + {'r', 17489, 17487, {0}, 0},{'\0', 0, 17488, {0}, 0},{';', 0, 17489, {10234}, 1}, + {'\0', 0, 17490, {0}, 0},{'r', 17493, 17491, {0}, 0},{'\0', 0, 17492, {0}, 0}, + {'r', 17495, 17493, {0}, 0},{'\0', 0, 17494, {0}, 0},{';', 0, 17495, {10231}, 1}, + {'\0', 0, 17496, {0}, 0},{';', 0, 17497, {958}, 1},{'\0', 0, 17498, {0}, 0}, + {'A', 17502, 17499, {0}, 0},{'a', 17508, 17500, {0}, 0},{'\0', 0, 17501, {0}, 0}, + {'r', 17504, 17502, {0}, 0},{'\0', 0, 17503, {0}, 0},{'r', 17506, 17504, {0}, 0}, + {'\0', 0, 17505, {0}, 0},{';', 0, 17506, {10232}, 1},{'\0', 0, 17507, {0}, 0}, + {'r', 17510, 17508, {0}, 0},{'\0', 0, 17509, {0}, 0},{'r', 17512, 17510, {0}, 0}, + {'\0', 0, 17511, {0}, 0},{';', 0, 17512, {10229}, 1},{'\0', 0, 17513, {0}, 0}, + {'a', 17516, 17514, {0}, 0},{'\0', 0, 17515, {0}, 0},{'p', 17518, 17516, {0}, 0}, + {'\0', 0, 17517, {0}, 0},{';', 0, 17518, {10236}, 1},{'\0', 0, 17519, {0}, 0}, + {'i', 17522, 17520, {0}, 0},{'\0', 0, 17521, {0}, 0},{'s', 17524, 17522, {0}, 0}, + {'\0', 0, 17523, {0}, 0},{';', 0, 17524, {8955}, 1},{'\0', 0, 17525, {0}, 0}, + {'d', 17530, 17526, {0}, 0},{'p', 17536, 17527, {0}, 0},{'t', 17547, 17528, {0}, 0}, + {'\0', 0, 17529, {0}, 0},{'o', 17532, 17530, {0}, 0},{'\0', 0, 17531, {0}, 0}, + {'t', 17534, 17532, {0}, 0},{'\0', 0, 17533, {0}, 0},{';', 0, 17534, {10752}, 1}, + {'\0', 0, 17535, {0}, 0},{'f', 17539, 17536, {0}, 0},{'l', 17541, 17537, {0}, 0}, + {'\0', 0, 17538, {0}, 0},{';', 0, 17539, {120169}, 1},{'\0', 0, 17540, {0}, 0}, + {'u', 17543, 17541, {0}, 0},{'\0', 0, 17542, {0}, 0},{'s', 17545, 17543, {0}, 0}, + {'\0', 0, 17544, {0}, 0},{';', 0, 17545, {10753}, 1},{'\0', 0, 17546, {0}, 0}, + {'i', 17549, 17547, {0}, 0},{'\0', 0, 17548, {0}, 0},{'m', 17551, 17549, {0}, 0}, + {'\0', 0, 17550, {0}, 0},{'e', 17553, 17551, {0}, 0},{'\0', 0, 17552, {0}, 0}, + {';', 0, 17553, {10754}, 1},{'\0', 0, 17554, {0}, 0},{'A', 17558, 17555, {0}, 0}, + {'a', 17564, 17556, {0}, 0},{'\0', 0, 17557, {0}, 0},{'r', 17560, 17558, {0}, 0}, + {'\0', 0, 17559, {0}, 0},{'r', 17562, 17560, {0}, 0},{'\0', 0, 17561, {0}, 0}, + {';', 0, 17562, {10233}, 1},{'\0', 0, 17563, {0}, 0},{'r', 17566, 17564, {0}, 0}, + {'\0', 0, 17565, {0}, 0},{'r', 17568, 17566, {0}, 0},{'\0', 0, 17567, {0}, 0}, + {';', 0, 17568, {10230}, 1},{'\0', 0, 17569, {0}, 0},{'c', 17573, 17570, {0}, 0}, + {'q', 17577, 17571, {0}, 0},{'\0', 0, 17572, {0}, 0},{'r', 17575, 17573, {0}, 0}, + {'\0', 0, 17574, {0}, 0},{';', 0, 17575, {120013}, 1},{'\0', 0, 17576, {0}, 0}, + {'c', 17579, 17577, {0}, 0},{'\0', 0, 17578, {0}, 0},{'u', 17581, 17579, {0}, 0}, + {'\0', 0, 17580, {0}, 0},{'p', 17583, 17581, {0}, 0},{'\0', 0, 17582, {0}, 0}, + {';', 0, 17583, {10758}, 1},{'\0', 0, 17584, {0}, 0},{'p', 17588, 17585, {0}, 0}, + {'t', 17596, 17586, {0}, 0},{'\0', 0, 17587, {0}, 0},{'l', 17590, 17588, {0}, 0}, + {'\0', 0, 17589, {0}, 0},{'u', 17592, 17590, {0}, 0},{'\0', 0, 17591, {0}, 0}, + {'s', 17594, 17592, {0}, 0},{'\0', 0, 17593, {0}, 0},{';', 0, 17594, {10756}, 1}, + {'\0', 0, 17595, {0}, 0},{'r', 17598, 17596, {0}, 0},{'\0', 0, 17597, {0}, 0}, + {'i', 17600, 17598, {0}, 0},{'\0', 0, 17599, {0}, 0},{';', 0, 17600, {9651}, 1}, + {'\0', 0, 17601, {0}, 0},{'e', 17604, 17602, {0}, 0},{'\0', 0, 17603, {0}, 0}, + {'e', 17606, 17604, {0}, 0},{'\0', 0, 17605, {0}, 0},{';', 0, 17606, {8897}, 1}, + {'\0', 0, 17607, {0}, 0},{'e', 17610, 17608, {0}, 0},{'\0', 0, 17609, {0}, 0}, + {'d', 17612, 17610, {0}, 0},{'\0', 0, 17611, {0}, 0},{'g', 17614, 17612, {0}, 0}, + {'\0', 0, 17613, {0}, 0},{'e', 17616, 17614, {0}, 0},{'\0', 0, 17615, {0}, 0}, + {';', 0, 17616, {8896}, 1},{'\0', 0, 17617, {0}, 0},{'a', 17627, 17618, {0}, 0}, + {'c', 17640, 17619, {0}, 0},{'e', 17651, 17620, {0}, 0},{'f', 17655, 17621, {0}, 0}, + {'i', 17659, 17622, {0}, 0},{'o', 17665, 17623, {0}, 0},{'s', 17671, 17624, {0}, 0}, + {'u', 17677, 17625, {0}, 0},{'\0', 0, 17626, {0}, 0},{'c', 17629, 17627, {0}, 0}, + {'\0', 0, 17628, {0}, 0},{'u', 17632, 17629, {0}, 0},{'y', 17638, 17630, {0}, 0}, + {'\0', 0, 17631, {0}, 0},{'t', 17634, 17632, {0}, 0},{'\0', 0, 17633, {0}, 0}, + {'e', 17636, 17634, {253}, 1},{'\0', 0, 17635, {0}, 0},{';', 0, 17636, {253}, 1}, + {'\0', 0, 17637, {0}, 0},{';', 0, 17638, {1103}, 1},{'\0', 0, 17639, {0}, 0}, + {'i', 17643, 17640, {0}, 0},{'y', 17649, 17641, {0}, 0},{'\0', 0, 17642, {0}, 0}, + {'r', 17645, 17643, {0}, 0},{'\0', 0, 17644, {0}, 0},{'c', 17647, 17645, {0}, 0}, + {'\0', 0, 17646, {0}, 0},{';', 0, 17647, {375}, 1},{'\0', 0, 17648, {0}, 0}, + {';', 0, 17649, {1099}, 1},{'\0', 0, 17650, {0}, 0},{'n', 17653, 17651, {165}, 1}, + {'\0', 0, 17652, {0}, 0},{';', 0, 17653, {165}, 1},{'\0', 0, 17654, {0}, 0}, + {'r', 17657, 17655, {0}, 0},{'\0', 0, 17656, {0}, 0},{';', 0, 17657, {120118}, 1}, + {'\0', 0, 17658, {0}, 0},{'c', 17661, 17659, {0}, 0},{'\0', 0, 17660, {0}, 0}, + {'y', 17663, 17661, {0}, 0},{'\0', 0, 17662, {0}, 0},{';', 0, 17663, {1111}, 1}, + {'\0', 0, 17664, {0}, 0},{'p', 17667, 17665, {0}, 0},{'\0', 0, 17666, {0}, 0}, + {'f', 17669, 17667, {0}, 0},{'\0', 0, 17668, {0}, 0},{';', 0, 17669, {120170}, 1}, + {'\0', 0, 17670, {0}, 0},{'c', 17673, 17671, {0}, 0},{'\0', 0, 17672, {0}, 0}, + {'r', 17675, 17673, {0}, 0},{'\0', 0, 17674, {0}, 0},{';', 0, 17675, {120014}, 1}, + {'\0', 0, 17676, {0}, 0},{'c', 17680, 17677, {0}, 0},{'m', 17684, 17678, {0}, 0}, + {'\0', 0, 17679, {0}, 0},{'y', 17682, 17680, {0}, 0},{'\0', 0, 17681, {0}, 0}, + {';', 0, 17682, {1102}, 1},{'\0', 0, 17683, {0}, 0},{'l', 17686, 17684, {255}, 1}, + {'\0', 0, 17685, {0}, 0},{';', 0, 17686, {255}, 1},{'\0', 0, 17687, {0}, 0}, + {'a', 17699, 17688, {0}, 0},{'c', 17709, 17689, {0}, 0},{'d', 17722, 17690, {0}, 0}, + {'e', 17728, 17691, {0}, 0},{'f', 17743, 17692, {0}, 0},{'h', 17747, 17693, {0}, 0}, + {'i', 17753, 17694, {0}, 0},{'o', 17765, 17695, {0}, 0},{'s', 17771, 17696, {0}, 0}, + {'w', 17777, 17697, {0}, 0},{'\0', 0, 17698, {0}, 0},{'c', 17701, 17699, {0}, 0}, + {'\0', 0, 17700, {0}, 0},{'u', 17703, 17701, {0}, 0},{'\0', 0, 17702, {0}, 0}, + {'t', 17705, 17703, {0}, 0},{'\0', 0, 17704, {0}, 0},{'e', 17707, 17705, {0}, 0}, + {'\0', 0, 17706, {0}, 0},{';', 0, 17707, {378}, 1},{'\0', 0, 17708, {0}, 0}, + {'a', 17712, 17709, {0}, 0},{'y', 17720, 17710, {0}, 0},{'\0', 0, 17711, {0}, 0}, + {'r', 17714, 17712, {0}, 0},{'\0', 0, 17713, {0}, 0},{'o', 17716, 17714, {0}, 0}, + {'\0', 0, 17715, {0}, 0},{'n', 17718, 17716, {0}, 0},{'\0', 0, 17717, {0}, 0}, + {';', 0, 17718, {382}, 1},{'\0', 0, 17719, {0}, 0},{';', 0, 17720, {1079}, 1}, + {'\0', 0, 17721, {0}, 0},{'o', 17724, 17722, {0}, 0},{'\0', 0, 17723, {0}, 0}, + {'t', 17726, 17724, {0}, 0},{'\0', 0, 17725, {0}, 0},{';', 0, 17726, {380}, 1}, + {'\0', 0, 17727, {0}, 0},{'e', 17731, 17728, {0}, 0},{'t', 17739, 17729, {0}, 0}, + {'\0', 0, 17730, {0}, 0},{'t', 17733, 17731, {0}, 0},{'\0', 0, 17732, {0}, 0}, + {'r', 17735, 17733, {0}, 0},{'\0', 0, 17734, {0}, 0},{'f', 17737, 17735, {0}, 0}, + {'\0', 0, 17736, {0}, 0},{';', 0, 17737, {8488}, 1},{'\0', 0, 17738, {0}, 0}, + {'a', 17741, 17739, {0}, 0},{'\0', 0, 17740, {0}, 0},{';', 0, 17741, {950}, 1}, + {'\0', 0, 17742, {0}, 0},{'r', 17745, 17743, {0}, 0},{'\0', 0, 17744, {0}, 0}, + {';', 0, 17745, {120119}, 1},{'\0', 0, 17746, {0}, 0},{'c', 17749, 17747, {0}, 0}, + {'\0', 0, 17748, {0}, 0},{'y', 17751, 17749, {0}, 0},{'\0', 0, 17750, {0}, 0}, + {';', 0, 17751, {1078}, 1},{'\0', 0, 17752, {0}, 0},{'g', 17755, 17753, {0}, 0}, + {'\0', 0, 17754, {0}, 0},{'r', 17757, 17755, {0}, 0},{'\0', 0, 17756, {0}, 0}, + {'a', 17759, 17757, {0}, 0},{'\0', 0, 17758, {0}, 0},{'r', 17761, 17759, {0}, 0}, + {'\0', 0, 17760, {0}, 0},{'r', 17763, 17761, {0}, 0},{'\0', 0, 17762, {0}, 0}, + {';', 0, 17763, {8669}, 1},{'\0', 0, 17764, {0}, 0},{'p', 17767, 17765, {0}, 0}, + {'\0', 0, 17766, {0}, 0},{'f', 17769, 17767, {0}, 0},{'\0', 0, 17768, {0}, 0}, + {';', 0, 17769, {120171}, 1},{'\0', 0, 17770, {0}, 0},{'c', 17773, 17771, {0}, 0}, + {'\0', 0, 17772, {0}, 0},{'r', 17775, 17773, {0}, 0},{'\0', 0, 17774, {0}, 0}, + {';', 0, 17775, {120015}, 1},{'\0', 0, 17776, {0}, 0},{'j', 17780, 17777, {0}, 0}, + {'n', 17782, 17778, {0}, 0},{'\0', 0, 17779, {0}, 0},{';', 0, 17780, {8205}, 1}, + {'\0', 0, 17781, {0}, 0},{'j', 17784, 17782, {0}, 0},{'\0', 0, 17783, {0}, 0}, + {';', 0, 17784, {8204}, 1},{'\0', 0, 17785, {0}, 0} +}; + +#endif /* MyHTML_CHAREF_RESOURCE_H */ diff --git a/source/myhtml/data_process.c b/source/myhtml/data_process.c new file mode 100644 index 0000000..a5081db --- /dev/null +++ b/source/myhtml/data_process.c @@ -0,0 +1,320 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/data_process.h" +#include "myhtml/utils/resources.h" + +#define MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() \ +tmp_offset += myhtml_string_before_append_any_preprocessing(str, &data[tmp_offset], (offset - tmp_offset), \ + proc_entry->tmp_str_pos_proc); \ +if(offset != tmp_offset) { \ + if(proc_entry->encoding == MyHTML_ENCODING_UTF_8) \ + proc_entry->tmp_str_pos_proc = myhtml_string_append_with_preprocessing(str, &data[tmp_offset], (offset - tmp_offset), \ + proc_entry->emit_null_char); \ + else { \ + proc_entry->tmp_str_pos_proc = \ + myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, \ + &data[tmp_offset], (offset - tmp_offset), \ + proc_entry->encoding, proc_entry->emit_null_char); \ + } \ +} + +void myhtml_data_process_entry_clean(myhtml_data_process_entry_t* proc_entry) +{ + memset(proc_entry, 0, sizeof(myhtml_data_process_entry_t)); + proc_entry->state = myhtml_data_process_state_data; +} + +void myhtml_data_process_string_append_char(myhtml_string_t* str, const char sm) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, 2, 0); + + str->data[str->length] = sm; + str->length++; + + str->data[str->length] = '\0'; +} + +size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +{ + size_t tmp_offset = offset; + + while(offset < size) + { + if(data[offset] == '&') + { + tmp_offset += myhtml_string_before_append_any_preprocessing(str, &data[tmp_offset], (offset - tmp_offset), + proc_entry->tmp_str_pos_proc); + if(offset != tmp_offset) { + if(proc_entry->encoding == MyHTML_ENCODING_UTF_8) + proc_entry->tmp_str_pos_proc = myhtml_string_append_with_preprocessing(str, &data[tmp_offset], + (offset - tmp_offset), + proc_entry->emit_null_char); + else { + proc_entry->tmp_str_pos_proc = + myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, + &data[tmp_offset], (offset - tmp_offset), + proc_entry->encoding, proc_entry->emit_null_char); + myhtml_encoding_result_clean(&proc_entry->res); + } + } + + proc_entry->tmp_str_pos = str->length; + proc_entry->state = myhtml_data_process_state_ampersand; + + myhtml_data_process_string_append_char(str, data[offset]); + + offset++; + return offset; + } + + offset++; + } + + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + + return offset; +} + +size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +{ + if(data[offset] == '#') + { + myhtml_data_process_string_append_char(str, data[offset]); + offset++; + + proc_entry->tmp_num = 0; + + if(offset >= size) { + proc_entry->state = myhtml_data_process_state_ampersand_hash; + return offset; + } + + if(data[offset] == 'x' || data[offset] == 'X') { + myhtml_data_process_string_append_char(str, data[offset]); + offset++; + + proc_entry->state = myhtml_data_process_state_ampersand_hash_x_data; + } + else + proc_entry->state = myhtml_data_process_state_ampersand_hash_data; + } + else { + proc_entry->charef_res.last_entry = NULL; + proc_entry->charef_res.curr_entry = myhtml_charef_get_first_position(data[offset]); + + if(proc_entry->charef_res.curr_entry->ch == '\0') + proc_entry->state = myhtml_data_process_state_data; + else { + proc_entry->state = myhtml_data_process_state_ampersand_data; + + myhtml_data_process_string_append_char(str, data[offset]); + offset++; + } + } + + return offset; +} + +size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +{ + size_t tmp_offset = offset; + + const charef_entry_t *current_entry = myhtml_charef_find_by_pos(proc_entry->charef_res.curr_entry->next, data, &offset, size, &proc_entry->charef_res); + + if(proc_entry->charef_res.is_done) { + proc_entry->state = myhtml_data_process_state_data; + + if(data[offset] == ';') + offset++; + else { + /* if current charef is atrribute */ + if(proc_entry->is_attributes && + (data[offset] == '=' || myhtml_string_alphanumeric_character[ (unsigned char)data[offset] ] != 0xff)) + { + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + + return offset; + } + } + + if(current_entry->codepoints_len) { + for (size_t i = 0; i < current_entry->codepoints_len; i++) { + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + + proc_entry->tmp_str_pos += myhtml_encoding_codepoint_to_ascii_utf_8(current_entry->codepoints[i], &str->data[proc_entry->tmp_str_pos]); + } + + str->length = proc_entry->tmp_str_pos; + str->data[str->length] = '\0'; + } + else { + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + } + + proc_entry->charef_res.last_entry = NULL; + } + else { + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + } + + return offset; +} + +size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +{ + if(data[offset] == 'x' || data[offset] == 'X') { + myhtml_data_process_string_append_char(str, data[offset]); + offset++; + + proc_entry->state = myhtml_data_process_state_ampersand_hash_x_data; + } + else + proc_entry->state = myhtml_data_process_state_ampersand_hash_data; + + return offset; +} + +size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +{ + const unsigned char *u_data = (const unsigned char*)data; + size_t tmp_offset = offset; + + while(offset < size) + { + if(myhtml_string_chars_num_map[ u_data[offset] ] == 0xff) + { + proc_entry->state = myhtml_data_process_state_data; + + if((offset - tmp_offset) == 0) { + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + + return offset; + } + + if(data[offset] == ';') + offset++; + + myhtml_data_process_state_end(proc_entry, str); + return offset; + } + + if(proc_entry->tmp_num <= 0x10FFFF) { + proc_entry->tmp_num = myhtml_string_chars_num_map[ u_data[offset] ] + proc_entry->tmp_num * 10; + } + + offset++; + } + + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + + return offset; +} + +size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +{ + unsigned const char *u_data = (unsigned const char*)data; + size_t tmp_offset = offset; + + while(offset < size) + { + if(myhtml_string_chars_hex_map[ u_data[offset] ] == 0xff) + { + proc_entry->state = myhtml_data_process_state_data; + + if((offset - tmp_offset) == 0) { + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + + return offset; + } + + if(data[offset] == ';') + offset++; + + myhtml_data_process_state_end(proc_entry, str); + return offset; + } + + if(proc_entry->tmp_num <= 0x10FFFF) { + proc_entry->tmp_num <<= 4; + proc_entry->tmp_num |= myhtml_string_chars_hex_map[ u_data[offset] ]; + } + + offset++; + } + + MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() + + return offset; +} + +void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str) +{ + /* 4 is max utf8 byte + \0 */ + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + + if(proc_entry->tmp_num <= 0x9F) + proc_entry->tmp_num = replacement_character[proc_entry->tmp_num]; + else if(proc_entry->tmp_num >= 0xD800 && proc_entry->tmp_num <= 0xDFFF) + proc_entry->tmp_num = replacement_character[0]; + else if(proc_entry->tmp_num > 0x10FFFF) + proc_entry->tmp_num = replacement_character[0]; + + str->length = proc_entry->tmp_str_pos + + myhtml_encoding_codepoint_to_ascii_utf_8(proc_entry->tmp_num, &str->data[proc_entry->tmp_str_pos]); + + str->data[str->length] = '\0'; +} + +void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t size) +{ + size_t offset = 0; + + while (offset < size) { + offset = proc_entry->state(proc_entry, str, data, offset, size); + } +} + +void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str) +{ + if(proc_entry->state == myhtml_data_process_state_ampersand_data && proc_entry->charef_res.last_entry) + { + const charef_entry_t *entry = proc_entry->charef_res.last_entry; + + for (size_t i = 0; i < entry->codepoints_len; i++) { + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + + proc_entry->tmp_str_pos += myhtml_encoding_codepoint_to_ascii_utf_8(entry->codepoints[i], &str->data[proc_entry->tmp_str_pos]); + } + + str->length = proc_entry->tmp_str_pos; + str->data[str->length] = '\0'; + } + else if(proc_entry->state == myhtml_data_process_state_ampersand_hash_data) { + if((str->length - (proc_entry->tmp_str_pos + 2))) + myhtml_data_process_state_end(proc_entry, str); + } + else if(proc_entry->state == myhtml_data_process_state_ampersand_hash_x_data) { + if((str->length - (proc_entry->tmp_str_pos + 3))) + myhtml_data_process_state_end(proc_entry, str); + } +} + + diff --git a/source/myhtml/data_process.h b/source/myhtml/data_process.h new file mode 100644 index 0000000..558a5aa --- /dev/null +++ b/source/myhtml/data_process.h @@ -0,0 +1,72 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_DATA_PROCESS_H +#define MyHTML_DATA_PROCESS_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/charef.h" +#include "myhtml/mystring.h" + +struct myhtml_data_process_entry { + /* current state for process data */ + myhtml_data_process_state_f state; + + /* for encodings */ + myhtml_encoding_t encoding; + myhtml_encoding_result_t res; + + /* temp */ + size_t tmp_str_pos_proc; + size_t tmp_str_pos; + size_t tmp_num; + + /* < current result */ + charef_entry_result_t charef_res; + + /* settings */ + bool is_attributes; + bool emit_null_char; +}; + +void myhtml_data_process_entry_clean(myhtml_data_process_entry_t* proc_entry); + +void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t size); +void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); + +size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char *data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); +void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_DATA_PROCESS_H */ + diff --git a/source/myhtml/def.h b/source/myhtml/def.h new file mode 100644 index 0000000..389b198 --- /dev/null +++ b/source/myhtml/def.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_def_H +#define MyHTML_def_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define myhtml_parser_skip_whitespace() \ +if(myhtml_whithspace(html[html_offset], ==, ||)) { \ + while (html_offset < html_size && (myhtml_whithspace(html[html_offset], ==, ||))) { \ + html_offset++; \ + } \ +} + +#define myhtml_parser_queue_set_attr(tree, token_node) \ + if(token_node->attr_first == NULL) { \ + token_node->attr_first = myhtml_tree_token_attr_current(tree); \ + token_node->attr_last = token_node->attr_first; \ + \ + tree->attr_current = token_node->attr_last; \ + tree->attr_current->next = NULL; \ + tree->attr_current->prev = NULL; \ + } \ + else { \ + token_node->attr_last->next = myhtml_tree_token_attr_current(tree); \ + token_node->attr_last->next->prev = token_node->attr_last; \ + token_node->attr_last = token_node->attr_last->next; \ + \ + token_node->attr_last->next = NULL; \ + tree->attr_current = token_node->attr_last; \ + } + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/source/myhtml/encoding.c b/source/myhtml/encoding.c new file mode 100644 index 0000000..737f2fa --- /dev/null +++ b/source/myhtml/encoding.c @@ -0,0 +1,1125 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/encoding.h" +#include "myhtml/encoding_resource.h" +#include "myhtml/utils/resources.h" + + + +myhtml_encoding_custom_f myhtml_encoding_get_function_by_id(myhtml_encoding_t idx) +{ + return myhtml_encoding_function_index[idx]; +} + +enum myhtml_encoding_status myhtml_encoding_decode_utf_8(unsigned const char data, myhtml_encoding_result_t *res) +{ + // res->first -- lower boundary + // res->second -- upper boundary + // res->result -- code point + // res->third -- bytes seen + // res->flag -- bytes needed + + if(res->flag == 0) + { + if(data <= 0x7F) { + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + else if(data >= 0xC2 && data <= 0xDF) { + res->flag = 1; + res->result = data - 0xC0; + } + else if(data >= 0xE0 && data <= 0xEF) { + if(data == 0xE0) { + res->first = 0xA0; + } + else if(data == 0xED){ + res->second = 0x9F; + } + + res->flag = 2; + res->result = data - 0xE0; + } + else if(data >= 0xF0 && data <= 0xF4) { + if(data == 0xF0) { + res->first = 0x90; + } + else if(data == 0xF4){ + res->second = 0x8F; + } + + res->flag = 2; + res->result = data - 0xF0; + } + else + return MyHTML_ENCODING_STATUS_ERROR; + + res->result = res->result << (6 * res->flag); + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + if(data < res->first && data > res->second) + { + res->result = 0x00; + res->flag = 0x00; + res->third = 0x00; + res->first = 0x80; + res->second = 0xBF; + + return MyHTML_ENCODING_STATUS_DONE|MyHTML_ENCODING_STATUS_ERROR; + } + + res->first = 0x80; + res->second = 0xBF; + + res->third++; + res->result += (unsigned long)(data - 0x80) << (6 * (res->flag - res->third)); + + if(res->third != res->flag) + return MyHTML_ENCODING_STATUS_CONTINUE; + + res->flag = 0x00; + res->third = 0x00; + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_ibm866(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_ibm866[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_2(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_2[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_3(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_3[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_4(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_4[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_5(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_5[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_6(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_6[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_7(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_7[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_8[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8_i(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_8[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_10(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_10[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_13(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_13[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_14(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_14[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_15(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_15[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_16(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_iso_8859_16[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_koi8_r(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_koi8_r[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_koi8_u(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_koi8_u[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_macintosh(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_macintosh[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_874(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_874[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1250(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1250[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1251(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1251[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1252(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1252[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1253(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1253[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1254(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1254[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1255(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1255[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1256(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1256[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1257(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1257[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_windows_1258(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_windows_1258[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_x_mac_cyrillic(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myhtml_encoding_map_x_mac_cyrillic[(data - 0x80)]); + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_gbk(unsigned const char data, myhtml_encoding_result_t *res) +{ + return myhtml_encoding_decode_gb18030(data, res); +} + +unsigned long myhtml_encoding_index_gb18030_ranges_code_point(unsigned long pointer) +{ + // step 1 + if((pointer > 39419 && pointer < 189000) || pointer > 1237575) + return 0; + + // step 2 + if(pointer == 7457) + return 0xe7c7; + + // step 3 + unsigned long offset = sizeof(myhtml_encoding_map_gb18030_ranges) / sizeof(unsigned long); + + unsigned long code_point_offset = 0; + while (offset) { + offset--; + + if(myhtml_encoding_map_gb18030_ranges[offset][0] == pointer || + myhtml_encoding_map_gb18030_ranges[offset][0] < pointer) + { + code_point_offset = myhtml_encoding_map_gb18030_ranges[offset][1]; + break; + } + } + + // step 4 + return (code_point_offset + pointer - offset); +} + +enum myhtml_encoding_status myhtml_encoding_decode_gb18030(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(res->third) { + if(data >= 0x30 && data <= 0x39) { + res->result = myhtml_encoding_index_gb18030_ranges_code_point((((res->first - 0x81) * 10 + res->second - 0x30) * + 126 + res->third - 0x81) * 10 + data - 0x30); + } + + res->first = 0; + res->second = 0; + res->third = 0; + + if(res->result) + return MyHTML_ENCODING_STATUS_OK; + + return MyHTML_ENCODING_STATUS_ERROR; + } + else if(res->second) { + if(data >= 0x81 && data <= 0xFE) { + res->third = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + res->first = 0; + res->second = 0; + + return MyHTML_ENCODING_STATUS_ERROR; + } + else if(res->first) { + if(data >= 0x30 && data <= 0x39) { + res->second = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + unsigned long lead = res->first, pointer = 0x00; + res->first = 0x00; + + unsigned char offset; + + if(data < 0x7F) + offset = 0x40; + else + offset = 0x41; + + if((data >= 0x40 && data <= 0x7E) || + (data >= 0x80 && data <= 0xFE)) + { + pointer = (lead - 0x81) * 190 + (data - offset); + } + else { + return MyHTML_ENCODING_STATUS_ERROR; + } + + res->result = myhtml_encoding_map_gb18030[pointer]; + return MyHTML_ENCODING_STATUS_OK; + } + + if(data <= 0x7F) { + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + + if(data == 0x80) { + res->result = 0x20ac; + return MyHTML_ENCODING_STATUS_OK; + } + + if(data >= 0x81 && data <= 0xFE) { + res->first = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + return MyHTML_ENCODING_STATUS_ERROR; +} + +enum myhtml_encoding_status myhtml_encoding_decode_big5(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(res->first) + { + unsigned long lead = res->first; + unsigned long pointer = 0x00; + unsigned long offset; + + res->first = 0x00; + + if(data < 0x7F) + offset = 0x40; + else + offset = 0x62; + + if((data >= 0x40 && data <= 0x7E) || + (data >= 0xA1 && data <= 0xFE)) + { + pointer = (lead - 0x81) * 157 + (data - offset); + } + + switch (pointer) { + case 1133: + // U+00CA U+0304 + res->result = 0x00ca; + res->result_aux = 0x0304; + return MyHTML_ENCODING_STATUS_OK; + case 1135: + // U+00CA U+030C + res->result = 0x00ca; + res->result_aux = 0x030c; + return MyHTML_ENCODING_STATUS_OK; + case 1164: + // U+00EA U+0304 + res->result = 0x00ea; + res->result_aux = 0x0304; + return MyHTML_ENCODING_STATUS_OK; + case 1166: + // U+00EA U+030C + res->result = 0x00ea; + res->result_aux = 0x030c; + return MyHTML_ENCODING_STATUS_OK; + default: + break; + } + + if(pointer == 0) + return MyHTML_ENCODING_STATUS_ERROR; + + res->result = myhtml_encoding_map_big5[pointer]; + res->result_aux = 0; + + return MyHTML_ENCODING_STATUS_OK; + } + + if(data <= 0x7F) { + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + + if(data >= 0x81 && data <= 0xFE) { + res->first = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + return MyHTML_ENCODING_STATUS_ERROR; +} + +enum myhtml_encoding_status myhtml_encoding_decode_euc_jp(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(res->first == 0x8E && (data >= 0xA1 && data <= 0xDF)) { + res->first = 0x00; + res->result = 0xFF61 + data - 0xA1; + + return MyHTML_ENCODING_STATUS_OK; + } + else if(res->first == 0x8F && (data >= 0xA1 && data <= 0xFE)) { + res->flag = 1; + res->first = data; + + return MyHTML_ENCODING_STATUS_CONTINUE; + } + else if(res->first) + { + unsigned long lead = res->first; + res->first = 0x00; + + if((lead >= 0xA1 && lead <= 0xFE) && + (data >= 0xA1 && data <= 0xFE)) + { + unsigned long idx = (lead - 0xA1) * 94 + data - 0xA1; + if(res->flag) { + res->result = myhtml_encoding_map_jis0212[idx]; + } + else { + res->result = myhtml_encoding_map_jis0208[idx]; + } + + res->flag = 0; + + if(res->result == 0) + return MyHTML_ENCODING_STATUS_ERROR; + + return MyHTML_ENCODING_STATUS_OK; + } + } + + if(data <= 0x7F) { + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + + if((data >= 0x8E && data <= 0x8F) || + (data >= 0xA1 && data <= 0xFE)) + { + res->first = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + return MyHTML_ENCODING_STATUS_ERROR; +} + +enum myhtml_encoding_status myhtml_encoding_decode_iso_2022_jp(unsigned const char data, myhtml_encoding_result_t *res) +{ + // res->first -- lead + // res->second -- state + // res->third -- output state + // res->flag -- output flag + + switch (res->second) { + case 0: // ASCII + { + if(data == 0x1B) { + res->second = 6; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + else if((data <= 0x7F) && + data != 0x0E && data != 0x0F && data != 0x1B) + { + res->flag = 0; + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + + res->flag = 0; + return MyHTML_ENCODING_STATUS_ERROR; + } + + case 1: // Roman + { + if(data == 0x1B) { + res->second = 6; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + else if(data == 0x5C) { + res->flag = 0; + res->result = 0x00A5; + return MyHTML_ENCODING_STATUS_OK; + } + else if(data == 0x7E) { + res->flag = 0; + res->result = 0x203E; + return MyHTML_ENCODING_STATUS_OK; + } + else if((data <= 0x7F) && + data != 0x0E && data != 0x0F && + data != 0x1B && data != 0x5C && + data != 0x7E) + { + res->flag = 0; + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + + res->flag = 0; + return MyHTML_ENCODING_STATUS_ERROR; + } + + case 3: // Katakana + { + if(data == 0x1B) { + res->second = 6; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + else if(data >= 0x21 && data <= 0x5F) { + res->flag = 0; + res->result = 0xFF61 + data - 0x21; + + return MyHTML_ENCODING_STATUS_OK; + } + + res->flag = 0; + return MyHTML_ENCODING_STATUS_ERROR; + } + + case 4: // Lead byte + { + if(data == 0x1B) { + res->second = 6; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + else if(data >= 0x21 && data <= 0x7E) { + res->flag = 0; + res->first = data; + res->second = 5; + + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + res->flag = 0; + return MyHTML_ENCODING_STATUS_ERROR; + } + + case 5: // Trail byte + { + if(data == 0x1B) { + res->second = 6; + return MyHTML_ENCODING_STATUS_CONTINUE|MyHTML_ENCODING_STATUS_ERROR; + } + else if(data >= 0x21 && data <= 0x7E) { + res->second = 4; + + unsigned long pointer = (res->first - 0x21) * 94 + data - 0x21; + res->result = myhtml_encoding_map_jis0208[pointer]; + + if(res->result == 0) + return MyHTML_ENCODING_STATUS_ERROR; + + return MyHTML_ENCODING_STATUS_OK; + } + + res->second = 4; + return MyHTML_ENCODING_STATUS_ERROR; + } + + case 6: // Escape start + { + if(data == 0x24 || data == 0x28) { + res->first = data; + res->second = 7; + + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + res->flag = 0; + res->second = res->third; + + return MyHTML_ENCODING_STATUS_ERROR; + } + + case 7: // Escape + { + unsigned long lead = res->first; + res->first = 0x00; + + res->second = 0x00; + + if(lead == 0x28 && data == 0x42) { + res->second = 0; + } + else if(lead == 0x28 && data == 0x4A) { + res->second = 1; + } + else if(lead == 0x28 && data == 0x49) { + res->second = 2; + } + else if(lead == 0x24 && (data == 0x40 || data == 0x42)) { + res->second = 4; + } + + if(res->second) + { + res->third = res->second; + + unsigned long output_flag = res->flag; + res->flag = 1; + + if(output_flag) + return MyHTML_ENCODING_STATUS_ERROR; + + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + res->flag = 0; + res->second = res->third; + + return MyHTML_ENCODING_STATUS_ERROR; + } + + default: + break; + } + + return 0; +} + +enum myhtml_encoding_status myhtml_encoding_decode_shift_jis(unsigned const char data, myhtml_encoding_result_t *res) +{ + // res->first -- lead + + if(res->first) + { + unsigned long offset; + unsigned long lead_offset; + + if(data < 0x7F) + offset = 0x40; + else + offset = 0x41; + + if(res->first < 0xA0) + lead_offset = 0x81; + else + lead_offset = 0xC1; + + unsigned long pointer = 0x00; + if((data >= 0x40 && data <= 0x7E) || + (data >= 0x80 && data <= 0xFC)) + { + pointer = (res->first - lead_offset) * 188 + data - offset; + } + + if(pointer) + res->result = myhtml_encoding_map_jis0208[pointer]; + else + res->result = 0x00; + + if(res->result == 0x00 && (pointer >= 8836 && pointer <= 10528)) { + res->result = 0xE000 + pointer - 8836; + } + + if(res->result) + return MyHTML_ENCODING_STATUS_OK; + + return MyHTML_ENCODING_STATUS_ERROR; + } + + if((data <= 0x7F) || data == 0x80) { + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + + if(data >= 0xA1 && data <= 0xDF) { + res->result = 0xFF61 + data - 0xA1; + return MyHTML_ENCODING_STATUS_OK; + } + + if((data >= 0x81 && data <= 0x9F) || + (data >= 0xE0 && data <= 0xFC)) { + res->first = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + return MyHTML_ENCODING_STATUS_ERROR; +} + +enum myhtml_encoding_status myhtml_encoding_decode_euc_kr(unsigned const char data, myhtml_encoding_result_t *res) +{ + // res->first -- lead + + if(res->first) + { + unsigned long lead = res->first, pointer = 0x00; + res->first = 0x00; + + if(data >= 0x41 && data <= 0xFE) { + pointer = (lead - 0x81) * 190 + (data - 0x41); + } + + if(pointer) + res->result = myhtml_encoding_map_euc_kr[pointer]; + + if(res->result) + return MyHTML_ENCODING_STATUS_OK; + + return MyHTML_ENCODING_STATUS_ERROR; + } + + if(data <= 0x7F) { + res->result = data; + return MyHTML_ENCODING_STATUS_OK; + } + + if(data >= 0x81 && data <= 0xFE) { + res->first = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + return MyHTML_ENCODING_STATUS_ERROR; +} + +enum myhtml_encoding_status myhtml_encoding_decode_shared_utf_16(unsigned const char data, myhtml_encoding_result_t *res) +{ + // res->first -- lead + // res->second -- lead surrogate + // res->flag -- flag + + if(res->first == 0x00) { + res->first = data; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + unsigned long code_unit; + if(res->flag) + (code_unit = (res->first << 8) + data); + else + (code_unit = (unsigned long)(data << 8) + res->first); + + res->first = 0x00; + + if(res->second) { + unsigned long lead_surrogate = res->second; + res->second = 0x00; + + if(code_unit >= 0xDC00 && code_unit <= 0xDFFF) { + res->result = 0x10000 + ((lead_surrogate - 0xD800) << 10) + (code_unit - 0xDC00); + return MyHTML_ENCODING_STATUS_OK; + } + + unsigned char byte1 = (unsigned char)(code_unit >> 8); + unsigned char byte2 = (unsigned char)(code_unit & 0x00FF); + + if(res->flag) { + res->result = byte1; + res->result_aux = byte2; + } + else { + res->result = byte2; + res->result_aux = byte1; + } + + return MyHTML_ENCODING_STATUS_DONE|MyHTML_ENCODING_STATUS_ERROR; + } + + if(code_unit >= 0xD800 && code_unit <= 0xDBFF) { + res->second = code_unit; + return MyHTML_ENCODING_STATUS_CONTINUE; + } + + if(code_unit >= 0xDC00 && code_unit <= 0xDFFF) { + return MyHTML_ENCODING_STATUS_ERROR; + } + + res->result = code_unit; + + return MyHTML_ENCODING_STATUS_OK; +} + +enum myhtml_encoding_status myhtml_encoding_decode_utf_16be(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(res->flag == 0) + res->flag = 1; + + return myhtml_encoding_decode_shared_utf_16(data, res); +} + +enum myhtml_encoding_status myhtml_encoding_decode_utf_16le(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(res->flag) + res->flag = 0; + + return myhtml_encoding_decode_shared_utf_16(data, res); +} + +enum myhtml_encoding_status myhtml_encoding_decode_x_user_defined(unsigned const char data, myhtml_encoding_result_t *res) +{ + if(data <= 0x7F) + res->result = data; + else + res->result = 0xF780 + data - 0x80; + + return MyHTML_ENCODING_STATUS_OK; +} + +void myhtml_encoding_result_clean(myhtml_encoding_result_t *res) +{ + memset(res, 0, sizeof(myhtml_encoding_result_t)); +} + +size_t myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data) +{ + /* 0x80 -- 10xxxxxx */ + /* 0xC0 -- 110xxxxx */ + /* 0xE0 -- 1110xxxx */ + /* 0xF0 -- 11110xxx */ + /* 0xF8 -- 111110xx */ + /* 0xFC -- 1111110x */ + + if (codepoint <= 0x0000007F) { + /* 0xxxxxxx */ + data[0] = (char)codepoint; + return 1; + } + else if (codepoint <= 0x000007FF) { + /* 110xxxxx 10xxxxxx */ + data[0] = (char)(0xC0 | (codepoint >> 6 )); + data[1] = (char)(0x80 | (codepoint & 0x3F)); + + return 2; + } + else if (codepoint <= 0x0000FFFF) { + /* 1110xxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xE0 | ((codepoint >> 12))); + data[1] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[2] = (char)(0x80 | ( codepoint & 0x3F)); + + return 3; + } + else if (codepoint <= 0x001FFFFF) { + /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xF0 | ( codepoint >> 18)); + data[1] = (char)(0x80 | ((codepoint >> 12) & 0x3F)); + data[2] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[3] = (char)(0x80 | ( codepoint & 0x3F)); + + return 4; + } + /* not uses in unicode */ + // else if (codepoint <= 0x03FFFFFF) { + // /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xF8 | ( codepoint >> 24); + // data[1] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[4] = 0x80 | ( codepoint & 0x3F); + // + // return 5; + // } + // else if (codepoint <= 0x7FFFFFFF) { + // /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xFC | ( codepoint >> 30); + // data[1] = 0x80 | ((codepoint >> 24) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[4] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[5] = 0x80 | ( codepoint & 0x3F); + // + // return 6; + // } + + return 0; +} + +size_t myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data) +{ + /* 0x80 -- 10xxxxxx */ + /* 0xC0 -- 110xxxxx */ + /* 0xE0 -- 1110xxxx */ + /* 0xF0 -- 11110xxx */ + /* 0xF8 -- 111110xx */ + /* 0xFC -- 1111110x */ + + if (codepoint <= 0x0000007F) { + /* 0xxxxxxx */ + data[0] = (char)myhtml_string_chars_lowercase_map[ codepoint ]; + return 1; + } + else if (codepoint <= 0x000007FF) { + /* 110xxxxx 10xxxxxx */ + data[0] = (char)(0xC0 | (codepoint >> 6 )); + data[1] = (char)(0x80 | (codepoint & 0x3F)); + + return 2; + } + else if (codepoint <= 0x0000FFFF) { + /* 1110xxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xE0 | ((codepoint >> 12))); + data[1] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[2] = (char)(0x80 | ( codepoint & 0x3F)); + + return 3; + } + else if (codepoint <= 0x001FFFFF) { + /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xF0 | ( codepoint >> 18)); + data[1] = (char)(0x80 | ((codepoint >> 12) & 0x3F)); + data[2] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[3] = (char)(0x80 | ( codepoint & 0x3F)); + + return 4; + } + /* not uses in unicode */ + // else if (codepoint <= 0x03FFFFFF) { + // /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xF8 | ( codepoint >> 24); + // data[1] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[4] = 0x80 | ( codepoint & 0x3F); + // + // return 5; + // } + // else if (codepoint <= 0x7FFFFFFF) { + // /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xFC | ( codepoint >> 30); + // data[1] = 0x80 | ((codepoint >> 24) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[4] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[5] = 0x80 | ( codepoint & 0x3F); + // + // return 6; + // } + + return 0; +} + +size_t myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data) +{ + if((codepoint >> 16)) { + codepoint -= 0x10000; + + size_t high = 0xD800 | (codepoint >> 10); + size_t low = 0xDC00 | (codepoint & 0x3FF); + + data[0] = (char)(high >> 8); + data[1] = (char)high; + data[2] = (char)(low >> 8); + data[3] = (char)low; + + return 4; + } + + data[0] = (char)(codepoint >> 8); + data[1] = (char)codepoint; + + return 2; +} + + + + diff --git a/source/myhtml/encoding.h b/source/myhtml/encoding.h new file mode 100644 index 0000000..f376aae --- /dev/null +++ b/source/myhtml/encoding.h @@ -0,0 +1,146 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_ENCODING_H +#define MyHTML_ENCODING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/utils.h" + +enum myhtml_encoding_status { + MyHTML_ENCODING_STATUS_OK = 0x00, + MyHTML_ENCODING_STATUS_ERROR = 0x01, + MyHTML_ENCODING_STATUS_CONTINUE = 0x02, + MyHTML_ENCODING_STATUS_DONE = 0x04 +} +typedef myhtml_encoding_status_t; + +struct myhtml_encoding_result { + unsigned long first; + unsigned long second; + unsigned long third; + unsigned long result; + unsigned long result_aux; + unsigned long flag; +} +typedef myhtml_encoding_result_t; + +struct myhtml_encoding_trigram { + const unsigned char trigram[3]; + size_t value; +} +typedef myhtml_encoding_trigram_t; + +struct myhtml_encoding_trigram_result { + size_t count; + size_t value; +} +typedef myhtml_encoding_trigram_result_t; + +struct myhtml_encoding_unicode_result { + size_t count_ascii; + size_t count_good; + size_t count_bad; +} +typedef myhtml_encoding_unicode_result_t; + +struct myhtml_encoding_detect_name_entry { + const char* name; + size_t name_length; + const char* label; + size_t label_length; + + myhtml_encoding_t encoding; + + size_t next; + size_t curr; +} +typedef myhtml_encoding_detect_name_entry_t; + +typedef myhtml_encoding_status_t (*myhtml_encoding_custom_f)(unsigned const char data, myhtml_encoding_result_t *res); + +myhtml_encoding_custom_f myhtml_encoding_get_function_by_id(myhtml_encoding_t idx); + +enum myhtml_encoding_status myhtml_encoding_decode_utf_8(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_ibm866(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_2(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_3(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_4(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_5(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_6(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_7(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8_i(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_10(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_13(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_14(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_15(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_16(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_koi8_r(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_koi8_u(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_macintosh(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_874(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1250(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1251(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1252(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1253(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1254(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1255(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1256(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1257(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_windows_1258(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_x_mac_cyrillic(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_gbk(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_gb18030(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_big5(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_euc_jp(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_iso_2022_jp(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_shift_jis(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_euc_kr(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_shared_utf_16(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_utf_16be(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_utf_16le(unsigned const char data, myhtml_encoding_result_t *res); +enum myhtml_encoding_status myhtml_encoding_decode_x_user_defined(unsigned const char data, myhtml_encoding_result_t *res); + +size_t myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); +size_t myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data); +size_t myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); + +void myhtml_encoding_result_clean(myhtml_encoding_result_t *res); + +bool myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); +bool myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, const char **new_text, size_t *new_size); + +const myhtml_encoding_detect_name_entry_t * myhtml_encoding_name_entry_by_name(const char* name, size_t length); +bool myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* encoding_h */ diff --git a/source/myhtml/encoding_detect.c b/source/myhtml/encoding_detect.c new file mode 100644 index 0000000..adceabd --- /dev/null +++ b/source/myhtml/encoding_detect.c @@ -0,0 +1,385 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/encoding.h" +#include "myhtml/encoding_detect_resource.h" +#include "myhtml/utils/resources.h" + +myhtml_encoding_trigram_result_t myhtml_encoding_detect_by_trigram(unsigned const char *u_text, size_t length, + const myhtml_encoding_trigram_t *list, size_t list_length, + size_t max_sum_for_break) +{ + myhtml_encoding_trigram_result_t res = {0, 0}; + + for (size_t i = 0; i < (length - 3); i++) { + if(u_text[i] > 127) + { + for (size_t j = 0; j < list_length; j++) + { + if(memcmp(list[j].trigram, &u_text[i], 3) == 0) { + res.value += list[j].value; + res.count++; + + if(res.value >= max_sum_for_break) + i = length; + + break; + } + } + } + } + + return res; +} + +bool myhtml_encoding_detect_russian_has_end(myhtml_encoding_trigram_result_t *res, size_t min_count, size_t min_value) +{ + if(res->value >= min_value || res->count >= min_count) + return true; + + return false; +} + +bool myhtml_encoding_detect_unicode_has_end(myhtml_encoding_unicode_result_t *res, size_t max_bad_percent) +{ + if(res->count_good == 0) { + if(res->count_bad) + return false; + + return true; + } + else if(res->count_bad == 0) + return true; + + size_t percent_bad = (res->count_bad * 100) / res->count_good; + if(percent_bad < max_bad_percent) + return true; + + return false; +} + +myhtml_encoding_unicode_result_t myhtml_encoding_detect_utf_8(unsigned const char *u_text, size_t length) +{ + size_t i = 0; + myhtml_encoding_unicode_result_t res = {0, 0, 0}; + + while(i < length) + { + if((u_text[i] & 0x80) == 0x00) { + i++; + res.count_ascii++; + } + else if((u_text[i] & 0xE0) == 0xC0) { + i += 2; + + if(i >= length) + break; + + if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0)) + res.count_good++; + else + res.count_bad++; + } + else if((u_text[i] & 0xF0) == 0xE0) { + i += 3; + + if(i >= length) + break; + + if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0) && + ((u_text[i - 2] & 0x80) && (u_text[i - 2] & 0x40) == 0)) { + res.count_good++; + } + else + res.count_bad++; + } + else if((u_text[i] & 0xF8) == 0xF0) { + i += 4; + + if(i >= length) + break; + + if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0) && + ((u_text[i - 2] & 0x80) && (u_text[i - 2] & 0x40) == 0) && + ((u_text[i - 3] & 0x80) && (u_text[i - 3] & 0x40) == 0)) { + res.count_good++; + } + else + res.count_bad++; + } + else { + i++; + res.count_bad++; + } + } + + return res; +} + +myhtml_encoding_unicode_result_t myhtml_encoding_detect_utf_16(unsigned const char *u_text, size_t length) +{ + size_t i = 0; + myhtml_encoding_unicode_result_t res = {0, 0, 0}; + + while(i < length) + { + if(u_text[i] == 0x00) { + if((i % 2) == 0) { + i++; + + if(u_text[i] > 0x1F && u_text[i] < 0x7F) + res.count_bad++; + } + else { + if(u_text[(i - 1)] > 0x1F && u_text[(i - 1)] < 0x7F) + res.count_good++; + + i++; + } + } + else + i++; + } + + return res; +} + +bool myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding) +{ + unsigned const char *u_text = (unsigned const char*)text; + + if(length > 2) { + if(u_text[0] == 0xEF && + u_text[1] == 0xBB && + u_text[2] == 0xBF) + { + *encoding = MyHTML_ENCODING_UTF_8; + return true; + } + } + + if(length > 1) { + if(u_text[0] == 0xFE && u_text[1] == 0xFF) { + *encoding = MyHTML_ENCODING_UTF_16BE; + return true; + } + + if(u_text[0] == 0xFF && u_text[1] == 0xFE) { + *encoding = MyHTML_ENCODING_UTF_16LE; + return true; + } + } + +// //for UTF-32 +// if(length > 3) { +// if(u_text[0] == 0x00 && +// u_text[1] == 0x00 && +// u_text[2] == 0xFE && +// u_text[3] == 0xFF) +// { +// *encoding = MyHTML_ENCODING_UTF_32BE; +// return true; +// } +// +// if(u_text[0] == 0xFF && +// u_text[1] == 0xFE && +// u_text[2] == 0x00 && +// u_text[3] == 0x00) +// { +// *encoding = MyHTML_ENCODING_UTF_32LE; +// return true; +// } +// } + + return false; +} + +bool myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, const char **new_text, size_t *new_size) +{ + if(myhtml_encoding_detect_bom(text, length, encoding)) + { + if(*encoding == MyHTML_ENCODING_UTF_8) { + *new_text = &text[3]; + *new_size = length - 3; + } + else { + *new_text = &text[2]; + *new_size = length - 2; + } + + return true; + } + + return false; +} + +bool myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding) +{ + unsigned const char *u_text = (unsigned const char*)text; + *encoding = MyHTML_ENCODING_DEFAULT; + + myhtml_encoding_unicode_result_t res = myhtml_encoding_detect_utf_16(u_text, length); + + if(res.count_bad == 0 && res.count_good >= 3) { + *encoding = MyHTML_ENCODING_UTF_16LE; + return true; + } + else if(res.count_bad >= 3 && res.count_good == 0) { + *encoding = MyHTML_ENCODING_UTF_16BE; + return true; + } + + res = myhtml_encoding_detect_utf_8(u_text, length); + if(myhtml_encoding_detect_unicode_has_end(&res, 10)) { + *encoding = MyHTML_ENCODING_UTF_8; + return true; + } + + return false; +} + +bool myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding) +{ + unsigned const char *u_text = (unsigned const char*)text; + + size_t min_count = 50; + size_t min_value = 100000; + size_t max_value = 0; + + *encoding = MyHTML_ENCODING_DEFAULT; + + myhtml_encoding_trigram_result_t + res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_windows_1251, 1000, min_value); + if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyHTML_ENCODING_WINDOWS_1251; + return true; + } + + max_value = res.value; + if(max_value) { + *encoding = MyHTML_ENCODING_WINDOWS_1251; + } + + res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_koi8_r, 1000, min_value); + if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyHTML_ENCODING_KOI8_R; + return true; + } + + if(max_value < res.value) { + *encoding = MyHTML_ENCODING_KOI8_R; + max_value = res.value; + } + + res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_iso_8859_5, 1000, min_value); + if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyHTML_ENCODING_ISO_8859_5; + return true; + } + + if(max_value < res.value) { + *encoding = MyHTML_ENCODING_ISO_8859_5; + max_value = res.value; + } + + res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_x_mac_cyrillic, 1000, min_value); + if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyHTML_ENCODING_X_MAC_CYRILLIC; + return true; + } + + if(max_value < res.value) { + *encoding = MyHTML_ENCODING_X_MAC_CYRILLIC; + max_value = res.value; + } + + res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_ibm866, 1000, min_value); + if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyHTML_ENCODING_IBM866; + return true; + } + + if(max_value < res.value) { + *encoding = MyHTML_ENCODING_IBM866; + } + + return false; +} + +bool myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding) +{ + *encoding = MyHTML_ENCODING_DEFAULT; + + if(myhtml_encoding_detect_unicode(text, length, encoding)) + return true; + + if(myhtml_encoding_detect_russian(text, length, encoding)) + return true; + + return false; +} + +const myhtml_encoding_detect_name_entry_t * myhtml_encoding_name_entry_by_name(const char* name, size_t length) +{ + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyHTML_ENCODING_DETECT_NAME_STATIC_SIZE) + 1; + + while (myhtml_encoding_detect_name_entry_static_list_index[idx].label) + { + if(myhtml_encoding_detect_name_entry_static_list_index[idx].label_length == length) { + if(myhtml_strncasecmp(myhtml_encoding_detect_name_entry_static_list_index[idx].label, name, length) == 0) + return &myhtml_encoding_detect_name_entry_static_list_index[idx]; + + if(myhtml_encoding_detect_name_entry_static_list_index[idx].next) + idx = myhtml_encoding_detect_name_entry_static_list_index[idx].next; + else + return NULL; + } + else if(myhtml_encoding_detect_name_entry_static_list_index[idx].label_length > length) { + return NULL; + } + else { + idx = myhtml_encoding_detect_name_entry_static_list_index[idx].next; + } + } + + return NULL; +} + +bool myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding) +{ + const myhtml_encoding_detect_name_entry_t *entry = myhtml_encoding_name_entry_by_name(name, length); + + if(entry) { + if(encoding) + *encoding = entry->encoding; + + return true; + } + + return false; +} + + + + + diff --git a/source/myhtml/encoding_detect_resource.h b/source/myhtml/encoding_detect_resource.h new file mode 100644 index 0000000..a30b6ba --- /dev/null +++ b/source/myhtml/encoding_detect_resource.h @@ -0,0 +1,5580 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_ENCODING_DETECT_RESOURCE_H +#define MyHTML_ENCODING_DETECT_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define MyHTML_ENCODING_DETECT_NAME_STATIC_SIZE 419 + +#include "myhtml/encoding.h" + +static const myhtml_encoding_detect_name_entry_t myhtml_encoding_detect_name_entry_static_list_index[] = +{ + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "x-cp1257", 8, MyHTML_ENCODING_WINDOWS_1257, 0, 7}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-874", 11, "tis-620", 7, MyHTML_ENCODING_WINDOWS_874, 0, 10}, + {"iso-8859-3", 10, "iso8859-3", 9, MyHTML_ENCODING_ISO_8859_3, 420, 11}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "ms932", 5, MyHTML_ENCODING_SHIFT_JIS, 0, 16}, + {"windows-1256", 12, "windows-1256", 12, MyHTML_ENCODING_WINDOWS_1256, 421, 17}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "csisolatincyrillic", 18, MyHTML_ENCODING_ISO_8859_5, 422, 20}, + {"windows-1250", 12, "cp1250", 6, MyHTML_ENCODING_WINDOWS_1250, 423, 21}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "shift-jis", 9, MyHTML_ENCODING_SHIFT_JIS, 424, 30}, + {"ibm866", 6, "csibm866", 8, MyHTML_ENCODING_IBM866, 425, 31}, + {"euc-kr", 6, "windows-949", 11, MyHTML_ENCODING_EUC_KR, 0, 32}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-2022-jp", 11, "csiso2022jp", 11, MyHTML_ENCODING_ISO_2022_JP, 0, 40}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "iso-8859-15", 11, MyHTML_ENCODING_ISO_8859_15, 426, 42}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ksc_5601", 8, MyHTML_ENCODING_EUC_KR, 0, 45}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "csiso58gb231280", 15, MyHTML_ENCODING_GBK, 0, 51}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "cyrillic", 8, MyHTML_ENCODING_ISO_8859_5, 0, 56}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "cp1255", 6, MyHTML_ENCODING_WINDOWS_1255, 427, 58}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "x-cp1254", 8, MyHTML_ENCODING_WINDOWS_1254, 0, 60}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "csisolatin9", 11, MyHTML_ENCODING_ISO_8859_15, 0, 62}, + {"koi8-u", 6, "koi8-ru", 7, MyHTML_ENCODING_KOI8_U, 0, 63}, + {"iso-8859-4", 10, "csisolatin4", 11, MyHTML_ENCODING_ISO_8859_4, 0, 64}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "windows-31j", 11, MyHTML_ENCODING_SHIFT_JIS, 0, 66}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "utf-8", 5, MyHTML_ENCODING_UTF_8, 0, 79}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"ibm866", 6, "ibm866", 6, MyHTML_ENCODING_IBM866, 0, 82}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi8", 4, MyHTML_ENCODING_KOI8_R, 0, 86}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "hebrew", 6, MyHTML_ENCODING_ISO_8859_8, 428, 94}, + {"iso-8859-7", 10, "csisolatingreek", 15, MyHTML_ENCODING_ISO_8859_7, 0, 95}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "iso88591", 8, MyHTML_ENCODING_WINDOWS_1252, 0, 99}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso88592", 8, MyHTML_ENCODING_ISO_8859_2, 0, 101}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "iso88593", 8, MyHTML_ENCODING_ISO_8859_3, 0, 103}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso88594", 8, MyHTML_ENCODING_ISO_8859_4, 0, 105}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "iso88595", 8, MyHTML_ENCODING_ISO_8859_5, 430, 107}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso88596", 8, MyHTML_ENCODING_ISO_8859_6, 431, 109}, + {"windows-1252", 12, "l1", 2, MyHTML_ENCODING_WINDOWS_1252, 432, 110}, + {"iso-8859-6", 10, "csisolatinarabic", 16, MyHTML_ENCODING_ISO_8859_6, 433, 111}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "iso88598", 8, MyHTML_ENCODING_ISO_8859_8, 435, 113}, + {"koi8-u", 6, "koi8-u", 6, MyHTML_ENCODING_KOI8_U, 0, 114}, + {"windows-1254", 12, "iso88599", 8, MyHTML_ENCODING_WINDOWS_1254, 0, 115}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "ecma-114", 8, MyHTML_ENCODING_ISO_8859_6, 0, 117}, + {"iso-8859-4", 10, "iso8859-4", 9, MyHTML_ENCODING_ISO_8859_4, 436, 118}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso-ir-110", 10, MyHTML_ENCODING_ISO_8859_4, 437, 121}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "l3", 2, MyHTML_ENCODING_ISO_8859_3, 0, 123}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso-8859-2", 10, MyHTML_ENCODING_ISO_8859_2, 439, 126}, + {"iso-8859-8", 10, "iso8859-8", 9, MyHTML_ENCODING_ISO_8859_8, 440, 127}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1258", 12, "x-cp1258", 8, MyHTML_ENCODING_WINDOWS_1258, 0, 129}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso-8859-4", 10, MyHTML_ENCODING_ISO_8859_4, 443, 131}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "iso-8859-10", 11, MyHTML_ENCODING_ISO_8859_10, 0, 133}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso-8859-6", 10, MyHTML_ENCODING_ISO_8859_6, 446, 136}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "latin2", 6, MyHTML_ENCODING_ISO_8859_2, 0, 138}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "iso-8859-8", 10, MyHTML_ENCODING_ISO_8859_8, 449, 141}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "cp819", 5, MyHTML_ENCODING_WINDOWS_1252, 0, 143}, + {"iso-8859-14", 11, "iso-8859-14", 11, MyHTML_ENCODING_ISO_8859_14, 0, 144}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "csisolatin6", 11, MyHTML_ENCODING_ISO_8859_10, 0, 147}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "csisolatin1", 11, MyHTML_ENCODING_WINDOWS_1252, 0, 149}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "l9", 2, MyHTML_ENCODING_ISO_8859_15, 0, 162}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1258", 12, "cp1258", 6, MyHTML_ENCODING_WINDOWS_1258, 0, 164}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "windows-1252", 12, MyHTML_ENCODING_WINDOWS_1252, 0, 171}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "sun_eu_greek", 12, MyHTML_ENCODING_ISO_8859_7, 0, 173}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "cseucpkdfmtjapanese", 19, MyHTML_ENCODING_EUC_JP, 0, 175}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "latin4", 6, MyHTML_ENCODING_ISO_8859_4, 0, 177}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "x-cp1255", 8, MyHTML_ENCODING_WINDOWS_1255, 452, 182}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi", 3, MyHTML_ENCODING_KOI8_R, 0, 186}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "windows-1257", 12, MyHTML_ENCODING_WINDOWS_1257, 0, 188}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-874", 11, "windows-874", 11, MyHTML_ENCODING_WINDOWS_874, 0, 191}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1251", 12, "cp1251", 6, MyHTML_ENCODING_WINDOWS_1251, 0, 196}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-16le", 8, "utf-16", 6, MyHTML_ENCODING_UTF_16LE, 0, 199}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "visual", 6, MyHTML_ENCODING_ISO_8859_8, 0, 207}, + {"macintosh", 9, "macintosh", 9, MyHTML_ENCODING_MACINTOSH, 0, 208}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "ansi_x3.4-1968", 14, MyHTML_ENCODING_WINDOWS_1252, 0, 210}, + {"iso-8859-3", 10, "iso_8859-3:1988", 15, MyHTML_ENCODING_ISO_8859_3, 453, 211}, + {"iso-8859-6", 10, "csiso88596e", 11, MyHTML_ENCODING_ISO_8859_6, 456, 212}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "csgb2312", 8, MyHTML_ENCODING_GBK, 0, 215}, + {"iso-8859-6", 10, "arabic", 6, MyHTML_ENCODING_ISO_8859_6, 457, 216}, + {"iso-8859-7", 10, "greek", 5, MyHTML_ENCODING_ISO_8859_7, 0, 217}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "ms_kanji", 8, MyHTML_ENCODING_SHIFT_JIS, 0, 219}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "iso8859-5", 9, MyHTML_ENCODING_ISO_8859_5, 460, 225}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"macintosh", 9, "x-mac-roman", 11, MyHTML_ENCODING_MACINTOSH, 461, 227}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "korean", 6, MyHTML_ENCODING_EUC_KR, 0, 229}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "utf8", 4, MyHTML_ENCODING_UTF_8, 462, 231}, + {"iso-8859-3", 10, "csisolatin3", 11, MyHTML_ENCODING_ISO_8859_3, 0, 232}, + {"windows-1256", 12, "cp1256", 6, MyHTML_ENCODING_WINDOWS_1256, 464, 233}, + {"windows-1254", 12, "iso8859-9", 9, MyHTML_ENCODING_WINDOWS_1254, 0, 234}, + {"windows-1252", 12, "us-ascii", 8, MyHTML_ENCODING_WINDOWS_1252, 465, 235}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-13", 11, "iso-8859-13", 11, MyHTML_ENCODING_ISO_8859_13, 466, 246}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1250", 12, "windows-1250", 12, MyHTML_ENCODING_WINDOWS_1250, 0, 248}, + {"euc-kr", 6, "ksc5601", 7, MyHTML_ENCODING_EUC_KR, 0, 249}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "greek8", 6, MyHTML_ENCODING_ISO_8859_7, 467, 251}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "x-euc-jp", 8, MyHTML_ENCODING_EUC_JP, 0, 257}, + {"shift_jis", 9, "x-sjis", 6, MyHTML_ENCODING_SHIFT_JIS, 0, 258}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-16be", 8, "utf-16be", 8, MyHTML_ENCODING_UTF_16BE, 468, 262}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "windows-1255", 12, MyHTML_ENCODING_WINDOWS_1255, 0, 265}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ks_c_5601-1987", 14, MyHTML_ENCODING_EUC_KR, 0, 267}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"ibm866", 6, "866", 3, MyHTML_ENCODING_IBM866, 0, 274}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"big5", 4, "cn-big5", 7, MyHTML_ENCODING_BIG5, 0, 277}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi8-r", 6, MyHTML_ENCODING_KOI8_R, 469, 283}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "ibm819", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 296}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "asmo-708", 8, MyHTML_ENCODING_ISO_8859_6, 0, 300}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "cp1254", 6, MyHTML_ENCODING_WINDOWS_1254, 470, 302}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso-8859-6-e", 12, MyHTML_ENCODING_ISO_8859_6, 471, 304}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-2022-jp", 11, "iso-2022-jp", 11, MyHTML_ENCODING_ISO_2022_JP, 0, 309}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso_8859-2:1987", 15, MyHTML_ENCODING_ISO_8859_2, 473, 312}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gb2312", 6, MyHTML_ENCODING_GBK, 0, 314}, + {"windows-1254", 12, "csisolatin5", 11, MyHTML_ENCODING_WINDOWS_1254, 0, 315}, + {"iso-8859-6", 10, "iso-8859-6-i", 12, MyHTML_ENCODING_ISO_8859_6, 476, 316}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso8859-2", 9, MyHTML_ENCODING_ISO_8859_2, 0, 323}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "l2", 2, MyHTML_ENCODING_ISO_8859_2, 0, 326}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "latin1", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 328}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ks_c_5601-1989", 14, MyHTML_ENCODING_EUC_KR, 0, 330}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso8859-6", 9, MyHTML_ENCODING_ISO_8859_6, 0, 332}, + {"iso-8859-2", 10, "iso-ir-101", 10, MyHTML_ENCODING_ISO_8859_2, 477, 333}, + {"ibm866", 6, "cp866", 5, MyHTML_ENCODING_IBM866, 0, 334}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "iso-8859-3", 10, MyHTML_ENCODING_ISO_8859_3, 480, 338}, + {"iso-8859-4", 10, "l4", 2, MyHTML_ENCODING_ISO_8859_4, 0, 339}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1253", 12, "windows-1253", 12, MyHTML_ENCODING_WINDOWS_1253, 0, 342}, + {"iso-8859-5", 10, "iso-8859-5", 10, MyHTML_ENCODING_ISO_8859_5, 482, 343}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso-ir-127", 10, MyHTML_ENCODING_ISO_8859_6, 484, 348}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "unicode-1-1-utf-8", 17, MyHTML_ENCODING_UTF_8, 0, 350}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "l6", 2, MyHTML_ENCODING_ISO_8859_10, 0, 352}, + {"iso-8859-3", 10, "iso-ir-109", 10, MyHTML_ENCODING_ISO_8859_3, 487, 353}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1253", 12, "x-cp1253", 8, MyHTML_ENCODING_WINDOWS_1253, 0, 357}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-16", 11, "iso-8859-16", 11, MyHTML_ENCODING_ISO_8859_16, 490, 359}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8-i", 12, "logical", 7, MyHTML_ENCODING_ISO_8859_8_I, 0, 363}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "csisolatinhebrew", 16, MyHTML_ENCODING_ISO_8859_8, 0, 366}, + {"iso-8859-3", 10, "latin3", 6, MyHTML_ENCODING_ISO_8859_3, 491, 367}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "euc-kr", 6, MyHTML_ENCODING_EUC_KR, 0, 369}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "cp1252", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 371}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "csiso88596i", 11, MyHTML_ENCODING_ISO_8859_6, 492, 378}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gbk", 3, MyHTML_ENCODING_GBK, 0, 382}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "csksc56011987", 13, MyHTML_ENCODING_EUC_KR, 0, 394}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"x-mac-cyrillic", 14, "x-mac-cyrillic", 14, MyHTML_ENCODING_X_MAC_CYRILLIC, 0, 397}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "csisolatin2", 11, MyHTML_ENCODING_ISO_8859_2, 0, 400}, + {"x-user-defined", 14, "x-user-defined", 14, MyHTML_ENCODING_X_USER_DEFINED, 0, 401}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "latin5", 6, MyHTML_ENCODING_WINDOWS_1254, 0, 406}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "cp1257", 6, MyHTML_ENCODING_WINDOWS_1257, 0, 408}, + {"big5", 4, "big5-hkscs", 10, MyHTML_ENCODING_BIG5, 0, 409}, + {"windows-1250", 12, "x-cp1250", 8, MyHTML_ENCODING_WINDOWS_1250, 0, 410}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "euc-jp", 6, MyHTML_ENCODING_EUC_JP, 0, 414}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "ecma-118", 8, MyHTML_ENCODING_ISO_8859_7, 493, 416}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gb_2312-80", 10, MyHTML_ENCODING_GBK, 0, 418}, + {"windows-1251", 12, "windows-1251", 12, MyHTML_ENCODING_WINDOWS_1251, 0, 419}, + {"iso-8859-13", 11, "iso885913", 9, MyHTML_ENCODING_ISO_8859_13, 0, 420}, + {"gbk", 3, "gb_2312", 7, MyHTML_ENCODING_GBK, 0, 421}, + {"iso-8859-7", 10, "iso8859-7", 9, MyHTML_ENCODING_ISO_8859_7, 0, 422}, + {"gbk", 3, "chinese", 7, MyHTML_ENCODING_GBK, 0, 423}, + {"shift_jis", 9, "shift_jis", 9, MyHTML_ENCODING_SHIFT_JIS, 0, 424}, + {"windows-874", 11, "iso-8859-11", 11, MyHTML_ENCODING_WINDOWS_874, 0, 425}, + {"iso-8859-15", 11, "iso_8859-15", 11, MyHTML_ENCODING_ISO_8859_15, 0, 426}, + {"big5", 4, "csbig5", 6, MyHTML_ENCODING_BIG5, 0, 427}, + {"gbk", 3, "x-gbk", 5, MyHTML_ENCODING_GBK, 429, 428}, + {"windows-1254", 12, "windows-1254", 12, MyHTML_ENCODING_WINDOWS_1254, 0, 429}, + {"shift_jis", 9, "sjis", 4, MyHTML_ENCODING_SHIFT_JIS, 0, 430}, + {"iso-8859-10", 11, "iso885910", 9, MyHTML_ENCODING_ISO_8859_10, 0, 431}, + {"windows-1254", 12, "iso_8859-9:1989", 15, MyHTML_ENCODING_WINDOWS_1254, 0, 432}, + {"macintosh", 9, "mac", 3, MyHTML_ENCODING_MACINTOSH, 434, 433}, + {"iso-8859-7", 10, "iso88597", 8, MyHTML_ENCODING_ISO_8859_7, 0, 434}, + {"windows-1251", 12, "x-cp1251", 8, MyHTML_ENCODING_WINDOWS_1251, 0, 435}, + {"iso-8859-14", 11, "iso885914", 9, MyHTML_ENCODING_ISO_8859_14, 0, 436}, + {"iso-8859-10", 11, "iso8859-10", 10, MyHTML_ENCODING_ISO_8859_10, 438, 437}, + {"windows-1252", 12, "iso-ir-100", 10, MyHTML_ENCODING_WINDOWS_1252, 0, 438}, + {"iso-8859-2", 10, "iso_8859-2", 10, MyHTML_ENCODING_ISO_8859_2, 0, 439}, + {"windows-1253", 12, "cp1253", 6, MyHTML_ENCODING_WINDOWS_1253, 441, 440}, + {"gbk", 3, "iso-ir-58", 9, MyHTML_ENCODING_GBK, 442, 441}, + {"macintosh", 9, "csmacintosh", 11, MyHTML_ENCODING_MACINTOSH, 0, 442}, + {"iso-8859-4", 10, "iso_8859-4", 10, MyHTML_ENCODING_ISO_8859_4, 444, 443}, + {"iso-8859-5", 10, "iso-ir-144", 10, MyHTML_ENCODING_ISO_8859_5, 445, 444}, + {"iso-8859-14", 11, "iso8859-14", 10, MyHTML_ENCODING_ISO_8859_14, 0, 445}, + {"windows-1254", 12, "l5", 2, MyHTML_ENCODING_WINDOWS_1254, 447, 446}, + {"iso-8859-6", 10, "iso_8859-6", 10, MyHTML_ENCODING_ISO_8859_6, 448, 447}, + {"iso-8859-7", 10, "iso-ir-126", 10, MyHTML_ENCODING_ISO_8859_7, 0, 448}, + {"iso-8859-8", 10, "iso-ir-138", 10, MyHTML_ENCODING_ISO_8859_8, 450, 449}, + {"iso-8859-8", 10, "iso_8859-8", 10, MyHTML_ENCODING_ISO_8859_8, 451, 450}, + {"windows-1254", 12, "iso-ir-148", 10, MyHTML_ENCODING_WINDOWS_1254, 0, 451}, + {"big5", 4, "x-x-big5", 8, MyHTML_ENCODING_BIG5, 0, 452}, + {"iso-8859-4", 10, "iso_8859-4:1988", 15, MyHTML_ENCODING_ISO_8859_4, 454, 453}, + {"iso-8859-5", 10, "iso_8859-5:1988", 15, MyHTML_ENCODING_ISO_8859_5, 455, 454}, + {"iso-8859-8", 10, "iso_8859-8:1988", 15, MyHTML_ENCODING_ISO_8859_8, 0, 455}, + {"iso-8859-8", 10, "csiso88598e", 11, MyHTML_ENCODING_ISO_8859_8, 0, 456}, + {"iso-8859-10", 11, "latin6", 6, MyHTML_ENCODING_ISO_8859_10, 458, 457}, + {"windows-874", 11, "iso885911", 9, MyHTML_ENCODING_WINDOWS_874, 459, 458}, + {"windows-1252", 12, "iso8859-1", 9, MyHTML_ENCODING_WINDOWS_1252, 0, 459}, + {"iso-8859-15", 11, "iso885915", 9, MyHTML_ENCODING_ISO_8859_15, 0, 460}, + {"windows-1252", 12, "ascii", 5, MyHTML_ENCODING_WINDOWS_1252, 0, 461}, + {"koi8-r", 6, "cskoi8r", 7, MyHTML_ENCODING_KOI8_R, 463, 462}, + {"euc-kr", 6, "cseuckr", 7, MyHTML_ENCODING_EUC_KR, 0, 463}, + {"x-mac-cyrillic", 14, "x-mac-ukrainian", 15, MyHTML_ENCODING_X_MAC_CYRILLIC, 0, 464}, + {"windows-1252", 12, "x-cp1252", 8, MyHTML_ENCODING_WINDOWS_1252, 0, 465}, + {"big5", 4, "big5", 4, MyHTML_ENCODING_BIG5, 0, 466}, + {"gb18030", 7, "gb18030", 7, MyHTML_ENCODING_GB18030, 0, 467}, + {"utf-16le", 8, "utf-16le", 8, MyHTML_ENCODING_UTF_16LE, 0, 468}, + {"koi8-r", 6, "koi8_r", 6, MyHTML_ENCODING_KOI8_R, 0, 469}, + {"shift_jis", 9, "csshiftjis", 10, MyHTML_ENCODING_SHIFT_JIS, 0, 470}, + {"windows-1256", 12, "x-cp1256", 8, MyHTML_ENCODING_WINDOWS_1256, 472, 471}, + {"iso-8859-8", 10, "iso-8859-8-e", 12, MyHTML_ENCODING_ISO_8859_8, 0, 472}, + {"iso-8859-6", 10, "iso_8859-6:1987", 15, MyHTML_ENCODING_ISO_8859_6, 474, 473}, + {"iso-8859-7", 10, "iso_8859-7:1987", 15, MyHTML_ENCODING_ISO_8859_7, 475, 474}, + {"windows-1252", 12, "iso_8859-1:1987", 15, MyHTML_ENCODING_WINDOWS_1252, 0, 475}, + {"iso-8859-8-i", 12, "iso-8859-8-i", 12, MyHTML_ENCODING_ISO_8859_8_I, 0, 476}, + {"windows-874", 11, "iso8859-11", 10, MyHTML_ENCODING_WINDOWS_874, 478, 477}, + {"windows-1252", 12, "iso-8859-1", 10, MyHTML_ENCODING_WINDOWS_1252, 479, 478}, + {"windows-1252", 12, "iso_8859-1", 10, MyHTML_ENCODING_WINDOWS_1252, 0, 479}, + {"iso-8859-3", 10, "iso_8859-3", 10, MyHTML_ENCODING_ISO_8859_3, 481, 480}, + {"iso-8859-13", 11, "iso8859-13", 10, MyHTML_ENCODING_ISO_8859_13, 0, 481}, + {"iso-8859-5", 10, "iso_8859-5", 10, MyHTML_ENCODING_ISO_8859_5, 483, 482}, + {"iso-8859-15", 11, "iso8859-15", 10, MyHTML_ENCODING_ISO_8859_15, 0, 483}, + {"iso-8859-7", 10, "iso-8859-7", 10, MyHTML_ENCODING_ISO_8859_7, 485, 484}, + {"iso-8859-7", 10, "iso_8859-7", 10, MyHTML_ENCODING_ISO_8859_7, 486, 485}, + {"iso-8859-10", 11, "iso-ir-157", 10, MyHTML_ENCODING_ISO_8859_10, 0, 486}, + {"windows-1254", 12, "iso-8859-9", 10, MyHTML_ENCODING_WINDOWS_1254, 488, 487}, + {"windows-1254", 12, "iso_8859-9", 10, MyHTML_ENCODING_WINDOWS_1254, 489, 488}, + {"euc-kr", 6, "iso-ir-149", 10, MyHTML_ENCODING_EUC_KR, 0, 489}, + {"windows-1258", 12, "windows-1258", 12, MyHTML_ENCODING_WINDOWS_1258, 0, 490}, + {"windows-874", 11, "dos-874", 7, MyHTML_ENCODING_WINDOWS_874, 0, 491}, + {"iso-8859-8-i", 12, "csiso88598i", 11, MyHTML_ENCODING_ISO_8859_8_I, 0, 492}, + {"iso-8859-7", 10, "elot_928", 8, MyHTML_ENCODING_ISO_8859_7, 0, 493}, +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_ibm866[] = { + {{0xA5, 0xAD, 0xA8}, 991}, /* ени */ + {{0xAE, 0xA3, 0xAE}, 806}, /* ого */ + {{0xE1, 0xE2, 0xA2}, 659}, /* ств */ + {{0xAD, 0xA8, 0xEF}, 629}, /* ния */ + {{0xAE, 0xA2, 0xA0}, 566}, /* ова */ + {{0xE2, 0xA5, 0xAB}, 555}, /* тел */ + {{0xE0, 0xA5, 0xA4}, 507}, /* ред */ + {{0xA5, 0xAD, 0xAD}, 499}, /* енн */ + {{0xAE, 0xA2, 0xAE}, 443}, /* ово */ + {{0xA0, 0xAD, 0xA8}, 443}, /* ани */ + {{0xE2, 0xE0, 0xA0}, 429}, /* тра */ + {{0xAE, 0xE1, 0xE2}, 428}, /* ост */ + {{0xAD, 0xA8, 0xA5}, 419}, /* ние */ + {{0xAD, 0xAD, 0xAE}, 412}, /* нно */ + {{0xA0, 0xE5, 0xAE}, 396}, /* ахо */ + {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ + {{0xE0, 0xA0, 0xE5}, 386}, /* рах */ + {{0xE5, 0xAE, 0xA2}, 379}, /* хов */ + {{0xA5, 0xAB, 0xEC}, 365}, /* ель */ + {{0xA3, 0xAE, 0xA2}, 360}, /* гов */ + {{0xA2, 0xAE, 0xE0}, 356}, /* вор */ + {{0xA5, 0xE1, 0xE2}, 349}, /* ест */ + {{0xA0, 0xE2, 0xEC}, 345}, /* ать */ + {{0xE0, 0xA0, 0xA2}, 337}, /* рав */ + {{0xAF, 0xE0, 0xA8}, 330}, /* при */ + {{0xAF, 0xE0, 0xA5}, 323}, /* пре */ + {{0xA4, 0xAE, 0xA3}, 318}, /* дог */ + {{0xAD, 0xA5, 0xAD}, 310}, /* нен */ + {{0xAF, 0xE0, 0xA0}, 309}, /* пра */ + {{0xA2, 0xA0, 0xAD}, 304}, /* ван */ + {{0xA8, 0xE2, 0xA5}, 295}, /* ите */ + {{0xE2, 0xA2, 0xA5}, 281}, /* тве */ + {{0xAB, 0xA5, 0xAD}, 266}, /* лен */ + {{0xE1, 0xE2, 0xAE}, 261}, /* сто */ + {{0xE2, 0xA0, 0xE2}, 260}, /* тат */ + {{0xAD, 0xAD, 0xEB}, 260}, /* нны */ + {{0xAB, 0xEC, 0xAD}, 256}, /* льн */ + {{0xA2, 0xAE, 0xA7}, 255}, /* воз */ + {{0xA8, 0xAB, 0xA8}, 254}, /* или */ + {{0xA0, 0xE2, 0xA5}, 252}, /* ате */ + {{0xA5, 0xA3, 0xAE}, 241}, /* его */ + {{0xA5, 0xE2, 0xE1}, 238}, /* етс */ + {{0xAD, 0xAE, 0xE1}, 236}, /* нос */ + {{0xE9, 0xA5, 0xE1}, 235}, /* щес */ + {{0xAF, 0xAE, 0xAB}, 232}, /* пол */ + {{0xE0, 0xA0, 0xAD}, 231}, /* ран */ + {{0xAD, 0xAE, 0xA3}, 230}, /* ног */ + {{0xE1, 0xE2, 0xA0}, 229}, /* ста */ + {{0xE7, 0xA5, 0xAD}, 226}, /* чен */ + {{0xE2, 0xE0, 0xA5}, 224}, /* тре */ + {{0xA7, 0xAC, 0xA5}, 214}, /* зме */ + {{0xE3, 0xE9, 0xA5}, 212}, /* уще */ + {{0xE1, 0xE2, 0xA8}, 210}, /* сти */ + {{0xAA, 0xAE, 0xAC}, 207}, /* ком */ + {{0xAE, 0xE0, 0xAE}, 206}, /* оро */ + {{0xA2, 0xAB, 0xA5}, 195}, /* вле */ + {{0xA7, 0xA0, 0xAD}, 194}, /* зан */ + {{0xA0, 0xE1, 0xE2}, 193}, /* аст */ + {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ + {{0xE5, 0xE0, 0xA0}, 187}, /* хра */ + {{0xA0, 0xAD, 0xAD}, 182}, /* анн */ + {{0xA5, 0xE0, 0xA5}, 182}, /* ере */ + {{0xA2, 0xE0, 0xA5}, 178}, /* вре */ + {{0xAE, 0xA2, 0xA5}, 173}, /* ове */ + {{0xEC, 0xAD, 0xAE}, 173}, /* ьно */ + {{0xA2, 0xA5, 0xE0}, 172}, /* вер */ + {{0xAC, 0xA5, 0xAD}, 170}, /* мен */ + {{0xAB, 0xA8, 0xE6}, 168}, /* лиц */ + {{0xE2, 0xAE, 0xE0}, 167}, /* тор */ + {{0xE0, 0xA5, 0xAD}, 167}, /* рен */ + {{0xE9, 0xA5, 0xAD}, 165}, /* щен */ + {{0xAE, 0xA7, 0xAC}, 164}, /* озм */ + {{0xA5, 0xA4, 0xA0}, 163}, /* еда */ + {{0xE2, 0xA2, 0xA8}, 159}, /* тви */ + {{0xEF, 0xA7, 0xA0}, 159}, /* яза */ + {{0xA1, 0xEF, 0xA7}, 158}, /* бяз */ + {{0xAD, 0xA8, 0xA8}, 153}, /* нии */ + {{0xAD, 0xEB, 0xE5}, 153}, /* ных */ + {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ + {{0xAC, 0xA5, 0xE0}, 153}, /* мер */ + {{0xE1, 0xAB, 0xA8}, 150}, /* сли */ + {{0xE2, 0xAE, 0xA2}, 148}, /* тов */ + {{0xE2, 0xA2, 0xA0}, 147}, /* тва */ + {{0xAE, 0xE0, 0xA0}, 146}, /* ора */ + {{0xAD, 0xAE, 0xAC}, 144}, /* ном */ + {{0xA4, 0xA5, 0xAD}, 144}, /* ден */ + {{0xA0, 0xAD, 0xA5}, 142}, /* ане */ + {{0xAA, 0xAE, 0xAD}, 141}, /* кон */ + {{0xAB, 0xE3, 0xE7}, 141}, /* луч */ + {{0xAC, 0xE3, 0xE9}, 140}, /* мущ */ + {{0xAE, 0xA1, 0xEF}, 140}, /* обя */ + {{0xA2, 0xA0, 0xE2}, 138}, /* ват */ + {{0xA2, 0xA0, 0xE0}, 137}, /* вар */ + {{0xA5, 0xE9, 0xA5}, 137}, /* еще */ + {{0xAE, 0xE2, 0xE0}, 137}, /* отр */ + {{0xA4, 0xA5, 0xAB}, 137}, /* дел */ + {{0xAD, 0xEB, 0xAC}, 136}, /* ным */ + {{0xA8, 0xAC, 0xE3}, 136}, /* иму */ + {{0x91, 0xE2, 0xA0}, 134}, /* Ста */ + {{0xE3, 0xE7, 0xA0}, 133}, /* уча */ + {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ + {{0xA5, 0xAB, 0xEF}, 130}, /* еля */ + {{0xE1, 0xAB, 0xE3}, 130}, /* слу */ + {{0xA7, 0xA0, 0xAA}, 130}, /* зак */ + {{0xE2, 0xAE, 0xEF}, 129}, /* тоя */ + {{0xAE, 0xAC, 0xA8}, 128}, /* оми */ + {{0xAC, 0xA5, 0xE9}, 128}, /* мещ */ + {{0xA5, 0xA4, 0xE3}, 127}, /* еду */ + {{0xA2, 0xA5, 0xAD}, 127}, /* вен */ + {{0xAD, 0xAE, 0xA2}, 127}, /* нов */ + {{0xAD, 0xAE, 0xA5}, 126}, /* ное */ + {{0xAE, 0xE2, 0xA2}, 125}, /* отв */ + {{0xAA, 0xA0, 0xA7}, 125}, /* каз */ + {{0xA0, 0xA5, 0xE2}, 125}, /* ает */ + {{0xE1, 0xAA, 0xAE}, 125}, /* ско */ + {{0xA5, 0xAD, 0xE2}, 124}, /* ент */ + {{0xAC, 0xAE, 0xE2}, 123}, /* мот */ + {{0xA0, 0xA2, 0xAB}, 122}, /* авл */ + {{0xE1, 0xAC, 0xAE}, 122}, /* смо */ + {{0xA8, 0xE7, 0xA8}, 121}, /* ичи */ + {{0xA1, 0xEB, 0xE2}, 120}, /* быт */ + {{0xE3, 0xE1, 0xAC}, 118}, /* усм */ + {{0xE1, 0xE1, 0xA8}, 117}, /* сси */ + {{0xA4, 0xE3, 0xE1}, 117}, /* дус */ + {{0xE5, 0xAE, 0xA4}, 117}, /* ход */ + {{0xE0, 0xA8, 0xE7}, 117}, /* рич */ + {{0xE7, 0xA5, 0xE1}, 115}, /* чес */ + {{0xA3, 0xE0, 0xA0}, 114}, /* гра */ + {{0xAF, 0xE0, 0xAE}, 114}, /* про */ + {{0xA4, 0xAE, 0xA2}, 113}, /* дов */ + {{0xA2, 0xA5, 0xE2}, 112}, /* вет */ + {{0xA5, 0xA4, 0xA5}, 112}, /* еде */ + {{0xE8, 0xA5, 0xAD}, 111}, /* шен */ + {{0xE7, 0xA8, 0xAD}, 110}, /* чин */ + {{0xAD, 0xA0, 0xE1}, 109}, /* нас */ + {{0xA8, 0xE2, 0xEC}, 105}, /* ить */ + {{0xE2, 0xA2, 0xAE}, 105}, /* тво */ + {{0xAA, 0xAB, 0xEE}, 104}, /* клю */ + {{0xE0, 0xA8, 0xE2}, 104}, /* рит */ + {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ + {{0xAB, 0xEE, 0xE7}, 104}, /* люч */ + {{0xE2, 0xAE, 0xAC}, 104}, /* том */ + {{0xE1, 0xAB, 0xA5}, 103}, /* сле */ + {{0xE1, 0xAF, 0xAE}, 102}, /* спо */ + {{0xAE, 0xAB, 0xAD}, 102}, /* олн */ + {{0xA5, 0xE1, 0xAB}, 102}, /* есл */ + {{0xA5, 0xE0, 0xA8}, 101}, /* ери */ + {{0xAD, 0xAE, 0xA9}, 101}, /* ной */ + {{0xE0, 0xAE, 0xAC}, 101}, /* ром */ + {{0xAE, 0xE2, 0xAE}, 99}, /* ото */ + {{0xAD, 0xEB, 0xA5}, 99}, /* ные */ + {{0xA7, 0xAD, 0xA0}, 99}, /* зна */ + {{0xA2, 0xAB, 0xEF}, 99}, /* вля */ + {{0xE2, 0xA5, 0xE0}, 98}, /* тер */ + {{0xE3, 0xAF, 0xE0}, 97}, /* упр */ + {{0xA0, 0xAA, 0xAE}, 96}, /* ако */ + {{0xAA, 0xAE, 0xA3}, 96}, /* ког */ + {{0xAD, 0xEB, 0xA9}, 96}, /* ный */ + {{0xAE, 0xE0, 0xE3}, 96}, /* ору */ + {{0xA5, 0xAB, 0xA5}, 95}, /* еле */ + {{0xA5, 0xE1, 0xAA}, 95}, /* еск */ + {{0xA0, 0xA7, 0xA0}, 95}, /* аза */ + {{0xA9, 0xE1, 0xE2}, 93}, /* йст */ + {{0xAF, 0xAE, 0xE0}, 93}, /* пор */ + {{0xAE, 0xA6, 0xA5}, 92}, /* оже */ + {{0xA8, 0xAD, 0xA5}, 91}, /* ине */ + {{0xE9, 0xA5, 0xA9}, 90}, /* щей */ + {{0xA6, 0xA4, 0xA5}, 90}, /* жде */ + {{0xAF, 0xA5, 0xE0}, 89}, /* пер */ + {{0xAD, 0xA8, 0xE2}, 89}, /* нит */ + {{0xAE, 0xAB, 0xEC}, 89}, /* оль */ + {{0xA0, 0xA6, 0xA4}, 88}, /* ажд */ + {{0xA6, 0xA5, 0xAD}, 87}, /* жен */ + {{0xAB, 0xA0, 0xA4}, 87}, /* лад */ + {{0xA0, 0xAC, 0xA8}, 87}, /* ами */ + {{0xAA, 0xAE, 0xE2}, 86}, /* кот */ + {{0xE7, 0xA0, 0xA5}, 85}, /* чае */ + {{0xA2, 0xA5, 0xE9}, 85}, /* вещ */ + {{0xA2, 0xA8, 0xEF}, 85}, /* вия */ + {{0xEF, 0xE9, 0xA5}, 85}, /* яще */ + {{0xA8, 0xA5, 0xAC}, 85}, /* ием */ + {{0xAA, 0xAB, 0xA0}, 85}, /* кла */ + {{0xA5, 0xA9, 0xE1}, 84}, /* ейс */ + {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ + {{0xA0, 0xA2, 0xAE}, 84}, /* аво */ + {{0xE0, 0xA0, 0xA6}, 83}, /* раж */ + {{0xAB, 0xEC, 0xE1}, 83}, /* льс */ + {{0xAE, 0xEF, 0xE9}, 82}, /* оящ */ + {{0xA5, 0xAD, 0xAE}, 81}, /* ено */ + {{0xA4, 0xE1, 0xE2}, 81}, /* дст */ + {{0xA4, 0xA5, 0xA9}, 80}, /* дей */ + {{0xE0, 0xA5, 0xA1}, 80}, /* реб */ + {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ + {{0xA5, 0xA4, 0xE1}, 79}, /* едс */ + {{0xA0, 0xE0, 0xA8}, 79}, /* ари */ + {{0xA4, 0xA0, 0xAD}, 79}, /* дан */ + {{0xAC, 0xAE, 0xA6}, 78}, /* мож */ + {{0xA8, 0xAC, 0xA5}, 78}, /* име */ + {{0xA8, 0xAD, 0xAE}, 78}, /* ино */ + {{0xE0, 0xA8, 0xAD}, 77}, /* рин */ + {{0xA4, 0xAE, 0xE1}, 77}, /* дос */ + {{0xAF, 0xAE, 0xE1}, 77}, /* пос */ + {{0xE2, 0xA0, 0xAA}, 77}, /* так */ + {{0xE9, 0xA5, 0xA3}, 77}, /* щег */ + {{0xA4, 0xA0, 0xE2}, 77}, /* дат */ + {{0xAF, 0xAB, 0xA0}, 76}, /* пла */ + {{0xE3, 0xE1, 0xAB}, 76}, /* усл */ + {{0xA8, 0xE6, 0xA0}, 76}, /* ица */ + {{0xE0, 0xAE, 0xA2}, 75}, /* ров */ + {{0xED, 0xE2, 0xAE}, 75}, /* это */ + {{0xE3, 0xE7, 0xA5}, 74}, /* уче */ + {{0xA4, 0xAE, 0xAB}, 73}, /* дол */ + {{0xEC, 0xAD, 0xEB}, 73}, /* ьны */ + {{0xE0, 0xA0, 0xA7}, 73}, /* раз */ + {{0xAC, 0xA8, 0xE1}, 73}, /* мис */ + {{0xA0, 0xAD, 0xAE}, 72}, /* ано */ + {{0xE1, 0xE0, 0xAE}, 72}, /* сро */ + {{0xA0, 0xA2, 0xA8}, 72}, /* ави */ + {{0xE2, 0xEC, 0xA8}, 71}, /* тьи */ + {{0xEE, 0xE7, 0xA5}, 70}, /* юче */ + {{0xE1, 0xAA, 0xAB}, 70}, /* скл */ + {{0xA8, 0xE1, 0xE1}, 70}, /* исс */ + {{0xA6, 0xA5, 0xE2}, 69}, /* жет */ + {{0xA5, 0xA4, 0xAE}, 69}, /* едо */ + {{0xAB, 0xA5, 0xA4}, 69}, /* лед */ + {{0xAB, 0xAE, 0xA2}, 69}, /* лов */ + {{0xEE, 0xE9, 0xA8}, 68}, /* ющи */ + {{0xA8, 0xA1, 0xAE}, 68}, /* ибо */ + {{0xAB, 0xA0, 0xE2}, 67}, /* лат */ + {{0xE0, 0xAE, 0xAA}, 67}, /* рок */ + {{0xA0, 0xAA, 0xAB}, 67}, /* акл */ + {{0xE0, 0xA8, 0xE9}, 67}, /* рищ */ + {{0xA1, 0xAE, 0xA2}, 67}, /* бов */ + {{0xA8, 0xE1, 0xAA}, 67}, /* иск */ + {{0xA5, 0xA1, 0xAE}, 67}, /* ебо */ + {{0xAB, 0xEC, 0xA7}, 67}, /* льз */ + {{0xE3, 0xAA, 0xA0}, 67}, /* ука */ + {{0xAB, 0xA8, 0xA1}, 66}, /* либ */ + {{0xAE, 0xAC, 0xE3}, 66}, /* ому */ + {{0xAE, 0xA2, 0xAB}, 66}, /* овл */ + {{0xE2, 0xAD, 0xAE}, 65}, /* тно */ + {{0xA2, 0xAE, 0xA9}, 64}, /* вой */ + {{0xE2, 0xAE, 0xA3}, 64}, /* тог */ + {{0xE1, 0xAB, 0xAE}, 64}, /* сло */ + {{0xAE, 0xA7, 0xAD}, 64}, /* озн */ + {{0xE1, 0xAE, 0xAE}, 64}, /* соо */ + {{0xA7, 0xA0, 0xE2}, 63}, /* зат */ + {{0xA8, 0xE1, 0xAF}, 63}, /* исп */ + {{0xA0, 0xE7, 0xA5}, 63}, /* аче */ + {{0xAD, 0xA8, 0xEE}, 63}, /* нию */ + {{0xAE, 0xAD, 0xA5}, 63}, /* оне */ + {{0xAE, 0xAB, 0xA6}, 62}, /* олж */ + {{0xAE, 0xA2, 0xE9}, 61}, /* овщ */ + {{0xE0, 0xA0, 0xE1}, 61}, /* рас */ + {{0xA2, 0xA8, 0xA4}, 61}, /* вид */ + {{0xA2, 0xE9, 0xA8}, 61}, /* вщи */ + {{0xE1, 0xAD, 0xAE}, 61}, /* сно */ + {{0xA8, 0xE6, 0xAE}, 61}, /* ицо */ + {{0xA8, 0xE7, 0xA5}, 61}, /* иче */ + {{0xA0, 0xA2, 0xA5}, 61}, /* аве */ + {{0xA3, 0xAB, 0xA0}, 61}, /* гла */ + {{0xE7, 0xA5, 0xE2}, 61}, /* чет */ + {{0xE9, 0xA8, 0xAA}, 61}, /* щик */ + {{0xE0, 0xE3, 0xA3}, 60}, /* руг */ + {{0xE2, 0xA0, 0xAD}, 60}, /* тан */ + {{0xA8, 0xAC, 0xAE}, 60}, /* имо */ + {{0xA0, 0xAB, 0xEC}, 60}, /* аль */ + {{0xAE, 0xA2, 0xA8}, 60}, /* ови */ + {{0xA6, 0xA4, 0xA0}, 60}, /* жда */ + {{0xAF, 0xAE, 0xA2}, 60}, /* пов */ + {{0xA5, 0xAC, 0xE3}, 60}, /* ему */ + {{0xEF, 0xE2, 0xA5}, 60}, /* яте */ + {{0xE1, 0xA8, 0xA8}, 59}, /* сии */ + {{0xA1, 0xAE, 0xE2}, 59}, /* бот */ + {{0xA2, 0xEB, 0xAF}, 59}, /* вып */ + {{0xA0, 0xA1, 0xAE}, 59}, /* або */ + {{0xAB, 0xEF, 0xEE}, 59}, /* ляю */ + {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ + {{0xAE, 0xA4, 0xA5}, 58}, /* оде */ + {{0xA8, 0xAD, 0xA8}, 58}, /* ини */ + {{0xE0, 0xA0, 0xE2}, 58}, /* рат */ + {{0xEF, 0xA2, 0xAB}, 58}, /* явл */ + {{0xAD, 0xA0, 0xA3}, 57}, /* наг */ + {{0xA4, 0xE0, 0xE3}, 57}, /* дру */ + {{0xE0, 0xA0, 0xA1}, 57}, /* раб */ + {{0xA0, 0xA3, 0xE0}, 57}, /* агр */ + {{0xA8, 0xAE, 0xAD}, 57}, /* ион */ + {{0xAC, 0xA5, 0xE1}, 57}, /* мес */ + {{0xA0, 0xE6, 0xA8}, 56}, /* аци */ + {{0xAE, 0xE1, 0xE3}, 56}, /* осу */ + {{0xAA, 0xAE, 0xA9}, 55}, /* кой */ + {{0xE1, 0xA2, 0xAE}, 55}, /* сво */ + {{0xA7, 0xAE, 0xA2}, 55}, /* зов */ + {{0xAE, 0xAF, 0xE0}, 54}, /* опр */ + {{0xE1, 0xAE, 0xA1}, 54}, /* соб */ + {{0xA2, 0xAF, 0xE0}, 54}, /* впр */ + {{0xAB, 0xAD, 0xA5}, 54}, /* лне */ + {{0xAE, 0xAC, 0xAC}, 54}, /* омм */ + {{0xA5, 0xE0, 0xA0}, 54}, /* ера */ + {{0xE7, 0xA8, 0xE2}, 54}, /* чит */ + {{0xA5, 0xE0, 0xE7}, 54}, /* ерч */ + {{0xE0, 0xE7, 0xA5}, 54}, /* рче */ + {{0xA0, 0xE2, 0xA8}, 54}, /* ати */ + {{0xAD, 0xA8, 0xAA}, 54}, /* ник */ + {{0xAC, 0xAC, 0xA5}, 54}, /* мме */ + {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ + {{0xE2, 0xA5, 0xAD}, 53}, /* тен */ + {{0xA2, 0xA5, 0xA4}, 53}, /* вед */ + {{0xE1, 0xAE, 0xA2}, 52}, /* сов */ + {{0xA0, 0xA6, 0xA5}, 52}, /* аже */ + {{0xAE, 0xAA, 0xA0}, 52}, /* ока */ + {{0xEB, 0xAC, 0xA8}, 52}, /* ыми */ + {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ + {{0xAE, 0xAE, 0xE2}, 52}, /* оот */ + {{0xAC, 0xA8, 0xE2}, 52}, /* мит */ + {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ + {{0xA2, 0xE8, 0xA5}, 51}, /* вше */ + {{0xE1, 0xA8, 0xAE}, 51}, /* сио */ + {{0xAE, 0xAD, 0xAE}, 51}, /* оно */ + {{0xA0, 0xA2, 0xA0}, 51}, /* ава */ + {{0xA0, 0xE9, 0xA5}, 51}, /* аще */ + {{0xAB, 0xEF, 0xA5}, 50}, /* ляе */ + {{0xA5, 0xAD, 0xA5}, 50}, /* ене */ + {{0xAE, 0xA4, 0xA8}, 50}, /* оди */ + {{0xAF, 0xE3, 0xAD}, 49}, /* пун */ + {{0xAB, 0xA8, 0xE7}, 49}, /* лич */ + {{0xA2, 0xAE, 0xAC}, 49}, /* вом */ + {{0xAD, 0xAA, 0xE2}, 49}, /* нкт */ + {{0xAD, 0xA5, 0xE1}, 49}, /* нес */ + {{0xA2, 0xA8, 0xAB}, 49}, /* вил */ + {{0xA5, 0xA6, 0xA4}, 49}, /* ежд */ + {{0xE0, 0xA5, 0xE1}, 49}, /* рес */ + {{0xEE, 0xE9, 0xA5}, 49}, /* юще */ + {{0xEC, 0xA7, 0xAE}, 49}, /* ьзо */ + {{0xAF, 0xAE, 0xE2}, 49}, /* пот */ + {{0xE3, 0xAD, 0xAA}, 49}, /* унк */ + {{0xE1, 0xE2, 0xA5}, 49}, /* сте */ + {{0xAA, 0xAE, 0xA2}, 49}, /* ков */ + {{0xAE, 0xE1, 0xAB}, 48}, /* осл */ + {{0xEF, 0xA5, 0xE2}, 48}, /* яет */ + {{0x85, 0xE1, 0xAB}, 48}, /* Есл */ + {{0x8F, 0xE0, 0xA8}, 48}, /* При */ + {{0xE2, 0xA0, 0xA2}, 48}, /* тав */ + {{0xAD, 0xA5, 0xE0}, 48}, /* нер */ + {{0xE7, 0xAD, 0xAE}, 47}, /* чно */ + {{0xAF, 0xAE, 0xA4}, 47}, /* под */ + {{0xAD, 0xE2, 0xA0}, 47}, /* нта */ + {{0xA8, 0xE9, 0xA5}, 47}, /* ище */ + {{0xAE, 0xA1, 0xE9}, 47}, /* общ */ + {{0xA0, 0xA7, 0xAC}, 47}, /* азм */ + {{0xA6, 0xAD, 0xAE}, 47}, /* жно */ + {{0xA2, 0xA8, 0xA8}, 46}, /* вии */ + {{0xE0, 0xA0, 0xE9}, 46}, /* ращ */ + {{0xAE, 0xE0, 0xA5}, 46}, /* оре */ + {{0xA2, 0xE8, 0xA8}, 46}, /* вши */ + {{0xA5, 0xAA, 0xE1}, 46}, /* екс */ + {{0xA2, 0xAE, 0xA3}, 46}, /* вог */ + {{0xE7, 0xE2, 0xAE}, 46}, /* что */ + {{0xA8, 0xE7, 0xAD}, 45}, /* ичн */ + {{0xAB, 0xA5, 0xAC}, 45}, /* лем */ + {{0xAC, 0xAE, 0xA3}, 45}, /* мог */ + {{0xE2, 0xA2, 0xAB}, 45}, /* твл */ + {{0xA4, 0xAB, 0xA5}, 45}, /* дле */ + {{0xA4, 0xAB, 0xEF}, 45}, /* для */ + {{0xE0, 0xA5, 0xE2}, 45}, /* рет */ + {{0xA0, 0xE0, 0xA0}, 45}, /* ара */ + {{0xAD, 0xEF, 0xE2}, 44}, /* нят */ + {{0xA5, 0xE7, 0xA5}, 44}, /* ече */ + {{0xAE, 0xE2, 0xA5}, 44}, /* оте */ + {{0xAE, 0xE0, 0xEB}, 44}, /* оры */ + {{0xAE, 0xE1, 0xAD}, 43}, /* осн */ + {{0xAE, 0xA1, 0xAE}, 43}, /* обо */ + {{0xAE, 0xA3, 0xAB}, 43}, /* огл */ + {{0xA8, 0xAD, 0xEB}, 43}, /* ины */ + {{0xA5, 0xE1, 0xE1}, 43}, /* есс */ + {{0xAE, 0xA1, 0xE0}, 43}, /* обр */ + {{0xAA, 0xE0, 0xA0}, 43}, /* кра */ + {{0xA8, 0xEF, 0xAC}, 43}, /* иям */ + {{0xA0, 0xAB, 0xAE}, 43}, /* ало */ + {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ + {{0xAE, 0xE0, 0xA3}, 43}, /* орг */ + {{0xE7, 0xA0, 0xEF}, 42}, /* чая */ + {{0xAD, 0xA8, 0xAC}, 42}, /* ним */ + {{0xA8, 0xA7, 0xAD}, 42}, /* изн */ + {{0xAF, 0xAE, 0xAA}, 42}, /* пок */ + {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ + {{0xA5, 0xAB, 0xEE}, 42}, /* елю */ + {{0xE2, 0xA8, 0xE2}, 42}, /* тит */ + {{0xE6, 0xA5, 0xAD}, 42}, /* цен */ + {{0xE7, 0xA0, 0xE1}, 42}, /* час */ + {{0xA3, 0xA0, 0xAD}, 42}, /* ган */ + {{0xE0, 0xA3, 0xA0}, 42}, /* рга */ + {{0xE1, 0xE2, 0xAD}, 42}, /* стн */ + {{0xE0, 0xA5, 0xA6}, 42}, /* реж */ + {{0xE3, 0xAC, 0xAC}, 42}, /* умм */ + {{0xE2, 0xA2, 0xE3}, 41}, /* тву */ + {{0xE2, 0xE3, 0xAF}, 41}, /* туп */ + {{0xE1, 0xAA, 0xA8}, 40}, /* ски */ + {{0xA4, 0xA5, 0xAA}, 40}, /* дек */ + {{0xAB, 0xA5, 0xA6}, 40}, /* леж */ + {{0xA5, 0xE1, 0xA5}, 40}, /* есе */ + {{0xA2, 0xA8, 0xA5}, 40}, /* вие */ + {{0xE2, 0xAA, 0xA0}, 40}, /* тка */ + {{0xA5, 0xAA, 0xE0}, 40}, /* екр */ + {{0xAE, 0xA4, 0xAE}, 40}, /* одо */ + {{0xAA, 0xE1, 0xA0}, 40}, /* кса */ + {{0xE0, 0xA5, 0xAA}, 40}, /* рек */ + {{0xAD, 0xE2, 0xA5}, 40}, /* нте */ + {{0xE3, 0xA3, 0xA8}, 40}, /* уги */ + {{0xA1, 0xEB, 0xAB}, 40}, /* был */ + {{0xA8, 0xAD, 0xEF}, 40}, /* иня */ + {{0xA5, 0xE9, 0xA8}, 39}, /* ещи */ + {{0xA3, 0xA5, 0xAD}, 39}, /* ген */ + {{0x8A, 0xAE, 0xA4}, 39}, /* Код */ + {{0xA4, 0xA8, 0xE2}, 39}, /* дит */ + {{0xE1, 0xE5, 0xAE}, 39}, /* схо */ + {{0xA8, 0xAD, 0xE2}, 39}, /* инт */ + {{0xE1, 0xE3, 0xAC}, 39}, /* сум */ + {{0xE0, 0xAE, 0xAD}, 39}, /* рон */ + {{0xAE, 0xE2, 0xAA}, 39}, /* отк */ + {{0xA4, 0xAE, 0xAA}, 39}, /* док */ + {{0xA8, 0xAB, 0xA0}, 38}, /* ила */ + {{0xE6, 0xA5, 0xE1}, 38}, /* цес */ + {{0xA8, 0xAA, 0xA0}, 38}, /* ика */ + {{0xA7, 0xAD, 0xA8}, 38}, /* зни */ + {{0xAE, 0xA2, 0xEB}, 38}, /* овы */ + {{0xAB, 0xA6, 0xAD}, 38}, /* лжн */ + {{0xE3, 0xAF, 0xAB}, 38}, /* упл */ + {{0xA3, 0xA4, 0xA0}, 37}, /* гда */ + {{0xAB, 0xA0, 0xA6}, 37}, /* лаж */ + {{0xA6, 0xA5, 0xA4}, 37}, /* жед */ + {{0xA1, 0xA5, 0xA7}, 37}, /* без */ + {{0xA4, 0xA5, 0xE2}, 37}, /* дет */ + {{0xAE, 0xE0, 0xEF}, 37}, /* оря */ + {{0xE0, 0xAE, 0xE1}, 37}, /* рос */ + {{0xAE, 0xA1, 0xAB}, 37}, /* обл */ + {{0xE6, 0xA8, 0xA8}, 37}, /* ции */ + {{0xA4, 0xAE, 0xAC}, 37}, /* дом */ + {{0xAD, 0xE6, 0xA5}, 37}, /* нце */ + {{0xE8, 0xA5, 0xA3}, 37}, /* шег */ + {{0xAB, 0xAE, 0xA6}, 37}, /* лож */ + {{0xAE, 0xAD, 0xA0}, 37}, /* она */ + {{0xAE, 0xAA, 0xAB}, 37}, /* окл */ + {{0xAE, 0xA3, 0xA4}, 37}, /* огд */ + {{0xE0, 0xAE, 0xA4}, 37}, /* род */ + {{0xA5, 0xAD, 0xA0}, 37}, /* ена */ + {{0xAE, 0xAD, 0xE6}, 37}, /* онц */ + {{0xAE, 0xE2, 0xAD}, 37}, /* отн */ + {{0xE1, 0xAE, 0xA3}, 37}, /* сог */ + {{0xA5, 0xA2, 0xE8}, 37}, /* евш */ + {{0xA2, 0xA8, 0xE2}, 36}, /* вит */ + {{0xA5, 0xE0, 0xAF}, 36}, /* ерп */ + {{0xAE, 0xA4, 0xA0}, 36}, /* ода */ + {{0xA5, 0xE2, 0xA5}, 36}, /* ете */ + {{0xAD, 0xA5, 0xAE}, 36}, /* нео */ + {{0xE0, 0xAF, 0xA5}, 36}, /* рпе */ + {{0xA5, 0xE0, 0xE8}, 36}, /* ерш */ + {{0xA8, 0xAC, 0xA8}, 36}, /* ими */ + {{0xA8, 0xA2, 0xE8}, 36}, /* ивш */ + {{0xEB, 0xAF, 0xAB}, 36}, /* ыпл */ + {{0xAF, 0xA5, 0xA2}, 36}, /* пев */ + {{0xA0, 0xA4, 0xA0}, 36}, /* ада */ + {{0xAC, 0xAE, 0xE1}, 35}, /* мос */ + {{0xAE, 0xA1, 0xE1}, 35}, /* обс */ + {{0xAD, 0xA5, 0xA4}, 34}, /* нед */ + {{0xA8, 0xAA, 0xAE}, 34}, /* ико */ + {{0xE9, 0xA8, 0xAC}, 34}, /* щим */ + {{0xA4, 0xA5, 0xE0}, 34}, /* дер */ + {{0xE1, 0xAA, 0xA0}, 34}, /* ска */ + {{0xAE, 0xE0, 0xAC}, 34}, /* орм */ + {{0xE3, 0xAC, 0xA5}, 34}, /* уме */ + {{0xAE, 0xAE, 0xA1}, 34}, /* ооб */ + {{0xE0, 0xA8, 0xE1}, 34}, /* рис */ + {{0xAE, 0xA1, 0xEA}, 33}, /* объ */ + {{0xAE, 0xAB, 0xE3}, 33}, /* олу */ + {{0xEA, 0xEF, 0xA2}, 33}, /* ъяв */ + {{0xE0, 0xA5, 0xAC}, 33}, /* рем */ + {{0xE9, 0xA8, 0xE5}, 33}, /* щих */ + {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ + {{0xAA, 0xA6, 0xA5}, 33}, /* кже */ + {{0xA8, 0xA4, 0xA5}, 33}, /* иде */ + {{0xA1, 0xE1, 0xE2}, 33}, /* бст */ + {{0xA0, 0xAA, 0xA6}, 33}, /* акж */ + {{0xA2, 0xE3, 0xEE}, 33}, /* вую */ + {{0xA0, 0xE1, 0xE5}, 33}, /* асх */ + {{0xA0, 0xAD, 0xA0}, 32}, /* ана */ + {{0xAD, 0xA0, 0xA4}, 32}, /* над */ + {{0xAE, 0xA1, 0xA5}, 32}, /* обе */ + {{0xEB, 0xE2, 0xAA}, 32}, /* ытк */ + {{0xED, 0xE2, 0xA8}, 32}, /* эти */ + {{0xAE, 0xA6, 0xAD}, 32}, /* ожн */ + {{0xA0, 0xE2, 0xEB}, 31}, /* аты */ + {{0xE1, 0xA4, 0xA5}, 31}, /* сде */ + {{0xA0, 0xEE, 0xE2}, 31}, /* ают */ + {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ + {{0xAE, 0xEF, 0xE2}, 31}, /* оят */ + {{0xA5, 0xE2, 0xEC}, 31}, /* еть */ + {{0xA0, 0xA3, 0xA5}, 31}, /* аге */ + {{0xE7, 0xE0, 0xA5}, 31}, /* чре */ + {{0xA5, 0xAD, 0xEB}, 31}, /* ены */ + {{0xE3, 0xA1, 0xEB}, 31}, /* убы */ + {{0xA8, 0xE1, 0xE2}, 30}, /* ист */ + {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ + {{0xE0, 0xEF, 0xA4}, 30}, /* ряд */ + {{0xA3, 0xAE, 0xE1}, 30}, /* гос */ + {{0xA8, 0xAC, 0xA0}, 30}, /* има */ + {{0xA7, 0xA0, 0xE1}, 30}, /* зас */ + {{0xA0, 0xEE, 0xE9}, 30}, /* ающ */ + {{0xAE, 0xA7, 0xA2}, 30}, /* озв */ + {{0xA5, 0xA4, 0xA8}, 30}, /* еди */ + {{0xAE, 0xAC, 0xA5}, 30}, /* оме */ + {{0xAD, 0xA8, 0xA9}, 30}, /* ний */ + {{0xE1, 0xE3, 0xA4}, 30}, /* суд */ + {{0xA7, 0xA4, 0xAE}, 29}, /* здо */ + {{0xE1, 0xA2, 0xA8}, 29}, /* сви */ + {{0xAE, 0xAB, 0xA8}, 29}, /* оли */ + {{0xAE, 0xA2, 0xEC}, 29}, /* овь */ + {{0xA2, 0xA8, 0xA9}, 29}, /* вий */ + {{0xA4, 0xAE, 0xE0}, 29}, /* дор */ + {{0xA4, 0xA5, 0xEF}, 29}, /* дея */ + {{0xA5, 0xEF, 0xE2}, 29}, /* еят */ + {{0xE6, 0xAE, 0xAC}, 29}, /* цом */ + {{0xA8, 0xA7, 0xA0}, 28}, /* иза */ + {{0xE1, 0xE7, 0xA5}, 28}, /* сче */ + {{0xAA, 0xE2, 0xA0}, 28}, /* кта */ + {{0xAE, 0xA4, 0xAD}, 28}, /* одн */ + {{0xA1, 0xAB, 0xA0}, 28}, /* бла */ + {{0xAE, 0xA4, 0xAB}, 28}, /* одл */ + {{0xA8, 0xE2, 0xA0}, 28}, /* ита */ + {{0x84, 0xAE, 0xA3}, 28}, /* Дог */ + {{0xAE, 0xE1, 0xAE}, 28}, /* осо */ + {{0xAD, 0xAE, 0xE8}, 28}, /* нош */ + {{0xAA, 0xE3, 0xE0}, 28}, /* кур */ + {{0xA8, 0xAD, 0xA0}, 28}, /* ина */ + {{0xAE, 0xE8, 0xA5}, 28}, /* оше */ + {{0xAD, 0xA0, 0xAB}, 28}, /* нал */ + {{0xAD, 0xA8, 0xA7}, 27}, /* низ */ + {{0xA7, 0xA2, 0xE0}, 27}, /* звр */ + {{0xA2, 0xE0, 0xA0}, 27}, /* вра */ + {{0xAB, 0xA5, 0xE2}, 27}, /* лет */ + {{0xA5, 0xE9, 0xEC}, 27}, /* ещь */ + {{0xE0, 0xA8, 0xA4}, 27}, /* рид */ + {{0xA4, 0xAD, 0xAE}, 27}, /* дно */ + {{0xE0, 0xA8, 0xAE}, 27}, /* рио */ + {{0xAE, 0xA8, 0xAC}, 27}, /* оим */ + {{0xA5, 0xE0, 0xA6}, 27}, /* ерж */ + {{0xE3, 0xA2, 0xA5}, 26}, /* уве */ + {{0xAE, 0xAD, 0xAA}, 26}, /* онк */ + {{0xA5, 0xAB, 0xAA}, 26}, /* елк */ + {{0xAB, 0xA0, 0xA2}, 26}, /* лав */ + {{0xA0, 0xE2, 0xAE}, 26}, /* ато */ + {{0xEF, 0xAC, 0xA8}, 26}, /* ями */ + {{0xAC, 0xAC, 0xEB}, 26}, /* ммы */ + {{0xA5, 0xE1, 0xAF}, 26}, /* есп */ + {{0xAD, 0xAA, 0xE3}, 26}, /* нку */ + {{0xA8, 0xE6, 0xE3}, 25}, /* ицу */ + {{0xA4, 0xE1, 0xAA}, 25}, /* дск */ + {{0xAD, 0xA8, 0xAD}, 25}, /* нин */ + {{0xAF, 0xAB, 0xA5}, 25}, /* пле */ + {{0xE4, 0xAE, 0xE0}, 25}, /* фор */ + {{0xAB, 0xA0, 0xE1}, 25}, /* лас */ + {{0xA4, 0xA8, 0xAC}, 25}, /* дим */ + {{0xA5, 0xE1, 0xEF}, 25}, /* еся */ + {{0xAD, 0xA8, 0xE7}, 25}, /* нич */ + {{0xAE, 0xA2, 0xE0}, 25}, /* овр */ + {{0xA2, 0xE1, 0xAB}, 25}, /* всл */ + {{0xE0, 0xE8, 0xA5}, 25}, /* рше */ + {{0xA5, 0xE9, 0xA0}, 25}, /* еща */ + {{0xA6, 0xAD, 0xEB}, 25}, /* жны */ + {{0xE0, 0xA8, 0xAC}, 25}, /* рим */ + {{0xA7, 0xA0, 0xE6}, 25}, /* зац */ + {{0xA1, 0xE9, 0xA5}, 25}, /* бще */ + {{0xA0, 0xAA, 0xE2}, 25}, /* акт */ + {{0xA0, 0xA4, 0xE1}, 25}, /* адс */ + {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ + {{0xE9, 0xA8, 0xA5}, 25}, /* щие */ + {{0xA6, 0xA8, 0xE2}, 24}, /* жит */ + {{0xA1, 0xE0, 0xA5}, 24}, /* бре */ + {{0xE3, 0xA3, 0xAE}, 24}, /* уго */ + {{0xA8, 0xEF, 0xE5}, 24}, /* иях */ + {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ + {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ + {{0xA2, 0xAE, 0xA2}, 24}, /* вов */ + {{0xAE, 0xE7, 0xAD}, 24}, /* очн */ + {{0xA2, 0xAE, 0xAE}, 24}, /* воо */ + {{0xAE, 0xA4, 0xEB}, 24}, /* оды */ + {{0xAB, 0xAE, 0xA3}, 24}, /* лог */ + {{0xA2, 0xA0, 0xA5}, 24}, /* вае */ + {{0xA0, 0xEF, 0xE5}, 24}, /* аях */ + {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ + {{0xA4, 0xA8, 0xE7}, 24}, /* дич */ + {{0xAA, 0xA8, 0xE5}, 24}, /* ких */ + {{0xE6, 0xA0, 0xAC}, 24}, /* цам */ + {{0xA8, 0xA7, 0xA2}, 24}, /* изв */ + {{0xE2, 0xA8, 0xA2}, 24}, /* тив */ + {{0xA5, 0xAE, 0xA1}, 24}, /* еоб */ + {{0xE1, 0xAE, 0xE1}, 24}, /* сос */ + {{0xE8, 0xA8, 0xAC}, 24}, /* шим */ + {{0xEB, 0xAF, 0xAE}, 24}, /* ыпо */ + {{0xA5, 0xA6, 0xA0}, 24}, /* ежа */ + {{0xE2, 0xAE, 0xA8}, 24}, /* тои */ + {{0xAA, 0xE2, 0xAE}, 24}, /* кто */ + {{0xA5, 0xE7, 0xA0}, 24}, /* еча */ + {{0xA8, 0xA4, 0xA8}, 24}, /* иди */ + {{0xA1, 0xE9, 0xA8}, 23}, /* бщи */ + {{0xE2, 0xEC, 0xA5}, 23}, /* тье */ + {{0xA1, 0xEA, 0xEF}, 23}, /* бъя */ + {{0xAD, 0xA0, 0xE7}, 23}, /* нач */ + {{0xE2, 0xA5, 0xE7}, 23}, /* теч */ + {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ + {{0xA2, 0xA5, 0xE7}, 23}, /* веч */ + {{0xA5, 0xAC, 0xA5}, 23}, /* еме */ + {{0xAE, 0xA1, 0xE5}, 23}, /* обх */ + {{0xA1, 0xE5, 0xAE}, 23}, /* бхо */ + {{0xA4, 0xA0, 0xA5}, 23}, /* дае */ + {{0xE0, 0xA5, 0xA7}, 23}, /* рез */ + {{0xAA, 0xA0, 0xA6}, 22}, /* каж */ + {{0xAE, 0xAA, 0xE3}, 22}, /* оку */ + {{0xA0, 0xAC, 0xA5}, 22}, /* аме */ + {{0xAD, 0xA5, 0xA7}, 22}, /* нез */ + {{0xEB, 0xA2, 0xA0}, 22}, /* ыва */ + {{0xE1, 0xA2, 0xEF}, 22}, /* свя */ + {{0xE0, 0xA0, 0xA4}, 22}, /* рад */ + {{0xA5, 0xA7, 0xA0}, 22}, /* еза */ + {{0xA8, 0xA2, 0xA0}, 22}, /* ива */ + {{0xAA, 0xA0, 0xAC}, 22}, /* кам */ + {{0xAD, 0xA5, 0xAC}, 22}, /* нем */ + {{0xE2, 0xAA, 0xAE}, 22}, /* тко */ + {{0xA7, 0xA2, 0xA5}, 22}, /* зве */ + {{0xA2, 0xEF, 0xA7}, 22}, /* вяз */ + {{0xEF, 0xE2, 0xA8}, 22}, /* яти */ + {{0xAE, 0xE5, 0xE0}, 22}, /* охр */ + {{0xE0, 0xAE, 0xE2}, 22}, /* рот */ + {{0xAE, 0xAB, 0xA5}, 22}, /* оле */ + {{0xA1, 0xE0, 0xA0}, 22}, /* бра */ + {{0xA0, 0xA5, 0xAC}, 22}, /* аем */ + {{0xAB, 0xA0, 0xE8}, 21}, /* лаш */ + {{0xA8, 0xA7, 0xAC}, 21}, /* изм */ + {{0xA3, 0xE3, 0xE2}, 21}, /* гут */ + {{0xAE, 0xA6, 0xA4}, 21}, /* ожд */ + {{0xAA, 0xA0, 0xAA}, 21}, /* как */ + {{0xAA, 0xA0, 0xE7}, 21}, /* кач */ + {{0xAD, 0xA0, 0xAC}, 21}, /* нам */ + {{0xA4, 0xAE, 0xE5}, 21}, /* дох */ + {{0xAE, 0xE5, 0xAE}, 21}, /* охо */ + {{0xEE, 0xE0, 0xA8}, 21}, /* юри */ + {{0xA2, 0xA0, 0xAC}, 21}, /* вам */ + {{0xA7, 0xAC, 0xAE}, 21}, /* змо */ + {{0xA4, 0xAA, 0xA5}, 21}, /* дке */ + {{0xA1, 0xA0, 0xAD}, 21}, /* бан */ + {{0xA5, 0xAB, 0xA8}, 21}, /* ели */ + {{0xE0, 0xA8, 0xA7}, 21}, /* риз */ + {{0xAB, 0xAD, 0xAE}, 21}, /* лно */ + {{0xA2, 0xEB, 0xE8}, 21}, /* выш */ + {{0xA4, 0xE6, 0xA0}, 21}, /* дца */ + {{0xEF, 0xA4, 0xAA}, 21}, /* ядк */ + {{0xAE, 0xE2, 0xE1}, 21}, /* отс */ + {{0xE2, 0xA5, 0xA9}, 21}, /* тей */ + {{0xA0, 0xAD, 0xAA}, 21}, /* анк */ + {{0xAD, 0xA5, 0xA3}, 21}, /* нег */ + {{0xE6, 0xA0, 0xE2}, 21}, /* цат */ + {{0xA5, 0xAC, 0xEB}, 21}, /* емы */ + {{0xA2, 0xAE, 0xA5}, 21}, /* вое */ + {{0xA4, 0xA0, 0xE7}, 21}, /* дач */ + {{0xAE, 0xA3, 0xE3}, 21}, /* огу */ + {{0xAB, 0xA6, 0xA5}, 21}, /* лже */ + {{0xE2, 0xAD, 0xA8}, 21}, /* тни */ + {{0xA7, 0xA0, 0xA2}, 21}, /* зав */ + {{0xA2, 0xA5, 0xE1}, 21}, /* вес */ + {{0xE1, 0xA0, 0xAC}, 20}, /* сам */ + {{0xA0, 0xE0, 0xAD}, 20}, /* арн */ + {{0xE7, 0xAD, 0xEB}, 20}, /* чны */ + {{0xE1, 0xE0, 0xA5}, 20}, /* сре */ + {{0xE2, 0xA8, 0xEF}, 20}, /* тия */ + {{0xA8, 0xE1, 0xAB}, 20}, /* исл */ + {{0x91, 0xE2, 0xE0}, 20}, /* Стр */ + {{0xAD, 0xE2, 0xAE}, 20}, /* нто */ + {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ + {{0xA0, 0xE8, 0xA5}, 20}, /* аше */ + {{0xA5, 0xAB, 0xA0}, 20}, /* ела */ + {{0xE3, 0xA4, 0xAE}, 20}, /* удо */ + {{0xA6, 0xA8, 0xA7}, 19}, /* жиз */ + {{0xAF, 0xA8, 0xE1}, 19}, /* пис */ + {{0xA0, 0xA8, 0xAC}, 19}, /* аим */ + {{0xE7, 0xA8, 0xE1}, 19}, /* чис */ + {{0xA5, 0xA6, 0xA8}, 19}, /* ежи */ + {{0xA2, 0xE1, 0xA5}, 19}, /* все */ + {{0xAB, 0xEC, 0xAA}, 19}, /* льк */ + {{0xA0, 0xE2, 0xE3}, 19}, /* ату */ + {{0xE3, 0xA4, 0xA0}, 19}, /* уда */ + {{0xE8, 0xA8, 0xA9}, 19}, /* ший */ + {{0xA7, 0xA0, 0xE0}, 19}, /* зар */ + {{0xA5, 0xA4, 0xAD}, 19}, /* едн */ + {{0xA0, 0xA2, 0xE8}, 19}, /* авш */ + {{0xE0, 0xAE, 0xA8}, 19}, /* рои */ + {{0xA8, 0xA4, 0xA0}, 19}, /* ида */ + {{0xA0, 0xE0, 0xAE}, 19}, /* аро */ + {{0xE2, 0xAE, 0xA9}, 19}, /* той */ + {{0xA6, 0xA0, 0xE9}, 19}, /* жащ */ + {{0xA5, 0xE1, 0xAE}, 19}, /* есо */ + {{0xAF, 0xA0, 0xAB}, 19}, /* пал */ + {{0xE9, 0xA0, 0xA5}, 19}, /* щае */ + {{0xE0, 0xEB, 0xA5}, 19}, /* рые */ + {{0xA5, 0xAD, 0xEF}, 19}, /* еня */ + {{0xE9, 0xA8, 0xA9}, 19}, /* щий */ + {{0xAB, 0xE3, 0xA3}, 19}, /* луг */ + {{0xEE, 0xE7, 0xA8}, 18}, /* ючи */ + {{0xE3, 0xAB, 0xEC}, 18}, /* уль */ + {{0xAC, 0xEB, 0xE5}, 18}, /* мых */ + {{0xE0, 0xAE, 0xA3}, 18}, /* рог */ + {{0xE1, 0xAE, 0xE5}, 18}, /* сох */ + {{0xAA, 0xAE, 0xA5}, 18}, /* кое */ + {{0xAD, 0xE2, 0xE1}, 18}, /* нтс */ + {{0xA0, 0xA7, 0xAD}, 18}, /* азн */ + {{0xE2, 0xAD, 0xEB}, 18}, /* тны */ + {{0xAE, 0xA4, 0xEF}, 18}, /* одя */ + {{0xAE, 0xA1, 0xAD}, 18}, /* обн */ + {{0xA2, 0xEB, 0xA4}, 18}, /* выд */ + {{0xAE, 0xE1, 0xEF}, 18}, /* ося */ + {{0xEC, 0xE2, 0xA0}, 18}, /* ьта */ + {{0xAD, 0xEF, 0xEE}, 18}, /* няю */ + {{0xAD, 0xA0, 0xE0}, 18}, /* нар */ + {{0xA5, 0xA7, 0xE3}, 18}, /* езу */ + {{0xA0, 0xE1, 0xAD}, 18}, /* асн */ + {{0xA7, 0xE3, 0xAB}, 18}, /* зул */ + {{0xE6, 0xA8, 0xAF}, 18}, /* цип */ + {{0xAA, 0xE2, 0xA5}, 18}, /* кте */ + {{0xA4, 0xAE, 0xAF}, 18}, /* доп */ + {{0xAD, 0xE6, 0xA8}, 18}, /* нци */ + {{0xE1, 0xAF, 0xA5}, 18}, /* спе */ + {{0xA8, 0xAC, 0xEB}, 18}, /* имы */ + {{0xAC, 0xAE, 0xAC}, 18}, /* мом */ + {{0xAF, 0xA5, 0xE7}, 18}, /* печ */ + {{0x8E, 0xA1, 0xEF}, 18}, /* Обя */ + {{0x8F, 0xE0, 0xA0}, 18}, /* Пра */ + {{0xAE, 0xAB, 0xAE}, 18}, /* оло */ + {{0xE2, 0xE1, 0xAA}, 18}, /* тск */ + {{0xAB, 0xAD, 0xA8}, 18}, /* лни */ + {{0xA5, 0xE0, 0xE2}, 18}, /* ерт */ + {{0xA8, 0xE1, 0xEC}, 18}, /* ись */ + {{0xAB, 0xEC, 0xE2}, 18}, /* льт */ + {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ + {{0xA2, 0xAE, 0xA1}, 17}, /* воб */ + {{0xE0, 0xAD, 0xEB}, 17}, /* рны */ + {{0xA1, 0xAD, 0xEB}, 17}, /* бны */ + {{0xEB, 0xA4, 0xA0}, 17}, /* ыда */ + {{0xEC, 0xA7, 0xE3}, 17}, /* ьзу */ + {{0xA5, 0xA4, 0xAF}, 17}, /* едп */ + {{0xA0, 0xA4, 0xA5}, 17}, /* аде */ + {{0xA8, 0xAF, 0xA0}, 17}, /* ипа */ + {{0xE1, 0xA5, 0xA9}, 17}, /* сей */ + {{0xA5, 0xA5, 0xE1}, 17}, /* еес */ + {{0xAE, 0xA8, 0xA7}, 17}, /* оиз */ + {{0xAE, 0xE1, 0xA2}, 17}, /* осв */ + {{0xA4, 0xA8, 0xA2}, 17}, /* див */ + {{0xAD, 0xA0, 0xAD}, 17}, /* нан */ + {{0xA5, 0xE2, 0xA0}, 17}, /* ета */ + {{0xA4, 0xAD, 0xA5}, 17}, /* дне */ + {{0xA8, 0xAE, 0xA1}, 17}, /* иоб */ + {{0xE3, 0xA5, 0xE2}, 17}, /* ует */ + {{0xAD, 0xA0, 0xE5}, 17}, /* нах */ + {{0xE1, 0xAC, 0xA5}, 17}, /* сме */ + {{0xA0, 0xAB, 0xA8}, 17}, /* али */ + {{0xA1, 0xEA, 0xA5}, 17}, /* бъе */ + {{0xAF, 0xA0, 0xE1}, 17}, /* пас */ + {{0xA7, 0xA0, 0xAB}, 17}, /* зал */ + {{0xE0, 0xA6, 0xA0}, 16}, /* ржа */ + {{0xEF, 0xA2, 0xA8}, 16}, /* яви */ + {{0xA6, 0xA0, 0xE2}, 16}, /* жат */ + {{0xA1, 0xAE, 0xA6}, 16}, /* бож */ + {{0xE1, 0xA8, 0xAB}, 16}, /* сил */ + {{0xAD, 0xE3, 0xEE}, 16}, /* ную */ + {{0xAF, 0xA5, 0xAD}, 16}, /* пен */ + {{0xAC, 0xA0, 0xE2}, 16}, /* мат */ + {{0xAE, 0xAD, 0xAD}, 16}, /* онн */ + {{0xA2, 0xA8, 0xAD}, 16}, /* вин */ + {{0xE2, 0xAA, 0xA8}, 16}, /* тки */ + {{0xE2, 0xAE, 0xE7}, 16}, /* точ */ + {{0xE1, 0xE7, 0xA8}, 16}, /* счи */ + {{0xAD, 0xA8, 0xE6}, 16}, /* ниц */ + {{0xE9, 0xA5, 0xA5}, 16}, /* щее */ + {{0xA1, 0xA5, 0xE1}, 16}, /* бес */ + {{0xA0, 0xA4, 0xE6}, 16}, /* адц */ + {{0x8A, 0xAE, 0xAC}, 16}, /* Ком */ + {{0xEC, 0xA8, 0xAC}, 16}, /* ьим */ + {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ + {{0xA0, 0xE7, 0xA8}, 16}, /* ачи */ + {{0xAF, 0xAE, 0xAD}, 16}, /* пон */ + {{0xAA, 0xA0, 0xA5}, 16}, /* кае */ + {{0xA8, 0xA3, 0xE0}, 16}, /* игр */ + {{0xA0, 0xAA, 0xA8}, 16}, /* аки */ + {{0xA0, 0xE9, 0xA8}, 16}, /* ащи */ + {{0xAB, 0xEC, 0xE6}, 16}, /* льц */ + {{0xA2, 0xAD, 0xAE}, 16}, /* вно */ + {{0xEB, 0xE8, 0xA5}, 15}, /* ыше */ + {{0x8B, 0xA8, 0xE6}, 15}, /* Лиц */ + {{0xEC, 0xA5, 0xA9}, 15}, /* ьей */ + {{0xE8, 0xA5, 0xAC}, 15}, /* шем */ + {{0xE3, 0xA1, 0xAB}, 15}, /* убл */ + {{0xE0, 0xA0, 0xE6}, 15}, /* рац */ + {{0xAA, 0xE3, 0xAC}, 15}, /* кум */ + {{0xE0, 0xA5, 0xA3}, 15}, /* рег */ + {{0xAE, 0xAF, 0xA0}, 15}, /* опа */ + {{0x82, 0xAE, 0xA7}, 15}, /* Воз */ + {{0xE2, 0xA0, 0xA5}, 15}, /* тае */ + {{0xAE, 0xA1, 0xEB}, 15}, /* обы */ + {{0xA1, 0xAB, 0xA8}, 15}, /* бли */ + {{0xE0, 0xAC, 0xA5}, 15}, /* рме */ + {{0xA2, 0xAE, 0xE1}, 15}, /* вос */ + {{0xA0, 0xE1, 0xA8}, 15}, /* аси */ + {{0xE2, 0xA0, 0xAC}, 15}, /* там */ + {{0xEC, 0xAC, 0xA5}, 15}, /* ьме */ + {{0xAE, 0xA3, 0xA0}, 15}, /* ога */ + {{0xA8, 0xAB, 0xAE}, 15}, /* ило */ + {{0xE1, 0xEC, 0xAC}, 15}, /* сьм */ + {{0xE0, 0xE2, 0xA8}, 15}, /* рти */ + {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ + {{0xE1, 0xA5, 0xAD}, 15}, /* сен */ + {{0xE2, 0xA0, 0xAB}, 15}, /* тал */ + {{0xA4, 0xA0, 0xE0}, 15}, /* дар */ + {{0xA0, 0xAC, 0xAE}, 15}, /* амо */ + {{0xA5, 0xA4, 0xAB}, 15}, /* едл */ + {{0xE1, 0xE3, 0xA1}, 15}, /* суб */ + {{0xA5, 0xA9, 0xE4}, 15}, /* ейф */ + {{0x95, 0xE0, 0xA0}, 15}, /* Хра */ + {{0xAB, 0xA0, 0xAC}, 14}, /* лам */ + {{0xA0, 0xE0, 0xE3}, 14}, /* ару */ + {{0xA3, 0xA8, 0xE5}, 14}, /* гих */ + {{0xE6, 0xA8, 0xEF}, 14}, /* ция */ + {{0xA4, 0xA0, 0xA2}, 14}, /* дав */ + {{0xAB, 0xA8, 0xE8}, 14}, /* лиш */ + {{0xEE, 0xE7, 0xA0}, 14}, /* юча */ + {{0xA0, 0xAD, 0xE1}, 14}, /* анс */ + {{0xAE, 0xA3, 0xE0}, 14}, /* огр */ + {{0xA8, 0xE9, 0xA0}, 14}, /* ища */ + {{0xA5, 0xAD, 0xEC}, 14}, /* ень */ + {{0xAE, 0xE2, 0xA8}, 14}, /* оти */ + {{0xA0, 0xA4, 0xEB}, 13}, /* ады */ + {{0xA0, 0xE9, 0xA0}, 13}, /* аща */ + {{0xA2, 0xAE, 0xA8}, 13}, /* вои */ + {{0xA2, 0xEB, 0xAC}, 13}, /* вым */ + {{0xA2, 0xEC, 0xEF}, 13}, /* вья */ + {{0xAA, 0xA8, 0xA5}, 13}, /* кие */ + {{0xAB, 0xA8, 0xE1}, 13}, /* лис */ + {{0xAC, 0xA5, 0xA4}, 13}, /* мед */ + {{0xE2, 0xA8, 0xE5}, 13}, /* тих */ + {{0xA5, 0xE2, 0xAE}, 13}, /* ето */ + {{0xA7, 0xAB, 0xAE}, 13}, /* зло */ + {{0xAE, 0xAF, 0xA5}, 13}, /* опе */ + {{0xE1, 0xA8, 0xAC}, 13}, /* сим */ + {{0xEF, 0xA7, 0xA8}, 13}, /* язи */ + {{0xA8, 0xAD, 0xA4}, 13}, /* инд */ + {{0xE7, 0xE3, 0xA6}, 13}, /* чуж */ + {{0xAB, 0xAA, 0xA8}, 13}, /* лки */ + {{0xA4, 0xAF, 0xE0}, 13}, /* дпр */ + {{0xAD, 0xA4, 0xA8}, 13}, /* нди */ + {{0xAE, 0xE2, 0xA0}, 13}, /* ота */ + {{0xAE, 0xE2, 0xEB}, 13}, /* оты */ + {{0xAB, 0xA0, 0xE7}, 13}, /* лач */ + {{0xAA, 0xA8, 0xAC}, 13}, /* ким */ + {{0xA8, 0xE1, 0xA8}, 13}, /* иси */ + {{0xA2, 0xA0, 0xAB}, 13}, /* вал */ + {{0xA5, 0xAC, 0xAE}, 13}, /* емо */ + {{0xAF, 0xE3, 0xA1}, 13}, /* пуб */ + {{0xEF, 0xA5, 0xAC}, 13}, /* яем */ + {{0xA1, 0xAE, 0xAB}, 13}, /* бол */ + {{0xAD, 0xE2, 0xE3}, 13}, /* нту */ + {{0xAD, 0xA5, 0xA9}, 13}, /* ней */ + {{0xAD, 0xA0, 0xEF}, 13}, /* ная */ + {{0xA5, 0xE1, 0xA0}, 13}, /* еса */ + {{0xE0, 0xAD, 0xAE}, 13}, /* рно */ + {{0xE9, 0xA5, 0xAC}, 13}, /* щем */ + {{0xA0, 0xAD, 0xEB}, 13}, /* аны */ + {{0x84, 0xAE, 0xA2}, 13}, /* Дов */ + {{0xE7, 0xA8, 0xA2}, 13}, /* чив */ + {{0xA2, 0xA8, 0xE1}, 13}, /* вис */ + {{0xAE, 0xAF, 0xAE}, 13}, /* опо */ + {{0xA2, 0xEC, 0xEE}, 13}, /* вью */ + {{0xA0, 0xAB, 0xA0}, 13}, /* ала */ + {{0xAB, 0xA5, 0xA9}, 12}, /* лей */ + {{0xA0, 0xE7, 0xA0}, 12}, /* ача */ + {{0xA5, 0xA7, 0xA2}, 12}, /* езв */ + {{0xA2, 0xA0, 0xEF}, 12}, /* вая */ + {{0xA5, 0xAE, 0xE1}, 12}, /* еос */ + {{0xEF, 0xE9, 0xA8}, 12}, /* ящи */ + {{0xA8, 0xA2, 0xA8}, 12}, /* иви */ + {{0xAD, 0xA5, 0xA5}, 12}, /* нее */ + {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ + {{0xE8, 0xA5, 0xA5}, 12}, /* шее */ + {{0xE1, 0xA0, 0xE5}, 12}, /* сах */ + {{0xA8, 0xAD, 0xE6}, 12}, /* инц */ + {{0xAE, 0xAC, 0xAF}, 12}, /* омп */ + {{0xE3, 0xA6, 0xAE}, 12}, /* ужо */ + {{0xE3, 0xA0, 0xAB}, 12}, /* уал */ + {{0xAD, 0xA0, 0xE2}, 12}, /* нат */ + {{0xA8, 0xA4, 0xE3}, 12}, /* иду */ + {{0xA2, 0xAB, 0xA0}, 12}, /* вла */ + {{0xA7, 0xA2, 0xA0}, 12}, /* зва */ + {{0xAB, 0xA5, 0xA5}, 12}, /* лее */ + {{0xE0, 0xA5, 0xE5}, 12}, /* рех */ + {{0xA6, 0xA4, 0xE3}, 12}, /* жду */ + {{0xAC, 0xA0, 0xAB}, 12}, /* мал */ + {{0xA5, 0xAD, 0xE1}, 12}, /* енс */ + {{0xA8, 0xA9, 0xE1}, 12}, /* ийс */ + {{0xAA, 0xAE, 0xAB}, 12}, /* кол */ + {{0xAD, 0xA0, 0xA7}, 12}, /* наз */ + {{0xA4, 0xE3, 0xA0}, 12}, /* дуа */ + {{0xAE, 0xAD, 0xA8}, 12}, /* они */ + {{0xE1, 0xA5, 0xAC}, 12}, /* сем */ + {{0xA3, 0xAE, 0xA4}, 12}, /* год */ + {{0xAC, 0xA5, 0xA6}, 12}, /* меж */ + {{0xAE, 0xA7, 0xAB}, 12}, /* озл */ + {{0xA2, 0xAC, 0xA5}, 12}, /* вме */ + {{0xE3, 0xA4, 0xA5}, 12}, /* уде */ + {{0xEC, 0xAA, 0xAE}, 12}, /* ько */ + {{0xA5, 0xA2, 0xEB}, 12}, /* евы */ + {{0xA7, 0xA0, 0xAC}, 12}, /* зам */ + {{0xE1, 0xAE, 0xA4}, 12}, /* сод */ + {{0xE0, 0xAE, 0xA5}, 11}, /* рое */ + {{0xAE, 0xE2, 0xA4}, 11}, /* отд */ + {{0xE1, 0xA8, 0xEF}, 11}, /* сия */ + {{0xA8, 0xAA, 0xE3}, 11}, /* ику */ + {{0xEB, 0xAB, 0xA8}, 11}, /* ыли */ + {{0xA3, 0xA8, 0xAC}, 11}, /* гим */ + {{0xAD, 0xEC, 0xE8}, 11}, /* ньш */ + {{0xE2, 0xA8, 0xE7}, 11}, /* тич */ + {{0xE0, 0xA0, 0xAB}, 11}, /* рал */ + {{0xE3, 0xE7, 0xA8}, 11}, /* учи */ + {{0xAC, 0xA5, 0xEE}, 11}, /* мею */ + {{0xE2, 0xA5, 0xAA}, 11}, /* тек */ + {{0xAE, 0xA1, 0xE3}, 11}, /* обу */ + {{0xAD, 0xAD, 0xE3}, 11}, /* нну */ + {{0xAD, 0xA5, 0xAF}, 11}, /* неп */ + {{0xA2, 0xA5, 0xAB}, 11}, /* вел */ + {{0xE2, 0xAC, 0xA5}, 11}, /* тме */ + {{0xA1, 0xAE, 0xA3}, 11}, /* бог */ + {{0xAE, 0xE0, 0xA8}, 11}, /* ори */ + {{0xA0, 0xA2, 0xAD}, 11}, /* авн */ + {{0xA4, 0xA5, 0xA5}, 11}, /* дее */ + {{0xA6, 0xAE, 0xAC}, 11}, /* жом */ + {{0x82, 0xE0, 0xA5}, 11}, /* Вре */ + {{0xAC, 0xEB, 0xA5}, 11}, /* мые */ + {{0xEC, 0xE6, 0xA0}, 11}, /* ьца */ + {{0xAE, 0xE6, 0xA5}, 11}, /* оце */ + {{0xA8, 0xE2, 0xEB}, 10}, /* иты */ + {{0xA7, 0xE0, 0xA0}, 10}, /* зра */ + {{0xAE, 0xAD, 0xEB}, 10}, /* оны */ + {{0xE0, 0xA5, 0xE8}, 10}, /* реш */ + {{0xE3, 0xE8, 0xA5}, 10}, /* уше */ + {{0xE0, 0xA5, 0xA2}, 10}, /* рев */ + {{0xAE, 0xAF, 0xE3}, 10}, /* опу */ + {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ + {{0xE2, 0xA0, 0xE7}, 10}, /* тач */ + {{0xA5, 0xE0, 0xAE}, 10}, /* еро */ + {{0xA2, 0xAA, 0xAB}, 10}, /* вкл */ + {{0xA7, 0xEB, 0xA2}, 10}, /* зыв */ + {{0xA0, 0xAF, 0xE0}, 10}, /* апр */ + {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ + {{0x8E, 0xE2, 0xA2}, 10}, /* Отв */ + {{0xE0, 0xE1, 0xA0}, 10}, /* рса */ + {{0xA5, 0xAA, 0xE2}, 10}, /* ект */ + {{0xAB, 0xA5, 0xAA}, 10}, /* лек */ + {{0xA5, 0xA5, 0xE2}, 10}, /* еет */ + {{0xAE, 0xAF, 0xAB}, 10}, /* опл */ + {{0xE2, 0xE7, 0xA5}, 10}, /* тче */ + {{0xA3, 0xAE, 0xAC}, 10}, /* гом */ + {{0xE2, 0xAE, 0xA6}, 10}, /* тож */ + {{0xAB, 0xA5, 0xE7}, 10}, /* леч */ + {{0xA5, 0xE2, 0xEB}, 10}, /* еты */ + {{0xAE, 0xA6, 0xA8}, 10}, /* ожи */ + {{0xAC, 0xAD, 0xAE}, 10}, /* мно */ + {{0xAC, 0xAE, 0xA9}, 10}, /* мой */ + {{0xE6, 0xA5, 0xAB}, 10}, /* цел */ + {{0xE3, 0xAF, 0xA8}, 10}, /* упи */ + {{0xA0, 0xA5, 0xA2}, 10}, /* аев */ + {{0xAF, 0xAE, 0xAC}, 10}, /* пом */ + {{0xA4, 0xEF, 0xE9}, 10}, /* дящ */ + {{0xE2, 0xE0, 0xA8}, 10}, /* три */ + {{0xE8, 0xA8, 0xA5}, 10}, /* шие */ + {{0xA5, 0xAA, 0xA0}, 10}, /* ека */ + {{0xA5, 0xE8, 0xA5}, 10}, /* еше */ + {{0xA7, 0xA0, 0xA8}, 10}, /* заи */ + {{0xA8, 0xE2, 0xAE}, 10}, /* ито */ + {{0xA7, 0xAD, 0xEB}, 10}, /* зны */ + {{0xAE, 0xEF, 0xAD}, 10}, /* оян */ + {{0xA8, 0xA6, 0xA5}, 10}, /* иже */ + {{0xA2, 0xAD, 0xA5}, 10}, /* вне */ + {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ + {{0xA5, 0xAC, 0xEF}, 10}, /* емя */ + {{0xAD, 0xA0, 0xA8}, 10}, /* наи */ + {{0xE2, 0xAE, 0xAB}, 10}, /* тол */ + {{0xAB, 0xA8, 0xE2}, 10}, /* лит */ + {{0xAE, 0xE1, 0xE0}, 10}, /* оср */ + {{0xE2, 0xA4, 0xA5}, 10}, /* тде */ + {{0xA5, 0xAC, 0xA8}, 10}, /* еми */ + {{0xAC, 0xA5, 0xA5}, 10}, /* мее */ + {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ + {{0xAD, 0xA8, 0xA2}, 10}, /* нив */ + {{0xA5, 0xE0, 0xE3}, 10}, /* еру */ + {{0xE7, 0xA5, 0xAC}, 10}, /* чем */ + {{0xA4, 0xAE, 0xA1}, 10}, /* доб */ + {{0xA5, 0xAB, 0xAE}, 10}, /* ело */ + {{0xA8, 0xAB, 0xE3}, 10}, /* илу */ + {{0xA0, 0xA4, 0xAB}, 10}, /* адл */ + {{0xA8, 0xE7, 0xE2}, 10}, /* ичт */ + {{0xAC, 0xAB, 0xA5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_iso_8859_5[] = { + {{0xD5, 0xDD, 0xD8}, 991}, /* ени */ + {{0xDE, 0xD3, 0xDE}, 806}, /* ого */ + {{0xE1, 0xE2, 0xD2}, 659}, /* ств */ + {{0xDD, 0xD8, 0xEF}, 629}, /* ния */ + {{0xDE, 0xD2, 0xD0}, 566}, /* ова */ + {{0xE2, 0xD5, 0xDB}, 555}, /* тел */ + {{0xE0, 0xD5, 0xD4}, 507}, /* ред */ + {{0xD5, 0xDD, 0xDD}, 499}, /* енн */ + {{0xDE, 0xD2, 0xDE}, 443}, /* ово */ + {{0xD0, 0xDD, 0xD8}, 443}, /* ани */ + {{0xE2, 0xE0, 0xD0}, 429}, /* тра */ + {{0xDE, 0xE1, 0xE2}, 428}, /* ост */ + {{0xDD, 0xD8, 0xD5}, 419}, /* ние */ + {{0xDD, 0xDD, 0xDE}, 412}, /* нно */ + {{0xD0, 0xE5, 0xDE}, 396}, /* ахо */ + {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ + {{0xE0, 0xD0, 0xE5}, 386}, /* рах */ + {{0xE5, 0xDE, 0xD2}, 379}, /* хов */ + {{0xD5, 0xDB, 0xEC}, 365}, /* ель */ + {{0xD3, 0xDE, 0xD2}, 360}, /* гов */ + {{0xD2, 0xDE, 0xE0}, 356}, /* вор */ + {{0xD5, 0xE1, 0xE2}, 349}, /* ест */ + {{0xD0, 0xE2, 0xEC}, 345}, /* ать */ + {{0xE0, 0xD0, 0xD2}, 337}, /* рав */ + {{0xDF, 0xE0, 0xD8}, 330}, /* при */ + {{0xDF, 0xE0, 0xD5}, 323}, /* пре */ + {{0xD4, 0xDE, 0xD3}, 318}, /* дог */ + {{0xDD, 0xD5, 0xDD}, 310}, /* нен */ + {{0xDF, 0xE0, 0xD0}, 309}, /* пра */ + {{0xD2, 0xD0, 0xDD}, 304}, /* ван */ + {{0xD8, 0xE2, 0xD5}, 295}, /* ите */ + {{0xE2, 0xD2, 0xD5}, 281}, /* тве */ + {{0xDB, 0xD5, 0xDD}, 266}, /* лен */ + {{0xE1, 0xE2, 0xDE}, 261}, /* сто */ + {{0xE2, 0xD0, 0xE2}, 260}, /* тат */ + {{0xDD, 0xDD, 0xEB}, 260}, /* нны */ + {{0xDB, 0xEC, 0xDD}, 256}, /* льн */ + {{0xD2, 0xDE, 0xD7}, 255}, /* воз */ + {{0xD8, 0xDB, 0xD8}, 254}, /* или */ + {{0xD0, 0xE2, 0xD5}, 252}, /* ате */ + {{0xD5, 0xD3, 0xDE}, 241}, /* его */ + {{0xD5, 0xE2, 0xE1}, 238}, /* етс */ + {{0xDD, 0xDE, 0xE1}, 236}, /* нос */ + {{0xE9, 0xD5, 0xE1}, 235}, /* щес */ + {{0xDF, 0xDE, 0xDB}, 232}, /* пол */ + {{0xE0, 0xD0, 0xDD}, 231}, /* ран */ + {{0xDD, 0xDE, 0xD3}, 230}, /* ног */ + {{0xE1, 0xE2, 0xD0}, 229}, /* ста */ + {{0xE7, 0xD5, 0xDD}, 226}, /* чен */ + {{0xE2, 0xE0, 0xD5}, 224}, /* тре */ + {{0xD7, 0xDC, 0xD5}, 214}, /* зме */ + {{0xE3, 0xE9, 0xD5}, 212}, /* уще */ + {{0xE1, 0xE2, 0xD8}, 210}, /* сти */ + {{0xDA, 0xDE, 0xDC}, 207}, /* ком */ + {{0xDE, 0xE0, 0xDE}, 206}, /* оро */ + {{0xD2, 0xDB, 0xD5}, 195}, /* вле */ + {{0xD7, 0xD0, 0xDD}, 194}, /* зан */ + {{0xD0, 0xE1, 0xE2}, 193}, /* аст */ + {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ + {{0xE5, 0xE0, 0xD0}, 187}, /* хра */ + {{0xD0, 0xDD, 0xDD}, 182}, /* анн */ + {{0xD5, 0xE0, 0xD5}, 182}, /* ере */ + {{0xD2, 0xE0, 0xD5}, 178}, /* вре */ + {{0xDE, 0xD2, 0xD5}, 173}, /* ове */ + {{0xEC, 0xDD, 0xDE}, 173}, /* ьно */ + {{0xD2, 0xD5, 0xE0}, 172}, /* вер */ + {{0xDC, 0xD5, 0xDD}, 170}, /* мен */ + {{0xDB, 0xD8, 0xE6}, 168}, /* лиц */ + {{0xE2, 0xDE, 0xE0}, 167}, /* тор */ + {{0xE0, 0xD5, 0xDD}, 167}, /* рен */ + {{0xE9, 0xD5, 0xDD}, 165}, /* щен */ + {{0xDE, 0xD7, 0xDC}, 164}, /* озм */ + {{0xD5, 0xD4, 0xD0}, 163}, /* еда */ + {{0xE2, 0xD2, 0xD8}, 159}, /* тви */ + {{0xEF, 0xD7, 0xD0}, 159}, /* яза */ + {{0xD1, 0xEF, 0xD7}, 158}, /* бяз */ + {{0xDD, 0xD8, 0xD8}, 153}, /* нии */ + {{0xDD, 0xEB, 0xE5}, 153}, /* ных */ + {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ + {{0xDC, 0xD5, 0xE0}, 153}, /* мер */ + {{0xE1, 0xDB, 0xD8}, 150}, /* сли */ + {{0xE2, 0xDE, 0xD2}, 148}, /* тов */ + {{0xE2, 0xD2, 0xD0}, 147}, /* тва */ + {{0xDE, 0xE0, 0xD0}, 146}, /* ора */ + {{0xDD, 0xDE, 0xDC}, 144}, /* ном */ + {{0xD4, 0xD5, 0xDD}, 144}, /* ден */ + {{0xD0, 0xDD, 0xD5}, 142}, /* ане */ + {{0xDA, 0xDE, 0xDD}, 141}, /* кон */ + {{0xDB, 0xE3, 0xE7}, 141}, /* луч */ + {{0xDC, 0xE3, 0xE9}, 140}, /* мущ */ + {{0xDE, 0xD1, 0xEF}, 140}, /* обя */ + {{0xD2, 0xD0, 0xE2}, 138}, /* ват */ + {{0xD2, 0xD0, 0xE0}, 137}, /* вар */ + {{0xD5, 0xE9, 0xD5}, 137}, /* еще */ + {{0xDE, 0xE2, 0xE0}, 137}, /* отр */ + {{0xD4, 0xD5, 0xDB}, 137}, /* дел */ + {{0xDD, 0xEB, 0xDC}, 136}, /* ным */ + {{0xD8, 0xDC, 0xE3}, 136}, /* иму */ + {{0xC1, 0xE2, 0xD0}, 134}, /* Ста */ + {{0xE3, 0xE7, 0xD0}, 133}, /* уча */ + {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ + {{0xD5, 0xDB, 0xEF}, 130}, /* еля */ + {{0xE1, 0xDB, 0xE3}, 130}, /* слу */ + {{0xD7, 0xD0, 0xDA}, 130}, /* зак */ + {{0xE2, 0xDE, 0xEF}, 129}, /* тоя */ + {{0xDE, 0xDC, 0xD8}, 128}, /* оми */ + {{0xDC, 0xD5, 0xE9}, 128}, /* мещ */ + {{0xD5, 0xD4, 0xE3}, 127}, /* еду */ + {{0xD2, 0xD5, 0xDD}, 127}, /* вен */ + {{0xDD, 0xDE, 0xD2}, 127}, /* нов */ + {{0xDD, 0xDE, 0xD5}, 126}, /* ное */ + {{0xDE, 0xE2, 0xD2}, 125}, /* отв */ + {{0xDA, 0xD0, 0xD7}, 125}, /* каз */ + {{0xD0, 0xD5, 0xE2}, 125}, /* ает */ + {{0xE1, 0xDA, 0xDE}, 125}, /* ско */ + {{0xD5, 0xDD, 0xE2}, 124}, /* ент */ + {{0xDC, 0xDE, 0xE2}, 123}, /* мот */ + {{0xD0, 0xD2, 0xDB}, 122}, /* авл */ + {{0xE1, 0xDC, 0xDE}, 122}, /* смо */ + {{0xD8, 0xE7, 0xD8}, 121}, /* ичи */ + {{0xD1, 0xEB, 0xE2}, 120}, /* быт */ + {{0xE3, 0xE1, 0xDC}, 118}, /* усм */ + {{0xE1, 0xE1, 0xD8}, 117}, /* сси */ + {{0xD4, 0xE3, 0xE1}, 117}, /* дус */ + {{0xE5, 0xDE, 0xD4}, 117}, /* ход */ + {{0xE0, 0xD8, 0xE7}, 117}, /* рич */ + {{0xE7, 0xD5, 0xE1}, 115}, /* чес */ + {{0xD3, 0xE0, 0xD0}, 114}, /* гра */ + {{0xDF, 0xE0, 0xDE}, 114}, /* про */ + {{0xD4, 0xDE, 0xD2}, 113}, /* дов */ + {{0xD2, 0xD5, 0xE2}, 112}, /* вет */ + {{0xD5, 0xD4, 0xD5}, 112}, /* еде */ + {{0xE8, 0xD5, 0xDD}, 111}, /* шен */ + {{0xE7, 0xD8, 0xDD}, 110}, /* чин */ + {{0xDD, 0xD0, 0xE1}, 109}, /* нас */ + {{0xD8, 0xE2, 0xEC}, 105}, /* ить */ + {{0xE2, 0xD2, 0xDE}, 105}, /* тво */ + {{0xDA, 0xDB, 0xEE}, 104}, /* клю */ + {{0xE0, 0xD8, 0xE2}, 104}, /* рит */ + {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ + {{0xDB, 0xEE, 0xE7}, 104}, /* люч */ + {{0xE2, 0xDE, 0xDC}, 104}, /* том */ + {{0xE1, 0xDB, 0xD5}, 103}, /* сле */ + {{0xE1, 0xDF, 0xDE}, 102}, /* спо */ + {{0xDE, 0xDB, 0xDD}, 102}, /* олн */ + {{0xD5, 0xE1, 0xDB}, 102}, /* есл */ + {{0xD5, 0xE0, 0xD8}, 101}, /* ери */ + {{0xDD, 0xDE, 0xD9}, 101}, /* ной */ + {{0xE0, 0xDE, 0xDC}, 101}, /* ром */ + {{0xDE, 0xE2, 0xDE}, 99}, /* ото */ + {{0xDD, 0xEB, 0xD5}, 99}, /* ные */ + {{0xD7, 0xDD, 0xD0}, 99}, /* зна */ + {{0xD2, 0xDB, 0xEF}, 99}, /* вля */ + {{0xE2, 0xD5, 0xE0}, 98}, /* тер */ + {{0xE3, 0xDF, 0xE0}, 97}, /* упр */ + {{0xD0, 0xDA, 0xDE}, 96}, /* ако */ + {{0xDA, 0xDE, 0xD3}, 96}, /* ког */ + {{0xDD, 0xEB, 0xD9}, 96}, /* ный */ + {{0xDE, 0xE0, 0xE3}, 96}, /* ору */ + {{0xD5, 0xDB, 0xD5}, 95}, /* еле */ + {{0xD5, 0xE1, 0xDA}, 95}, /* еск */ + {{0xD0, 0xD7, 0xD0}, 95}, /* аза */ + {{0xD9, 0xE1, 0xE2}, 93}, /* йст */ + {{0xDF, 0xDE, 0xE0}, 93}, /* пор */ + {{0xDE, 0xD6, 0xD5}, 92}, /* оже */ + {{0xD8, 0xDD, 0xD5}, 91}, /* ине */ + {{0xE9, 0xD5, 0xD9}, 90}, /* щей */ + {{0xD6, 0xD4, 0xD5}, 90}, /* жде */ + {{0xDF, 0xD5, 0xE0}, 89}, /* пер */ + {{0xDD, 0xD8, 0xE2}, 89}, /* нит */ + {{0xDE, 0xDB, 0xEC}, 89}, /* оль */ + {{0xD0, 0xD6, 0xD4}, 88}, /* ажд */ + {{0xD6, 0xD5, 0xDD}, 87}, /* жен */ + {{0xDB, 0xD0, 0xD4}, 87}, /* лад */ + {{0xD0, 0xDC, 0xD8}, 87}, /* ами */ + {{0xDA, 0xDE, 0xE2}, 86}, /* кот */ + {{0xE7, 0xD0, 0xD5}, 85}, /* чае */ + {{0xD2, 0xD5, 0xE9}, 85}, /* вещ */ + {{0xD2, 0xD8, 0xEF}, 85}, /* вия */ + {{0xEF, 0xE9, 0xD5}, 85}, /* яще */ + {{0xD8, 0xD5, 0xDC}, 85}, /* ием */ + {{0xDA, 0xDB, 0xD0}, 85}, /* кла */ + {{0xD5, 0xD9, 0xE1}, 84}, /* ейс */ + {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ + {{0xD0, 0xD2, 0xDE}, 84}, /* аво */ + {{0xE0, 0xD0, 0xD6}, 83}, /* раж */ + {{0xDB, 0xEC, 0xE1}, 83}, /* льс */ + {{0xDE, 0xEF, 0xE9}, 82}, /* оящ */ + {{0xD5, 0xDD, 0xDE}, 81}, /* ено */ + {{0xD4, 0xE1, 0xE2}, 81}, /* дст */ + {{0xD4, 0xD5, 0xD9}, 80}, /* дей */ + {{0xE0, 0xD5, 0xD1}, 80}, /* реб */ + {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ + {{0xD5, 0xD4, 0xE1}, 79}, /* едс */ + {{0xD0, 0xE0, 0xD8}, 79}, /* ари */ + {{0xD4, 0xD0, 0xDD}, 79}, /* дан */ + {{0xDC, 0xDE, 0xD6}, 78}, /* мож */ + {{0xD8, 0xDC, 0xD5}, 78}, /* име */ + {{0xD8, 0xDD, 0xDE}, 78}, /* ино */ + {{0xE0, 0xD8, 0xDD}, 77}, /* рин */ + {{0xD4, 0xDE, 0xE1}, 77}, /* дос */ + {{0xDF, 0xDE, 0xE1}, 77}, /* пос */ + {{0xE2, 0xD0, 0xDA}, 77}, /* так */ + {{0xE9, 0xD5, 0xD3}, 77}, /* щег */ + {{0xD4, 0xD0, 0xE2}, 77}, /* дат */ + {{0xDF, 0xDB, 0xD0}, 76}, /* пла */ + {{0xE3, 0xE1, 0xDB}, 76}, /* усл */ + {{0xD8, 0xE6, 0xD0}, 76}, /* ица */ + {{0xE0, 0xDE, 0xD2}, 75}, /* ров */ + {{0xED, 0xE2, 0xDE}, 75}, /* это */ + {{0xE3, 0xE7, 0xD5}, 74}, /* уче */ + {{0xD4, 0xDE, 0xDB}, 73}, /* дол */ + {{0xEC, 0xDD, 0xEB}, 73}, /* ьны */ + {{0xE0, 0xD0, 0xD7}, 73}, /* раз */ + {{0xDC, 0xD8, 0xE1}, 73}, /* мис */ + {{0xD0, 0xDD, 0xDE}, 72}, /* ано */ + {{0xE1, 0xE0, 0xDE}, 72}, /* сро */ + {{0xD0, 0xD2, 0xD8}, 72}, /* ави */ + {{0xE2, 0xEC, 0xD8}, 71}, /* тьи */ + {{0xEE, 0xE7, 0xD5}, 70}, /* юче */ + {{0xE1, 0xDA, 0xDB}, 70}, /* скл */ + {{0xD8, 0xE1, 0xE1}, 70}, /* исс */ + {{0xD6, 0xD5, 0xE2}, 69}, /* жет */ + {{0xD5, 0xD4, 0xDE}, 69}, /* едо */ + {{0xDB, 0xD5, 0xD4}, 69}, /* лед */ + {{0xDB, 0xDE, 0xD2}, 69}, /* лов */ + {{0xEE, 0xE9, 0xD8}, 68}, /* ющи */ + {{0xD8, 0xD1, 0xDE}, 68}, /* ибо */ + {{0xDB, 0xD0, 0xE2}, 67}, /* лат */ + {{0xE0, 0xDE, 0xDA}, 67}, /* рок */ + {{0xD0, 0xDA, 0xDB}, 67}, /* акл */ + {{0xE0, 0xD8, 0xE9}, 67}, /* рищ */ + {{0xD1, 0xDE, 0xD2}, 67}, /* бов */ + {{0xD8, 0xE1, 0xDA}, 67}, /* иск */ + {{0xD5, 0xD1, 0xDE}, 67}, /* ебо */ + {{0xDB, 0xEC, 0xD7}, 67}, /* льз */ + {{0xE3, 0xDA, 0xD0}, 67}, /* ука */ + {{0xDB, 0xD8, 0xD1}, 66}, /* либ */ + {{0xDE, 0xDC, 0xE3}, 66}, /* ому */ + {{0xDE, 0xD2, 0xDB}, 66}, /* овл */ + {{0xE2, 0xDD, 0xDE}, 65}, /* тно */ + {{0xD2, 0xDE, 0xD9}, 64}, /* вой */ + {{0xE2, 0xDE, 0xD3}, 64}, /* тог */ + {{0xE1, 0xDB, 0xDE}, 64}, /* сло */ + {{0xDE, 0xD7, 0xDD}, 64}, /* озн */ + {{0xE1, 0xDE, 0xDE}, 64}, /* соо */ + {{0xD7, 0xD0, 0xE2}, 63}, /* зат */ + {{0xD8, 0xE1, 0xDF}, 63}, /* исп */ + {{0xD0, 0xE7, 0xD5}, 63}, /* аче */ + {{0xDD, 0xD8, 0xEE}, 63}, /* нию */ + {{0xDE, 0xDD, 0xD5}, 63}, /* оне */ + {{0xDE, 0xDB, 0xD6}, 62}, /* олж */ + {{0xDE, 0xD2, 0xE9}, 61}, /* овщ */ + {{0xE0, 0xD0, 0xE1}, 61}, /* рас */ + {{0xD2, 0xD8, 0xD4}, 61}, /* вид */ + {{0xD2, 0xE9, 0xD8}, 61}, /* вщи */ + {{0xE1, 0xDD, 0xDE}, 61}, /* сно */ + {{0xD8, 0xE6, 0xDE}, 61}, /* ицо */ + {{0xD8, 0xE7, 0xD5}, 61}, /* иче */ + {{0xD0, 0xD2, 0xD5}, 61}, /* аве */ + {{0xD3, 0xDB, 0xD0}, 61}, /* гла */ + {{0xE7, 0xD5, 0xE2}, 61}, /* чет */ + {{0xE9, 0xD8, 0xDA}, 61}, /* щик */ + {{0xE0, 0xE3, 0xD3}, 60}, /* руг */ + {{0xE2, 0xD0, 0xDD}, 60}, /* тан */ + {{0xD8, 0xDC, 0xDE}, 60}, /* имо */ + {{0xD0, 0xDB, 0xEC}, 60}, /* аль */ + {{0xDE, 0xD2, 0xD8}, 60}, /* ови */ + {{0xD6, 0xD4, 0xD0}, 60}, /* жда */ + {{0xDF, 0xDE, 0xD2}, 60}, /* пов */ + {{0xD5, 0xDC, 0xE3}, 60}, /* ему */ + {{0xEF, 0xE2, 0xD5}, 60}, /* яте */ + {{0xE1, 0xD8, 0xD8}, 59}, /* сии */ + {{0xD1, 0xDE, 0xE2}, 59}, /* бот */ + {{0xD2, 0xEB, 0xDF}, 59}, /* вып */ + {{0xD0, 0xD1, 0xDE}, 59}, /* або */ + {{0xDB, 0xEF, 0xEE}, 59}, /* ляю */ + {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ + {{0xDE, 0xD4, 0xD5}, 58}, /* оде */ + {{0xD8, 0xDD, 0xD8}, 58}, /* ини */ + {{0xE0, 0xD0, 0xE2}, 58}, /* рат */ + {{0xEF, 0xD2, 0xDB}, 58}, /* явл */ + {{0xDD, 0xD0, 0xD3}, 57}, /* наг */ + {{0xD4, 0xE0, 0xE3}, 57}, /* дру */ + {{0xE0, 0xD0, 0xD1}, 57}, /* раб */ + {{0xD0, 0xD3, 0xE0}, 57}, /* агр */ + {{0xD8, 0xDE, 0xDD}, 57}, /* ион */ + {{0xDC, 0xD5, 0xE1}, 57}, /* мес */ + {{0xD0, 0xE6, 0xD8}, 56}, /* аци */ + {{0xDE, 0xE1, 0xE3}, 56}, /* осу */ + {{0xDA, 0xDE, 0xD9}, 55}, /* кой */ + {{0xE1, 0xD2, 0xDE}, 55}, /* сво */ + {{0xD7, 0xDE, 0xD2}, 55}, /* зов */ + {{0xDE, 0xDF, 0xE0}, 54}, /* опр */ + {{0xE1, 0xDE, 0xD1}, 54}, /* соб */ + {{0xD2, 0xDF, 0xE0}, 54}, /* впр */ + {{0xDB, 0xDD, 0xD5}, 54}, /* лне */ + {{0xDE, 0xDC, 0xDC}, 54}, /* омм */ + {{0xD5, 0xE0, 0xD0}, 54}, /* ера */ + {{0xE7, 0xD8, 0xE2}, 54}, /* чит */ + {{0xD5, 0xE0, 0xE7}, 54}, /* ерч */ + {{0xE0, 0xE7, 0xD5}, 54}, /* рче */ + {{0xD0, 0xE2, 0xD8}, 54}, /* ати */ + {{0xDD, 0xD8, 0xDA}, 54}, /* ник */ + {{0xDC, 0xDC, 0xD5}, 54}, /* мме */ + {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ + {{0xE2, 0xD5, 0xDD}, 53}, /* тен */ + {{0xD2, 0xD5, 0xD4}, 53}, /* вед */ + {{0xE1, 0xDE, 0xD2}, 52}, /* сов */ + {{0xD0, 0xD6, 0xD5}, 52}, /* аже */ + {{0xDE, 0xDA, 0xD0}, 52}, /* ока */ + {{0xEB, 0xDC, 0xD8}, 52}, /* ыми */ + {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ + {{0xDE, 0xDE, 0xE2}, 52}, /* оот */ + {{0xDC, 0xD8, 0xE2}, 52}, /* мит */ + {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ + {{0xD2, 0xE8, 0xD5}, 51}, /* вше */ + {{0xE1, 0xD8, 0xDE}, 51}, /* сио */ + {{0xDE, 0xDD, 0xDE}, 51}, /* оно */ + {{0xD0, 0xD2, 0xD0}, 51}, /* ава */ + {{0xD0, 0xE9, 0xD5}, 51}, /* аще */ + {{0xDB, 0xEF, 0xD5}, 50}, /* ляе */ + {{0xD5, 0xDD, 0xD5}, 50}, /* ене */ + {{0xDE, 0xD4, 0xD8}, 50}, /* оди */ + {{0xDF, 0xE3, 0xDD}, 49}, /* пун */ + {{0xDB, 0xD8, 0xE7}, 49}, /* лич */ + {{0xD2, 0xDE, 0xDC}, 49}, /* вом */ + {{0xDD, 0xDA, 0xE2}, 49}, /* нкт */ + {{0xDD, 0xD5, 0xE1}, 49}, /* нес */ + {{0xD2, 0xD8, 0xDB}, 49}, /* вил */ + {{0xD5, 0xD6, 0xD4}, 49}, /* ежд */ + {{0xE0, 0xD5, 0xE1}, 49}, /* рес */ + {{0xEE, 0xE9, 0xD5}, 49}, /* юще */ + {{0xEC, 0xD7, 0xDE}, 49}, /* ьзо */ + {{0xDF, 0xDE, 0xE2}, 49}, /* пот */ + {{0xE3, 0xDD, 0xDA}, 49}, /* унк */ + {{0xE1, 0xE2, 0xD5}, 49}, /* сте */ + {{0xDA, 0xDE, 0xD2}, 49}, /* ков */ + {{0xDE, 0xE1, 0xDB}, 48}, /* осл */ + {{0xEF, 0xD5, 0xE2}, 48}, /* яет */ + {{0xB5, 0xE1, 0xDB}, 48}, /* Есл */ + {{0xBF, 0xE0, 0xD8}, 48}, /* При */ + {{0xE2, 0xD0, 0xD2}, 48}, /* тав */ + {{0xDD, 0xD5, 0xE0}, 48}, /* нер */ + {{0xE7, 0xDD, 0xDE}, 47}, /* чно */ + {{0xDF, 0xDE, 0xD4}, 47}, /* под */ + {{0xDD, 0xE2, 0xD0}, 47}, /* нта */ + {{0xD8, 0xE9, 0xD5}, 47}, /* ище */ + {{0xDE, 0xD1, 0xE9}, 47}, /* общ */ + {{0xD0, 0xD7, 0xDC}, 47}, /* азм */ + {{0xD6, 0xDD, 0xDE}, 47}, /* жно */ + {{0xD2, 0xD8, 0xD8}, 46}, /* вии */ + {{0xE0, 0xD0, 0xE9}, 46}, /* ращ */ + {{0xDE, 0xE0, 0xD5}, 46}, /* оре */ + {{0xD2, 0xE8, 0xD8}, 46}, /* вши */ + {{0xD5, 0xDA, 0xE1}, 46}, /* екс */ + {{0xD2, 0xDE, 0xD3}, 46}, /* вог */ + {{0xE7, 0xE2, 0xDE}, 46}, /* что */ + {{0xD8, 0xE7, 0xDD}, 45}, /* ичн */ + {{0xDB, 0xD5, 0xDC}, 45}, /* лем */ + {{0xDC, 0xDE, 0xD3}, 45}, /* мог */ + {{0xE2, 0xD2, 0xDB}, 45}, /* твл */ + {{0xD4, 0xDB, 0xD5}, 45}, /* дле */ + {{0xD4, 0xDB, 0xEF}, 45}, /* для */ + {{0xE0, 0xD5, 0xE2}, 45}, /* рет */ + {{0xD0, 0xE0, 0xD0}, 45}, /* ара */ + {{0xDD, 0xEF, 0xE2}, 44}, /* нят */ + {{0xD5, 0xE7, 0xD5}, 44}, /* ече */ + {{0xDE, 0xE2, 0xD5}, 44}, /* оте */ + {{0xDE, 0xE0, 0xEB}, 44}, /* оры */ + {{0xDE, 0xE1, 0xDD}, 43}, /* осн */ + {{0xDE, 0xD1, 0xDE}, 43}, /* обо */ + {{0xDE, 0xD3, 0xDB}, 43}, /* огл */ + {{0xD8, 0xDD, 0xEB}, 43}, /* ины */ + {{0xD5, 0xE1, 0xE1}, 43}, /* есс */ + {{0xDE, 0xD1, 0xE0}, 43}, /* обр */ + {{0xDA, 0xE0, 0xD0}, 43}, /* кра */ + {{0xD8, 0xEF, 0xDC}, 43}, /* иям */ + {{0xD0, 0xDB, 0xDE}, 43}, /* ало */ + {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ + {{0xDE, 0xE0, 0xD3}, 43}, /* орг */ + {{0xE7, 0xD0, 0xEF}, 42}, /* чая */ + {{0xDD, 0xD8, 0xDC}, 42}, /* ним */ + {{0xD8, 0xD7, 0xDD}, 42}, /* изн */ + {{0xDF, 0xDE, 0xDA}, 42}, /* пок */ + {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ + {{0xD5, 0xDB, 0xEE}, 42}, /* елю */ + {{0xE2, 0xD8, 0xE2}, 42}, /* тит */ + {{0xE6, 0xD5, 0xDD}, 42}, /* цен */ + {{0xE7, 0xD0, 0xE1}, 42}, /* час */ + {{0xD3, 0xD0, 0xDD}, 42}, /* ган */ + {{0xE0, 0xD3, 0xD0}, 42}, /* рга */ + {{0xE1, 0xE2, 0xDD}, 42}, /* стн */ + {{0xE0, 0xD5, 0xD6}, 42}, /* реж */ + {{0xE3, 0xDC, 0xDC}, 42}, /* умм */ + {{0xE2, 0xD2, 0xE3}, 41}, /* тву */ + {{0xE2, 0xE3, 0xDF}, 41}, /* туп */ + {{0xE1, 0xDA, 0xD8}, 40}, /* ски */ + {{0xD4, 0xD5, 0xDA}, 40}, /* дек */ + {{0xDB, 0xD5, 0xD6}, 40}, /* леж */ + {{0xD5, 0xE1, 0xD5}, 40}, /* есе */ + {{0xD2, 0xD8, 0xD5}, 40}, /* вие */ + {{0xE2, 0xDA, 0xD0}, 40}, /* тка */ + {{0xD5, 0xDA, 0xE0}, 40}, /* екр */ + {{0xDE, 0xD4, 0xDE}, 40}, /* одо */ + {{0xDA, 0xE1, 0xD0}, 40}, /* кса */ + {{0xE0, 0xD5, 0xDA}, 40}, /* рек */ + {{0xDD, 0xE2, 0xD5}, 40}, /* нте */ + {{0xE3, 0xD3, 0xD8}, 40}, /* уги */ + {{0xD1, 0xEB, 0xDB}, 40}, /* был */ + {{0xD8, 0xDD, 0xEF}, 40}, /* иня */ + {{0xD5, 0xE9, 0xD8}, 39}, /* ещи */ + {{0xD3, 0xD5, 0xDD}, 39}, /* ген */ + {{0xBA, 0xDE, 0xD4}, 39}, /* Код */ + {{0xD4, 0xD8, 0xE2}, 39}, /* дит */ + {{0xE1, 0xE5, 0xDE}, 39}, /* схо */ + {{0xD8, 0xDD, 0xE2}, 39}, /* инт */ + {{0xE1, 0xE3, 0xDC}, 39}, /* сум */ + {{0xE0, 0xDE, 0xDD}, 39}, /* рон */ + {{0xDE, 0xE2, 0xDA}, 39}, /* отк */ + {{0xD4, 0xDE, 0xDA}, 39}, /* док */ + {{0xD8, 0xDB, 0xD0}, 38}, /* ила */ + {{0xE6, 0xD5, 0xE1}, 38}, /* цес */ + {{0xD8, 0xDA, 0xD0}, 38}, /* ика */ + {{0xD7, 0xDD, 0xD8}, 38}, /* зни */ + {{0xDE, 0xD2, 0xEB}, 38}, /* овы */ + {{0xDB, 0xD6, 0xDD}, 38}, /* лжн */ + {{0xE3, 0xDF, 0xDB}, 38}, /* упл */ + {{0xD3, 0xD4, 0xD0}, 37}, /* гда */ + {{0xDB, 0xD0, 0xD6}, 37}, /* лаж */ + {{0xD6, 0xD5, 0xD4}, 37}, /* жед */ + {{0xD1, 0xD5, 0xD7}, 37}, /* без */ + {{0xD4, 0xD5, 0xE2}, 37}, /* дет */ + {{0xDE, 0xE0, 0xEF}, 37}, /* оря */ + {{0xE0, 0xDE, 0xE1}, 37}, /* рос */ + {{0xDE, 0xD1, 0xDB}, 37}, /* обл */ + {{0xE6, 0xD8, 0xD8}, 37}, /* ции */ + {{0xD4, 0xDE, 0xDC}, 37}, /* дом */ + {{0xDD, 0xE6, 0xD5}, 37}, /* нце */ + {{0xE8, 0xD5, 0xD3}, 37}, /* шег */ + {{0xDB, 0xDE, 0xD6}, 37}, /* лож */ + {{0xDE, 0xDD, 0xD0}, 37}, /* она */ + {{0xDE, 0xDA, 0xDB}, 37}, /* окл */ + {{0xDE, 0xD3, 0xD4}, 37}, /* огд */ + {{0xE0, 0xDE, 0xD4}, 37}, /* род */ + {{0xD5, 0xDD, 0xD0}, 37}, /* ена */ + {{0xDE, 0xDD, 0xE6}, 37}, /* онц */ + {{0xDE, 0xE2, 0xDD}, 37}, /* отн */ + {{0xE1, 0xDE, 0xD3}, 37}, /* сог */ + {{0xD5, 0xD2, 0xE8}, 37}, /* евш */ + {{0xD2, 0xD8, 0xE2}, 36}, /* вит */ + {{0xD5, 0xE0, 0xDF}, 36}, /* ерп */ + {{0xDE, 0xD4, 0xD0}, 36}, /* ода */ + {{0xD5, 0xE2, 0xD5}, 36}, /* ете */ + {{0xDD, 0xD5, 0xDE}, 36}, /* нео */ + {{0xE0, 0xDF, 0xD5}, 36}, /* рпе */ + {{0xD5, 0xE0, 0xE8}, 36}, /* ерш */ + {{0xD8, 0xDC, 0xD8}, 36}, /* ими */ + {{0xD8, 0xD2, 0xE8}, 36}, /* ивш */ + {{0xEB, 0xDF, 0xDB}, 36}, /* ыпл */ + {{0xDF, 0xD5, 0xD2}, 36}, /* пев */ + {{0xD0, 0xD4, 0xD0}, 36}, /* ада */ + {{0xDC, 0xDE, 0xE1}, 35}, /* мос */ + {{0xDE, 0xD1, 0xE1}, 35}, /* обс */ + {{0xDD, 0xD5, 0xD4}, 34}, /* нед */ + {{0xD8, 0xDA, 0xDE}, 34}, /* ико */ + {{0xE9, 0xD8, 0xDC}, 34}, /* щим */ + {{0xD4, 0xD5, 0xE0}, 34}, /* дер */ + {{0xE1, 0xDA, 0xD0}, 34}, /* ска */ + {{0xDE, 0xE0, 0xDC}, 34}, /* орм */ + {{0xE3, 0xDC, 0xD5}, 34}, /* уме */ + {{0xDE, 0xDE, 0xD1}, 34}, /* ооб */ + {{0xE0, 0xD8, 0xE1}, 34}, /* рис */ + {{0xDE, 0xD1, 0xEA}, 33}, /* объ */ + {{0xDE, 0xDB, 0xE3}, 33}, /* олу */ + {{0xEA, 0xEF, 0xD2}, 33}, /* ъяв */ + {{0xE0, 0xD5, 0xDC}, 33}, /* рем */ + {{0xE9, 0xD8, 0xE5}, 33}, /* щих */ + {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ + {{0xDA, 0xD6, 0xD5}, 33}, /* кже */ + {{0xD8, 0xD4, 0xD5}, 33}, /* иде */ + {{0xD1, 0xE1, 0xE2}, 33}, /* бст */ + {{0xD0, 0xDA, 0xD6}, 33}, /* акж */ + {{0xD2, 0xE3, 0xEE}, 33}, /* вую */ + {{0xD0, 0xE1, 0xE5}, 33}, /* асх */ + {{0xD0, 0xDD, 0xD0}, 32}, /* ана */ + {{0xDD, 0xD0, 0xD4}, 32}, /* над */ + {{0xDE, 0xD1, 0xD5}, 32}, /* обе */ + {{0xEB, 0xE2, 0xDA}, 32}, /* ытк */ + {{0xED, 0xE2, 0xD8}, 32}, /* эти */ + {{0xDE, 0xD6, 0xDD}, 32}, /* ожн */ + {{0xD0, 0xE2, 0xEB}, 31}, /* аты */ + {{0xE1, 0xD4, 0xD5}, 31}, /* сде */ + {{0xD0, 0xEE, 0xE2}, 31}, /* ают */ + {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ + {{0xDE, 0xEF, 0xE2}, 31}, /* оят */ + {{0xD5, 0xE2, 0xEC}, 31}, /* еть */ + {{0xD0, 0xD3, 0xD5}, 31}, /* аге */ + {{0xE7, 0xE0, 0xD5}, 31}, /* чре */ + {{0xD5, 0xDD, 0xEB}, 31}, /* ены */ + {{0xE3, 0xD1, 0xEB}, 31}, /* убы */ + {{0xD8, 0xE1, 0xE2}, 30}, /* ист */ + {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ + {{0xE0, 0xEF, 0xD4}, 30}, /* ряд */ + {{0xD3, 0xDE, 0xE1}, 30}, /* гос */ + {{0xD8, 0xDC, 0xD0}, 30}, /* има */ + {{0xD7, 0xD0, 0xE1}, 30}, /* зас */ + {{0xD0, 0xEE, 0xE9}, 30}, /* ающ */ + {{0xDE, 0xD7, 0xD2}, 30}, /* озв */ + {{0xD5, 0xD4, 0xD8}, 30}, /* еди */ + {{0xDE, 0xDC, 0xD5}, 30}, /* оме */ + {{0xDD, 0xD8, 0xD9}, 30}, /* ний */ + {{0xE1, 0xE3, 0xD4}, 30}, /* суд */ + {{0xD7, 0xD4, 0xDE}, 29}, /* здо */ + {{0xE1, 0xD2, 0xD8}, 29}, /* сви */ + {{0xDE, 0xDB, 0xD8}, 29}, /* оли */ + {{0xDE, 0xD2, 0xEC}, 29}, /* овь */ + {{0xD2, 0xD8, 0xD9}, 29}, /* вий */ + {{0xD4, 0xDE, 0xE0}, 29}, /* дор */ + {{0xD4, 0xD5, 0xEF}, 29}, /* дея */ + {{0xD5, 0xEF, 0xE2}, 29}, /* еят */ + {{0xE6, 0xDE, 0xDC}, 29}, /* цом */ + {{0xD8, 0xD7, 0xD0}, 28}, /* иза */ + {{0xE1, 0xE7, 0xD5}, 28}, /* сче */ + {{0xDA, 0xE2, 0xD0}, 28}, /* кта */ + {{0xDE, 0xD4, 0xDD}, 28}, /* одн */ + {{0xD1, 0xDB, 0xD0}, 28}, /* бла */ + {{0xDE, 0xD4, 0xDB}, 28}, /* одл */ + {{0xD8, 0xE2, 0xD0}, 28}, /* ита */ + {{0xB4, 0xDE, 0xD3}, 28}, /* Дог */ + {{0xDE, 0xE1, 0xDE}, 28}, /* осо */ + {{0xDD, 0xDE, 0xE8}, 28}, /* нош */ + {{0xDA, 0xE3, 0xE0}, 28}, /* кур */ + {{0xD8, 0xDD, 0xD0}, 28}, /* ина */ + {{0xDE, 0xE8, 0xD5}, 28}, /* оше */ + {{0xDD, 0xD0, 0xDB}, 28}, /* нал */ + {{0xDD, 0xD8, 0xD7}, 27}, /* низ */ + {{0xD7, 0xD2, 0xE0}, 27}, /* звр */ + {{0xD2, 0xE0, 0xD0}, 27}, /* вра */ + {{0xDB, 0xD5, 0xE2}, 27}, /* лет */ + {{0xD5, 0xE9, 0xEC}, 27}, /* ещь */ + {{0xE0, 0xD8, 0xD4}, 27}, /* рид */ + {{0xD4, 0xDD, 0xDE}, 27}, /* дно */ + {{0xE0, 0xD8, 0xDE}, 27}, /* рио */ + {{0xDE, 0xD8, 0xDC}, 27}, /* оим */ + {{0xD5, 0xE0, 0xD6}, 27}, /* ерж */ + {{0xE3, 0xD2, 0xD5}, 26}, /* уве */ + {{0xDE, 0xDD, 0xDA}, 26}, /* онк */ + {{0xD5, 0xDB, 0xDA}, 26}, /* елк */ + {{0xDB, 0xD0, 0xD2}, 26}, /* лав */ + {{0xD0, 0xE2, 0xDE}, 26}, /* ато */ + {{0xEF, 0xDC, 0xD8}, 26}, /* ями */ + {{0xDC, 0xDC, 0xEB}, 26}, /* ммы */ + {{0xD5, 0xE1, 0xDF}, 26}, /* есп */ + {{0xDD, 0xDA, 0xE3}, 26}, /* нку */ + {{0xD8, 0xE6, 0xE3}, 25}, /* ицу */ + {{0xD4, 0xE1, 0xDA}, 25}, /* дск */ + {{0xDD, 0xD8, 0xDD}, 25}, /* нин */ + {{0xDF, 0xDB, 0xD5}, 25}, /* пле */ + {{0xE4, 0xDE, 0xE0}, 25}, /* фор */ + {{0xDB, 0xD0, 0xE1}, 25}, /* лас */ + {{0xD4, 0xD8, 0xDC}, 25}, /* дим */ + {{0xD5, 0xE1, 0xEF}, 25}, /* еся */ + {{0xDD, 0xD8, 0xE7}, 25}, /* нич */ + {{0xDE, 0xD2, 0xE0}, 25}, /* овр */ + {{0xD2, 0xE1, 0xDB}, 25}, /* всл */ + {{0xE0, 0xE8, 0xD5}, 25}, /* рше */ + {{0xD5, 0xE9, 0xD0}, 25}, /* еща */ + {{0xD6, 0xDD, 0xEB}, 25}, /* жны */ + {{0xE0, 0xD8, 0xDC}, 25}, /* рим */ + {{0xD7, 0xD0, 0xE6}, 25}, /* зац */ + {{0xD1, 0xE9, 0xD5}, 25}, /* бще */ + {{0xD0, 0xDA, 0xE2}, 25}, /* акт */ + {{0xD0, 0xD4, 0xE1}, 25}, /* адс */ + {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ + {{0xE9, 0xD8, 0xD5}, 25}, /* щие */ + {{0xD6, 0xD8, 0xE2}, 24}, /* жит */ + {{0xD1, 0xE0, 0xD5}, 24}, /* бре */ + {{0xE3, 0xD3, 0xDE}, 24}, /* уго */ + {{0xD8, 0xEF, 0xE5}, 24}, /* иях */ + {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ + {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ + {{0xD2, 0xDE, 0xD2}, 24}, /* вов */ + {{0xDE, 0xE7, 0xDD}, 24}, /* очн */ + {{0xD2, 0xDE, 0xDE}, 24}, /* воо */ + {{0xDE, 0xD4, 0xEB}, 24}, /* оды */ + {{0xDB, 0xDE, 0xD3}, 24}, /* лог */ + {{0xD2, 0xD0, 0xD5}, 24}, /* вае */ + {{0xD0, 0xEF, 0xE5}, 24}, /* аях */ + {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ + {{0xD4, 0xD8, 0xE7}, 24}, /* дич */ + {{0xDA, 0xD8, 0xE5}, 24}, /* ких */ + {{0xE6, 0xD0, 0xDC}, 24}, /* цам */ + {{0xD8, 0xD7, 0xD2}, 24}, /* изв */ + {{0xE2, 0xD8, 0xD2}, 24}, /* тив */ + {{0xD5, 0xDE, 0xD1}, 24}, /* еоб */ + {{0xE1, 0xDE, 0xE1}, 24}, /* сос */ + {{0xE8, 0xD8, 0xDC}, 24}, /* шим */ + {{0xEB, 0xDF, 0xDE}, 24}, /* ыпо */ + {{0xD5, 0xD6, 0xD0}, 24}, /* ежа */ + {{0xE2, 0xDE, 0xD8}, 24}, /* тои */ + {{0xDA, 0xE2, 0xDE}, 24}, /* кто */ + {{0xD5, 0xE7, 0xD0}, 24}, /* еча */ + {{0xD8, 0xD4, 0xD8}, 24}, /* иди */ + {{0xD1, 0xE9, 0xD8}, 23}, /* бщи */ + {{0xE2, 0xEC, 0xD5}, 23}, /* тье */ + {{0xD1, 0xEA, 0xEF}, 23}, /* бъя */ + {{0xDD, 0xD0, 0xE7}, 23}, /* нач */ + {{0xE2, 0xD5, 0xE7}, 23}, /* теч */ + {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ + {{0xD2, 0xD5, 0xE7}, 23}, /* веч */ + {{0xD5, 0xDC, 0xD5}, 23}, /* еме */ + {{0xDE, 0xD1, 0xE5}, 23}, /* обх */ + {{0xD1, 0xE5, 0xDE}, 23}, /* бхо */ + {{0xD4, 0xD0, 0xD5}, 23}, /* дае */ + {{0xE0, 0xD5, 0xD7}, 23}, /* рез */ + {{0xDA, 0xD0, 0xD6}, 22}, /* каж */ + {{0xDE, 0xDA, 0xE3}, 22}, /* оку */ + {{0xD0, 0xDC, 0xD5}, 22}, /* аме */ + {{0xDD, 0xD5, 0xD7}, 22}, /* нез */ + {{0xEB, 0xD2, 0xD0}, 22}, /* ыва */ + {{0xE1, 0xD2, 0xEF}, 22}, /* свя */ + {{0xE0, 0xD0, 0xD4}, 22}, /* рад */ + {{0xD5, 0xD7, 0xD0}, 22}, /* еза */ + {{0xD8, 0xD2, 0xD0}, 22}, /* ива */ + {{0xDA, 0xD0, 0xDC}, 22}, /* кам */ + {{0xDD, 0xD5, 0xDC}, 22}, /* нем */ + {{0xE2, 0xDA, 0xDE}, 22}, /* тко */ + {{0xD7, 0xD2, 0xD5}, 22}, /* зве */ + {{0xD2, 0xEF, 0xD7}, 22}, /* вяз */ + {{0xEF, 0xE2, 0xD8}, 22}, /* яти */ + {{0xDE, 0xE5, 0xE0}, 22}, /* охр */ + {{0xE0, 0xDE, 0xE2}, 22}, /* рот */ + {{0xDE, 0xDB, 0xD5}, 22}, /* оле */ + {{0xD1, 0xE0, 0xD0}, 22}, /* бра */ + {{0xD0, 0xD5, 0xDC}, 22}, /* аем */ + {{0xDB, 0xD0, 0xE8}, 21}, /* лаш */ + {{0xD8, 0xD7, 0xDC}, 21}, /* изм */ + {{0xD3, 0xE3, 0xE2}, 21}, /* гут */ + {{0xDE, 0xD6, 0xD4}, 21}, /* ожд */ + {{0xDA, 0xD0, 0xDA}, 21}, /* как */ + {{0xDA, 0xD0, 0xE7}, 21}, /* кач */ + {{0xDD, 0xD0, 0xDC}, 21}, /* нам */ + {{0xD4, 0xDE, 0xE5}, 21}, /* дох */ + {{0xDE, 0xE5, 0xDE}, 21}, /* охо */ + {{0xEE, 0xE0, 0xD8}, 21}, /* юри */ + {{0xD2, 0xD0, 0xDC}, 21}, /* вам */ + {{0xD7, 0xDC, 0xDE}, 21}, /* змо */ + {{0xD4, 0xDA, 0xD5}, 21}, /* дке */ + {{0xD1, 0xD0, 0xDD}, 21}, /* бан */ + {{0xD5, 0xDB, 0xD8}, 21}, /* ели */ + {{0xE0, 0xD8, 0xD7}, 21}, /* риз */ + {{0xDB, 0xDD, 0xDE}, 21}, /* лно */ + {{0xD2, 0xEB, 0xE8}, 21}, /* выш */ + {{0xD4, 0xE6, 0xD0}, 21}, /* дца */ + {{0xEF, 0xD4, 0xDA}, 21}, /* ядк */ + {{0xDE, 0xE2, 0xE1}, 21}, /* отс */ + {{0xE2, 0xD5, 0xD9}, 21}, /* тей */ + {{0xD0, 0xDD, 0xDA}, 21}, /* анк */ + {{0xDD, 0xD5, 0xD3}, 21}, /* нег */ + {{0xE6, 0xD0, 0xE2}, 21}, /* цат */ + {{0xD5, 0xDC, 0xEB}, 21}, /* емы */ + {{0xD2, 0xDE, 0xD5}, 21}, /* вое */ + {{0xD4, 0xD0, 0xE7}, 21}, /* дач */ + {{0xDE, 0xD3, 0xE3}, 21}, /* огу */ + {{0xDB, 0xD6, 0xD5}, 21}, /* лже */ + {{0xE2, 0xDD, 0xD8}, 21}, /* тни */ + {{0xD7, 0xD0, 0xD2}, 21}, /* зав */ + {{0xD2, 0xD5, 0xE1}, 21}, /* вес */ + {{0xE1, 0xD0, 0xDC}, 20}, /* сам */ + {{0xD0, 0xE0, 0xDD}, 20}, /* арн */ + {{0xE7, 0xDD, 0xEB}, 20}, /* чны */ + {{0xE1, 0xE0, 0xD5}, 20}, /* сре */ + {{0xE2, 0xD8, 0xEF}, 20}, /* тия */ + {{0xD8, 0xE1, 0xDB}, 20}, /* исл */ + {{0xC1, 0xE2, 0xE0}, 20}, /* Стр */ + {{0xDD, 0xE2, 0xDE}, 20}, /* нто */ + {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ + {{0xD0, 0xE8, 0xD5}, 20}, /* аше */ + {{0xD5, 0xDB, 0xD0}, 20}, /* ела */ + {{0xE3, 0xD4, 0xDE}, 20}, /* удо */ + {{0xD6, 0xD8, 0xD7}, 19}, /* жиз */ + {{0xDF, 0xD8, 0xE1}, 19}, /* пис */ + {{0xD0, 0xD8, 0xDC}, 19}, /* аим */ + {{0xE7, 0xD8, 0xE1}, 19}, /* чис */ + {{0xD5, 0xD6, 0xD8}, 19}, /* ежи */ + {{0xD2, 0xE1, 0xD5}, 19}, /* все */ + {{0xDB, 0xEC, 0xDA}, 19}, /* льк */ + {{0xD0, 0xE2, 0xE3}, 19}, /* ату */ + {{0xE3, 0xD4, 0xD0}, 19}, /* уда */ + {{0xE8, 0xD8, 0xD9}, 19}, /* ший */ + {{0xD7, 0xD0, 0xE0}, 19}, /* зар */ + {{0xD5, 0xD4, 0xDD}, 19}, /* едн */ + {{0xD0, 0xD2, 0xE8}, 19}, /* авш */ + {{0xE0, 0xDE, 0xD8}, 19}, /* рои */ + {{0xD8, 0xD4, 0xD0}, 19}, /* ида */ + {{0xD0, 0xE0, 0xDE}, 19}, /* аро */ + {{0xE2, 0xDE, 0xD9}, 19}, /* той */ + {{0xD6, 0xD0, 0xE9}, 19}, /* жащ */ + {{0xD5, 0xE1, 0xDE}, 19}, /* есо */ + {{0xDF, 0xD0, 0xDB}, 19}, /* пал */ + {{0xE9, 0xD0, 0xD5}, 19}, /* щае */ + {{0xE0, 0xEB, 0xD5}, 19}, /* рые */ + {{0xD5, 0xDD, 0xEF}, 19}, /* еня */ + {{0xE9, 0xD8, 0xD9}, 19}, /* щий */ + {{0xDB, 0xE3, 0xD3}, 19}, /* луг */ + {{0xEE, 0xE7, 0xD8}, 18}, /* ючи */ + {{0xE3, 0xDB, 0xEC}, 18}, /* уль */ + {{0xDC, 0xEB, 0xE5}, 18}, /* мых */ + {{0xE0, 0xDE, 0xD3}, 18}, /* рог */ + {{0xE1, 0xDE, 0xE5}, 18}, /* сох */ + {{0xDA, 0xDE, 0xD5}, 18}, /* кое */ + {{0xDD, 0xE2, 0xE1}, 18}, /* нтс */ + {{0xD0, 0xD7, 0xDD}, 18}, /* азн */ + {{0xE2, 0xDD, 0xEB}, 18}, /* тны */ + {{0xDE, 0xD4, 0xEF}, 18}, /* одя */ + {{0xDE, 0xD1, 0xDD}, 18}, /* обн */ + {{0xD2, 0xEB, 0xD4}, 18}, /* выд */ + {{0xDE, 0xE1, 0xEF}, 18}, /* ося */ + {{0xEC, 0xE2, 0xD0}, 18}, /* ьта */ + {{0xDD, 0xEF, 0xEE}, 18}, /* няю */ + {{0xDD, 0xD0, 0xE0}, 18}, /* нар */ + {{0xD5, 0xD7, 0xE3}, 18}, /* езу */ + {{0xD0, 0xE1, 0xDD}, 18}, /* асн */ + {{0xD7, 0xE3, 0xDB}, 18}, /* зул */ + {{0xE6, 0xD8, 0xDF}, 18}, /* цип */ + {{0xDA, 0xE2, 0xD5}, 18}, /* кте */ + {{0xD4, 0xDE, 0xDF}, 18}, /* доп */ + {{0xDD, 0xE6, 0xD8}, 18}, /* нци */ + {{0xE1, 0xDF, 0xD5}, 18}, /* спе */ + {{0xD8, 0xDC, 0xEB}, 18}, /* имы */ + {{0xDC, 0xDE, 0xDC}, 18}, /* мом */ + {{0xDF, 0xD5, 0xE7}, 18}, /* печ */ + {{0xBE, 0xD1, 0xEF}, 18}, /* Обя */ + {{0xBF, 0xE0, 0xD0}, 18}, /* Пра */ + {{0xDE, 0xDB, 0xDE}, 18}, /* оло */ + {{0xE2, 0xE1, 0xDA}, 18}, /* тск */ + {{0xDB, 0xDD, 0xD8}, 18}, /* лни */ + {{0xD5, 0xE0, 0xE2}, 18}, /* ерт */ + {{0xD8, 0xE1, 0xEC}, 18}, /* ись */ + {{0xDB, 0xEC, 0xE2}, 18}, /* льт */ + {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ + {{0xD2, 0xDE, 0xD1}, 17}, /* воб */ + {{0xE0, 0xDD, 0xEB}, 17}, /* рны */ + {{0xD1, 0xDD, 0xEB}, 17}, /* бны */ + {{0xEB, 0xD4, 0xD0}, 17}, /* ыда */ + {{0xEC, 0xD7, 0xE3}, 17}, /* ьзу */ + {{0xD5, 0xD4, 0xDF}, 17}, /* едп */ + {{0xD0, 0xD4, 0xD5}, 17}, /* аде */ + {{0xD8, 0xDF, 0xD0}, 17}, /* ипа */ + {{0xE1, 0xD5, 0xD9}, 17}, /* сей */ + {{0xD5, 0xD5, 0xE1}, 17}, /* еес */ + {{0xDE, 0xD8, 0xD7}, 17}, /* оиз */ + {{0xDE, 0xE1, 0xD2}, 17}, /* осв */ + {{0xD4, 0xD8, 0xD2}, 17}, /* див */ + {{0xDD, 0xD0, 0xDD}, 17}, /* нан */ + {{0xD5, 0xE2, 0xD0}, 17}, /* ета */ + {{0xD4, 0xDD, 0xD5}, 17}, /* дне */ + {{0xD8, 0xDE, 0xD1}, 17}, /* иоб */ + {{0xE3, 0xD5, 0xE2}, 17}, /* ует */ + {{0xDD, 0xD0, 0xE5}, 17}, /* нах */ + {{0xE1, 0xDC, 0xD5}, 17}, /* сме */ + {{0xD0, 0xDB, 0xD8}, 17}, /* али */ + {{0xD1, 0xEA, 0xD5}, 17}, /* бъе */ + {{0xDF, 0xD0, 0xE1}, 17}, /* пас */ + {{0xD7, 0xD0, 0xDB}, 17}, /* зал */ + {{0xE0, 0xD6, 0xD0}, 16}, /* ржа */ + {{0xEF, 0xD2, 0xD8}, 16}, /* яви */ + {{0xD6, 0xD0, 0xE2}, 16}, /* жат */ + {{0xD1, 0xDE, 0xD6}, 16}, /* бож */ + {{0xE1, 0xD8, 0xDB}, 16}, /* сил */ + {{0xDD, 0xE3, 0xEE}, 16}, /* ную */ + {{0xDF, 0xD5, 0xDD}, 16}, /* пен */ + {{0xDC, 0xD0, 0xE2}, 16}, /* мат */ + {{0xDE, 0xDD, 0xDD}, 16}, /* онн */ + {{0xD2, 0xD8, 0xDD}, 16}, /* вин */ + {{0xE2, 0xDA, 0xD8}, 16}, /* тки */ + {{0xE2, 0xDE, 0xE7}, 16}, /* точ */ + {{0xE1, 0xE7, 0xD8}, 16}, /* счи */ + {{0xDD, 0xD8, 0xE6}, 16}, /* ниц */ + {{0xE9, 0xD5, 0xD5}, 16}, /* щее */ + {{0xD1, 0xD5, 0xE1}, 16}, /* бес */ + {{0xD0, 0xD4, 0xE6}, 16}, /* адц */ + {{0xBA, 0xDE, 0xDC}, 16}, /* Ком */ + {{0xEC, 0xD8, 0xDC}, 16}, /* ьим */ + {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ + {{0xD0, 0xE7, 0xD8}, 16}, /* ачи */ + {{0xDF, 0xDE, 0xDD}, 16}, /* пон */ + {{0xDA, 0xD0, 0xD5}, 16}, /* кае */ + {{0xD8, 0xD3, 0xE0}, 16}, /* игр */ + {{0xD0, 0xDA, 0xD8}, 16}, /* аки */ + {{0xD0, 0xE9, 0xD8}, 16}, /* ащи */ + {{0xDB, 0xEC, 0xE6}, 16}, /* льц */ + {{0xD2, 0xDD, 0xDE}, 16}, /* вно */ + {{0xEB, 0xE8, 0xD5}, 15}, /* ыше */ + {{0xBB, 0xD8, 0xE6}, 15}, /* Лиц */ + {{0xEC, 0xD5, 0xD9}, 15}, /* ьей */ + {{0xE8, 0xD5, 0xDC}, 15}, /* шем */ + {{0xE3, 0xD1, 0xDB}, 15}, /* убл */ + {{0xE0, 0xD0, 0xE6}, 15}, /* рац */ + {{0xDA, 0xE3, 0xDC}, 15}, /* кум */ + {{0xE0, 0xD5, 0xD3}, 15}, /* рег */ + {{0xDE, 0xDF, 0xD0}, 15}, /* опа */ + {{0xB2, 0xDE, 0xD7}, 15}, /* Воз */ + {{0xE2, 0xD0, 0xD5}, 15}, /* тае */ + {{0xDE, 0xD1, 0xEB}, 15}, /* обы */ + {{0xD1, 0xDB, 0xD8}, 15}, /* бли */ + {{0xE0, 0xDC, 0xD5}, 15}, /* рме */ + {{0xD2, 0xDE, 0xE1}, 15}, /* вос */ + {{0xD0, 0xE1, 0xD8}, 15}, /* аси */ + {{0xE2, 0xD0, 0xDC}, 15}, /* там */ + {{0xEC, 0xDC, 0xD5}, 15}, /* ьме */ + {{0xDE, 0xD3, 0xD0}, 15}, /* ога */ + {{0xD8, 0xDB, 0xDE}, 15}, /* ило */ + {{0xE1, 0xEC, 0xDC}, 15}, /* сьм */ + {{0xE0, 0xE2, 0xD8}, 15}, /* рти */ + {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ + {{0xE1, 0xD5, 0xDD}, 15}, /* сен */ + {{0xE2, 0xD0, 0xDB}, 15}, /* тал */ + {{0xD4, 0xD0, 0xE0}, 15}, /* дар */ + {{0xD0, 0xDC, 0xDE}, 15}, /* амо */ + {{0xD5, 0xD4, 0xDB}, 15}, /* едл */ + {{0xE1, 0xE3, 0xD1}, 15}, /* суб */ + {{0xD5, 0xD9, 0xE4}, 15}, /* ейф */ + {{0xC5, 0xE0, 0xD0}, 15}, /* Хра */ + {{0xDB, 0xD0, 0xDC}, 14}, /* лам */ + {{0xD0, 0xE0, 0xE3}, 14}, /* ару */ + {{0xD3, 0xD8, 0xE5}, 14}, /* гих */ + {{0xE6, 0xD8, 0xEF}, 14}, /* ция */ + {{0xD4, 0xD0, 0xD2}, 14}, /* дав */ + {{0xDB, 0xD8, 0xE8}, 14}, /* лиш */ + {{0xEE, 0xE7, 0xD0}, 14}, /* юча */ + {{0xD0, 0xDD, 0xE1}, 14}, /* анс */ + {{0xDE, 0xD3, 0xE0}, 14}, /* огр */ + {{0xD8, 0xE9, 0xD0}, 14}, /* ища */ + {{0xD5, 0xDD, 0xEC}, 14}, /* ень */ + {{0xDE, 0xE2, 0xD8}, 14}, /* оти */ + {{0xD0, 0xD4, 0xEB}, 13}, /* ады */ + {{0xD0, 0xE9, 0xD0}, 13}, /* аща */ + {{0xD2, 0xDE, 0xD8}, 13}, /* вои */ + {{0xD2, 0xEB, 0xDC}, 13}, /* вым */ + {{0xD2, 0xEC, 0xEF}, 13}, /* вья */ + {{0xDA, 0xD8, 0xD5}, 13}, /* кие */ + {{0xDB, 0xD8, 0xE1}, 13}, /* лис */ + {{0xDC, 0xD5, 0xD4}, 13}, /* мед */ + {{0xE2, 0xD8, 0xE5}, 13}, /* тих */ + {{0xD5, 0xE2, 0xDE}, 13}, /* ето */ + {{0xD7, 0xDB, 0xDE}, 13}, /* зло */ + {{0xDE, 0xDF, 0xD5}, 13}, /* опе */ + {{0xE1, 0xD8, 0xDC}, 13}, /* сим */ + {{0xEF, 0xD7, 0xD8}, 13}, /* язи */ + {{0xD8, 0xDD, 0xD4}, 13}, /* инд */ + {{0xE7, 0xE3, 0xD6}, 13}, /* чуж */ + {{0xDB, 0xDA, 0xD8}, 13}, /* лки */ + {{0xD4, 0xDF, 0xE0}, 13}, /* дпр */ + {{0xDD, 0xD4, 0xD8}, 13}, /* нди */ + {{0xDE, 0xE2, 0xD0}, 13}, /* ота */ + {{0xDE, 0xE2, 0xEB}, 13}, /* оты */ + {{0xDB, 0xD0, 0xE7}, 13}, /* лач */ + {{0xDA, 0xD8, 0xDC}, 13}, /* ким */ + {{0xD8, 0xE1, 0xD8}, 13}, /* иси */ + {{0xD2, 0xD0, 0xDB}, 13}, /* вал */ + {{0xD5, 0xDC, 0xDE}, 13}, /* емо */ + {{0xDF, 0xE3, 0xD1}, 13}, /* пуб */ + {{0xEF, 0xD5, 0xDC}, 13}, /* яем */ + {{0xD1, 0xDE, 0xDB}, 13}, /* бол */ + {{0xDD, 0xE2, 0xE3}, 13}, /* нту */ + {{0xDD, 0xD5, 0xD9}, 13}, /* ней */ + {{0xDD, 0xD0, 0xEF}, 13}, /* ная */ + {{0xD5, 0xE1, 0xD0}, 13}, /* еса */ + {{0xE0, 0xDD, 0xDE}, 13}, /* рно */ + {{0xE9, 0xD5, 0xDC}, 13}, /* щем */ + {{0xD0, 0xDD, 0xEB}, 13}, /* аны */ + {{0xB4, 0xDE, 0xD2}, 13}, /* Дов */ + {{0xE7, 0xD8, 0xD2}, 13}, /* чив */ + {{0xD2, 0xD8, 0xE1}, 13}, /* вис */ + {{0xDE, 0xDF, 0xDE}, 13}, /* опо */ + {{0xD2, 0xEC, 0xEE}, 13}, /* вью */ + {{0xD0, 0xDB, 0xD0}, 13}, /* ала */ + {{0xDB, 0xD5, 0xD9}, 12}, /* лей */ + {{0xD0, 0xE7, 0xD0}, 12}, /* ача */ + {{0xD5, 0xD7, 0xD2}, 12}, /* езв */ + {{0xD2, 0xD0, 0xEF}, 12}, /* вая */ + {{0xD5, 0xDE, 0xE1}, 12}, /* еос */ + {{0xEF, 0xE9, 0xD8}, 12}, /* ящи */ + {{0xD8, 0xD2, 0xD8}, 12}, /* иви */ + {{0xDD, 0xD5, 0xD5}, 12}, /* нее */ + {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ + {{0xE8, 0xD5, 0xD5}, 12}, /* шее */ + {{0xE1, 0xD0, 0xE5}, 12}, /* сах */ + {{0xD8, 0xDD, 0xE6}, 12}, /* инц */ + {{0xDE, 0xDC, 0xDF}, 12}, /* омп */ + {{0xE3, 0xD6, 0xDE}, 12}, /* ужо */ + {{0xE3, 0xD0, 0xDB}, 12}, /* уал */ + {{0xDD, 0xD0, 0xE2}, 12}, /* нат */ + {{0xD8, 0xD4, 0xE3}, 12}, /* иду */ + {{0xD2, 0xDB, 0xD0}, 12}, /* вла */ + {{0xD7, 0xD2, 0xD0}, 12}, /* зва */ + {{0xDB, 0xD5, 0xD5}, 12}, /* лее */ + {{0xE0, 0xD5, 0xE5}, 12}, /* рех */ + {{0xD6, 0xD4, 0xE3}, 12}, /* жду */ + {{0xDC, 0xD0, 0xDB}, 12}, /* мал */ + {{0xD5, 0xDD, 0xE1}, 12}, /* енс */ + {{0xD8, 0xD9, 0xE1}, 12}, /* ийс */ + {{0xDA, 0xDE, 0xDB}, 12}, /* кол */ + {{0xDD, 0xD0, 0xD7}, 12}, /* наз */ + {{0xD4, 0xE3, 0xD0}, 12}, /* дуа */ + {{0xDE, 0xDD, 0xD8}, 12}, /* они */ + {{0xE1, 0xD5, 0xDC}, 12}, /* сем */ + {{0xD3, 0xDE, 0xD4}, 12}, /* год */ + {{0xDC, 0xD5, 0xD6}, 12}, /* меж */ + {{0xDE, 0xD7, 0xDB}, 12}, /* озл */ + {{0xD2, 0xDC, 0xD5}, 12}, /* вме */ + {{0xE3, 0xD4, 0xD5}, 12}, /* уде */ + {{0xEC, 0xDA, 0xDE}, 12}, /* ько */ + {{0xD5, 0xD2, 0xEB}, 12}, /* евы */ + {{0xD7, 0xD0, 0xDC}, 12}, /* зам */ + {{0xE1, 0xDE, 0xD4}, 12}, /* сод */ + {{0xE0, 0xDE, 0xD5}, 11}, /* рое */ + {{0xDE, 0xE2, 0xD4}, 11}, /* отд */ + {{0xE1, 0xD8, 0xEF}, 11}, /* сия */ + {{0xD8, 0xDA, 0xE3}, 11}, /* ику */ + {{0xEB, 0xDB, 0xD8}, 11}, /* ыли */ + {{0xD3, 0xD8, 0xDC}, 11}, /* гим */ + {{0xDD, 0xEC, 0xE8}, 11}, /* ньш */ + {{0xE2, 0xD8, 0xE7}, 11}, /* тич */ + {{0xE0, 0xD0, 0xDB}, 11}, /* рал */ + {{0xE3, 0xE7, 0xD8}, 11}, /* учи */ + {{0xDC, 0xD5, 0xEE}, 11}, /* мею */ + {{0xE2, 0xD5, 0xDA}, 11}, /* тек */ + {{0xDE, 0xD1, 0xE3}, 11}, /* обу */ + {{0xDD, 0xDD, 0xE3}, 11}, /* нну */ + {{0xDD, 0xD5, 0xDF}, 11}, /* неп */ + {{0xD2, 0xD5, 0xDB}, 11}, /* вел */ + {{0xE2, 0xDC, 0xD5}, 11}, /* тме */ + {{0xD1, 0xDE, 0xD3}, 11}, /* бог */ + {{0xDE, 0xE0, 0xD8}, 11}, /* ори */ + {{0xD0, 0xD2, 0xDD}, 11}, /* авн */ + {{0xD4, 0xD5, 0xD5}, 11}, /* дее */ + {{0xD6, 0xDE, 0xDC}, 11}, /* жом */ + {{0xB2, 0xE0, 0xD5}, 11}, /* Вре */ + {{0xDC, 0xEB, 0xD5}, 11}, /* мые */ + {{0xEC, 0xE6, 0xD0}, 11}, /* ьца */ + {{0xDE, 0xE6, 0xD5}, 11}, /* оце */ + {{0xD8, 0xE2, 0xEB}, 10}, /* иты */ + {{0xD7, 0xE0, 0xD0}, 10}, /* зра */ + {{0xDE, 0xDD, 0xEB}, 10}, /* оны */ + {{0xE0, 0xD5, 0xE8}, 10}, /* реш */ + {{0xE3, 0xE8, 0xD5}, 10}, /* уше */ + {{0xE0, 0xD5, 0xD2}, 10}, /* рев */ + {{0xDE, 0xDF, 0xE3}, 10}, /* опу */ + {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ + {{0xE2, 0xD0, 0xE7}, 10}, /* тач */ + {{0xD5, 0xE0, 0xDE}, 10}, /* еро */ + {{0xD2, 0xDA, 0xDB}, 10}, /* вкл */ + {{0xD7, 0xEB, 0xD2}, 10}, /* зыв */ + {{0xD0, 0xDF, 0xE0}, 10}, /* апр */ + {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ + {{0xBE, 0xE2, 0xD2}, 10}, /* Отв */ + {{0xE0, 0xE1, 0xD0}, 10}, /* рса */ + {{0xD5, 0xDA, 0xE2}, 10}, /* ект */ + {{0xDB, 0xD5, 0xDA}, 10}, /* лек */ + {{0xD5, 0xD5, 0xE2}, 10}, /* еет */ + {{0xDE, 0xDF, 0xDB}, 10}, /* опл */ + {{0xE2, 0xE7, 0xD5}, 10}, /* тче */ + {{0xD3, 0xDE, 0xDC}, 10}, /* гом */ + {{0xE2, 0xDE, 0xD6}, 10}, /* тож */ + {{0xDB, 0xD5, 0xE7}, 10}, /* леч */ + {{0xD5, 0xE2, 0xEB}, 10}, /* еты */ + {{0xDE, 0xD6, 0xD8}, 10}, /* ожи */ + {{0xDC, 0xDD, 0xDE}, 10}, /* мно */ + {{0xDC, 0xDE, 0xD9}, 10}, /* мой */ + {{0xE6, 0xD5, 0xDB}, 10}, /* цел */ + {{0xE3, 0xDF, 0xD8}, 10}, /* упи */ + {{0xD0, 0xD5, 0xD2}, 10}, /* аев */ + {{0xDF, 0xDE, 0xDC}, 10}, /* пом */ + {{0xD4, 0xEF, 0xE9}, 10}, /* дящ */ + {{0xE2, 0xE0, 0xD8}, 10}, /* три */ + {{0xE8, 0xD8, 0xD5}, 10}, /* шие */ + {{0xD5, 0xDA, 0xD0}, 10}, /* ека */ + {{0xD5, 0xE8, 0xD5}, 10}, /* еше */ + {{0xD7, 0xD0, 0xD8}, 10}, /* заи */ + {{0xD8, 0xE2, 0xDE}, 10}, /* ито */ + {{0xD7, 0xDD, 0xEB}, 10}, /* зны */ + {{0xDE, 0xEF, 0xDD}, 10}, /* оян */ + {{0xD8, 0xD6, 0xD5}, 10}, /* иже */ + {{0xD2, 0xDD, 0xD5}, 10}, /* вне */ + {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ + {{0xD5, 0xDC, 0xEF}, 10}, /* емя */ + {{0xDD, 0xD0, 0xD8}, 10}, /* наи */ + {{0xE2, 0xDE, 0xDB}, 10}, /* тол */ + {{0xDB, 0xD8, 0xE2}, 10}, /* лит */ + {{0xDE, 0xE1, 0xE0}, 10}, /* оср */ + {{0xE2, 0xD4, 0xD5}, 10}, /* тде */ + {{0xD5, 0xDC, 0xD8}, 10}, /* еми */ + {{0xDC, 0xD5, 0xD5}, 10}, /* мее */ + {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ + {{0xDD, 0xD8, 0xD2}, 10}, /* нив */ + {{0xD5, 0xE0, 0xE3}, 10}, /* еру */ + {{0xE7, 0xD5, 0xDC}, 10}, /* чем */ + {{0xD4, 0xDE, 0xD1}, 10}, /* доб */ + {{0xD5, 0xDB, 0xDE}, 10}, /* ело */ + {{0xD8, 0xDB, 0xE3}, 10}, /* илу */ + {{0xD0, 0xD4, 0xDB}, 10}, /* адл */ + {{0xD8, 0xE7, 0xE2}, 10}, /* ичт */ + {{0xDC, 0xDB, 0xD5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_koi8_r[] = { + {{0xC5, 0xCE, 0xC9}, 991}, /* ени */ + {{0xCF, 0xC7, 0xCF}, 806}, /* ого */ + {{0xD3, 0xD4, 0xD7}, 659}, /* ств */ + {{0xCE, 0xC9, 0xD1}, 629}, /* ния */ + {{0xCF, 0xD7, 0xC1}, 566}, /* ова */ + {{0xD4, 0xC5, 0xCC}, 555}, /* тел */ + {{0xD2, 0xC5, 0xC4}, 507}, /* ред */ + {{0xC5, 0xCE, 0xCE}, 499}, /* енн */ + {{0xCF, 0xD7, 0xCF}, 443}, /* ово */ + {{0xC1, 0xCE, 0xC9}, 443}, /* ани */ + {{0xD4, 0xD2, 0xC1}, 429}, /* тра */ + {{0xCF, 0xD3, 0xD4}, 428}, /* ост */ + {{0xCE, 0xC9, 0xC5}, 419}, /* ние */ + {{0xCE, 0xCE, 0xCF}, 412}, /* нно */ + {{0xC1, 0xC8, 0xCF}, 396}, /* ахо */ + {{0xD3, 0xD4, 0xD2}, 392}, /* стр */ + {{0xD2, 0xC1, 0xC8}, 386}, /* рах */ + {{0xC8, 0xCF, 0xD7}, 379}, /* хов */ + {{0xC5, 0xCC, 0xD8}, 365}, /* ель */ + {{0xC7, 0xCF, 0xD7}, 360}, /* гов */ + {{0xD7, 0xCF, 0xD2}, 356}, /* вор */ + {{0xC5, 0xD3, 0xD4}, 349}, /* ест */ + {{0xC1, 0xD4, 0xD8}, 345}, /* ать */ + {{0xD2, 0xC1, 0xD7}, 337}, /* рав */ + {{0xD0, 0xD2, 0xC9}, 330}, /* при */ + {{0xD0, 0xD2, 0xC5}, 323}, /* пре */ + {{0xC4, 0xCF, 0xC7}, 318}, /* дог */ + {{0xCE, 0xC5, 0xCE}, 310}, /* нен */ + {{0xD0, 0xD2, 0xC1}, 309}, /* пра */ + {{0xD7, 0xC1, 0xCE}, 304}, /* ван */ + {{0xC9, 0xD4, 0xC5}, 295}, /* ите */ + {{0xD4, 0xD7, 0xC5}, 281}, /* тве */ + {{0xCC, 0xC5, 0xCE}, 266}, /* лен */ + {{0xD3, 0xD4, 0xCF}, 261}, /* сто */ + {{0xD4, 0xC1, 0xD4}, 260}, /* тат */ + {{0xCE, 0xCE, 0xD9}, 260}, /* нны */ + {{0xCC, 0xD8, 0xCE}, 256}, /* льн */ + {{0xD7, 0xCF, 0xDA}, 255}, /* воз */ + {{0xC9, 0xCC, 0xC9}, 254}, /* или */ + {{0xC1, 0xD4, 0xC5}, 252}, /* ате */ + {{0xC5, 0xC7, 0xCF}, 241}, /* его */ + {{0xC5, 0xD4, 0xD3}, 238}, /* етс */ + {{0xCE, 0xCF, 0xD3}, 236}, /* нос */ + {{0xDD, 0xC5, 0xD3}, 235}, /* щес */ + {{0xD0, 0xCF, 0xCC}, 232}, /* пол */ + {{0xD2, 0xC1, 0xCE}, 231}, /* ран */ + {{0xCE, 0xCF, 0xC7}, 230}, /* ног */ + {{0xD3, 0xD4, 0xC1}, 229}, /* ста */ + {{0xDE, 0xC5, 0xCE}, 226}, /* чен */ + {{0xD4, 0xD2, 0xC5}, 224}, /* тре */ + {{0xDA, 0xCD, 0xC5}, 214}, /* зме */ + {{0xD5, 0xDD, 0xC5}, 212}, /* уще */ + {{0xD3, 0xD4, 0xC9}, 210}, /* сти */ + {{0xCB, 0xCF, 0xCD}, 207}, /* ком */ + {{0xCF, 0xD2, 0xCF}, 206}, /* оро */ + {{0xD7, 0xCC, 0xC5}, 195}, /* вле */ + {{0xDA, 0xC1, 0xCE}, 194}, /* зан */ + {{0xC1, 0xD3, 0xD4}, 193}, /* аст */ + {{0xD4, 0xD3, 0xD1}, 191}, /* тся */ + {{0xC8, 0xD2, 0xC1}, 187}, /* хра */ + {{0xC1, 0xCE, 0xCE}, 182}, /* анн */ + {{0xC5, 0xD2, 0xC5}, 182}, /* ере */ + {{0xD7, 0xD2, 0xC5}, 178}, /* вре */ + {{0xCF, 0xD7, 0xC5}, 173}, /* ове */ + {{0xD8, 0xCE, 0xCF}, 173}, /* ьно */ + {{0xD7, 0xC5, 0xD2}, 172}, /* вер */ + {{0xCD, 0xC5, 0xCE}, 170}, /* мен */ + {{0xCC, 0xC9, 0xC3}, 168}, /* лиц */ + {{0xD4, 0xCF, 0xD2}, 167}, /* тор */ + {{0xD2, 0xC5, 0xCE}, 167}, /* рен */ + {{0xDD, 0xC5, 0xCE}, 165}, /* щен */ + {{0xCF, 0xDA, 0xCD}, 164}, /* озм */ + {{0xC5, 0xC4, 0xC1}, 163}, /* еда */ + {{0xD4, 0xD7, 0xC9}, 159}, /* тви */ + {{0xD1, 0xDA, 0xC1}, 159}, /* яза */ + {{0xC2, 0xD1, 0xDA}, 158}, /* бяз */ + {{0xCE, 0xC9, 0xC9}, 153}, /* нии */ + {{0xCE, 0xD9, 0xC8}, 153}, /* ных */ + {{0xD4, 0xD8, 0xD1}, 153}, /* тья */ + {{0xCD, 0xC5, 0xD2}, 153}, /* мер */ + {{0xD3, 0xCC, 0xC9}, 150}, /* сли */ + {{0xD4, 0xCF, 0xD7}, 148}, /* тов */ + {{0xD4, 0xD7, 0xC1}, 147}, /* тва */ + {{0xCF, 0xD2, 0xC1}, 146}, /* ора */ + {{0xCE, 0xCF, 0xCD}, 144}, /* ном */ + {{0xC4, 0xC5, 0xCE}, 144}, /* ден */ + {{0xC1, 0xCE, 0xC5}, 142}, /* ане */ + {{0xCB, 0xCF, 0xCE}, 141}, /* кон */ + {{0xCC, 0xD5, 0xDE}, 141}, /* луч */ + {{0xCD, 0xD5, 0xDD}, 140}, /* мущ */ + {{0xCF, 0xC2, 0xD1}, 140}, /* обя */ + {{0xD7, 0xC1, 0xD4}, 138}, /* ват */ + {{0xD7, 0xC1, 0xD2}, 137}, /* вар */ + {{0xC5, 0xDD, 0xC5}, 137}, /* еще */ + {{0xCF, 0xD4, 0xD2}, 137}, /* отр */ + {{0xC4, 0xC5, 0xCC}, 137}, /* дел */ + {{0xCE, 0xD9, 0xCD}, 136}, /* ным */ + {{0xC9, 0xCD, 0xD5}, 136}, /* иму */ + {{0xF3, 0xD4, 0xC1}, 134}, /* Ста */ + {{0xD5, 0xDE, 0xC1}, 133}, /* уча */ + {{0xD4, 0xD3, 0xD4}, 131}, /* тст */ + {{0xC5, 0xCC, 0xD1}, 130}, /* еля */ + {{0xD3, 0xCC, 0xD5}, 130}, /* слу */ + {{0xDA, 0xC1, 0xCB}, 130}, /* зак */ + {{0xD4, 0xCF, 0xD1}, 129}, /* тоя */ + {{0xCF, 0xCD, 0xC9}, 128}, /* оми */ + {{0xCD, 0xC5, 0xDD}, 128}, /* мещ */ + {{0xC5, 0xC4, 0xD5}, 127}, /* еду */ + {{0xD7, 0xC5, 0xCE}, 127}, /* вен */ + {{0xCE, 0xCF, 0xD7}, 127}, /* нов */ + {{0xCE, 0xCF, 0xC5}, 126}, /* ное */ + {{0xCF, 0xD4, 0xD7}, 125}, /* отв */ + {{0xCB, 0xC1, 0xDA}, 125}, /* каз */ + {{0xC1, 0xC5, 0xD4}, 125}, /* ает */ + {{0xD3, 0xCB, 0xCF}, 125}, /* ско */ + {{0xC5, 0xCE, 0xD4}, 124}, /* ент */ + {{0xCD, 0xCF, 0xD4}, 123}, /* мот */ + {{0xC1, 0xD7, 0xCC}, 122}, /* авл */ + {{0xD3, 0xCD, 0xCF}, 122}, /* смо */ + {{0xC9, 0xDE, 0xC9}, 121}, /* ичи */ + {{0xC2, 0xD9, 0xD4}, 120}, /* быт */ + {{0xD5, 0xD3, 0xCD}, 118}, /* усм */ + {{0xD3, 0xD3, 0xC9}, 117}, /* сси */ + {{0xC4, 0xD5, 0xD3}, 117}, /* дус */ + {{0xC8, 0xCF, 0xC4}, 117}, /* ход */ + {{0xD2, 0xC9, 0xDE}, 117}, /* рич */ + {{0xDE, 0xC5, 0xD3}, 115}, /* чес */ + {{0xC7, 0xD2, 0xC1}, 114}, /* гра */ + {{0xD0, 0xD2, 0xCF}, 114}, /* про */ + {{0xC4, 0xCF, 0xD7}, 113}, /* дов */ + {{0xD7, 0xC5, 0xD4}, 112}, /* вет */ + {{0xC5, 0xC4, 0xC5}, 112}, /* еде */ + {{0xDB, 0xC5, 0xCE}, 111}, /* шен */ + {{0xDE, 0xC9, 0xCE}, 110}, /* чин */ + {{0xCE, 0xC1, 0xD3}, 109}, /* нас */ + {{0xC9, 0xD4, 0xD8}, 105}, /* ить */ + {{0xD4, 0xD7, 0xCF}, 105}, /* тво */ + {{0xCB, 0xCC, 0xC0}, 104}, /* клю */ + {{0xD2, 0xC9, 0xD4}, 104}, /* рит */ + {{0xD3, 0xD4, 0xD8}, 104}, /* сть */ + {{0xCC, 0xC0, 0xDE}, 104}, /* люч */ + {{0xD4, 0xCF, 0xCD}, 104}, /* том */ + {{0xD3, 0xCC, 0xC5}, 103}, /* сле */ + {{0xD3, 0xD0, 0xCF}, 102}, /* спо */ + {{0xCF, 0xCC, 0xCE}, 102}, /* олн */ + {{0xC5, 0xD3, 0xCC}, 102}, /* есл */ + {{0xC5, 0xD2, 0xC9}, 101}, /* ери */ + {{0xCE, 0xCF, 0xCA}, 101}, /* ной */ + {{0xD2, 0xCF, 0xCD}, 101}, /* ром */ + {{0xCF, 0xD4, 0xCF}, 99}, /* ото */ + {{0xCE, 0xD9, 0xC5}, 99}, /* ные */ + {{0xDA, 0xCE, 0xC1}, 99}, /* зна */ + {{0xD7, 0xCC, 0xD1}, 99}, /* вля */ + {{0xD4, 0xC5, 0xD2}, 98}, /* тер */ + {{0xD5, 0xD0, 0xD2}, 97}, /* упр */ + {{0xC1, 0xCB, 0xCF}, 96}, /* ако */ + {{0xCB, 0xCF, 0xC7}, 96}, /* ког */ + {{0xCE, 0xD9, 0xCA}, 96}, /* ный */ + {{0xCF, 0xD2, 0xD5}, 96}, /* ору */ + {{0xC5, 0xCC, 0xC5}, 95}, /* еле */ + {{0xC5, 0xD3, 0xCB}, 95}, /* еск */ + {{0xC1, 0xDA, 0xC1}, 95}, /* аза */ + {{0xCA, 0xD3, 0xD4}, 93}, /* йст */ + {{0xD0, 0xCF, 0xD2}, 93}, /* пор */ + {{0xCF, 0xD6, 0xC5}, 92}, /* оже */ + {{0xC9, 0xCE, 0xC5}, 91}, /* ине */ + {{0xDD, 0xC5, 0xCA}, 90}, /* щей */ + {{0xD6, 0xC4, 0xC5}, 90}, /* жде */ + {{0xD0, 0xC5, 0xD2}, 89}, /* пер */ + {{0xCE, 0xC9, 0xD4}, 89}, /* нит */ + {{0xCF, 0xCC, 0xD8}, 89}, /* оль */ + {{0xC1, 0xD6, 0xC4}, 88}, /* ажд */ + {{0xD6, 0xC5, 0xCE}, 87}, /* жен */ + {{0xCC, 0xC1, 0xC4}, 87}, /* лад */ + {{0xC1, 0xCD, 0xC9}, 87}, /* ами */ + {{0xCB, 0xCF, 0xD4}, 86}, /* кот */ + {{0xDE, 0xC1, 0xC5}, 85}, /* чае */ + {{0xD7, 0xC5, 0xDD}, 85}, /* вещ */ + {{0xD7, 0xC9, 0xD1}, 85}, /* вия */ + {{0xD1, 0xDD, 0xC5}, 85}, /* яще */ + {{0xC9, 0xC5, 0xCD}, 85}, /* ием */ + {{0xCB, 0xCC, 0xC1}, 85}, /* кла */ + {{0xC5, 0xCA, 0xD3}, 84}, /* ейс */ + {{0xD9, 0xD4, 0xD8}, 84}, /* ыть */ + {{0xC1, 0xD7, 0xCF}, 84}, /* аво */ + {{0xD2, 0xC1, 0xD6}, 83}, /* раж */ + {{0xCC, 0xD8, 0xD3}, 83}, /* льс */ + {{0xCF, 0xD1, 0xDD}, 82}, /* оящ */ + {{0xC5, 0xCE, 0xCF}, 81}, /* ено */ + {{0xC4, 0xD3, 0xD4}, 81}, /* дст */ + {{0xC4, 0xC5, 0xCA}, 80}, /* дей */ + {{0xD2, 0xC5, 0xC2}, 80}, /* реб */ + {{0xD8, 0xD3, 0xD4}, 79}, /* ьст */ + {{0xC5, 0xC4, 0xD3}, 79}, /* едс */ + {{0xC1, 0xD2, 0xC9}, 79}, /* ари */ + {{0xC4, 0xC1, 0xCE}, 79}, /* дан */ + {{0xCD, 0xCF, 0xD6}, 78}, /* мож */ + {{0xC9, 0xCD, 0xC5}, 78}, /* име */ + {{0xC9, 0xCE, 0xCF}, 78}, /* ино */ + {{0xD2, 0xC9, 0xCE}, 77}, /* рин */ + {{0xC4, 0xCF, 0xD3}, 77}, /* дос */ + {{0xD0, 0xCF, 0xD3}, 77}, /* пос */ + {{0xD4, 0xC1, 0xCB}, 77}, /* так */ + {{0xDD, 0xC5, 0xC7}, 77}, /* щег */ + {{0xC4, 0xC1, 0xD4}, 77}, /* дат */ + {{0xD0, 0xCC, 0xC1}, 76}, /* пла */ + {{0xD5, 0xD3, 0xCC}, 76}, /* усл */ + {{0xC9, 0xC3, 0xC1}, 76}, /* ица */ + {{0xD2, 0xCF, 0xD7}, 75}, /* ров */ + {{0xDC, 0xD4, 0xCF}, 75}, /* это */ + {{0xD5, 0xDE, 0xC5}, 74}, /* уче */ + {{0xC4, 0xCF, 0xCC}, 73}, /* дол */ + {{0xD8, 0xCE, 0xD9}, 73}, /* ьны */ + {{0xD2, 0xC1, 0xDA}, 73}, /* раз */ + {{0xCD, 0xC9, 0xD3}, 73}, /* мис */ + {{0xC1, 0xCE, 0xCF}, 72}, /* ано */ + {{0xD3, 0xD2, 0xCF}, 72}, /* сро */ + {{0xC1, 0xD7, 0xC9}, 72}, /* ави */ + {{0xD4, 0xD8, 0xC9}, 71}, /* тьи */ + {{0xC0, 0xDE, 0xC5}, 70}, /* юче */ + {{0xD3, 0xCB, 0xCC}, 70}, /* скл */ + {{0xC9, 0xD3, 0xD3}, 70}, /* исс */ + {{0xD6, 0xC5, 0xD4}, 69}, /* жет */ + {{0xC5, 0xC4, 0xCF}, 69}, /* едо */ + {{0xCC, 0xC5, 0xC4}, 69}, /* лед */ + {{0xCC, 0xCF, 0xD7}, 69}, /* лов */ + {{0xC0, 0xDD, 0xC9}, 68}, /* ющи */ + {{0xC9, 0xC2, 0xCF}, 68}, /* ибо */ + {{0xCC, 0xC1, 0xD4}, 67}, /* лат */ + {{0xD2, 0xCF, 0xCB}, 67}, /* рок */ + {{0xC1, 0xCB, 0xCC}, 67}, /* акл */ + {{0xD2, 0xC9, 0xDD}, 67}, /* рищ */ + {{0xC2, 0xCF, 0xD7}, 67}, /* бов */ + {{0xC9, 0xD3, 0xCB}, 67}, /* иск */ + {{0xC5, 0xC2, 0xCF}, 67}, /* ебо */ + {{0xCC, 0xD8, 0xDA}, 67}, /* льз */ + {{0xD5, 0xCB, 0xC1}, 67}, /* ука */ + {{0xCC, 0xC9, 0xC2}, 66}, /* либ */ + {{0xCF, 0xCD, 0xD5}, 66}, /* ому */ + {{0xCF, 0xD7, 0xCC}, 66}, /* овл */ + {{0xD4, 0xCE, 0xCF}, 65}, /* тно */ + {{0xD7, 0xCF, 0xCA}, 64}, /* вой */ + {{0xD4, 0xCF, 0xC7}, 64}, /* тог */ + {{0xD3, 0xCC, 0xCF}, 64}, /* сло */ + {{0xCF, 0xDA, 0xCE}, 64}, /* озн */ + {{0xD3, 0xCF, 0xCF}, 64}, /* соо */ + {{0xDA, 0xC1, 0xD4}, 63}, /* зат */ + {{0xC9, 0xD3, 0xD0}, 63}, /* исп */ + {{0xC1, 0xDE, 0xC5}, 63}, /* аче */ + {{0xCE, 0xC9, 0xC0}, 63}, /* нию */ + {{0xCF, 0xCE, 0xC5}, 63}, /* оне */ + {{0xCF, 0xCC, 0xD6}, 62}, /* олж */ + {{0xCF, 0xD7, 0xDD}, 61}, /* овщ */ + {{0xD2, 0xC1, 0xD3}, 61}, /* рас */ + {{0xD7, 0xC9, 0xC4}, 61}, /* вид */ + {{0xD7, 0xDD, 0xC9}, 61}, /* вщи */ + {{0xD3, 0xCE, 0xCF}, 61}, /* сно */ + {{0xC9, 0xC3, 0xCF}, 61}, /* ицо */ + {{0xC9, 0xDE, 0xC5}, 61}, /* иче */ + {{0xC1, 0xD7, 0xC5}, 61}, /* аве */ + {{0xC7, 0xCC, 0xC1}, 61}, /* гла */ + {{0xDE, 0xC5, 0xD4}, 61}, /* чет */ + {{0xDD, 0xC9, 0xCB}, 61}, /* щик */ + {{0xD2, 0xD5, 0xC7}, 60}, /* руг */ + {{0xD4, 0xC1, 0xCE}, 60}, /* тан */ + {{0xC9, 0xCD, 0xCF}, 60}, /* имо */ + {{0xC1, 0xCC, 0xD8}, 60}, /* аль */ + {{0xCF, 0xD7, 0xC9}, 60}, /* ови */ + {{0xD6, 0xC4, 0xC1}, 60}, /* жда */ + {{0xD0, 0xCF, 0xD7}, 60}, /* пов */ + {{0xC5, 0xCD, 0xD5}, 60}, /* ему */ + {{0xD1, 0xD4, 0xC5}, 60}, /* яте */ + {{0xD3, 0xC9, 0xC9}, 59}, /* сии */ + {{0xC2, 0xCF, 0xD4}, 59}, /* бот */ + {{0xD7, 0xD9, 0xD0}, 59}, /* вып */ + {{0xC1, 0xC2, 0xCF}, 59}, /* або */ + {{0xCC, 0xD1, 0xC0}, 59}, /* ляю */ + {{0xD3, 0xD5, 0xDD}, 58}, /* сущ */ + {{0xCF, 0xC4, 0xC5}, 58}, /* оде */ + {{0xC9, 0xCE, 0xC9}, 58}, /* ини */ + {{0xD2, 0xC1, 0xD4}, 58}, /* рат */ + {{0xD1, 0xD7, 0xCC}, 58}, /* явл */ + {{0xCE, 0xC1, 0xC7}, 57}, /* наг */ + {{0xC4, 0xD2, 0xD5}, 57}, /* дру */ + {{0xD2, 0xC1, 0xC2}, 57}, /* раб */ + {{0xC1, 0xC7, 0xD2}, 57}, /* агр */ + {{0xC9, 0xCF, 0xCE}, 57}, /* ион */ + {{0xCD, 0xC5, 0xD3}, 57}, /* мес */ + {{0xC1, 0xC3, 0xC9}, 56}, /* аци */ + {{0xCF, 0xD3, 0xD5}, 56}, /* осу */ + {{0xCB, 0xCF, 0xCA}, 55}, /* кой */ + {{0xD3, 0xD7, 0xCF}, 55}, /* сво */ + {{0xDA, 0xCF, 0xD7}, 55}, /* зов */ + {{0xCF, 0xD0, 0xD2}, 54}, /* опр */ + {{0xD3, 0xCF, 0xC2}, 54}, /* соб */ + {{0xD7, 0xD0, 0xD2}, 54}, /* впр */ + {{0xCC, 0xCE, 0xC5}, 54}, /* лне */ + {{0xCF, 0xCD, 0xCD}, 54}, /* омм */ + {{0xC5, 0xD2, 0xC1}, 54}, /* ера */ + {{0xDE, 0xC9, 0xD4}, 54}, /* чит */ + {{0xC5, 0xD2, 0xDE}, 54}, /* ерч */ + {{0xD2, 0xDE, 0xC5}, 54}, /* рче */ + {{0xC1, 0xD4, 0xC9}, 54}, /* ати */ + {{0xCE, 0xC9, 0xCB}, 54}, /* ник */ + {{0xCD, 0xCD, 0xC5}, 54}, /* мме */ + {{0xD5, 0xD3, 0xD4}, 53}, /* уст */ + {{0xD4, 0xC5, 0xCE}, 53}, /* тен */ + {{0xD7, 0xC5, 0xC4}, 53}, /* вед */ + {{0xD3, 0xCF, 0xD7}, 52}, /* сов */ + {{0xC1, 0xD6, 0xC5}, 52}, /* аже */ + {{0xCF, 0xCB, 0xC1}, 52}, /* ока */ + {{0xD9, 0xCD, 0xC9}, 52}, /* ыми */ + {{0xC0, 0xD4, 0xD3}, 52}, /* ютс */ + {{0xCF, 0xCF, 0xD4}, 52}, /* оот */ + {{0xCD, 0xC9, 0xD4}, 52}, /* мит */ + {{0xD1, 0xC0, 0xDD}, 51}, /* яющ */ + {{0xD7, 0xDB, 0xC5}, 51}, /* вше */ + {{0xD3, 0xC9, 0xCF}, 51}, /* сио */ + {{0xCF, 0xCE, 0xCF}, 51}, /* оно */ + {{0xC1, 0xD7, 0xC1}, 51}, /* ава */ + {{0xC1, 0xDD, 0xC5}, 51}, /* аще */ + {{0xCC, 0xD1, 0xC5}, 50}, /* ляе */ + {{0xC5, 0xCE, 0xC5}, 50}, /* ене */ + {{0xCF, 0xC4, 0xC9}, 50}, /* оди */ + {{0xD0, 0xD5, 0xCE}, 49}, /* пун */ + {{0xCC, 0xC9, 0xDE}, 49}, /* лич */ + {{0xD7, 0xCF, 0xCD}, 49}, /* вом */ + {{0xCE, 0xCB, 0xD4}, 49}, /* нкт */ + {{0xCE, 0xC5, 0xD3}, 49}, /* нес */ + {{0xD7, 0xC9, 0xCC}, 49}, /* вил */ + {{0xC5, 0xD6, 0xC4}, 49}, /* ежд */ + {{0xD2, 0xC5, 0xD3}, 49}, /* рес */ + {{0xC0, 0xDD, 0xC5}, 49}, /* юще */ + {{0xD8, 0xDA, 0xCF}, 49}, /* ьзо */ + {{0xD0, 0xCF, 0xD4}, 49}, /* пот */ + {{0xD5, 0xCE, 0xCB}, 49}, /* унк */ + {{0xD3, 0xD4, 0xC5}, 49}, /* сте */ + {{0xCB, 0xCF, 0xD7}, 49}, /* ков */ + {{0xCF, 0xD3, 0xCC}, 48}, /* осл */ + {{0xD1, 0xC5, 0xD4}, 48}, /* яет */ + {{0xE5, 0xD3, 0xCC}, 48}, /* Есл */ + {{0xF0, 0xD2, 0xC9}, 48}, /* При */ + {{0xD4, 0xC1, 0xD7}, 48}, /* тав */ + {{0xCE, 0xC5, 0xD2}, 48}, /* нер */ + {{0xDE, 0xCE, 0xCF}, 47}, /* чно */ + {{0xD0, 0xCF, 0xC4}, 47}, /* под */ + {{0xCE, 0xD4, 0xC1}, 47}, /* нта */ + {{0xC9, 0xDD, 0xC5}, 47}, /* ище */ + {{0xCF, 0xC2, 0xDD}, 47}, /* общ */ + {{0xC1, 0xDA, 0xCD}, 47}, /* азм */ + {{0xD6, 0xCE, 0xCF}, 47}, /* жно */ + {{0xD7, 0xC9, 0xC9}, 46}, /* вии */ + {{0xD2, 0xC1, 0xDD}, 46}, /* ращ */ + {{0xCF, 0xD2, 0xC5}, 46}, /* оре */ + {{0xD7, 0xDB, 0xC9}, 46}, /* вши */ + {{0xC5, 0xCB, 0xD3}, 46}, /* екс */ + {{0xD7, 0xCF, 0xC7}, 46}, /* вог */ + {{0xDE, 0xD4, 0xCF}, 46}, /* что */ + {{0xC9, 0xDE, 0xCE}, 45}, /* ичн */ + {{0xCC, 0xC5, 0xCD}, 45}, /* лем */ + {{0xCD, 0xCF, 0xC7}, 45}, /* мог */ + {{0xD4, 0xD7, 0xCC}, 45}, /* твл */ + {{0xC4, 0xCC, 0xC5}, 45}, /* дле */ + {{0xC4, 0xCC, 0xD1}, 45}, /* для */ + {{0xD2, 0xC5, 0xD4}, 45}, /* рет */ + {{0xC1, 0xD2, 0xC1}, 45}, /* ара */ + {{0xCE, 0xD1, 0xD4}, 44}, /* нят */ + {{0xC5, 0xDE, 0xC5}, 44}, /* ече */ + {{0xCF, 0xD4, 0xC5}, 44}, /* оте */ + {{0xCF, 0xD2, 0xD9}, 44}, /* оры */ + {{0xCF, 0xD3, 0xCE}, 43}, /* осн */ + {{0xCF, 0xC2, 0xCF}, 43}, /* обо */ + {{0xCF, 0xC7, 0xCC}, 43}, /* огл */ + {{0xC9, 0xCE, 0xD9}, 43}, /* ины */ + {{0xC5, 0xD3, 0xD3}, 43}, /* есс */ + {{0xCF, 0xC2, 0xD2}, 43}, /* обр */ + {{0xCB, 0xD2, 0xC1}, 43}, /* кра */ + {{0xC9, 0xD1, 0xCD}, 43}, /* иям */ + {{0xC1, 0xCC, 0xCF}, 43}, /* ало */ + {{0xD2, 0xD5, 0xDE}, 43}, /* руч */ + {{0xCF, 0xD2, 0xC7}, 43}, /* орг */ + {{0xDE, 0xC1, 0xD1}, 42}, /* чая */ + {{0xCE, 0xC9, 0xCD}, 42}, /* ним */ + {{0xC9, 0xDA, 0xCE}, 42}, /* изн */ + {{0xD0, 0xCF, 0xCB}, 42}, /* пок */ + {{0xD3, 0xD4, 0xD5}, 42}, /* сту */ + {{0xC5, 0xCC, 0xC0}, 42}, /* елю */ + {{0xD4, 0xC9, 0xD4}, 42}, /* тит */ + {{0xC3, 0xC5, 0xCE}, 42}, /* цен */ + {{0xDE, 0xC1, 0xD3}, 42}, /* час */ + {{0xC7, 0xC1, 0xCE}, 42}, /* ган */ + {{0xD2, 0xC7, 0xC1}, 42}, /* рга */ + {{0xD3, 0xD4, 0xCE}, 42}, /* стн */ + {{0xD2, 0xC5, 0xD6}, 42}, /* реж */ + {{0xD5, 0xCD, 0xCD}, 42}, /* умм */ + {{0xD4, 0xD7, 0xD5}, 41}, /* тву */ + {{0xD4, 0xD5, 0xD0}, 41}, /* туп */ + {{0xD3, 0xCB, 0xC9}, 40}, /* ски */ + {{0xC4, 0xC5, 0xCB}, 40}, /* дек */ + {{0xCC, 0xC5, 0xD6}, 40}, /* леж */ + {{0xC5, 0xD3, 0xC5}, 40}, /* есе */ + {{0xD7, 0xC9, 0xC5}, 40}, /* вие */ + {{0xD4, 0xCB, 0xC1}, 40}, /* тка */ + {{0xC5, 0xCB, 0xD2}, 40}, /* екр */ + {{0xCF, 0xC4, 0xCF}, 40}, /* одо */ + {{0xCB, 0xD3, 0xC1}, 40}, /* кса */ + {{0xD2, 0xC5, 0xCB}, 40}, /* рек */ + {{0xCE, 0xD4, 0xC5}, 40}, /* нте */ + {{0xD5, 0xC7, 0xC9}, 40}, /* уги */ + {{0xC2, 0xD9, 0xCC}, 40}, /* был */ + {{0xC9, 0xCE, 0xD1}, 40}, /* иня */ + {{0xC5, 0xDD, 0xC9}, 39}, /* ещи */ + {{0xC7, 0xC5, 0xCE}, 39}, /* ген */ + {{0xEB, 0xCF, 0xC4}, 39}, /* Код */ + {{0xC4, 0xC9, 0xD4}, 39}, /* дит */ + {{0xD3, 0xC8, 0xCF}, 39}, /* схо */ + {{0xC9, 0xCE, 0xD4}, 39}, /* инт */ + {{0xD3, 0xD5, 0xCD}, 39}, /* сум */ + {{0xD2, 0xCF, 0xCE}, 39}, /* рон */ + {{0xCF, 0xD4, 0xCB}, 39}, /* отк */ + {{0xC4, 0xCF, 0xCB}, 39}, /* док */ + {{0xC9, 0xCC, 0xC1}, 38}, /* ила */ + {{0xC3, 0xC5, 0xD3}, 38}, /* цес */ + {{0xC9, 0xCB, 0xC1}, 38}, /* ика */ + {{0xDA, 0xCE, 0xC9}, 38}, /* зни */ + {{0xCF, 0xD7, 0xD9}, 38}, /* овы */ + {{0xCC, 0xD6, 0xCE}, 38}, /* лжн */ + {{0xD5, 0xD0, 0xCC}, 38}, /* упл */ + {{0xC7, 0xC4, 0xC1}, 37}, /* гда */ + {{0xCC, 0xC1, 0xD6}, 37}, /* лаж */ + {{0xD6, 0xC5, 0xC4}, 37}, /* жед */ + {{0xC2, 0xC5, 0xDA}, 37}, /* без */ + {{0xC4, 0xC5, 0xD4}, 37}, /* дет */ + {{0xCF, 0xD2, 0xD1}, 37}, /* оря */ + {{0xD2, 0xCF, 0xD3}, 37}, /* рос */ + {{0xCF, 0xC2, 0xCC}, 37}, /* обл */ + {{0xC3, 0xC9, 0xC9}, 37}, /* ции */ + {{0xC4, 0xCF, 0xCD}, 37}, /* дом */ + {{0xCE, 0xC3, 0xC5}, 37}, /* нце */ + {{0xDB, 0xC5, 0xC7}, 37}, /* шег */ + {{0xCC, 0xCF, 0xD6}, 37}, /* лож */ + {{0xCF, 0xCE, 0xC1}, 37}, /* она */ + {{0xCF, 0xCB, 0xCC}, 37}, /* окл */ + {{0xCF, 0xC7, 0xC4}, 37}, /* огд */ + {{0xD2, 0xCF, 0xC4}, 37}, /* род */ + {{0xC5, 0xCE, 0xC1}, 37}, /* ена */ + {{0xCF, 0xCE, 0xC3}, 37}, /* онц */ + {{0xCF, 0xD4, 0xCE}, 37}, /* отн */ + {{0xD3, 0xCF, 0xC7}, 37}, /* сог */ + {{0xC5, 0xD7, 0xDB}, 37}, /* евш */ + {{0xD7, 0xC9, 0xD4}, 36}, /* вит */ + {{0xC5, 0xD2, 0xD0}, 36}, /* ерп */ + {{0xCF, 0xC4, 0xC1}, 36}, /* ода */ + {{0xC5, 0xD4, 0xC5}, 36}, /* ете */ + {{0xCE, 0xC5, 0xCF}, 36}, /* нео */ + {{0xD2, 0xD0, 0xC5}, 36}, /* рпе */ + {{0xC5, 0xD2, 0xDB}, 36}, /* ерш */ + {{0xC9, 0xCD, 0xC9}, 36}, /* ими */ + {{0xC9, 0xD7, 0xDB}, 36}, /* ивш */ + {{0xD9, 0xD0, 0xCC}, 36}, /* ыпл */ + {{0xD0, 0xC5, 0xD7}, 36}, /* пев */ + {{0xC1, 0xC4, 0xC1}, 36}, /* ада */ + {{0xCD, 0xCF, 0xD3}, 35}, /* мос */ + {{0xCF, 0xC2, 0xD3}, 35}, /* обс */ + {{0xCE, 0xC5, 0xC4}, 34}, /* нед */ + {{0xC9, 0xCB, 0xCF}, 34}, /* ико */ + {{0xDD, 0xC9, 0xCD}, 34}, /* щим */ + {{0xC4, 0xC5, 0xD2}, 34}, /* дер */ + {{0xD3, 0xCB, 0xC1}, 34}, /* ска */ + {{0xCF, 0xD2, 0xCD}, 34}, /* орм */ + {{0xD5, 0xCD, 0xC5}, 34}, /* уме */ + {{0xCF, 0xCF, 0xC2}, 34}, /* ооб */ + {{0xD2, 0xC9, 0xD3}, 34}, /* рис */ + {{0xCF, 0xC2, 0xDF}, 33}, /* объ */ + {{0xCF, 0xCC, 0xD5}, 33}, /* олу */ + {{0xDF, 0xD1, 0xD7}, 33}, /* ъяв */ + {{0xD2, 0xC5, 0xCD}, 33}, /* рем */ + {{0xDD, 0xC9, 0xC8}, 33}, /* щих */ + {{0xD5, 0xC0, 0xDD}, 33}, /* ующ */ + {{0xCB, 0xD6, 0xC5}, 33}, /* кже */ + {{0xC9, 0xC4, 0xC5}, 33}, /* иде */ + {{0xC2, 0xD3, 0xD4}, 33}, /* бст */ + {{0xC1, 0xCB, 0xD6}, 33}, /* акж */ + {{0xD7, 0xD5, 0xC0}, 33}, /* вую */ + {{0xC1, 0xD3, 0xC8}, 33}, /* асх */ + {{0xC1, 0xCE, 0xC1}, 32}, /* ана */ + {{0xCE, 0xC1, 0xC4}, 32}, /* над */ + {{0xCF, 0xC2, 0xC5}, 32}, /* обе */ + {{0xD9, 0xD4, 0xCB}, 32}, /* ытк */ + {{0xDC, 0xD4, 0xC9}, 32}, /* эти */ + {{0xCF, 0xD6, 0xCE}, 32}, /* ожн */ + {{0xC1, 0xD4, 0xD9}, 31}, /* аты */ + {{0xD3, 0xC4, 0xC5}, 31}, /* сде */ + {{0xC1, 0xC0, 0xD4}, 31}, /* ают */ + {{0xD1, 0xD4, 0xD8}, 31}, /* ять */ + {{0xCF, 0xD1, 0xD4}, 31}, /* оят */ + {{0xC5, 0xD4, 0xD8}, 31}, /* еть */ + {{0xC1, 0xC7, 0xC5}, 31}, /* аге */ + {{0xDE, 0xD2, 0xC5}, 31}, /* чре */ + {{0xC5, 0xCE, 0xD9}, 31}, /* ены */ + {{0xD5, 0xC2, 0xD9}, 31}, /* убы */ + {{0xC9, 0xD3, 0xD4}, 30}, /* ист */ + {{0xD1, 0xC0, 0xD4}, 30}, /* яют */ + {{0xD2, 0xD1, 0xC4}, 30}, /* ряд */ + {{0xC7, 0xCF, 0xD3}, 30}, /* гос */ + {{0xC9, 0xCD, 0xC1}, 30}, /* има */ + {{0xDA, 0xC1, 0xD3}, 30}, /* зас */ + {{0xC1, 0xC0, 0xDD}, 30}, /* ающ */ + {{0xCF, 0xDA, 0xD7}, 30}, /* озв */ + {{0xC5, 0xC4, 0xC9}, 30}, /* еди */ + {{0xCF, 0xCD, 0xC5}, 30}, /* оме */ + {{0xCE, 0xC9, 0xCA}, 30}, /* ний */ + {{0xD3, 0xD5, 0xC4}, 30}, /* суд */ + {{0xDA, 0xC4, 0xCF}, 29}, /* здо */ + {{0xD3, 0xD7, 0xC9}, 29}, /* сви */ + {{0xCF, 0xCC, 0xC9}, 29}, /* оли */ + {{0xCF, 0xD7, 0xD8}, 29}, /* овь */ + {{0xD7, 0xC9, 0xCA}, 29}, /* вий */ + {{0xC4, 0xCF, 0xD2}, 29}, /* дор */ + {{0xC4, 0xC5, 0xD1}, 29}, /* дея */ + {{0xC5, 0xD1, 0xD4}, 29}, /* еят */ + {{0xC3, 0xCF, 0xCD}, 29}, /* цом */ + {{0xC9, 0xDA, 0xC1}, 28}, /* иза */ + {{0xD3, 0xDE, 0xC5}, 28}, /* сче */ + {{0xCB, 0xD4, 0xC1}, 28}, /* кта */ + {{0xCF, 0xC4, 0xCE}, 28}, /* одн */ + {{0xC2, 0xCC, 0xC1}, 28}, /* бла */ + {{0xCF, 0xC4, 0xCC}, 28}, /* одл */ + {{0xC9, 0xD4, 0xC1}, 28}, /* ита */ + {{0xE4, 0xCF, 0xC7}, 28}, /* Дог */ + {{0xCF, 0xD3, 0xCF}, 28}, /* осо */ + {{0xCE, 0xCF, 0xDB}, 28}, /* нош */ + {{0xCB, 0xD5, 0xD2}, 28}, /* кур */ + {{0xC9, 0xCE, 0xC1}, 28}, /* ина */ + {{0xCF, 0xDB, 0xC5}, 28}, /* оше */ + {{0xCE, 0xC1, 0xCC}, 28}, /* нал */ + {{0xCE, 0xC9, 0xDA}, 27}, /* низ */ + {{0xDA, 0xD7, 0xD2}, 27}, /* звр */ + {{0xD7, 0xD2, 0xC1}, 27}, /* вра */ + {{0xCC, 0xC5, 0xD4}, 27}, /* лет */ + {{0xC5, 0xDD, 0xD8}, 27}, /* ещь */ + {{0xD2, 0xC9, 0xC4}, 27}, /* рид */ + {{0xC4, 0xCE, 0xCF}, 27}, /* дно */ + {{0xD2, 0xC9, 0xCF}, 27}, /* рио */ + {{0xCF, 0xC9, 0xCD}, 27}, /* оим */ + {{0xC5, 0xD2, 0xD6}, 27}, /* ерж */ + {{0xD5, 0xD7, 0xC5}, 26}, /* уве */ + {{0xCF, 0xCE, 0xCB}, 26}, /* онк */ + {{0xC5, 0xCC, 0xCB}, 26}, /* елк */ + {{0xCC, 0xC1, 0xD7}, 26}, /* лав */ + {{0xC1, 0xD4, 0xCF}, 26}, /* ато */ + {{0xD1, 0xCD, 0xC9}, 26}, /* ями */ + {{0xCD, 0xCD, 0xD9}, 26}, /* ммы */ + {{0xC5, 0xD3, 0xD0}, 26}, /* есп */ + {{0xCE, 0xCB, 0xD5}, 26}, /* нку */ + {{0xC9, 0xC3, 0xD5}, 25}, /* ицу */ + {{0xC4, 0xD3, 0xCB}, 25}, /* дск */ + {{0xCE, 0xC9, 0xCE}, 25}, /* нин */ + {{0xD0, 0xCC, 0xC5}, 25}, /* пле */ + {{0xC6, 0xCF, 0xD2}, 25}, /* фор */ + {{0xCC, 0xC1, 0xD3}, 25}, /* лас */ + {{0xC4, 0xC9, 0xCD}, 25}, /* дим */ + {{0xC5, 0xD3, 0xD1}, 25}, /* еся */ + {{0xCE, 0xC9, 0xDE}, 25}, /* нич */ + {{0xCF, 0xD7, 0xD2}, 25}, /* овр */ + {{0xD7, 0xD3, 0xCC}, 25}, /* всл */ + {{0xD2, 0xDB, 0xC5}, 25}, /* рше */ + {{0xC5, 0xDD, 0xC1}, 25}, /* еща */ + {{0xD6, 0xCE, 0xD9}, 25}, /* жны */ + {{0xD2, 0xC9, 0xCD}, 25}, /* рим */ + {{0xDA, 0xC1, 0xC3}, 25}, /* зац */ + {{0xC2, 0xDD, 0xC5}, 25}, /* бще */ + {{0xC1, 0xCB, 0xD4}, 25}, /* акт */ + {{0xC1, 0xC4, 0xD3}, 25}, /* адс */ + {{0xD5, 0xDE, 0xD2}, 25}, /* учр */ + {{0xDD, 0xC9, 0xC5}, 25}, /* щие */ + {{0xD6, 0xC9, 0xD4}, 24}, /* жит */ + {{0xC2, 0xD2, 0xC5}, 24}, /* бре */ + {{0xD5, 0xC7, 0xCF}, 24}, /* уго */ + {{0xC9, 0xD1, 0xC8}, 24}, /* иях */ + {{0xD4, 0xD8, 0xC0}, 24}, /* тью */ + {{0xD8, 0xD3, 0xD1}, 24}, /* ься */ + {{0xD7, 0xCF, 0xD7}, 24}, /* вов */ + {{0xCF, 0xDE, 0xCE}, 24}, /* очн */ + {{0xD7, 0xCF, 0xCF}, 24}, /* воо */ + {{0xCF, 0xC4, 0xD9}, 24}, /* оды */ + {{0xCC, 0xCF, 0xC7}, 24}, /* лог */ + {{0xD7, 0xC1, 0xC5}, 24}, /* вае */ + {{0xC1, 0xD1, 0xC8}, 24}, /* аях */ + {{0xD4, 0xD8, 0xD3}, 24}, /* тьс */ + {{0xC4, 0xC9, 0xDE}, 24}, /* дич */ + {{0xCB, 0xC9, 0xC8}, 24}, /* ких */ + {{0xC3, 0xC1, 0xCD}, 24}, /* цам */ + {{0xC9, 0xDA, 0xD7}, 24}, /* изв */ + {{0xD4, 0xC9, 0xD7}, 24}, /* тив */ + {{0xC5, 0xCF, 0xC2}, 24}, /* еоб */ + {{0xD3, 0xCF, 0xD3}, 24}, /* сос */ + {{0xDB, 0xC9, 0xCD}, 24}, /* шим */ + {{0xD9, 0xD0, 0xCF}, 24}, /* ыпо */ + {{0xC5, 0xD6, 0xC1}, 24}, /* ежа */ + {{0xD4, 0xCF, 0xC9}, 24}, /* тои */ + {{0xCB, 0xD4, 0xCF}, 24}, /* кто */ + {{0xC5, 0xDE, 0xC1}, 24}, /* еча */ + {{0xC9, 0xC4, 0xC9}, 24}, /* иди */ + {{0xC2, 0xDD, 0xC9}, 23}, /* бщи */ + {{0xD4, 0xD8, 0xC5}, 23}, /* тье */ + {{0xC2, 0xDF, 0xD1}, 23}, /* бъя */ + {{0xCE, 0xC1, 0xDE}, 23}, /* нач */ + {{0xD4, 0xC5, 0xDE}, 23}, /* теч */ + {{0xD5, 0xD2, 0xD3}, 23}, /* урс */ + {{0xD7, 0xC5, 0xDE}, 23}, /* веч */ + {{0xC5, 0xCD, 0xC5}, 23}, /* еме */ + {{0xCF, 0xC2, 0xC8}, 23}, /* обх */ + {{0xC2, 0xC8, 0xCF}, 23}, /* бхо */ + {{0xC4, 0xC1, 0xC5}, 23}, /* дае */ + {{0xD2, 0xC5, 0xDA}, 23}, /* рез */ + {{0xCB, 0xC1, 0xD6}, 22}, /* каж */ + {{0xCF, 0xCB, 0xD5}, 22}, /* оку */ + {{0xC1, 0xCD, 0xC5}, 22}, /* аме */ + {{0xCE, 0xC5, 0xDA}, 22}, /* нез */ + {{0xD9, 0xD7, 0xC1}, 22}, /* ыва */ + {{0xD3, 0xD7, 0xD1}, 22}, /* свя */ + {{0xD2, 0xC1, 0xC4}, 22}, /* рад */ + {{0xC5, 0xDA, 0xC1}, 22}, /* еза */ + {{0xC9, 0xD7, 0xC1}, 22}, /* ива */ + {{0xCB, 0xC1, 0xCD}, 22}, /* кам */ + {{0xCE, 0xC5, 0xCD}, 22}, /* нем */ + {{0xD4, 0xCB, 0xCF}, 22}, /* тко */ + {{0xDA, 0xD7, 0xC5}, 22}, /* зве */ + {{0xD7, 0xD1, 0xDA}, 22}, /* вяз */ + {{0xD1, 0xD4, 0xC9}, 22}, /* яти */ + {{0xCF, 0xC8, 0xD2}, 22}, /* охр */ + {{0xD2, 0xCF, 0xD4}, 22}, /* рот */ + {{0xCF, 0xCC, 0xC5}, 22}, /* оле */ + {{0xC2, 0xD2, 0xC1}, 22}, /* бра */ + {{0xC1, 0xC5, 0xCD}, 22}, /* аем */ + {{0xCC, 0xC1, 0xDB}, 21}, /* лаш */ + {{0xC9, 0xDA, 0xCD}, 21}, /* изм */ + {{0xC7, 0xD5, 0xD4}, 21}, /* гут */ + {{0xCF, 0xD6, 0xC4}, 21}, /* ожд */ + {{0xCB, 0xC1, 0xCB}, 21}, /* как */ + {{0xCB, 0xC1, 0xDE}, 21}, /* кач */ + {{0xCE, 0xC1, 0xCD}, 21}, /* нам */ + {{0xC4, 0xCF, 0xC8}, 21}, /* дох */ + {{0xCF, 0xC8, 0xCF}, 21}, /* охо */ + {{0xC0, 0xD2, 0xC9}, 21}, /* юри */ + {{0xD7, 0xC1, 0xCD}, 21}, /* вам */ + {{0xDA, 0xCD, 0xCF}, 21}, /* змо */ + {{0xC4, 0xCB, 0xC5}, 21}, /* дке */ + {{0xC2, 0xC1, 0xCE}, 21}, /* бан */ + {{0xC5, 0xCC, 0xC9}, 21}, /* ели */ + {{0xD2, 0xC9, 0xDA}, 21}, /* риз */ + {{0xCC, 0xCE, 0xCF}, 21}, /* лно */ + {{0xD7, 0xD9, 0xDB}, 21}, /* выш */ + {{0xC4, 0xC3, 0xC1}, 21}, /* дца */ + {{0xD1, 0xC4, 0xCB}, 21}, /* ядк */ + {{0xCF, 0xD4, 0xD3}, 21}, /* отс */ + {{0xD4, 0xC5, 0xCA}, 21}, /* тей */ + {{0xC1, 0xCE, 0xCB}, 21}, /* анк */ + {{0xCE, 0xC5, 0xC7}, 21}, /* нег */ + {{0xC3, 0xC1, 0xD4}, 21}, /* цат */ + {{0xC5, 0xCD, 0xD9}, 21}, /* емы */ + {{0xD7, 0xCF, 0xC5}, 21}, /* вое */ + {{0xC4, 0xC1, 0xDE}, 21}, /* дач */ + {{0xCF, 0xC7, 0xD5}, 21}, /* огу */ + {{0xCC, 0xD6, 0xC5}, 21}, /* лже */ + {{0xD4, 0xCE, 0xC9}, 21}, /* тни */ + {{0xDA, 0xC1, 0xD7}, 21}, /* зав */ + {{0xD7, 0xC5, 0xD3}, 21}, /* вес */ + {{0xD3, 0xC1, 0xCD}, 20}, /* сам */ + {{0xC1, 0xD2, 0xCE}, 20}, /* арн */ + {{0xDE, 0xCE, 0xD9}, 20}, /* чны */ + {{0xD3, 0xD2, 0xC5}, 20}, /* сре */ + {{0xD4, 0xC9, 0xD1}, 20}, /* тия */ + {{0xC9, 0xD3, 0xCC}, 20}, /* исл */ + {{0xF3, 0xD4, 0xD2}, 20}, /* Стр */ + {{0xCE, 0xD4, 0xCF}, 20}, /* нто */ + {{0xD5, 0xD4, 0xD2}, 20}, /* утр */ + {{0xC1, 0xDB, 0xC5}, 20}, /* аше */ + {{0xC5, 0xCC, 0xC1}, 20}, /* ела */ + {{0xD5, 0xC4, 0xCF}, 20}, /* удо */ + {{0xD6, 0xC9, 0xDA}, 19}, /* жиз */ + {{0xD0, 0xC9, 0xD3}, 19}, /* пис */ + {{0xC1, 0xC9, 0xCD}, 19}, /* аим */ + {{0xDE, 0xC9, 0xD3}, 19}, /* чис */ + {{0xC5, 0xD6, 0xC9}, 19}, /* ежи */ + {{0xD7, 0xD3, 0xC5}, 19}, /* все */ + {{0xCC, 0xD8, 0xCB}, 19}, /* льк */ + {{0xC1, 0xD4, 0xD5}, 19}, /* ату */ + {{0xD5, 0xC4, 0xC1}, 19}, /* уда */ + {{0xDB, 0xC9, 0xCA}, 19}, /* ший */ + {{0xDA, 0xC1, 0xD2}, 19}, /* зар */ + {{0xC5, 0xC4, 0xCE}, 19}, /* едн */ + {{0xC1, 0xD7, 0xDB}, 19}, /* авш */ + {{0xD2, 0xCF, 0xC9}, 19}, /* рои */ + {{0xC9, 0xC4, 0xC1}, 19}, /* ида */ + {{0xC1, 0xD2, 0xCF}, 19}, /* аро */ + {{0xD4, 0xCF, 0xCA}, 19}, /* той */ + {{0xD6, 0xC1, 0xDD}, 19}, /* жащ */ + {{0xC5, 0xD3, 0xCF}, 19}, /* есо */ + {{0xD0, 0xC1, 0xCC}, 19}, /* пал */ + {{0xDD, 0xC1, 0xC5}, 19}, /* щае */ + {{0xD2, 0xD9, 0xC5}, 19}, /* рые */ + {{0xC5, 0xCE, 0xD1}, 19}, /* еня */ + {{0xDD, 0xC9, 0xCA}, 19}, /* щий */ + {{0xCC, 0xD5, 0xC7}, 19}, /* луг */ + {{0xC0, 0xDE, 0xC9}, 18}, /* ючи */ + {{0xD5, 0xCC, 0xD8}, 18}, /* уль */ + {{0xCD, 0xD9, 0xC8}, 18}, /* мых */ + {{0xD2, 0xCF, 0xC7}, 18}, /* рог */ + {{0xD3, 0xCF, 0xC8}, 18}, /* сох */ + {{0xCB, 0xCF, 0xC5}, 18}, /* кое */ + {{0xCE, 0xD4, 0xD3}, 18}, /* нтс */ + {{0xC1, 0xDA, 0xCE}, 18}, /* азн */ + {{0xD4, 0xCE, 0xD9}, 18}, /* тны */ + {{0xCF, 0xC4, 0xD1}, 18}, /* одя */ + {{0xCF, 0xC2, 0xCE}, 18}, /* обн */ + {{0xD7, 0xD9, 0xC4}, 18}, /* выд */ + {{0xCF, 0xD3, 0xD1}, 18}, /* ося */ + {{0xD8, 0xD4, 0xC1}, 18}, /* ьта */ + {{0xCE, 0xD1, 0xC0}, 18}, /* няю */ + {{0xCE, 0xC1, 0xD2}, 18}, /* нар */ + {{0xC5, 0xDA, 0xD5}, 18}, /* езу */ + {{0xC1, 0xD3, 0xCE}, 18}, /* асн */ + {{0xDA, 0xD5, 0xCC}, 18}, /* зул */ + {{0xC3, 0xC9, 0xD0}, 18}, /* цип */ + {{0xCB, 0xD4, 0xC5}, 18}, /* кте */ + {{0xC4, 0xCF, 0xD0}, 18}, /* доп */ + {{0xCE, 0xC3, 0xC9}, 18}, /* нци */ + {{0xD3, 0xD0, 0xC5}, 18}, /* спе */ + {{0xC9, 0xCD, 0xD9}, 18}, /* имы */ + {{0xCD, 0xCF, 0xCD}, 18}, /* мом */ + {{0xD0, 0xC5, 0xDE}, 18}, /* печ */ + {{0xEF, 0xC2, 0xD1}, 18}, /* Обя */ + {{0xF0, 0xD2, 0xC1}, 18}, /* Пра */ + {{0xCF, 0xCC, 0xCF}, 18}, /* оло */ + {{0xD4, 0xD3, 0xCB}, 18}, /* тск */ + {{0xCC, 0xCE, 0xC9}, 18}, /* лни */ + {{0xC5, 0xD2, 0xD4}, 18}, /* ерт */ + {{0xC9, 0xD3, 0xD8}, 18}, /* ись */ + {{0xCC, 0xD8, 0xD4}, 18}, /* льт */ + {{0xD3, 0xD5, 0xD4}, 18}, /* сут */ + {{0xD7, 0xCF, 0xC2}, 17}, /* воб */ + {{0xD2, 0xCE, 0xD9}, 17}, /* рны */ + {{0xC2, 0xCE, 0xD9}, 17}, /* бны */ + {{0xD9, 0xC4, 0xC1}, 17}, /* ыда */ + {{0xD8, 0xDA, 0xD5}, 17}, /* ьзу */ + {{0xC5, 0xC4, 0xD0}, 17}, /* едп */ + {{0xC1, 0xC4, 0xC5}, 17}, /* аде */ + {{0xC9, 0xD0, 0xC1}, 17}, /* ипа */ + {{0xD3, 0xC5, 0xCA}, 17}, /* сей */ + {{0xC5, 0xC5, 0xD3}, 17}, /* еес */ + {{0xCF, 0xC9, 0xDA}, 17}, /* оиз */ + {{0xCF, 0xD3, 0xD7}, 17}, /* осв */ + {{0xC4, 0xC9, 0xD7}, 17}, /* див */ + {{0xCE, 0xC1, 0xCE}, 17}, /* нан */ + {{0xC5, 0xD4, 0xC1}, 17}, /* ета */ + {{0xC4, 0xCE, 0xC5}, 17}, /* дне */ + {{0xC9, 0xCF, 0xC2}, 17}, /* иоб */ + {{0xD5, 0xC5, 0xD4}, 17}, /* ует */ + {{0xCE, 0xC1, 0xC8}, 17}, /* нах */ + {{0xD3, 0xCD, 0xC5}, 17}, /* сме */ + {{0xC1, 0xCC, 0xC9}, 17}, /* али */ + {{0xC2, 0xDF, 0xC5}, 17}, /* бъе */ + {{0xD0, 0xC1, 0xD3}, 17}, /* пас */ + {{0xDA, 0xC1, 0xCC}, 17}, /* зал */ + {{0xD2, 0xD6, 0xC1}, 16}, /* ржа */ + {{0xD1, 0xD7, 0xC9}, 16}, /* яви */ + {{0xD6, 0xC1, 0xD4}, 16}, /* жат */ + {{0xC2, 0xCF, 0xD6}, 16}, /* бож */ + {{0xD3, 0xC9, 0xCC}, 16}, /* сил */ + {{0xCE, 0xD5, 0xC0}, 16}, /* ную */ + {{0xD0, 0xC5, 0xCE}, 16}, /* пен */ + {{0xCD, 0xC1, 0xD4}, 16}, /* мат */ + {{0xCF, 0xCE, 0xCE}, 16}, /* онн */ + {{0xD7, 0xC9, 0xCE}, 16}, /* вин */ + {{0xD4, 0xCB, 0xC9}, 16}, /* тки */ + {{0xD4, 0xCF, 0xDE}, 16}, /* точ */ + {{0xD3, 0xDE, 0xC9}, 16}, /* счи */ + {{0xCE, 0xC9, 0xC3}, 16}, /* ниц */ + {{0xDD, 0xC5, 0xC5}, 16}, /* щее */ + {{0xC2, 0xC5, 0xD3}, 16}, /* бес */ + {{0xC1, 0xC4, 0xC3}, 16}, /* адц */ + {{0xEB, 0xCF, 0xCD}, 16}, /* Ком */ + {{0xD8, 0xC9, 0xCD}, 16}, /* ьим */ + {{0xD5, 0xD4, 0xD3}, 16}, /* утс */ + {{0xC1, 0xDE, 0xC9}, 16}, /* ачи */ + {{0xD0, 0xCF, 0xCE}, 16}, /* пон */ + {{0xCB, 0xC1, 0xC5}, 16}, /* кае */ + {{0xC9, 0xC7, 0xD2}, 16}, /* игр */ + {{0xC1, 0xCB, 0xC9}, 16}, /* аки */ + {{0xC1, 0xDD, 0xC9}, 16}, /* ащи */ + {{0xCC, 0xD8, 0xC3}, 16}, /* льц */ + {{0xD7, 0xCE, 0xCF}, 16}, /* вно */ + {{0xD9, 0xDB, 0xC5}, 15}, /* ыше */ + {{0xEC, 0xC9, 0xC3}, 15}, /* Лиц */ + {{0xD8, 0xC5, 0xCA}, 15}, /* ьей */ + {{0xDB, 0xC5, 0xCD}, 15}, /* шем */ + {{0xD5, 0xC2, 0xCC}, 15}, /* убл */ + {{0xD2, 0xC1, 0xC3}, 15}, /* рац */ + {{0xCB, 0xD5, 0xCD}, 15}, /* кум */ + {{0xD2, 0xC5, 0xC7}, 15}, /* рег */ + {{0xCF, 0xD0, 0xC1}, 15}, /* опа */ + {{0xF7, 0xCF, 0xDA}, 15}, /* Воз */ + {{0xD4, 0xC1, 0xC5}, 15}, /* тае */ + {{0xCF, 0xC2, 0xD9}, 15}, /* обы */ + {{0xC2, 0xCC, 0xC9}, 15}, /* бли */ + {{0xD2, 0xCD, 0xC5}, 15}, /* рме */ + {{0xD7, 0xCF, 0xD3}, 15}, /* вос */ + {{0xC1, 0xD3, 0xC9}, 15}, /* аси */ + {{0xD4, 0xC1, 0xCD}, 15}, /* там */ + {{0xD8, 0xCD, 0xC5}, 15}, /* ьме */ + {{0xCF, 0xC7, 0xC1}, 15}, /* ога */ + {{0xC9, 0xCC, 0xCF}, 15}, /* ило */ + {{0xD3, 0xD8, 0xCD}, 15}, /* сьм */ + {{0xD2, 0xD4, 0xC9}, 15}, /* рти */ + {{0xD4, 0xD3, 0xD5}, 15}, /* тсу */ + {{0xD3, 0xC5, 0xCE}, 15}, /* сен */ + {{0xD4, 0xC1, 0xCC}, 15}, /* тал */ + {{0xC4, 0xC1, 0xD2}, 15}, /* дар */ + {{0xC1, 0xCD, 0xCF}, 15}, /* амо */ + {{0xC5, 0xC4, 0xCC}, 15}, /* едл */ + {{0xD3, 0xD5, 0xC2}, 15}, /* суб */ + {{0xC5, 0xCA, 0xC6}, 15}, /* ейф */ + {{0xE8, 0xD2, 0xC1}, 15}, /* Хра */ + {{0xCC, 0xC1, 0xCD}, 14}, /* лам */ + {{0xC1, 0xD2, 0xD5}, 14}, /* ару */ + {{0xC7, 0xC9, 0xC8}, 14}, /* гих */ + {{0xC3, 0xC9, 0xD1}, 14}, /* ция */ + {{0xC4, 0xC1, 0xD7}, 14}, /* дав */ + {{0xCC, 0xC9, 0xDB}, 14}, /* лиш */ + {{0xC0, 0xDE, 0xC1}, 14}, /* юча */ + {{0xC1, 0xCE, 0xD3}, 14}, /* анс */ + {{0xCF, 0xC7, 0xD2}, 14}, /* огр */ + {{0xC9, 0xDD, 0xC1}, 14}, /* ища */ + {{0xC5, 0xCE, 0xD8}, 14}, /* ень */ + {{0xCF, 0xD4, 0xC9}, 14}, /* оти */ + {{0xC1, 0xC4, 0xD9}, 13}, /* ады */ + {{0xC1, 0xDD, 0xC1}, 13}, /* аща */ + {{0xD7, 0xCF, 0xC9}, 13}, /* вои */ + {{0xD7, 0xD9, 0xCD}, 13}, /* вым */ + {{0xD7, 0xD8, 0xD1}, 13}, /* вья */ + {{0xCB, 0xC9, 0xC5}, 13}, /* кие */ + {{0xCC, 0xC9, 0xD3}, 13}, /* лис */ + {{0xCD, 0xC5, 0xC4}, 13}, /* мед */ + {{0xD4, 0xC9, 0xC8}, 13}, /* тих */ + {{0xC5, 0xD4, 0xCF}, 13}, /* ето */ + {{0xDA, 0xCC, 0xCF}, 13}, /* зло */ + {{0xCF, 0xD0, 0xC5}, 13}, /* опе */ + {{0xD3, 0xC9, 0xCD}, 13}, /* сим */ + {{0xD1, 0xDA, 0xC9}, 13}, /* язи */ + {{0xC9, 0xCE, 0xC4}, 13}, /* инд */ + {{0xDE, 0xD5, 0xD6}, 13}, /* чуж */ + {{0xCC, 0xCB, 0xC9}, 13}, /* лки */ + {{0xC4, 0xD0, 0xD2}, 13}, /* дпр */ + {{0xCE, 0xC4, 0xC9}, 13}, /* нди */ + {{0xCF, 0xD4, 0xC1}, 13}, /* ота */ + {{0xCF, 0xD4, 0xD9}, 13}, /* оты */ + {{0xCC, 0xC1, 0xDE}, 13}, /* лач */ + {{0xCB, 0xC9, 0xCD}, 13}, /* ким */ + {{0xC9, 0xD3, 0xC9}, 13}, /* иси */ + {{0xD7, 0xC1, 0xCC}, 13}, /* вал */ + {{0xC5, 0xCD, 0xCF}, 13}, /* емо */ + {{0xD0, 0xD5, 0xC2}, 13}, /* пуб */ + {{0xD1, 0xC5, 0xCD}, 13}, /* яем */ + {{0xC2, 0xCF, 0xCC}, 13}, /* бол */ + {{0xCE, 0xD4, 0xD5}, 13}, /* нту */ + {{0xCE, 0xC5, 0xCA}, 13}, /* ней */ + {{0xCE, 0xC1, 0xD1}, 13}, /* ная */ + {{0xC5, 0xD3, 0xC1}, 13}, /* еса */ + {{0xD2, 0xCE, 0xCF}, 13}, /* рно */ + {{0xDD, 0xC5, 0xCD}, 13}, /* щем */ + {{0xC1, 0xCE, 0xD9}, 13}, /* аны */ + {{0xE4, 0xCF, 0xD7}, 13}, /* Дов */ + {{0xDE, 0xC9, 0xD7}, 13}, /* чив */ + {{0xD7, 0xC9, 0xD3}, 13}, /* вис */ + {{0xCF, 0xD0, 0xCF}, 13}, /* опо */ + {{0xD7, 0xD8, 0xC0}, 13}, /* вью */ + {{0xC1, 0xCC, 0xC1}, 13}, /* ала */ + {{0xCC, 0xC5, 0xCA}, 12}, /* лей */ + {{0xC1, 0xDE, 0xC1}, 12}, /* ача */ + {{0xC5, 0xDA, 0xD7}, 12}, /* езв */ + {{0xD7, 0xC1, 0xD1}, 12}, /* вая */ + {{0xC5, 0xCF, 0xD3}, 12}, /* еос */ + {{0xD1, 0xDD, 0xC9}, 12}, /* ящи */ + {{0xC9, 0xD7, 0xC9}, 12}, /* иви */ + {{0xCE, 0xC5, 0xC5}, 12}, /* нее */ + {{0xD4, 0xD2, 0xD5}, 12}, /* тру */ + {{0xDB, 0xC5, 0xC5}, 12}, /* шее */ + {{0xD3, 0xC1, 0xC8}, 12}, /* сах */ + {{0xC9, 0xCE, 0xC3}, 12}, /* инц */ + {{0xCF, 0xCD, 0xD0}, 12}, /* омп */ + {{0xD5, 0xD6, 0xCF}, 12}, /* ужо */ + {{0xD5, 0xC1, 0xCC}, 12}, /* уал */ + {{0xCE, 0xC1, 0xD4}, 12}, /* нат */ + {{0xC9, 0xC4, 0xD5}, 12}, /* иду */ + {{0xD7, 0xCC, 0xC1}, 12}, /* вла */ + {{0xDA, 0xD7, 0xC1}, 12}, /* зва */ + {{0xCC, 0xC5, 0xC5}, 12}, /* лее */ + {{0xD2, 0xC5, 0xC8}, 12}, /* рех */ + {{0xD6, 0xC4, 0xD5}, 12}, /* жду */ + {{0xCD, 0xC1, 0xCC}, 12}, /* мал */ + {{0xC5, 0xCE, 0xD3}, 12}, /* енс */ + {{0xC9, 0xCA, 0xD3}, 12}, /* ийс */ + {{0xCB, 0xCF, 0xCC}, 12}, /* кол */ + {{0xCE, 0xC1, 0xDA}, 12}, /* наз */ + {{0xC4, 0xD5, 0xC1}, 12}, /* дуа */ + {{0xCF, 0xCE, 0xC9}, 12}, /* они */ + {{0xD3, 0xC5, 0xCD}, 12}, /* сем */ + {{0xC7, 0xCF, 0xC4}, 12}, /* год */ + {{0xCD, 0xC5, 0xD6}, 12}, /* меж */ + {{0xCF, 0xDA, 0xCC}, 12}, /* озл */ + {{0xD7, 0xCD, 0xC5}, 12}, /* вме */ + {{0xD5, 0xC4, 0xC5}, 12}, /* уде */ + {{0xD8, 0xCB, 0xCF}, 12}, /* ько */ + {{0xC5, 0xD7, 0xD9}, 12}, /* евы */ + {{0xDA, 0xC1, 0xCD}, 12}, /* зам */ + {{0xD3, 0xCF, 0xC4}, 12}, /* сод */ + {{0xD2, 0xCF, 0xC5}, 11}, /* рое */ + {{0xCF, 0xD4, 0xC4}, 11}, /* отд */ + {{0xD3, 0xC9, 0xD1}, 11}, /* сия */ + {{0xC9, 0xCB, 0xD5}, 11}, /* ику */ + {{0xD9, 0xCC, 0xC9}, 11}, /* ыли */ + {{0xC7, 0xC9, 0xCD}, 11}, /* гим */ + {{0xCE, 0xD8, 0xDB}, 11}, /* ньш */ + {{0xD4, 0xC9, 0xDE}, 11}, /* тич */ + {{0xD2, 0xC1, 0xCC}, 11}, /* рал */ + {{0xD5, 0xDE, 0xC9}, 11}, /* учи */ + {{0xCD, 0xC5, 0xC0}, 11}, /* мею */ + {{0xD4, 0xC5, 0xCB}, 11}, /* тек */ + {{0xCF, 0xC2, 0xD5}, 11}, /* обу */ + {{0xCE, 0xCE, 0xD5}, 11}, /* нну */ + {{0xCE, 0xC5, 0xD0}, 11}, /* неп */ + {{0xD7, 0xC5, 0xCC}, 11}, /* вел */ + {{0xD4, 0xCD, 0xC5}, 11}, /* тме */ + {{0xC2, 0xCF, 0xC7}, 11}, /* бог */ + {{0xCF, 0xD2, 0xC9}, 11}, /* ори */ + {{0xC1, 0xD7, 0xCE}, 11}, /* авн */ + {{0xC4, 0xC5, 0xC5}, 11}, /* дее */ + {{0xD6, 0xCF, 0xCD}, 11}, /* жом */ + {{0xF7, 0xD2, 0xC5}, 11}, /* Вре */ + {{0xCD, 0xD9, 0xC5}, 11}, /* мые */ + {{0xD8, 0xC3, 0xC1}, 11}, /* ьца */ + {{0xCF, 0xC3, 0xC5}, 11}, /* оце */ + {{0xC9, 0xD4, 0xD9}, 10}, /* иты */ + {{0xDA, 0xD2, 0xC1}, 10}, /* зра */ + {{0xCF, 0xCE, 0xD9}, 10}, /* оны */ + {{0xD2, 0xC5, 0xDB}, 10}, /* реш */ + {{0xD5, 0xDB, 0xC5}, 10}, /* уше */ + {{0xD2, 0xC5, 0xD7}, 10}, /* рев */ + {{0xCF, 0xD0, 0xD5}, 10}, /* опу */ + {{0xD1, 0xD4, 0xD9}, 10}, /* яты */ + {{0xD4, 0xC1, 0xDE}, 10}, /* тач */ + {{0xC5, 0xD2, 0xCF}, 10}, /* еро */ + {{0xD7, 0xCB, 0xCC}, 10}, /* вкл */ + {{0xDA, 0xD9, 0xD7}, 10}, /* зыв */ + {{0xC1, 0xD0, 0xD2}, 10}, /* апр */ + {{0xD2, 0xD5, 0xDB}, 10}, /* руш */ + {{0xEF, 0xD4, 0xD7}, 10}, /* Отв */ + {{0xD2, 0xD3, 0xC1}, 10}, /* рса */ + {{0xC5, 0xCB, 0xD4}, 10}, /* ект */ + {{0xCC, 0xC5, 0xCB}, 10}, /* лек */ + {{0xC5, 0xC5, 0xD4}, 10}, /* еет */ + {{0xCF, 0xD0, 0xCC}, 10}, /* опл */ + {{0xD4, 0xDE, 0xC5}, 10}, /* тче */ + {{0xC7, 0xCF, 0xCD}, 10}, /* гом */ + {{0xD4, 0xCF, 0xD6}, 10}, /* тож */ + {{0xCC, 0xC5, 0xDE}, 10}, /* леч */ + {{0xC5, 0xD4, 0xD9}, 10}, /* еты */ + {{0xCF, 0xD6, 0xC9}, 10}, /* ожи */ + {{0xCD, 0xCE, 0xCF}, 10}, /* мно */ + {{0xCD, 0xCF, 0xCA}, 10}, /* мой */ + {{0xC3, 0xC5, 0xCC}, 10}, /* цел */ + {{0xD5, 0xD0, 0xC9}, 10}, /* упи */ + {{0xC1, 0xC5, 0xD7}, 10}, /* аев */ + {{0xD0, 0xCF, 0xCD}, 10}, /* пом */ + {{0xC4, 0xD1, 0xDD}, 10}, /* дящ */ + {{0xD4, 0xD2, 0xC9}, 10}, /* три */ + {{0xDB, 0xC9, 0xC5}, 10}, /* шие */ + {{0xC5, 0xCB, 0xC1}, 10}, /* ека */ + {{0xC5, 0xDB, 0xC5}, 10}, /* еше */ + {{0xDA, 0xC1, 0xC9}, 10}, /* заи */ + {{0xC9, 0xD4, 0xCF}, 10}, /* ито */ + {{0xDA, 0xCE, 0xD9}, 10}, /* зны */ + {{0xCF, 0xD1, 0xCE}, 10}, /* оян */ + {{0xC9, 0xD6, 0xC5}, 10}, /* иже */ + {{0xD7, 0xCE, 0xC5}, 10}, /* вне */ + {{0xD2, 0xD3, 0xD4}, 10}, /* рст */ + {{0xC5, 0xCD, 0xD1}, 10}, /* емя */ + {{0xCE, 0xC1, 0xC9}, 10}, /* наи */ + {{0xD4, 0xCF, 0xCC}, 10}, /* тол */ + {{0xCC, 0xC9, 0xD4}, 10}, /* лит */ + {{0xCF, 0xD3, 0xD2}, 10}, /* оср */ + {{0xD4, 0xC4, 0xC5}, 10}, /* тде */ + {{0xC5, 0xCD, 0xC9}, 10}, /* еми */ + {{0xCD, 0xC5, 0xC5}, 10}, /* мее */ + {{0xD2, 0xD9, 0xC8}, 10}, /* рых */ + {{0xCE, 0xC9, 0xD7}, 10}, /* нив */ + {{0xC5, 0xD2, 0xD5}, 10}, /* еру */ + {{0xDE, 0xC5, 0xCD}, 10}, /* чем */ + {{0xC4, 0xCF, 0xC2}, 10}, /* доб */ + {{0xC5, 0xCC, 0xCF}, 10}, /* ело */ + {{0xC9, 0xCC, 0xD5}, 10}, /* илу */ + {{0xC1, 0xC4, 0xCC}, 10}, /* адл */ + {{0xC9, 0xDE, 0xD4}, 10}, /* ичт */ + {{0xCD, 0xCC, 0xC5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_windows_1251[] = { + {{0xE5, 0xED, 0xE8}, 991}, /* ени */ + {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ + {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ + {{0xED, 0xE8, 0xFF}, 629}, /* ния */ + {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ + {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ + {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ + {{0xE5, 0xED, 0xED}, 499}, /* енн */ + {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ + {{0xE0, 0xED, 0xE8}, 443}, /* ани */ + {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ + {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ + {{0xED, 0xE8, 0xE5}, 419}, /* ние */ + {{0xED, 0xED, 0xEE}, 412}, /* нно */ + {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ + {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ + {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ + {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ + {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ + {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ + {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ + {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ + {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ + {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ + {{0xEF, 0xF0, 0xE8}, 330}, /* при */ + {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ + {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ + {{0xED, 0xE5, 0xED}, 310}, /* нен */ + {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ + {{0xE2, 0xE0, 0xED}, 304}, /* ван */ + {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ + {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ + {{0xEB, 0xE5, 0xED}, 266}, /* лен */ + {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ + {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ + {{0xED, 0xED, 0xFB}, 260}, /* нны */ + {{0xEB, 0xFC, 0xED}, 256}, /* льн */ + {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ + {{0xE8, 0xEB, 0xE8}, 254}, /* или */ + {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ + {{0xE5, 0xE3, 0xEE}, 241}, /* его */ + {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ + {{0xED, 0xEE, 0xF1}, 236}, /* нос */ + {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ + {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ + {{0xF0, 0xE0, 0xED}, 231}, /* ран */ + {{0xED, 0xEE, 0xE3}, 230}, /* ног */ + {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ + {{0xF7, 0xE5, 0xED}, 226}, /* чен */ + {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ + {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ + {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ + {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ + {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ + {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ + {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ + {{0xE7, 0xE0, 0xED}, 194}, /* зан */ + {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ + {{0xF2, 0xF1, 0xFF}, 191}, /* тся */ + {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ + {{0xE0, 0xED, 0xED}, 182}, /* анн */ + {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ + {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ + {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ + {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ + {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ + {{0xEC, 0xE5, 0xED}, 170}, /* мен */ + {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ + {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ + {{0xF0, 0xE5, 0xED}, 167}, /* рен */ + {{0xF9, 0xE5, 0xED}, 165}, /* щен */ + {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ + {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ + {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ + {{0xFF, 0xE7, 0xE0}, 159}, /* яза */ + {{0xE1, 0xFF, 0xE7}, 158}, /* бяз */ + {{0xED, 0xE8, 0xE8}, 153}, /* нии */ + {{0xED, 0xFB, 0xF5}, 153}, /* ных */ + {{0xF2, 0xFC, 0xFF}, 153}, /* тья */ + {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ + {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ + {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ + {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ + {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ + {{0xED, 0xEE, 0xEC}, 144}, /* ном */ + {{0xE4, 0xE5, 0xED}, 144}, /* ден */ + {{0xE0, 0xED, 0xE5}, 142}, /* ане */ + {{0xEA, 0xEE, 0xED}, 141}, /* кон */ + {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ + {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ + {{0xEE, 0xE1, 0xFF}, 140}, /* обя */ + {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ + {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ + {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ + {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ + {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ + {{0xED, 0xFB, 0xEC}, 136}, /* ным */ + {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ + {{0xD1, 0xF2, 0xE0}, 134}, /* Ста */ + {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ + {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ + {{0xE5, 0xEB, 0xFF}, 130}, /* еля */ + {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ + {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ + {{0xF2, 0xEE, 0xFF}, 129}, /* тоя */ + {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ + {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ + {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ + {{0xE2, 0xE5, 0xED}, 127}, /* вен */ + {{0xED, 0xEE, 0xE2}, 127}, /* нов */ + {{0xED, 0xEE, 0xE5}, 126}, /* ное */ + {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ + {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ + {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ + {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ + {{0xE5, 0xED, 0xF2}, 124}, /* ент */ + {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ + {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ + {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ + {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ + {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ + {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ + {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ + {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ + {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ + {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ + {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ + {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ + {{0xEF, 0xF0, 0xEE}, 114}, /* про */ + {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ + {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ + {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ + {{0xF8, 0xE5, 0xED}, 111}, /* шен */ + {{0xF7, 0xE8, 0xED}, 110}, /* чин */ + {{0xED, 0xE0, 0xF1}, 109}, /* нас */ + {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ + {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ + {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ + {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ + {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ + {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ + {{0xF2, 0xEE, 0xEC}, 104}, /* том */ + {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ + {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ + {{0xEE, 0xEB, 0xED}, 102}, /* олн */ + {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ + {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ + {{0xED, 0xEE, 0xE9}, 101}, /* ной */ + {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ + {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ + {{0xED, 0xFB, 0xE5}, 99}, /* ные */ + {{0xE7, 0xED, 0xE0}, 99}, /* зна */ + {{0xE2, 0xEB, 0xFF}, 99}, /* вля */ + {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ + {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ + {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ + {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ + {{0xED, 0xFB, 0xE9}, 96}, /* ный */ + {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ + {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ + {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ + {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ + {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ + {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ + {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ + {{0xE8, 0xED, 0xE5}, 91}, /* ине */ + {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ + {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ + {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ + {{0xED, 0xE8, 0xF2}, 89}, /* нит */ + {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ + {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ + {{0xE6, 0xE5, 0xED}, 87}, /* жен */ + {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ + {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ + {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ + {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ + {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ + {{0xE2, 0xE8, 0xFF}, 85}, /* вия */ + {{0xFF, 0xF9, 0xE5}, 85}, /* яще */ + {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ + {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ + {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ + {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ + {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ + {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ + {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ + {{0xEE, 0xFF, 0xF9}, 82}, /* оящ */ + {{0xE5, 0xED, 0xEE}, 81}, /* ено */ + {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ + {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ + {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ + {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ + {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ + {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ + {{0xE4, 0xE0, 0xED}, 79}, /* дан */ + {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ + {{0xE8, 0xEC, 0xE5}, 78}, /* име */ + {{0xE8, 0xED, 0xEE}, 78}, /* ино */ + {{0xF0, 0xE8, 0xED}, 77}, /* рин */ + {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ + {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ + {{0xF2, 0xE0, 0xEA}, 77}, /* так */ + {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ + {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ + {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ + {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ + {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ + {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ + {{0xFD, 0xF2, 0xEE}, 75}, /* это */ + {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ + {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ + {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ + {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ + {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ + {{0xE0, 0xED, 0xEE}, 72}, /* ано */ + {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ + {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ + {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ + {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ + {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ + {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ + {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ + {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ + {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ + {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ + {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ + {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ + {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ + {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ + {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ + {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ + {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ + {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ + {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ + {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ + {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ + {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ + {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ + {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ + {{0xF2, 0xED, 0xEE}, 65}, /* тно */ + {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ + {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ + {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ + {{0xEE, 0xE7, 0xED}, 64}, /* озн */ + {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ + {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ + {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ + {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ + {{0xED, 0xE8, 0xFE}, 63}, /* нию */ + {{0xEE, 0xED, 0xE5}, 63}, /* оне */ + {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ + {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ + {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ + {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ + {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ + {{0xF1, 0xED, 0xEE}, 61}, /* сно */ + {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ + {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ + {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ + {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ + {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ + {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ + {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ + {{0xF2, 0xE0, 0xED}, 60}, /* тан */ + {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ + {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ + {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ + {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ + {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ + {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ + {{0xFF, 0xF2, 0xE5}, 60}, /* яте */ + {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ + {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ + {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ + {{0xE0, 0xE1, 0xEE}, 59}, /* або */ + {{0xEB, 0xFF, 0xFE}, 59}, /* ляю */ + {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ + {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ + {{0xE8, 0xED, 0xE8}, 58}, /* ини */ + {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ + {{0xFF, 0xE2, 0xEB}, 58}, /* явл */ + {{0xED, 0xE0, 0xE3}, 57}, /* наг */ + {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ + {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ + {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ + {{0xE8, 0xEE, 0xED}, 57}, /* ион */ + {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ + {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ + {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ + {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ + {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ + {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ + {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ + {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ + {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ + {{0xEB, 0xED, 0xE5}, 54}, /* лне */ + {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ + {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ + {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ + {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ + {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ + {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ + {{0xED, 0xE8, 0xEA}, 54}, /* ник */ + {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ + {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ + {{0xF2, 0xE5, 0xED}, 53}, /* тен */ + {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ + {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ + {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ + {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ + {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ + {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ + {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ + {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ + {{0xFF, 0xFE, 0xF9}, 51}, /* яющ */ + {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ + {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ + {{0xEE, 0xED, 0xEE}, 51}, /* оно */ + {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ + {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ + {{0xEB, 0xFF, 0xE5}, 50}, /* ляе */ + {{0xE5, 0xED, 0xE5}, 50}, /* ене */ + {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ + {{0xEF, 0xF3, 0xED}, 49}, /* пун */ + {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ + {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ + {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ + {{0xED, 0xE5, 0xF1}, 49}, /* нес */ + {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ + {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ + {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ + {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ + {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ + {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ + {{0xF3, 0xED, 0xEA}, 49}, /* унк */ + {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ + {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ + {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ + {{0xFF, 0xE5, 0xF2}, 48}, /* яет */ + {{0xC5, 0xF1, 0xEB}, 48}, /* Есл */ + {{0xCF, 0xF0, 0xE8}, 48}, /* При */ + {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ + {{0xED, 0xE5, 0xF0}, 48}, /* нер */ + {{0xF7, 0xED, 0xEE}, 47}, /* чно */ + {{0xEF, 0xEE, 0xE4}, 47}, /* под */ + {{0xED, 0xF2, 0xE0}, 47}, /* нта */ + {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ + {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ + {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ + {{0xE6, 0xED, 0xEE}, 47}, /* жно */ + {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ + {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ + {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ + {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ + {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ + {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ + {{0xF7, 0xF2, 0xEE}, 46}, /* что */ + {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ + {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ + {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ + {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ + {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ + {{0xE4, 0xEB, 0xFF}, 45}, /* для */ + {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ + {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ + {{0xED, 0xFF, 0xF2}, 44}, /* нят */ + {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ + {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ + {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ + {{0xEE, 0xF1, 0xED}, 43}, /* осн */ + {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ + {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ + {{0xE8, 0xED, 0xFB}, 43}, /* ины */ + {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ + {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ + {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ + {{0xE8, 0xFF, 0xEC}, 43}, /* иям */ + {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ + {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ + {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ + {{0xF7, 0xE0, 0xFF}, 42}, /* чая */ + {{0xED, 0xE8, 0xEC}, 42}, /* ним */ + {{0xE8, 0xE7, 0xED}, 42}, /* изн */ + {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ + {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ + {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ + {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ + {{0xF6, 0xE5, 0xED}, 42}, /* цен */ + {{0xF7, 0xE0, 0xF1}, 42}, /* час */ + {{0xE3, 0xE0, 0xED}, 42}, /* ган */ + {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ + {{0xF1, 0xF2, 0xED}, 42}, /* стн */ + {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ + {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ + {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ + {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ + {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ + {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ + {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ + {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ + {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ + {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ + {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ + {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ + {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ + {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ + {{0xED, 0xF2, 0xE5}, 40}, /* нте */ + {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ + {{0xE1, 0xFB, 0xEB}, 40}, /* был */ + {{0xE8, 0xED, 0xFF}, 40}, /* иня */ + {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ + {{0xE3, 0xE5, 0xED}, 39}, /* ген */ + {{0xCA, 0xEE, 0xE4}, 39}, /* Код */ + {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ + {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ + {{0xE8, 0xED, 0xF2}, 39}, /* инт */ + {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ + {{0xF0, 0xEE, 0xED}, 39}, /* рон */ + {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ + {{0xE4, 0xEE, 0xEA}, 39}, /* док */ + {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ + {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ + {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ + {{0xE7, 0xED, 0xE8}, 38}, /* зни */ + {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ + {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ + {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ + {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ + {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ + {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ + {{0xE1, 0xE5, 0xE7}, 37}, /* без */ + {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ + {{0xEE, 0xF0, 0xFF}, 37}, /* оря */ + {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ + {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ + {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ + {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ + {{0xED, 0xF6, 0xE5}, 37}, /* нце */ + {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ + {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ + {{0xEE, 0xED, 0xE0}, 37}, /* она */ + {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ + {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ + {{0xF0, 0xEE, 0xE4}, 37}, /* род */ + {{0xE5, 0xED, 0xE0}, 37}, /* ена */ + {{0xEE, 0xED, 0xF6}, 37}, /* онц */ + {{0xEE, 0xF2, 0xED}, 37}, /* отн */ + {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ + {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ + {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ + {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ + {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ + {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ + {{0xED, 0xE5, 0xEE}, 36}, /* нео */ + {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ + {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ + {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ + {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ + {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ + {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ + {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ + {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ + {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ + {{0xED, 0xE5, 0xE4}, 34}, /* нед */ + {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ + {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ + {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ + {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ + {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ + {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ + {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ + {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ + {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ + {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ + {{0xFA, 0xFF, 0xE2}, 33}, /* ъяв */ + {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ + {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ + {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ + {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ + {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ + {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ + {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ + {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ + {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ + {{0xE0, 0xED, 0xE0}, 32}, /* ана */ + {{0xED, 0xE0, 0xE4}, 32}, /* над */ + {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ + {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ + {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ + {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ + {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ + {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ + {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ + {{0xFF, 0xF2, 0xFC}, 31}, /* ять */ + {{0xEE, 0xFF, 0xF2}, 31}, /* оят */ + {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ + {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ + {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ + {{0xE5, 0xED, 0xFB}, 31}, /* ены */ + {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ + {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ + {{0xFF, 0xFE, 0xF2}, 30}, /* яют */ + {{0xF0, 0xFF, 0xE4}, 30}, /* ряд */ + {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ + {{0xE8, 0xEC, 0xE0}, 30}, /* има */ + {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ + {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ + {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ + {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ + {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ + {{0xED, 0xE8, 0xE9}, 30}, /* ний */ + {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ + {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ + {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ + {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ + {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ + {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ + {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ + {{0xE4, 0xE5, 0xFF}, 29}, /* дея */ + {{0xE5, 0xFF, 0xF2}, 29}, /* еят */ + {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ + {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ + {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ + {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ + {{0xEE, 0xE4, 0xED}, 28}, /* одн */ + {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ + {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ + {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ + {{0xC4, 0xEE, 0xE3}, 28}, /* Дог */ + {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ + {{0xED, 0xEE, 0xF8}, 28}, /* нош */ + {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ + {{0xE8, 0xED, 0xE0}, 28}, /* ина */ + {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ + {{0xED, 0xE0, 0xEB}, 28}, /* нал */ + {{0xED, 0xE8, 0xE7}, 27}, /* низ */ + {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ + {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ + {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ + {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ + {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ + {{0xE4, 0xED, 0xEE}, 27}, /* дно */ + {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ + {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ + {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ + {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ + {{0xEE, 0xED, 0xEA}, 26}, /* онк */ + {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ + {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ + {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ + {{0xFF, 0xEC, 0xE8}, 26}, /* ями */ + {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ + {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ + {{0xED, 0xEA, 0xF3}, 26}, /* нку */ + {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ + {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ + {{0xED, 0xE8, 0xED}, 25}, /* нин */ + {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ + {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ + {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ + {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ + {{0xE5, 0xF1, 0xFF}, 25}, /* еся */ + {{0xED, 0xE8, 0xF7}, 25}, /* нич */ + {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ + {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ + {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ + {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ + {{0xE6, 0xED, 0xFB}, 25}, /* жны */ + {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ + {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ + {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ + {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ + {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ + {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ + {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ + {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ + {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ + {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ + {{0xE8, 0xFF, 0xF5}, 24}, /* иях */ + {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ + {{0xFC, 0xF1, 0xFF}, 24}, /* ься */ + {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ + {{0xEE, 0xF7, 0xED}, 24}, /* очн */ + {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ + {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ + {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ + {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ + {{0xE0, 0xFF, 0xF5}, 24}, /* аях */ + {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ + {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ + {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ + {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ + {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ + {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ + {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ + {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ + {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ + {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ + {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ + {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ + {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ + {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ + {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ + {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ + {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ + {{0xE1, 0xFA, 0xFF}, 23}, /* бъя */ + {{0xED, 0xE0, 0xF7}, 23}, /* нач */ + {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ + {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ + {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ + {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ + {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ + {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ + {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ + {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ + {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ + {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ + {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ + {{0xED, 0xE5, 0xE7}, 22}, /* нез */ + {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ + {{0xF1, 0xE2, 0xFF}, 22}, /* свя */ + {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ + {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ + {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ + {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ + {{0xED, 0xE5, 0xEC}, 22}, /* нем */ + {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ + {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ + {{0xE2, 0xFF, 0xE7}, 22}, /* вяз */ + {{0xFF, 0xF2, 0xE8}, 22}, /* яти */ + {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ + {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ + {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ + {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ + {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ + {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ + {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ + {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ + {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ + {{0xEA, 0xE0, 0xEA}, 21}, /* как */ + {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ + {{0xED, 0xE0, 0xEC}, 21}, /* нам */ + {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ + {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ + {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ + {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ + {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ + {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ + {{0xE1, 0xE0, 0xED}, 21}, /* бан */ + {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ + {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ + {{0xEB, 0xED, 0xEE}, 21}, /* лно */ + {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ + {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ + {{0xFF, 0xE4, 0xEA}, 21}, /* ядк */ + {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ + {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ + {{0xE0, 0xED, 0xEA}, 21}, /* анк */ + {{0xED, 0xE5, 0xE3}, 21}, /* нег */ + {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ + {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ + {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ + {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ + {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ + {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ + {{0xF2, 0xED, 0xE8}, 21}, /* тни */ + {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ + {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ + {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ + {{0xE0, 0xF0, 0xED}, 20}, /* арн */ + {{0xF7, 0xED, 0xFB}, 20}, /* чны */ + {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ + {{0xF2, 0xE8, 0xFF}, 20}, /* тия */ + {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ + {{0xD1, 0xF2, 0xF0}, 20}, /* Стр */ + {{0xED, 0xF2, 0xEE}, 20}, /* нто */ + {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ + {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ + {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ + {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ + {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ + {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ + {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ + {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ + {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ + {{0xE2, 0xF1, 0xE5}, 19}, /* все */ + {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ + {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ + {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ + {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ + {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ + {{0xE5, 0xE4, 0xED}, 19}, /* едн */ + {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ + {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ + {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ + {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ + {{0xF2, 0xEE, 0xE9}, 19}, /* той */ + {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ + {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ + {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ + {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ + {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ + {{0xE5, 0xED, 0xFF}, 19}, /* еня */ + {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ + {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ + {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ + {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ + {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ + {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ + {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ + {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ + {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ + {{0xE0, 0xE7, 0xED}, 18}, /* азн */ + {{0xF2, 0xED, 0xFB}, 18}, /* тны */ + {{0xEE, 0xE4, 0xFF}, 18}, /* одя */ + {{0xEE, 0xE1, 0xED}, 18}, /* обн */ + {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ + {{0xEE, 0xF1, 0xFF}, 18}, /* ося */ + {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ + {{0xED, 0xFF, 0xFE}, 18}, /* няю */ + {{0xED, 0xE0, 0xF0}, 18}, /* нар */ + {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ + {{0xE0, 0xF1, 0xED}, 18}, /* асн */ + {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ + {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ + {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ + {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ + {{0xED, 0xF6, 0xE8}, 18}, /* нци */ + {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ + {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ + {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ + {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ + {{0xCE, 0xE1, 0xFF}, 18}, /* Обя */ + {{0xCF, 0xF0, 0xE0}, 18}, /* Пра */ + {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ + {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ + {{0xEB, 0xED, 0xE8}, 18}, /* лни */ + {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ + {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ + {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ + {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ + {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ + {{0xF0, 0xED, 0xFB}, 17}, /* рны */ + {{0xE1, 0xED, 0xFB}, 17}, /* бны */ + {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ + {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ + {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ + {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ + {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ + {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ + {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ + {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ + {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ + {{0xE4, 0xE8, 0xE2}, 17}, /* див */ + {{0xED, 0xE0, 0xED}, 17}, /* нан */ + {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ + {{0xE4, 0xED, 0xE5}, 17}, /* дне */ + {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ + {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ + {{0xED, 0xE0, 0xF5}, 17}, /* нах */ + {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ + {{0xE0, 0xEB, 0xE8}, 17}, /* али */ + {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ + {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ + {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ + {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ + {{0xFF, 0xE2, 0xE8}, 16}, /* яви */ + {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ + {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ + {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ + {{0xED, 0xF3, 0xFE}, 16}, /* ную */ + {{0xEF, 0xE5, 0xED}, 16}, /* пен */ + {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ + {{0xEE, 0xED, 0xED}, 16}, /* онн */ + {{0xE2, 0xE8, 0xED}, 16}, /* вин */ + {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ + {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ + {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ + {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ + {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ + {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ + {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ + {{0xCA, 0xEE, 0xEC}, 16}, /* Ком */ + {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ + {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ + {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ + {{0xEF, 0xEE, 0xED}, 16}, /* пон */ + {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ + {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ + {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ + {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ + {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ + {{0xE2, 0xED, 0xEE}, 16}, /* вно */ + {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ + {{0xCB, 0xE8, 0xF6}, 15}, /* Лиц */ + {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ + {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ + {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ + {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ + {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ + {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ + {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ + {{0xC2, 0xEE, 0xE7}, 15}, /* Воз */ + {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ + {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ + {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ + {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ + {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ + {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ + {{0xF2, 0xE0, 0xEC}, 15}, /* там */ + {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ + {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ + {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ + {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ + {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ + {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ + {{0xF1, 0xE5, 0xED}, 15}, /* сен */ + {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ + {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ + {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ + {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ + {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ + {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ + {{0xD5, 0xF0, 0xE0}, 15}, /* Хра */ + {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ + {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ + {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ + {{0xF6, 0xE8, 0xFF}, 14}, /* ция */ + {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ + {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ + {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ + {{0xE0, 0xED, 0xF1}, 14}, /* анс */ + {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ + {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ + {{0xE5, 0xED, 0xFC}, 14}, /* ень */ + {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ + {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ + {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ + {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ + {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ + {{0xE2, 0xFC, 0xFF}, 13}, /* вья */ + {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ + {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ + {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ + {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ + {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ + {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ + {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ + {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ + {{0xFF, 0xE7, 0xE8}, 13}, /* язи */ + {{0xE8, 0xED, 0xE4}, 13}, /* инд */ + {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ + {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ + {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ + {{0xED, 0xE4, 0xE8}, 13}, /* нди */ + {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ + {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ + {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ + {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ + {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ + {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ + {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ + {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ + {{0xFF, 0xE5, 0xEC}, 13}, /* яем */ + {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ + {{0xED, 0xF2, 0xF3}, 13}, /* нту */ + {{0xED, 0xE5, 0xE9}, 13}, /* ней */ + {{0xED, 0xE0, 0xFF}, 13}, /* ная */ + {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ + {{0xF0, 0xED, 0xEE}, 13}, /* рно */ + {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ + {{0xE0, 0xED, 0xFB}, 13}, /* аны */ + {{0xC4, 0xEE, 0xE2}, 13}, /* Дов */ + {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ + {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ + {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ + {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ + {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ + {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ + {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ + {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ + {{0xE2, 0xE0, 0xFF}, 12}, /* вая */ + {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ + {{0xFF, 0xF9, 0xE8}, 12}, /* ящи */ + {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ + {{0xED, 0xE5, 0xE5}, 12}, /* нее */ + {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ + {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ + {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ + {{0xE8, 0xED, 0xF6}, 12}, /* инц */ + {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ + {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ + {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ + {{0xED, 0xE0, 0xF2}, 12}, /* нат */ + {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ + {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ + {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ + {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ + {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ + {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ + {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ + {{0xE5, 0xED, 0xF1}, 12}, /* енс */ + {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ + {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ + {{0xED, 0xE0, 0xE7}, 12}, /* наз */ + {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ + {{0xEE, 0xED, 0xE8}, 12}, /* они */ + {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ + {{0xE3, 0xEE, 0xE4}, 12}, /* год */ + {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ + {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ + {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ + {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ + {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ + {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ + {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ + {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ + {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ + {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ + {{0xF1, 0xE8, 0xFF}, 11}, /* сия */ + {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ + {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ + {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ + {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ + {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ + {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ + {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ + {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ + {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ + {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ + {{0xED, 0xED, 0xF3}, 11}, /* нну */ + {{0xED, 0xE5, 0xEF}, 11}, /* неп */ + {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ + {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ + {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ + {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ + {{0xE0, 0xE2, 0xED}, 11}, /* авн */ + {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ + {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ + {{0xC2, 0xF0, 0xE5}, 11}, /* Вре */ + {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ + {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ + {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ + {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ + {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ + {{0xEE, 0xED, 0xFB}, 10}, /* оны */ + {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ + {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ + {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ + {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ + {{0xFF, 0xF2, 0xFB}, 10}, /* яты */ + {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ + {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ + {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ + {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ + {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ + {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ + {{0xCE, 0xF2, 0xE2}, 10}, /* Отв */ + {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ + {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ + {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ + {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ + {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ + {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ + {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ + {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ + {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ + {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ + {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ + {{0xEC, 0xED, 0xEE}, 10}, /* мно */ + {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ + {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ + {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ + {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ + {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ + {{0xE4, 0xFF, 0xF9}, 10}, /* дящ */ + {{0xF2, 0xF0, 0xE8}, 10}, /* три */ + {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ + {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ + {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ + {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ + {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ + {{0xE7, 0xED, 0xFB}, 10}, /* зны */ + {{0xEE, 0xFF, 0xED}, 10}, /* оян */ + {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ + {{0xE2, 0xED, 0xE5}, 10}, /* вне */ + {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ + {{0xE5, 0xEC, 0xFF}, 10}, /* емя */ + {{0xED, 0xE0, 0xE8}, 10}, /* наи */ + {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ + {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ + {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ + {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ + {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ + {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ + {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ + {{0xED, 0xE8, 0xE2}, 10}, /* нив */ + {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ + {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ + {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ + {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ + {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ + {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ + {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ + {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ +}; + +static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_x_mac_cyrillic[] = { + {{0xE5, 0xED, 0xE8}, 991}, /* ени */ + {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ + {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ + {{0xED, 0xE8, 0xDF}, 629}, /* ния */ + {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ + {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ + {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ + {{0xE5, 0xED, 0xED}, 499}, /* енн */ + {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ + {{0xE0, 0xED, 0xE8}, 443}, /* ани */ + {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ + {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ + {{0xED, 0xE8, 0xE5}, 419}, /* ние */ + {{0xED, 0xED, 0xEE}, 412}, /* нно */ + {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ + {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ + {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ + {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ + {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ + {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ + {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ + {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ + {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ + {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ + {{0xEF, 0xF0, 0xE8}, 330}, /* при */ + {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ + {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ + {{0xED, 0xE5, 0xED}, 310}, /* нен */ + {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ + {{0xE2, 0xE0, 0xED}, 304}, /* ван */ + {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ + {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ + {{0xEB, 0xE5, 0xED}, 266}, /* лен */ + {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ + {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ + {{0xED, 0xED, 0xFB}, 260}, /* нны */ + {{0xEB, 0xFC, 0xED}, 256}, /* льн */ + {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ + {{0xE8, 0xEB, 0xE8}, 254}, /* или */ + {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ + {{0xE5, 0xE3, 0xEE}, 241}, /* его */ + {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ + {{0xED, 0xEE, 0xF1}, 236}, /* нос */ + {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ + {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ + {{0xF0, 0xE0, 0xED}, 231}, /* ран */ + {{0xED, 0xEE, 0xE3}, 230}, /* ног */ + {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ + {{0xF7, 0xE5, 0xED}, 226}, /* чен */ + {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ + {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ + {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ + {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ + {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ + {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ + {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ + {{0xE7, 0xE0, 0xED}, 194}, /* зан */ + {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ + {{0xF2, 0xF1, 0xDF}, 191}, /* тся */ + {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ + {{0xE0, 0xED, 0xED}, 182}, /* анн */ + {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ + {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ + {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ + {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ + {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ + {{0xEC, 0xE5, 0xED}, 170}, /* мен */ + {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ + {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ + {{0xF0, 0xE5, 0xED}, 167}, /* рен */ + {{0xF9, 0xE5, 0xED}, 165}, /* щен */ + {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ + {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ + {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ + {{0xDF, 0xE7, 0xE0}, 159}, /* яза */ + {{0xE1, 0xDF, 0xE7}, 158}, /* бяз */ + {{0xED, 0xE8, 0xE8}, 153}, /* нии */ + {{0xED, 0xFB, 0xF5}, 153}, /* ных */ + {{0xF2, 0xFC, 0xDF}, 153}, /* тья */ + {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ + {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ + {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ + {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ + {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ + {{0xED, 0xEE, 0xEC}, 144}, /* ном */ + {{0xE4, 0xE5, 0xED}, 144}, /* ден */ + {{0xE0, 0xED, 0xE5}, 142}, /* ане */ + {{0xEA, 0xEE, 0xED}, 141}, /* кон */ + {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ + {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ + {{0xEE, 0xE1, 0xDF}, 140}, /* обя */ + {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ + {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ + {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ + {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ + {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ + {{0xED, 0xFB, 0xEC}, 136}, /* ным */ + {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ + {{0x91, 0xF2, 0xE0}, 134}, /* Ста */ + {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ + {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ + {{0xE5, 0xEB, 0xDF}, 130}, /* еля */ + {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ + {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ + {{0xF2, 0xEE, 0xDF}, 129}, /* тоя */ + {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ + {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ + {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ + {{0xE2, 0xE5, 0xED}, 127}, /* вен */ + {{0xED, 0xEE, 0xE2}, 127}, /* нов */ + {{0xED, 0xEE, 0xE5}, 126}, /* ное */ + {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ + {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ + {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ + {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ + {{0xE5, 0xED, 0xF2}, 124}, /* ент */ + {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ + {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ + {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ + {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ + {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ + {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ + {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ + {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ + {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ + {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ + {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ + {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ + {{0xEF, 0xF0, 0xEE}, 114}, /* про */ + {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ + {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ + {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ + {{0xF8, 0xE5, 0xED}, 111}, /* шен */ + {{0xF7, 0xE8, 0xED}, 110}, /* чин */ + {{0xED, 0xE0, 0xF1}, 109}, /* нас */ + {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ + {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ + {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ + {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ + {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ + {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ + {{0xF2, 0xEE, 0xEC}, 104}, /* том */ + {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ + {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ + {{0xEE, 0xEB, 0xED}, 102}, /* олн */ + {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ + {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ + {{0xED, 0xEE, 0xE9}, 101}, /* ной */ + {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ + {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ + {{0xED, 0xFB, 0xE5}, 99}, /* ные */ + {{0xE7, 0xED, 0xE0}, 99}, /* зна */ + {{0xE2, 0xEB, 0xDF}, 99}, /* вля */ + {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ + {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ + {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ + {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ + {{0xED, 0xFB, 0xE9}, 96}, /* ный */ + {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ + {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ + {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ + {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ + {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ + {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ + {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ + {{0xE8, 0xED, 0xE5}, 91}, /* ине */ + {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ + {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ + {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ + {{0xED, 0xE8, 0xF2}, 89}, /* нит */ + {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ + {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ + {{0xE6, 0xE5, 0xED}, 87}, /* жен */ + {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ + {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ + {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ + {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ + {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ + {{0xE2, 0xE8, 0xDF}, 85}, /* вия */ + {{0xDF, 0xF9, 0xE5}, 85}, /* яще */ + {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ + {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ + {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ + {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ + {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ + {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ + {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ + {{0xEE, 0xDF, 0xF9}, 82}, /* оящ */ + {{0xE5, 0xED, 0xEE}, 81}, /* ено */ + {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ + {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ + {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ + {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ + {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ + {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ + {{0xE4, 0xE0, 0xED}, 79}, /* дан */ + {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ + {{0xE8, 0xEC, 0xE5}, 78}, /* име */ + {{0xE8, 0xED, 0xEE}, 78}, /* ино */ + {{0xF0, 0xE8, 0xED}, 77}, /* рин */ + {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ + {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ + {{0xF2, 0xE0, 0xEA}, 77}, /* так */ + {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ + {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ + {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ + {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ + {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ + {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ + {{0xFD, 0xF2, 0xEE}, 75}, /* это */ + {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ + {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ + {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ + {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ + {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ + {{0xE0, 0xED, 0xEE}, 72}, /* ано */ + {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ + {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ + {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ + {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ + {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ + {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ + {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ + {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ + {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ + {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ + {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ + {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ + {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ + {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ + {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ + {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ + {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ + {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ + {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ + {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ + {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ + {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ + {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ + {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ + {{0xF2, 0xED, 0xEE}, 65}, /* тно */ + {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ + {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ + {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ + {{0xEE, 0xE7, 0xED}, 64}, /* озн */ + {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ + {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ + {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ + {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ + {{0xED, 0xE8, 0xFE}, 63}, /* нию */ + {{0xEE, 0xED, 0xE5}, 63}, /* оне */ + {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ + {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ + {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ + {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ + {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ + {{0xF1, 0xED, 0xEE}, 61}, /* сно */ + {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ + {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ + {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ + {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ + {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ + {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ + {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ + {{0xF2, 0xE0, 0xED}, 60}, /* тан */ + {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ + {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ + {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ + {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ + {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ + {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ + {{0xDF, 0xF2, 0xE5}, 60}, /* яте */ + {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ + {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ + {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ + {{0xE0, 0xE1, 0xEE}, 59}, /* або */ + {{0xEB, 0xDF, 0xFE}, 59}, /* ляю */ + {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ + {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ + {{0xE8, 0xED, 0xE8}, 58}, /* ини */ + {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ + {{0xDF, 0xE2, 0xEB}, 58}, /* явл */ + {{0xED, 0xE0, 0xE3}, 57}, /* наг */ + {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ + {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ + {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ + {{0xE8, 0xEE, 0xED}, 57}, /* ион */ + {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ + {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ + {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ + {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ + {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ + {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ + {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ + {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ + {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ + {{0xEB, 0xED, 0xE5}, 54}, /* лне */ + {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ + {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ + {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ + {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ + {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ + {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ + {{0xED, 0xE8, 0xEA}, 54}, /* ник */ + {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ + {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ + {{0xF2, 0xE5, 0xED}, 53}, /* тен */ + {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ + {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ + {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ + {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ + {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ + {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ + {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ + {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ + {{0xDF, 0xFE, 0xF9}, 51}, /* яющ */ + {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ + {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ + {{0xEE, 0xED, 0xEE}, 51}, /* оно */ + {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ + {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ + {{0xEB, 0xDF, 0xE5}, 50}, /* ляе */ + {{0xE5, 0xED, 0xE5}, 50}, /* ене */ + {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ + {{0xEF, 0xF3, 0xED}, 49}, /* пун */ + {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ + {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ + {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ + {{0xED, 0xE5, 0xF1}, 49}, /* нес */ + {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ + {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ + {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ + {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ + {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ + {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ + {{0xF3, 0xED, 0xEA}, 49}, /* унк */ + {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ + {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ + {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ + {{0xDF, 0xE5, 0xF2}, 48}, /* яет */ + {{0x85, 0xF1, 0xEB}, 48}, /* Есл */ + {{0x8F, 0xF0, 0xE8}, 48}, /* При */ + {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ + {{0xED, 0xE5, 0xF0}, 48}, /* нер */ + {{0xF7, 0xED, 0xEE}, 47}, /* чно */ + {{0xEF, 0xEE, 0xE4}, 47}, /* под */ + {{0xED, 0xF2, 0xE0}, 47}, /* нта */ + {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ + {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ + {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ + {{0xE6, 0xED, 0xEE}, 47}, /* жно */ + {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ + {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ + {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ + {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ + {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ + {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ + {{0xF7, 0xF2, 0xEE}, 46}, /* что */ + {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ + {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ + {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ + {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ + {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ + {{0xE4, 0xEB, 0xDF}, 45}, /* для */ + {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ + {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ + {{0xED, 0xDF, 0xF2}, 44}, /* нят */ + {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ + {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ + {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ + {{0xEE, 0xF1, 0xED}, 43}, /* осн */ + {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ + {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ + {{0xE8, 0xED, 0xFB}, 43}, /* ины */ + {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ + {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ + {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ + {{0xE8, 0xDF, 0xEC}, 43}, /* иям */ + {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ + {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ + {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ + {{0xF7, 0xE0, 0xDF}, 42}, /* чая */ + {{0xED, 0xE8, 0xEC}, 42}, /* ним */ + {{0xE8, 0xE7, 0xED}, 42}, /* изн */ + {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ + {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ + {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ + {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ + {{0xF6, 0xE5, 0xED}, 42}, /* цен */ + {{0xF7, 0xE0, 0xF1}, 42}, /* час */ + {{0xE3, 0xE0, 0xED}, 42}, /* ган */ + {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ + {{0xF1, 0xF2, 0xED}, 42}, /* стн */ + {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ + {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ + {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ + {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ + {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ + {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ + {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ + {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ + {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ + {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ + {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ + {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ + {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ + {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ + {{0xED, 0xF2, 0xE5}, 40}, /* нте */ + {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ + {{0xE1, 0xFB, 0xEB}, 40}, /* был */ + {{0xE8, 0xED, 0xDF}, 40}, /* иня */ + {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ + {{0xE3, 0xE5, 0xED}, 39}, /* ген */ + {{0x8A, 0xEE, 0xE4}, 39}, /* Код */ + {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ + {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ + {{0xE8, 0xED, 0xF2}, 39}, /* инт */ + {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ + {{0xF0, 0xEE, 0xED}, 39}, /* рон */ + {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ + {{0xE4, 0xEE, 0xEA}, 39}, /* док */ + {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ + {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ + {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ + {{0xE7, 0xED, 0xE8}, 38}, /* зни */ + {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ + {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ + {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ + {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ + {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ + {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ + {{0xE1, 0xE5, 0xE7}, 37}, /* без */ + {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ + {{0xEE, 0xF0, 0xDF}, 37}, /* оря */ + {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ + {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ + {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ + {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ + {{0xED, 0xF6, 0xE5}, 37}, /* нце */ + {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ + {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ + {{0xEE, 0xED, 0xE0}, 37}, /* она */ + {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ + {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ + {{0xF0, 0xEE, 0xE4}, 37}, /* род */ + {{0xE5, 0xED, 0xE0}, 37}, /* ена */ + {{0xEE, 0xED, 0xF6}, 37}, /* онц */ + {{0xEE, 0xF2, 0xED}, 37}, /* отн */ + {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ + {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ + {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ + {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ + {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ + {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ + {{0xED, 0xE5, 0xEE}, 36}, /* нео */ + {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ + {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ + {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ + {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ + {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ + {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ + {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ + {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ + {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ + {{0xED, 0xE5, 0xE4}, 34}, /* нед */ + {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ + {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ + {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ + {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ + {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ + {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ + {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ + {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ + {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ + {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ + {{0xFA, 0xDF, 0xE2}, 33}, /* ъяв */ + {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ + {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ + {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ + {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ + {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ + {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ + {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ + {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ + {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ + {{0xE0, 0xED, 0xE0}, 32}, /* ана */ + {{0xED, 0xE0, 0xE4}, 32}, /* над */ + {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ + {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ + {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ + {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ + {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ + {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ + {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ + {{0xDF, 0xF2, 0xFC}, 31}, /* ять */ + {{0xEE, 0xDF, 0xF2}, 31}, /* оят */ + {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ + {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ + {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ + {{0xE5, 0xED, 0xFB}, 31}, /* ены */ + {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ + {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ + {{0xDF, 0xFE, 0xF2}, 30}, /* яют */ + {{0xF0, 0xDF, 0xE4}, 30}, /* ряд */ + {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ + {{0xE8, 0xEC, 0xE0}, 30}, /* има */ + {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ + {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ + {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ + {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ + {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ + {{0xED, 0xE8, 0xE9}, 30}, /* ний */ + {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ + {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ + {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ + {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ + {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ + {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ + {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ + {{0xE4, 0xE5, 0xDF}, 29}, /* дея */ + {{0xE5, 0xDF, 0xF2}, 29}, /* еят */ + {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ + {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ + {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ + {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ + {{0xEE, 0xE4, 0xED}, 28}, /* одн */ + {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ + {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ + {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ + {{0x84, 0xEE, 0xE3}, 28}, /* Дог */ + {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ + {{0xED, 0xEE, 0xF8}, 28}, /* нош */ + {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ + {{0xE8, 0xED, 0xE0}, 28}, /* ина */ + {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ + {{0xED, 0xE0, 0xEB}, 28}, /* нал */ + {{0xED, 0xE8, 0xE7}, 27}, /* низ */ + {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ + {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ + {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ + {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ + {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ + {{0xE4, 0xED, 0xEE}, 27}, /* дно */ + {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ + {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ + {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ + {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ + {{0xEE, 0xED, 0xEA}, 26}, /* онк */ + {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ + {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ + {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ + {{0xDF, 0xEC, 0xE8}, 26}, /* ями */ + {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ + {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ + {{0xED, 0xEA, 0xF3}, 26}, /* нку */ + {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ + {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ + {{0xED, 0xE8, 0xED}, 25}, /* нин */ + {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ + {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ + {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ + {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ + {{0xE5, 0xF1, 0xDF}, 25}, /* еся */ + {{0xED, 0xE8, 0xF7}, 25}, /* нич */ + {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ + {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ + {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ + {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ + {{0xE6, 0xED, 0xFB}, 25}, /* жны */ + {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ + {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ + {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ + {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ + {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ + {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ + {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ + {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ + {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ + {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ + {{0xE8, 0xDF, 0xF5}, 24}, /* иях */ + {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ + {{0xFC, 0xF1, 0xDF}, 24}, /* ься */ + {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ + {{0xEE, 0xF7, 0xED}, 24}, /* очн */ + {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ + {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ + {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ + {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ + {{0xE0, 0xDF, 0xF5}, 24}, /* аях */ + {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ + {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ + {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ + {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ + {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ + {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ + {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ + {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ + {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ + {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ + {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ + {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ + {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ + {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ + {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ + {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ + {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ + {{0xE1, 0xFA, 0xDF}, 23}, /* бъя */ + {{0xED, 0xE0, 0xF7}, 23}, /* нач */ + {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ + {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ + {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ + {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ + {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ + {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ + {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ + {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ + {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ + {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ + {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ + {{0xED, 0xE5, 0xE7}, 22}, /* нез */ + {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ + {{0xF1, 0xE2, 0xDF}, 22}, /* свя */ + {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ + {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ + {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ + {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ + {{0xED, 0xE5, 0xEC}, 22}, /* нем */ + {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ + {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ + {{0xE2, 0xDF, 0xE7}, 22}, /* вяз */ + {{0xDF, 0xF2, 0xE8}, 22}, /* яти */ + {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ + {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ + {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ + {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ + {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ + {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ + {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ + {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ + {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ + {{0xEA, 0xE0, 0xEA}, 21}, /* как */ + {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ + {{0xED, 0xE0, 0xEC}, 21}, /* нам */ + {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ + {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ + {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ + {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ + {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ + {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ + {{0xE1, 0xE0, 0xED}, 21}, /* бан */ + {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ + {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ + {{0xEB, 0xED, 0xEE}, 21}, /* лно */ + {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ + {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ + {{0xDF, 0xE4, 0xEA}, 21}, /* ядк */ + {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ + {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ + {{0xE0, 0xED, 0xEA}, 21}, /* анк */ + {{0xED, 0xE5, 0xE3}, 21}, /* нег */ + {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ + {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ + {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ + {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ + {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ + {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ + {{0xF2, 0xED, 0xE8}, 21}, /* тни */ + {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ + {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ + {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ + {{0xE0, 0xF0, 0xED}, 20}, /* арн */ + {{0xF7, 0xED, 0xFB}, 20}, /* чны */ + {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ + {{0xF2, 0xE8, 0xDF}, 20}, /* тия */ + {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ + {{0x91, 0xF2, 0xF0}, 20}, /* Стр */ + {{0xED, 0xF2, 0xEE}, 20}, /* нто */ + {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ + {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ + {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ + {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ + {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ + {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ + {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ + {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ + {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ + {{0xE2, 0xF1, 0xE5}, 19}, /* все */ + {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ + {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ + {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ + {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ + {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ + {{0xE5, 0xE4, 0xED}, 19}, /* едн */ + {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ + {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ + {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ + {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ + {{0xF2, 0xEE, 0xE9}, 19}, /* той */ + {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ + {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ + {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ + {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ + {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ + {{0xE5, 0xED, 0xDF}, 19}, /* еня */ + {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ + {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ + {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ + {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ + {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ + {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ + {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ + {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ + {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ + {{0xE0, 0xE7, 0xED}, 18}, /* азн */ + {{0xF2, 0xED, 0xFB}, 18}, /* тны */ + {{0xEE, 0xE4, 0xDF}, 18}, /* одя */ + {{0xEE, 0xE1, 0xED}, 18}, /* обн */ + {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ + {{0xEE, 0xF1, 0xDF}, 18}, /* ося */ + {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ + {{0xED, 0xDF, 0xFE}, 18}, /* няю */ + {{0xED, 0xE0, 0xF0}, 18}, /* нар */ + {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ + {{0xE0, 0xF1, 0xED}, 18}, /* асн */ + {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ + {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ + {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ + {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ + {{0xED, 0xF6, 0xE8}, 18}, /* нци */ + {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ + {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ + {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ + {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ + {{0x8E, 0xE1, 0xDF}, 18}, /* Обя */ + {{0x8F, 0xF0, 0xE0}, 18}, /* Пра */ + {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ + {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ + {{0xEB, 0xED, 0xE8}, 18}, /* лни */ + {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ + {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ + {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ + {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ + {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ + {{0xF0, 0xED, 0xFB}, 17}, /* рны */ + {{0xE1, 0xED, 0xFB}, 17}, /* бны */ + {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ + {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ + {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ + {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ + {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ + {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ + {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ + {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ + {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ + {{0xE4, 0xE8, 0xE2}, 17}, /* див */ + {{0xED, 0xE0, 0xED}, 17}, /* нан */ + {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ + {{0xE4, 0xED, 0xE5}, 17}, /* дне */ + {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ + {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ + {{0xED, 0xE0, 0xF5}, 17}, /* нах */ + {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ + {{0xE0, 0xEB, 0xE8}, 17}, /* али */ + {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ + {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ + {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ + {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ + {{0xDF, 0xE2, 0xE8}, 16}, /* яви */ + {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ + {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ + {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ + {{0xED, 0xF3, 0xFE}, 16}, /* ную */ + {{0xEF, 0xE5, 0xED}, 16}, /* пен */ + {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ + {{0xEE, 0xED, 0xED}, 16}, /* онн */ + {{0xE2, 0xE8, 0xED}, 16}, /* вин */ + {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ + {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ + {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ + {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ + {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ + {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ + {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ + {{0x8A, 0xEE, 0xEC}, 16}, /* Ком */ + {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ + {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ + {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ + {{0xEF, 0xEE, 0xED}, 16}, /* пон */ + {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ + {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ + {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ + {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ + {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ + {{0xE2, 0xED, 0xEE}, 16}, /* вно */ + {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ + {{0x8B, 0xE8, 0xF6}, 15}, /* Лиц */ + {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ + {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ + {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ + {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ + {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ + {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ + {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ + {{0x82, 0xEE, 0xE7}, 15}, /* Воз */ + {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ + {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ + {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ + {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ + {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ + {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ + {{0xF2, 0xE0, 0xEC}, 15}, /* там */ + {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ + {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ + {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ + {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ + {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ + {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ + {{0xF1, 0xE5, 0xED}, 15}, /* сен */ + {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ + {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ + {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ + {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ + {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ + {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ + {{0x95, 0xF0, 0xE0}, 15}, /* Хра */ + {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ + {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ + {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ + {{0xF6, 0xE8, 0xDF}, 14}, /* ция */ + {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ + {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ + {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ + {{0xE0, 0xED, 0xF1}, 14}, /* анс */ + {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ + {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ + {{0xE5, 0xED, 0xFC}, 14}, /* ень */ + {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ + {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ + {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ + {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ + {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ + {{0xE2, 0xFC, 0xDF}, 13}, /* вья */ + {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ + {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ + {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ + {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ + {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ + {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ + {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ + {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ + {{0xDF, 0xE7, 0xE8}, 13}, /* язи */ + {{0xE8, 0xED, 0xE4}, 13}, /* инд */ + {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ + {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ + {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ + {{0xED, 0xE4, 0xE8}, 13}, /* нди */ + {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ + {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ + {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ + {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ + {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ + {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ + {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ + {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ + {{0xDF, 0xE5, 0xEC}, 13}, /* яем */ + {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ + {{0xED, 0xF2, 0xF3}, 13}, /* нту */ + {{0xED, 0xE5, 0xE9}, 13}, /* ней */ + {{0xED, 0xE0, 0xDF}, 13}, /* ная */ + {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ + {{0xF0, 0xED, 0xEE}, 13}, /* рно */ + {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ + {{0xE0, 0xED, 0xFB}, 13}, /* аны */ + {{0x84, 0xEE, 0xE2}, 13}, /* Дов */ + {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ + {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ + {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ + {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ + {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ + {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ + {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ + {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ + {{0xE2, 0xE0, 0xDF}, 12}, /* вая */ + {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ + {{0xDF, 0xF9, 0xE8}, 12}, /* ящи */ + {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ + {{0xED, 0xE5, 0xE5}, 12}, /* нее */ + {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ + {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ + {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ + {{0xE8, 0xED, 0xF6}, 12}, /* инц */ + {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ + {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ + {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ + {{0xED, 0xE0, 0xF2}, 12}, /* нат */ + {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ + {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ + {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ + {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ + {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ + {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ + {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ + {{0xE5, 0xED, 0xF1}, 12}, /* енс */ + {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ + {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ + {{0xED, 0xE0, 0xE7}, 12}, /* наз */ + {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ + {{0xEE, 0xED, 0xE8}, 12}, /* они */ + {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ + {{0xE3, 0xEE, 0xE4}, 12}, /* год */ + {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ + {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ + {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ + {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ + {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ + {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ + {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ + {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ + {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ + {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ + {{0xF1, 0xE8, 0xDF}, 11}, /* сия */ + {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ + {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ + {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ + {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ + {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ + {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ + {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ + {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ + {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ + {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ + {{0xED, 0xED, 0xF3}, 11}, /* нну */ + {{0xED, 0xE5, 0xEF}, 11}, /* неп */ + {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ + {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ + {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ + {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ + {{0xE0, 0xE2, 0xED}, 11}, /* авн */ + {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ + {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ + {{0x82, 0xF0, 0xE5}, 11}, /* Вре */ + {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ + {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ + {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ + {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ + {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ + {{0xEE, 0xED, 0xFB}, 10}, /* оны */ + {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ + {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ + {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ + {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ + {{0xDF, 0xF2, 0xFB}, 10}, /* яты */ + {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ + {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ + {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ + {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ + {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ + {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ + {{0x8E, 0xF2, 0xE2}, 10}, /* Отв */ + {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ + {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ + {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ + {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ + {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ + {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ + {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ + {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ + {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ + {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ + {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ + {{0xEC, 0xED, 0xEE}, 10}, /* мно */ + {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ + {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ + {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ + {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ + {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ + {{0xE4, 0xDF, 0xF9}, 10}, /* дящ */ + {{0xF2, 0xF0, 0xE8}, 10}, /* три */ + {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ + {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ + {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ + {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ + {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ + {{0xE7, 0xED, 0xFB}, 10}, /* зны */ + {{0xEE, 0xDF, 0xED}, 10}, /* оян */ + {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ + {{0xE2, 0xED, 0xE5}, 10}, /* вне */ + {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ + {{0xE5, 0xEC, 0xDF}, 10}, /* емя */ + {{0xED, 0xE0, 0xE8}, 10}, /* наи */ + {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ + {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ + {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ + {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ + {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ + {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ + {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ + {{0xED, 0xE8, 0xE2}, 10}, /* нив */ + {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ + {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ + {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ + {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ + {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ + {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ + {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ + {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_ENCODING_DETECT_RESOURCE_H */ diff --git a/source/myhtml/encoding_resource.h b/source/myhtml/encoding_resource.h new file mode 100644 index 0000000..af6a763 --- /dev/null +++ b/source/myhtml/encoding_resource.h @@ -0,0 +1,9330 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/encoding.h" + +#ifndef MyHTML_ENCODING_RESOURCE_H +#define MyHTML_ENCODING_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +static const unsigned long myhtml_encoding_map_big5[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 17392, 19506, 17923, 17830, 17784, 160359, 19831, 17843, + 162993, 19682, 163013, 15253, 18230, 18244, 19527, 19520, 148159, 144919, + 160594, 159371, 159954, 19543, 172881, 18255, 17882, 19589, 162924, 19719, + 19108, 18081, 158499, 29221, 154196, 137827, 146950, 147297, 26189, 22267, + 0x0000, 32149, 22813, 166841, 15860, 38708, 162799, 23515, 138590, 23204, + 13861, 171696, 23249, 23479, 23804, 26478, 34195, 170309, 29793, 29853, + 14453, 138579, 145054, 155681, 16108, 153822, 15093, 31484, 40855, 147809, + 166157, 143850, 133770, 143966, 17162, 33924, 40854, 37935, 18736, 34323, + 22678, 38730, 37400, 31184, 31282, 26208, 27177, 34973, 29772, 31685, + 26498, 31276, 21071, 36934, 13542, 29636, 155065, 29894, 40903, 22451, + 18735, 21580, 16689, 145038, 22552, 31346, 162661, 35727, 18094, 159368, + 16769, 155033, 31662, 140476, 40904, 140481, 140489, 140492, 40905, 34052, + 144827, 16564, 40906, 17633, 175615, 25281, 28782, 40907, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12736, + 12737, 12738, 12739, 12740, 131340, 12741, 131281, 131277, 12742, 12743, + 131275, 139240, 12744, 131274, 12745, 12746, 12747, 12748, 131342, 12749, + 12750, 256, 193, 461, 192, 274, 201, 282, 200, 332, + 211, 465, 210, 0x0000, 7870, 0x0000, 7872, 202, 257, 225, + 462, 224, 593, 275, 233, 283, 232, 299, 237, 464, + 236, 333, 243, 466, 242, 363, 250, 468, 249, 470, + 472, 474, 476, 252, 0x0000, 7871, 0x0000, 7873, 234, 609, + 9178, 9179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 172969, 135493, 0x0000, 25866, + 0x0000, 0x0000, 20029, 28381, 40270, 37343, 0x0000, 0x0000, 161589, 25745, + 20250, 20264, 20392, 20822, 20852, 20892, 20964, 21153, 21160, 21307, + 21326, 21457, 21464, 22242, 22768, 22788, 22791, 22834, 22836, 23398, + 23454, 23455, 23706, 24198, 24635, 25993, 26622, 26628, 26725, 27982, + 28860, 30005, 32420, 32428, 32442, 32455, 32463, 32479, 32518, 32567, + 33402, 33487, 33647, 35270, 35774, 35810, 36710, 36711, 36718, 29713, + 31996, 32205, 26950, 31433, 21031, 0x0000, 0x0000, 0x0000, 0x0000, 37260, + 30904, 37214, 32956, 0x0000, 36107, 33014, 133607, 0x0000, 0x0000, 32927, + 40647, 19661, 40393, 40460, 19518, 171510, 159758, 40458, 172339, 13761, + 0x0000, 28314, 33342, 29977, 0x0000, 18705, 39532, 39567, 40857, 31111, + 164972, 138698, 132560, 142054, 20004, 20097, 20096, 20103, 20159, 20203, + 20279, 13388, 20413, 15944, 20483, 20616, 13437, 13459, 13477, 20870, + 22789, 20955, 20988, 20997, 20105, 21113, 21136, 21287, 13767, 21417, + 13649, 21424, 13651, 21442, 21539, 13677, 13682, 13953, 21651, 21667, + 21684, 21689, 21712, 21743, 21784, 21795, 21800, 13720, 21823, 13733, + 13759, 21975, 13765, 163204, 21797, 0x0000, 134210, 134421, 151851, 21904, + 142534, 14828, 131905, 36422, 150968, 169189, 16467, 164030, 30586, 142392, + 14900, 18389, 164189, 158194, 151018, 25821, 134524, 135092, 134357, 135412, + 25741, 36478, 134806, 134155, 135012, 142505, 164438, 148691, 0x0000, 134470, + 170573, 164073, 18420, 151207, 142530, 39602, 14951, 169460, 16365, 13574, + 152263, 169940, 161992, 142660, 40302, 38933, 0x0000, 17369, 155813, 25780, + 21731, 142668, 142282, 135287, 14843, 135279, 157402, 157462, 162208, 25834, + 151634, 134211, 36456, 139681, 166732, 132913, 0x0000, 18443, 131497, 16378, + 22643, 142733, 0x0000, 148936, 132348, 155799, 134988, 134550, 21881, 16571, + 17338, 0x0000, 19124, 141926, 135325, 33194, 39157, 134556, 25465, 14846, + 141173, 36288, 22177, 25724, 15939, 0x0000, 173569, 134665, 142031, 142537, + 0x0000, 135368, 145858, 14738, 14854, 164507, 13688, 155209, 139463, 22098, + 134961, 142514, 169760, 13500, 27709, 151099, 0x0000, 0x0000, 161140, 142987, + 139784, 173659, 167117, 134778, 134196, 157724, 32659, 135375, 141315, 141625, + 13819, 152035, 134796, 135053, 134826, 16275, 134960, 134471, 135503, 134732, + 0x0000, 134827, 134057, 134472, 135360, 135485, 16377, 140950, 25650, 135085, + 144372, 161337, 142286, 134526, 134527, 142417, 142421, 14872, 134808, 135367, + 134958, 173618, 158544, 167122, 167321, 167114, 38314, 21708, 33476, 21945, + 0x0000, 171715, 39974, 39606, 161630, 142830, 28992, 33133, 33004, 23580, + 157042, 33076, 14231, 21343, 164029, 37302, 134906, 134671, 134775, 134907, + 13789, 151019, 13833, 134358, 22191, 141237, 135369, 134672, 134776, 135288, + 135496, 164359, 136277, 134777, 151120, 142756, 23124, 135197, 135198, 135413, + 135414, 22428, 134673, 161428, 164557, 135093, 134779, 151934, 14083, 135094, + 135552, 152280, 172733, 149978, 137274, 147831, 164476, 22681, 21096, 13850, + 153405, 31666, 23400, 18432, 19244, 40743, 18919, 39967, 39821, 154484, + 143677, 22011, 13810, 22153, 20008, 22786, 138177, 194680, 38737, 131206, + 20059, 20155, 13630, 23587, 24401, 24516, 14586, 25164, 25909, 27514, + 27701, 27706, 28780, 29227, 20012, 29357, 149737, 32594, 31035, 31993, + 32595, 156266, 13505, 0x0000, 156491, 32770, 32896, 157202, 158033, 21341, + 34916, 35265, 161970, 35744, 36125, 38021, 38264, 38271, 38376, 167439, + 38886, 39029, 39118, 39134, 39267, 170000, 40060, 40479, 40644, 27503, + 63751, 20023, 131207, 38429, 25143, 38050, 0x0000, 20539, 28158, 171123, + 40870, 15817, 34959, 147790, 28791, 23797, 19232, 152013, 13657, 154928, + 24866, 166450, 36775, 37366, 29073, 26393, 29626, 144001, 172295, 15499, + 137600, 19216, 30948, 29698, 20910, 165647, 16393, 27235, 172730, 16931, + 34319, 133743, 31274, 170311, 166634, 38741, 28749, 21284, 139390, 37876, + 30425, 166371, 40871, 30685, 20131, 20464, 20668, 20015, 20247, 40872, + 21556, 32139, 22674, 22736, 138678, 24210, 24217, 24514, 141074, 25995, + 144377, 26905, 27203, 146531, 27903, 0x0000, 29184, 148741, 29580, 16091, + 150035, 23317, 29881, 35715, 154788, 153237, 31379, 31724, 31939, 32364, + 33528, 34199, 40873, 34960, 40874, 36537, 40875, 36815, 34143, 39392, + 37409, 40876, 167353, 136255, 16497, 17058, 23066, 0x0000, 0x0000, 0x0000, + 39016, 26475, 17014, 22333, 0x0000, 34262, 149883, 33471, 160013, 19585, + 159092, 23931, 158485, 159678, 40877, 40878, 23446, 40879, 26343, 32347, + 28247, 31178, 15752, 17603, 143958, 141206, 17306, 17718, 0x0000, 23765, + 146202, 35577, 23672, 15634, 144721, 23928, 40882, 29015, 17752, 147692, + 138787, 19575, 14712, 13386, 131492, 158785, 35532, 20404, 131641, 22975, + 33132, 38998, 170234, 24379, 134047, 0x0000, 139713, 166253, 16642, 18107, + 168057, 16135, 40883, 172469, 16632, 14294, 18167, 158790, 16764, 165554, + 160767, 17773, 14548, 152730, 17761, 17691, 19849, 19579, 19830, 17898, + 16328, 150287, 13921, 17630, 17597, 16877, 23870, 23880, 23894, 15868, + 14351, 23972, 23993, 14368, 14392, 24130, 24253, 24357, 24451, 14600, + 14612, 14655, 14669, 24791, 24893, 23781, 14729, 25015, 25017, 25039, + 14776, 25132, 25232, 25317, 25368, 14840, 22193, 14851, 25570, 25595, + 25607, 25690, 14923, 25792, 23829, 22049, 40863, 14999, 25990, 15037, + 26111, 26195, 15090, 26258, 15138, 26390, 15170, 26532, 26624, 15192, + 26698, 26756, 15218, 15217, 15227, 26889, 26947, 29276, 26980, 27039, + 27013, 15292, 27094, 15325, 27237, 27252, 27249, 27266, 15340, 27289, + 15346, 27307, 27317, 27348, 27382, 27521, 27585, 27626, 27765, 27818, + 15563, 27906, 27910, 27942, 28033, 15599, 28068, 28081, 28181, 28184, + 28201, 28294, 166336, 28347, 28386, 28378, 40831, 28392, 28393, 28452, + 28468, 15686, 147265, 28545, 28606, 15722, 15733, 29111, 23705, 15754, + 28716, 15761, 28752, 28756, 28783, 28799, 28809, 131877, 17345, 13809, + 134872, 147159, 22462, 159443, 28990, 153568, 13902, 27042, 166889, 23412, + 31305, 153825, 169177, 31333, 31357, 154028, 31419, 31408, 31426, 31427, + 29137, 156813, 16842, 31450, 31453, 31466, 16879, 21682, 154625, 31499, + 31573, 31529, 152334, 154878, 31650, 31599, 33692, 154548, 158847, 31696, + 33825, 31634, 31672, 154912, 15789, 154725, 33938, 31738, 31750, 31797, + 154817, 31812, 31875, 149634, 31910, 26237, 148856, 31945, 31943, 31974, + 31860, 31987, 31989, 31950, 32359, 17693, 159300, 32093, 159446, 29837, + 32137, 32171, 28981, 32179, 32210, 147543, 155689, 32228, 15635, 32245, + 137209, 32229, 164717, 32285, 155937, 155994, 32366, 32402, 17195, 37996, + 32295, 32576, 32577, 32583, 31030, 156368, 39393, 32663, 156497, 32675, + 136801, 131176, 17756, 145254, 17667, 164666, 32762, 156809, 32773, 32776, + 32797, 32808, 32815, 172167, 158915, 32827, 32828, 32865, 141076, 18825, + 157222, 146915, 157416, 26405, 32935, 166472, 33031, 33050, 22704, 141046, + 27775, 156824, 151480, 25831, 136330, 33304, 137310, 27219, 150117, 150165, + 17530, 33321, 133901, 158290, 146814, 20473, 136445, 34018, 33634, 158474, + 149927, 144688, 137075, 146936, 33450, 26907, 194964, 16859, 34123, 33488, + 33562, 134678, 137140, 14017, 143741, 144730, 33403, 33506, 33560, 147083, + 159139, 158469, 158615, 144846, 15807, 33565, 21996, 33669, 17675, 159141, + 33708, 33729, 33747, 13438, 159444, 27223, 34138, 13462, 159298, 143087, + 33880, 154596, 33905, 15827, 17636, 27303, 33866, 146613, 31064, 33960, + 158614, 159351, 159299, 34014, 33807, 33681, 17568, 33939, 34020, 154769, + 16960, 154816, 17731, 34100, 23282, 159385, 17703, 34163, 17686, 26559, + 34326, 165413, 165435, 34241, 159880, 34306, 136578, 159949, 194994, 17770, + 34344, 13896, 137378, 21495, 160666, 34430, 34673, 172280, 34798, 142375, + 34737, 34778, 34831, 22113, 34412, 26710, 17935, 34885, 34886, 161248, + 146873, 161252, 34910, 34972, 18011, 34996, 34997, 25537, 35013, 30583, + 161551, 35207, 35210, 35238, 35241, 35239, 35260, 166437, 35303, 162084, + 162493, 35484, 30611, 37374, 35472, 162393, 31465, 162618, 147343, 18195, + 162616, 29052, 35596, 35615, 152624, 152933, 35647, 35660, 35661, 35497, + 150138, 35728, 35739, 35503, 136927, 17941, 34895, 35995, 163156, 163215, + 195028, 14117, 163155, 36054, 163224, 163261, 36114, 36099, 137488, 36059, + 28764, 36113, 150729, 16080, 36215, 36265, 163842, 135188, 149898, 15228, + 164284, 160012, 31463, 36525, 36534, 36547, 37588, 36633, 36653, 164709, + 164882, 36773, 37635, 172703, 133712, 36787, 18730, 166366, 165181, 146875, + 24312, 143970, 36857, 172052, 165564, 165121, 140069, 14720, 159447, 36919, + 165180, 162494, 36961, 165228, 165387, 37032, 165651, 37060, 165606, 37038, + 37117, 37223, 15088, 37289, 37316, 31916, 166195, 138889, 37390, 27807, + 37441, 37474, 153017, 37561, 166598, 146587, 166668, 153051, 134449, 37676, + 37739, 166625, 166891, 28815, 23235, 166626, 166629, 18789, 37444, 166892, + 166969, 166911, 37747, 37979, 36540, 38277, 38310, 37926, 38304, 28662, + 17081, 140922, 165592, 135804, 146990, 18911, 27676, 38523, 38550, 16748, + 38563, 159445, 25050, 38582, 30965, 166624, 38589, 21452, 18849, 158904, + 131700, 156688, 168111, 168165, 150225, 137493, 144138, 38705, 34370, 38710, + 18959, 17725, 17797, 150249, 28789, 23361, 38683, 38748, 168405, 38743, + 23370, 168427, 38751, 37925, 20688, 143543, 143548, 38793, 38815, 38833, + 38846, 38848, 38866, 38880, 152684, 38894, 29724, 169011, 38911, 38901, + 168989, 162170, 19153, 38964, 38963, 38987, 39014, 15118, 160117, 15697, + 132656, 147804, 153350, 39114, 39095, 39112, 39111, 19199, 159015, 136915, + 21936, 39137, 39142, 39148, 37752, 39225, 150057, 19314, 170071, 170245, + 39413, 39436, 39483, 39440, 39512, 153381, 14020, 168113, 170965, 39648, + 39650, 170757, 39668, 19470, 39700, 39725, 165376, 20532, 39732, 158120, + 14531, 143485, 39760, 39744, 171326, 23109, 137315, 39822, 148043, 39938, + 39935, 39948, 171624, 40404, 171959, 172434, 172459, 172257, 172323, 172511, + 40318, 40323, 172340, 40462, 26760, 40388, 139611, 172435, 172576, 137531, + 172595, 40249, 172217, 172724, 40592, 40597, 40606, 40610, 19764, 40618, + 40623, 148324, 40641, 15200, 14821, 15645, 20274, 14270, 166955, 40706, + 40712, 19350, 37924, 159138, 40727, 40726, 40761, 22175, 22154, 40773, + 39352, 168075, 38898, 33919, 40802, 40809, 31452, 40846, 29206, 19390, + 149877, 149947, 29047, 150008, 148296, 150097, 29598, 166874, 137466, 31135, + 166270, 167478, 37737, 37875, 166468, 37612, 37761, 37835, 166252, 148665, + 29207, 16107, 30578, 31299, 28880, 148595, 148472, 29054, 137199, 28835, + 137406, 144793, 16071, 137349, 152623, 137208, 14114, 136955, 137273, 14049, + 137076, 137425, 155467, 14115, 136896, 22363, 150053, 136190, 135848, 136134, + 136374, 34051, 145062, 34051, 33877, 149908, 160101, 146993, 152924, 147195, + 159826, 17652, 145134, 170397, 159526, 26617, 14131, 15381, 15847, 22636, + 137506, 26640, 16471, 145215, 147681, 147595, 147727, 158753, 21707, 22174, + 157361, 22162, 135135, 134056, 134669, 37830, 166675, 37788, 20216, 20779, + 14361, 148534, 20156, 132197, 131967, 20299, 20362, 153169, 23144, 131499, + 132043, 14745, 131850, 132116, 13365, 20265, 131776, 167603, 131701, 35546, + 131596, 20120, 20685, 20749, 20386, 20227, 150030, 147082, 20290, 20526, + 20588, 20609, 20428, 20453, 20568, 20732, 20825, 20827, 20829, 20830, + 28278, 144789, 147001, 147135, 28018, 137348, 147081, 20904, 20931, 132576, + 17629, 132259, 132242, 132241, 36218, 166556, 132878, 21081, 21156, 133235, + 21217, 37742, 18042, 29068, 148364, 134176, 149932, 135396, 27089, 134685, + 29817, 16094, 29849, 29716, 29782, 29592, 19342, 150204, 147597, 21456, + 13700, 29199, 147657, 21940, 131909, 21709, 134086, 22301, 37469, 38644, + 37734, 22493, 22413, 22399, 13886, 22731, 23193, 166470, 136954, 137071, + 136976, 23084, 22968, 37519, 23166, 23247, 23058, 153926, 137715, 137313, + 148117, 14069, 27909, 29763, 23073, 155267, 23169, 166871, 132115, 37856, + 29836, 135939, 28933, 18802, 37896, 166395, 37821, 14240, 23582, 23710, + 24158, 24136, 137622, 137596, 146158, 24269, 23375, 137475, 137476, 14081, + 137376, 14045, 136958, 14035, 33066, 166471, 138682, 144498, 166312, 24332, + 24334, 137511, 137131, 23147, 137019, 23364, 34324, 161277, 34912, 24702, + 141408, 140843, 24539, 16056, 140719, 140734, 168072, 159603, 25024, 131134, + 131142, 140827, 24985, 24984, 24693, 142491, 142599, 149204, 168269, 25713, + 149093, 142186, 14889, 142114, 144464, 170218, 142968, 25399, 173147, 25782, + 25393, 25553, 149987, 142695, 25252, 142497, 25659, 25963, 26994, 15348, + 143502, 144045, 149897, 144043, 21773, 144096, 137433, 169023, 26318, 144009, + 143795, 15072, 16784, 152964, 166690, 152975, 136956, 152923, 152613, 30958, + 143619, 137258, 143924, 13412, 143887, 143746, 148169, 26254, 159012, 26219, + 19347, 26160, 161904, 138731, 26211, 144082, 144097, 26142, 153714, 14545, + 145466, 145340, 15257, 145314, 144382, 29904, 15254, 26511, 149034, 26806, + 26654, 15300, 27326, 14435, 145365, 148615, 27187, 27218, 27337, 27397, + 137490, 25873, 26776, 27212, 15319, 27258, 27479, 147392, 146586, 37792, + 37618, 166890, 166603, 37513, 163870, 166364, 37991, 28069, 28427, 149996, + 28007, 147327, 15759, 28164, 147516, 23101, 28170, 22599, 27940, 30786, + 28987, 148250, 148086, 28913, 29264, 29319, 29332, 149391, 149285, 20857, + 150180, 132587, 29818, 147192, 144991, 150090, 149783, 155617, 16134, 16049, + 150239, 166947, 147253, 24743, 16115, 29900, 29756, 37767, 29751, 17567, + 159210, 17745, 30083, 16227, 150745, 150790, 16216, 30037, 30323, 173510, + 15129, 29800, 166604, 149931, 149902, 15099, 15821, 150094, 16127, 149957, + 149747, 37370, 22322, 37698, 166627, 137316, 20703, 152097, 152039, 30584, + 143922, 30478, 30479, 30587, 149143, 145281, 14942, 149744, 29752, 29851, + 16063, 150202, 150215, 16584, 150166, 156078, 37639, 152961, 30750, 30861, + 30856, 30930, 29648, 31065, 161601, 153315, 16654, 31131, 33942, 31141, + 27181, 147194, 31290, 31220, 16750, 136934, 16690, 37429, 31217, 134476, + 149900, 131737, 146874, 137070, 13719, 21867, 13680, 13994, 131540, 134157, + 31458, 23129, 141045, 154287, 154268, 23053, 131675, 30960, 23082, 154566, + 31486, 16889, 31837, 31853, 16913, 154547, 155324, 155302, 31949, 150009, + 137136, 31886, 31868, 31918, 27314, 32220, 32263, 32211, 32590, 156257, + 155996, 162632, 32151, 155266, 17002, 158581, 133398, 26582, 131150, 144847, + 22468, 156690, 156664, 149858, 32733, 31527, 133164, 154345, 154947, 31500, + 155150, 39398, 34373, 39523, 27164, 144447, 14818, 150007, 157101, 39455, + 157088, 33920, 160039, 158929, 17642, 33079, 17410, 32966, 33033, 33090, + 157620, 39107, 158274, 33378, 33381, 158289, 33875, 159143, 34320, 160283, + 23174, 16767, 137280, 23339, 137377, 23268, 137432, 34464, 195004, 146831, + 34861, 160802, 23042, 34926, 20293, 34951, 35007, 35046, 35173, 35149, + 153219, 35156, 161669, 161668, 166901, 166873, 166812, 166393, 16045, 33955, + 18165, 18127, 14322, 35389, 35356, 169032, 24397, 37419, 148100, 26068, + 28969, 28868, 137285, 40301, 35999, 36073, 163292, 22938, 30659, 23024, + 17262, 14036, 36394, 36519, 150537, 36656, 36682, 17140, 27736, 28603, + 140065, 18587, 28537, 28299, 137178, 39913, 14005, 149807, 37051, 37015, + 21873, 18694, 37307, 37892, 166475, 16482, 166652, 37927, 166941, 166971, + 34021, 35371, 38297, 38311, 38295, 38294, 167220, 29765, 16066, 149759, + 150082, 148458, 16103, 143909, 38543, 167655, 167526, 167525, 16076, 149997, + 150136, 147438, 29714, 29803, 16124, 38721, 168112, 26695, 18973, 168083, + 153567, 38749, 37736, 166281, 166950, 166703, 156606, 37562, 23313, 35689, + 18748, 29689, 147995, 38811, 38769, 39224, 134950, 24001, 166853, 150194, + 38943, 169178, 37622, 169431, 37349, 17600, 166736, 150119, 166756, 39132, + 166469, 16128, 37418, 18725, 33812, 39227, 39245, 162566, 15869, 39323, + 19311, 39338, 39516, 166757, 153800, 27279, 39457, 23294, 39471, 170225, + 19344, 170312, 39356, 19389, 19351, 37757, 22642, 135938, 22562, 149944, + 136424, 30788, 141087, 146872, 26821, 15741, 37976, 14631, 24912, 141185, + 141675, 24839, 40015, 40019, 40059, 39989, 39952, 39807, 39887, 171565, + 39839, 172533, 172286, 40225, 19630, 147716, 40472, 19632, 40204, 172468, + 172269, 172275, 170287, 40357, 33981, 159250, 159711, 158594, 34300, 17715, + 159140, 159364, 159216, 33824, 34286, 159232, 145367, 155748, 31202, 144796, + 144960, 18733, 149982, 15714, 37851, 37566, 37704, 131775, 30905, 37495, + 37965, 20452, 13376, 36964, 152925, 30781, 30804, 30902, 30795, 137047, + 143817, 149825, 13978, 20338, 28634, 28633, 28702, 28702, 21524, 147893, + 22459, 22771, 22410, 40214, 22487, 28980, 13487, 147884, 29163, 158784, + 151447, 23336, 137141, 166473, 24844, 23246, 23051, 17084, 148616, 14124, + 19323, 166396, 37819, 37816, 137430, 134941, 33906, 158912, 136211, 148218, + 142374, 148417, 22932, 146871, 157505, 32168, 155995, 155812, 149945, 149899, + 166394, 37605, 29666, 16105, 29876, 166755, 137375, 16097, 150195, 27352, + 29683, 29691, 16086, 150078, 150164, 137177, 150118, 132007, 136228, 149989, + 29768, 149782, 28837, 149878, 37508, 29670, 37727, 132350, 37681, 166606, + 166422, 37766, 166887, 153045, 18741, 166530, 29035, 149827, 134399, 22180, + 132634, 134123, 134328, 21762, 31172, 137210, 32254, 136898, 150096, 137298, + 17710, 37889, 14090, 166592, 149933, 22960, 137407, 137347, 160900, 23201, + 14050, 146779, 14000, 37471, 23161, 166529, 137314, 37748, 15565, 133812, + 19094, 14730, 20724, 15721, 15692, 136092, 29045, 17147, 164376, 28175, + 168164, 17643, 27991, 163407, 28775, 27823, 15574, 147437, 146989, 28162, + 28428, 15727, 132085, 30033, 14012, 13512, 18048, 16090, 18545, 22980, + 37486, 18750, 36673, 166940, 158656, 22546, 22472, 14038, 136274, 28926, + 148322, 150129, 143331, 135856, 140221, 26809, 26983, 136088, 144613, 162804, + 145119, 166531, 145366, 144378, 150687, 27162, 145069, 158903, 33854, 17631, + 17614, 159014, 159057, 158850, 159710, 28439, 160009, 33597, 137018, 33773, + 158848, 159827, 137179, 22921, 23170, 137139, 23137, 23153, 137477, 147964, + 14125, 23023, 137020, 14023, 29070, 37776, 26266, 148133, 23150, 23083, + 148115, 27179, 147193, 161590, 148571, 148170, 28957, 148057, 166369, 20400, + 159016, 23746, 148686, 163405, 148413, 27148, 148054, 135940, 28838, 28979, + 148457, 15781, 27871, 194597, 150095, 32357, 23019, 23855, 15859, 24412, + 150109, 137183, 32164, 33830, 21637, 146170, 144128, 131604, 22398, 133333, + 132633, 16357, 139166, 172726, 28675, 168283, 23920, 29583, 31955, 166489, + 168992, 20424, 32743, 29389, 29456, 162548, 29496, 29497, 153334, 29505, + 29512, 16041, 162584, 36972, 29173, 149746, 29665, 33270, 16074, 30476, + 16081, 27810, 22269, 29721, 29726, 29727, 16098, 16112, 16116, 16122, + 29907, 16142, 16211, 30018, 30061, 30066, 30093, 16252, 30152, 30172, + 16320, 30285, 16343, 30324, 16348, 30330, 151388, 29064, 22051, 35200, + 22633, 16413, 30531, 16441, 26465, 16453, 13787, 30616, 16490, 16495, + 23646, 30654, 30667, 22770, 30744, 28857, 30748, 16552, 30777, 30791, + 30801, 30822, 33864, 152885, 31027, 26627, 31026, 16643, 16649, 31121, + 31129, 36795, 31238, 36796, 16743, 31377, 16818, 31420, 33401, 16836, + 31439, 31451, 16847, 20001, 31586, 31596, 31611, 31762, 31771, 16992, + 17018, 31867, 31900, 17036, 31928, 17044, 31981, 36755, 28864, 134351, + 32207, 32212, 32208, 32253, 32686, 32692, 29343, 17303, 32800, 32805, + 31545, 32814, 32817, 32852, 15820, 22452, 28832, 32951, 33001, 17389, + 33036, 29482, 33038, 33042, 30048, 33044, 17409, 15161, 33110, 33113, + 33114, 17427, 22586, 33148, 33156, 17445, 33171, 17453, 33189, 22511, + 33217, 33252, 33364, 17551, 33446, 33398, 33482, 33496, 33535, 17584, + 33623, 38505, 27018, 33797, 28917, 33892, 24803, 33928, 17668, 33982, + 34017, 34040, 34064, 34104, 34130, 17723, 34159, 34160, 34272, 17783, + 34418, 34450, 34482, 34543, 38469, 34699, 17926, 17943, 34990, 35071, + 35108, 35143, 35217, 162151, 35369, 35384, 35476, 35508, 35921, 36052, + 36082, 36124, 18328, 22623, 36291, 18413, 20206, 36410, 21976, 22356, + 36465, 22005, 36528, 18487, 36558, 36578, 36580, 36589, 36594, 36791, + 36801, 36810, 36812, 36915, 39364, 18605, 39136, 37395, 18718, 37416, + 37464, 37483, 37553, 37550, 37567, 37603, 37611, 37619, 37620, 37629, + 37699, 37764, 37805, 18757, 18769, 40639, 37911, 21249, 37917, 37933, + 37950, 18794, 37972, 38009, 38189, 38306, 18855, 38388, 38451, 18917, + 26528, 18980, 38720, 18997, 38834, 38850, 22100, 19172, 24808, 39097, + 19225, 39153, 22596, 39182, 39193, 20916, 39196, 39223, 39234, 39261, + 39266, 19312, 39365, 19357, 39484, 39695, 31363, 39785, 39809, 39901, + 39921, 39924, 19565, 39968, 14191, 138178, 40265, 39994, 40702, 22096, + 40339, 40381, 40384, 40444, 38134, 36790, 40571, 40620, 40625, 40637, + 40646, 38108, 40674, 40689, 40696, 31432, 40772, 131220, 131767, 132000, + 26906, 38083, 22956, 132311, 22592, 38081, 14265, 132565, 132629, 132726, + 136890, 22359, 29043, 133826, 133837, 134079, 21610, 194619, 134091, 21662, + 134139, 134203, 134227, 134245, 134268, 24807, 134285, 22138, 134325, 134365, + 134381, 134511, 134578, 134600, 26965, 39983, 34725, 134660, 134670, 134871, + 135056, 134957, 134771, 23584, 135100, 24075, 135260, 135247, 135286, 26398, + 135291, 135304, 135318, 13895, 135359, 135379, 135471, 135483, 21348, 33965, + 135907, 136053, 135990, 35713, 136567, 136729, 137155, 137159, 20088, 28859, + 137261, 137578, 137773, 137797, 138282, 138352, 138412, 138952, 25283, 138965, + 139029, 29080, 26709, 139333, 27113, 14024, 139900, 140247, 140282, 141098, + 141425, 141647, 33533, 141671, 141715, 142037, 35237, 142056, 36768, 142094, + 38840, 142143, 38983, 39613, 142412, 0x0000, 142472, 142519, 154600, 142600, + 142610, 142775, 142741, 142914, 143220, 143308, 143411, 143462, 144159, 144350, + 24497, 26184, 26303, 162425, 144743, 144883, 29185, 149946, 30679, 144922, + 145174, 32391, 131910, 22709, 26382, 26904, 146087, 161367, 155618, 146961, + 147129, 161278, 139418, 18640, 19128, 147737, 166554, 148206, 148237, 147515, + 148276, 148374, 150085, 132554, 20946, 132625, 22943, 138920, 15294, 146687, + 148484, 148694, 22408, 149108, 14747, 149295, 165352, 170441, 14178, 139715, + 35678, 166734, 39382, 149522, 149755, 150037, 29193, 150208, 134264, 22885, + 151205, 151430, 132985, 36570, 151596, 21135, 22335, 29041, 152217, 152601, + 147274, 150183, 21948, 152646, 152686, 158546, 37332, 13427, 152895, 161330, + 152926, 18200, 152930, 152934, 153543, 149823, 153693, 20582, 13563, 144332, + 24798, 153859, 18300, 166216, 154286, 154505, 154630, 138640, 22433, 29009, + 28598, 155906, 162834, 36950, 156082, 151450, 35682, 156674, 156746, 23899, + 158711, 36662, 156804, 137500, 35562, 150006, 156808, 147439, 156946, 19392, + 157119, 157365, 141083, 37989, 153569, 24981, 23079, 194765, 20411, 22201, + 148769, 157436, 20074, 149812, 38486, 28047, 158909, 13848, 35191, 157593, + 157806, 156689, 157790, 29151, 157895, 31554, 168128, 133649, 157990, 37124, + 158009, 31301, 40432, 158202, 39462, 158253, 13919, 156777, 131105, 31107, + 158260, 158555, 23852, 144665, 33743, 158621, 18128, 158884, 30011, 34917, + 159150, 22710, 14108, 140685, 159819, 160205, 15444, 160384, 160389, 37505, + 139642, 160395, 37680, 160486, 149968, 27705, 38047, 160848, 134904, 34855, + 35061, 141606, 164979, 137137, 28344, 150058, 137248, 14756, 14009, 23568, + 31203, 17727, 26294, 171181, 170148, 35139, 161740, 161880, 22230, 16607, + 136714, 14753, 145199, 164072, 136133, 29101, 33638, 162269, 168360, 23143, + 19639, 159919, 166315, 162301, 162314, 162571, 163174, 147834, 31555, 31102, + 163849, 28597, 172767, 27139, 164632, 21410, 159239, 37823, 26678, 38749, + 164207, 163875, 158133, 136173, 143919, 163912, 23941, 166960, 163971, 22293, + 38947, 166217, 23979, 149896, 26046, 27093, 21458, 150181, 147329, 15377, + 26422, 163984, 164084, 164142, 139169, 164175, 164233, 164271, 164378, 164614, + 164655, 164746, 13770, 164968, 165546, 18682, 25574, 166230, 30728, 37461, + 166328, 17394, 166375, 17375, 166376, 166726, 166868, 23032, 166921, 36619, + 167877, 168172, 31569, 168208, 168252, 15863, 168286, 150218, 36816, 29327, + 22155, 169191, 169449, 169392, 169400, 169778, 170193, 170313, 170346, 170435, + 170536, 170766, 171354, 171419, 32415, 171768, 171811, 19620, 38215, 172691, + 29090, 172799, 19857, 36882, 173515, 19868, 134300, 36798, 21953, 36794, + 140464, 36793, 150163, 17673, 32383, 28502, 27313, 20202, 13540, 166700, + 161949, 14138, 36480, 137205, 163876, 166764, 166809, 162366, 157359, 15851, + 161365, 146615, 153141, 153942, 20122, 155265, 156248, 22207, 134765, 36366, + 23405, 147080, 150686, 25566, 25296, 137206, 137339, 25904, 22061, 154698, + 21530, 152337, 15814, 171416, 19581, 22050, 22046, 32585, 155352, 22901, + 146752, 34672, 19996, 135146, 134473, 145082, 33047, 40286, 36120, 30267, + 40005, 30286, 30649, 37701, 21554, 33096, 33527, 22053, 33074, 33816, + 32957, 21994, 31074, 22083, 21526, 134813, 13774, 22021, 22001, 26353, + 164578, 13869, 30004, 22000, 21946, 21655, 21874, 134209, 134294, 24272, + 151880, 134774, 142434, 134818, 40619, 32090, 21982, 135285, 25245, 38765, + 21652, 36045, 29174, 37238, 25596, 25529, 25598, 21865, 142147, 40050, + 143027, 20890, 13535, 134567, 20903, 21581, 21790, 21779, 30310, 36397, + 157834, 30129, 32950, 34820, 34694, 35015, 33206, 33820, 135361, 17644, + 29444, 149254, 23440, 33547, 157843, 22139, 141044, 163119, 147875, 163187, + 159440, 160438, 37232, 135641, 37384, 146684, 173737, 134828, 134905, 29286, + 138402, 18254, 151490, 163833, 135147, 16634, 40029, 25887, 142752, 18675, + 149472, 171388, 135148, 134666, 24674, 161187, 135149, 0x0000, 155720, 135559, + 29091, 32398, 40272, 19994, 19972, 13687, 23309, 27826, 21351, 13996, + 14812, 21373, 13989, 149016, 22682, 150382, 33325, 21579, 22442, 154261, + 133497, 0x0000, 14930, 140389, 29556, 171692, 19721, 39917, 146686, 171824, + 19547, 151465, 169374, 171998, 33884, 146870, 160434, 157619, 145184, 25390, + 32037, 147191, 146988, 14890, 36872, 21196, 15988, 13946, 17897, 132238, + 30272, 23280, 134838, 30842, 163630, 22695, 16575, 22140, 39819, 23924, + 30292, 173108, 40581, 19681, 30201, 14331, 24857, 143578, 148466, 0x0000, + 22109, 135849, 22439, 149859, 171526, 21044, 159918, 13741, 27722, 40316, + 31830, 39737, 22494, 137068, 23635, 25811, 169168, 156469, 160100, 34477, + 134440, 159010, 150242, 134513, 0x0000, 20990, 139023, 23950, 38659, 138705, + 40577, 36940, 31519, 39682, 23761, 31651, 25192, 25397, 39679, 31695, + 39722, 31870, 39726, 31810, 31878, 39957, 31740, 39689, 40727, 39963, + 149822, 40794, 21875, 23491, 20477, 40600, 20466, 21088, 15878, 21201, + 22375, 20566, 22967, 24082, 38856, 40363, 36700, 21609, 38836, 39232, + 38842, 21292, 24880, 26924, 21466, 39946, 40194, 19515, 38465, 27008, + 20646, 30022, 137069, 39386, 21107, 0x0000, 37209, 38529, 37212, 0x0000, + 37201, 167575, 25471, 159011, 27338, 22033, 37262, 30074, 25221, 132092, + 29519, 31856, 154657, 146685, 0x0000, 149785, 30422, 39837, 20010, 134356, + 33726, 34882, 0x0000, 23626, 27072, 20717, 22394, 21023, 24053, 20174, + 27697, 131570, 20281, 21660, 21722, 21146, 36226, 13822, 24332, 13811, + 0x0000, 27474, 37244, 40869, 39831, 38958, 39092, 39610, 40616, 40580, + 29050, 31508, 0x0000, 27642, 34840, 32632, 0x0000, 22048, 173642, 36471, + 40787, 0x0000, 36308, 36431, 40476, 36353, 25218, 164733, 36392, 36469, + 31443, 150135, 31294, 30936, 27882, 35431, 30215, 166490, 40742, 27854, + 34774, 30147, 172722, 30803, 194624, 36108, 29410, 29553, 35629, 29442, + 29937, 36075, 150203, 34351, 24506, 34976, 17591, 0x0000, 137275, 159237, + 0x0000, 35454, 140571, 0x0000, 24829, 30311, 39639, 40260, 37742, 39823, + 34805, 0x0000, 34831, 36087, 29484, 38689, 39856, 13782, 29362, 19463, + 31825, 39242, 155993, 24921, 19460, 40598, 24957, 0x0000, 22367, 24943, + 25254, 25145, 25294, 14940, 25058, 21418, 144373, 25444, 26626, 13778, + 23895, 166850, 36826, 167481, 0x0000, 20697, 138566, 30982, 21298, 38456, + 134971, 16485, 0x0000, 30718, 0x0000, 31938, 155418, 31962, 31277, 32870, + 32867, 32077, 29957, 29938, 35220, 33306, 26380, 32866, 160902, 32859, + 29936, 33027, 30500, 35209, 157644, 30035, 159441, 34729, 34766, 33224, + 34700, 35401, 36013, 35651, 30507, 29944, 34010, 13877, 27058, 36262, + 0x0000, 35241, 29800, 28089, 34753, 147473, 29927, 15835, 29046, 24740, + 24988, 15569, 29026, 24695, 0x0000, 32625, 166701, 29264, 24809, 19326, + 21024, 15384, 146631, 155351, 161366, 152881, 137540, 135934, 170243, 159196, + 159917, 23745, 156077, 166415, 145015, 131310, 157766, 151310, 17762, 23327, + 156492, 40784, 40614, 156267, 12288, 65292, 12289, 12290, 65294, 8231, + 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65105, 65106, + 183, 65108, 65109, 65110, 65111, 65372, 8211, 65073, 8212, 65075, + 9588, 65076, 65103, 65288, 65289, 65077, 65078, 65371, 65373, 65079, + 65080, 12308, 12309, 65081, 65082, 12304, 12305, 65083, 65084, 12298, + 12299, 65085, 65086, 12296, 12297, 65087, 65088, 12300, 12301, 65089, + 65090, 12302, 12303, 65091, 65092, 65113, 65114, 65115, 65116, 65117, + 65118, 8216, 8217, 8220, 8221, 12317, 12318, 8245, 8242, 65283, + 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, + 9734, 9733, 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, + 175, 65507, 65343, 717, 65097, 65098, 65101, 65102, 65099, 65100, + 65119, 65120, 65121, 65291, 65293, 215, 247, 177, 8730, 65308, + 65310, 65309, 8806, 8807, 8800, 8734, 8786, 8801, 65122, 65123, + 65124, 65125, 65126, 65374, 8745, 8746, 8869, 8736, 8735, 8895, + 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 8853, 8857, + 8593, 8595, 8592, 8594, 8598, 8599, 8601, 8600, 8741, 8739, + 65295, 65340, 8725, 65128, 65284, 65509, 12306, 65504, 65505, 65285, + 65312, 8451, 8457, 65129, 65130, 65131, 13269, 13212, 13213, 13214, + 13262, 13217, 13198, 13199, 13252, 176, 20825, 20827, 20830, 20829, + 20833, 20835, 21991, 29929, 31950, 9601, 9602, 9603, 9604, 9605, + 9606, 9607, 9608, 9615, 9614, 9613, 9612, 9611, 9610, 9609, + 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, + 9488, 9492, 9496, 9581, 9582, 9584, 9583, 9552, 9566, 9578, + 9569, 9698, 9699, 9701, 9700, 9585, 9586, 9587, 65296, 65297, + 65298, 65299, 65300, 65301, 65302, 65303, 65304, 65305, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 12321, 12322, + 12323, 12324, 12325, 12326, 12327, 12328, 12329, 21313, 21316, 21317, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 65345, 65346, 65347, 65348, + 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, + 65359, 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, + 65369, 65370, 913, 914, 915, 916, 917, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, + 932, 933, 934, 935, 936, 937, 945, 946, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, + 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, + 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, + 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, + 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, + 12579, 12580, 12581, 12582, 12583, 12584, 12585, 729, 713, 714, + 711, 715, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, + 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, + 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, + 9244, 9245, 9246, 9247, 9249, 8364, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 19968, 20057, 19969, 19971, 20035, + 20061, 20102, 20108, 20154, 20799, 20837, 20843, 20960, 20992, 20993, + 21147, 21269, 21313, 21340, 21448, 19977, 19979, 19976, 19978, 20011, + 20024, 20961, 20037, 20040, 20063, 20062, 20110, 20129, 20800, 20995, + 21242, 21315, 21449, 21475, 22303, 22763, 22805, 22823, 22899, 23376, + 23377, 23379, 23544, 23567, 23586, 23608, 23665, 24029, 24037, 24049, + 24050, 24051, 24062, 24178, 24318, 24331, 24339, 25165, 19985, 19984, + 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, 20117, 20114, + 20116, 20130, 20161, 20160, 20163, 20166, 20167, 20173, 20170, 20171, + 20164, 20803, 20801, 20839, 20845, 20846, 20844, 20887, 20982, 20998, + 20999, 21000, 21243, 21246, 21247, 21270, 21305, 21320, 21319, 21317, + 21342, 21380, 21451, 21450, 21453, 22764, 22825, 22827, 22826, 22829, + 23380, 23569, 23588, 23610, 23663, 24052, 24187, 24319, 24340, 24341, + 24515, 25096, 25142, 25163, 25166, 25903, 25991, 26007, 26020, 26041, + 26085, 26352, 26376, 26408, 27424, 27490, 27513, 27595, 27604, 27611, + 27663, 27700, 28779, 29226, 29238, 29243, 29255, 29273, 29275, 29356, + 29579, 19993, 19990, 19989, 19988, 19992, 20027, 20045, 20047, 20046, + 20197, 20184, 20180, 20181, 20182, 20183, 20195, 20196, 20185, 20190, + 20805, 20804, 20873, 20874, 20908, 20985, 20986, 20984, 21002, 21152, + 21151, 21253, 21254, 21271, 21277, 20191, 21322, 21321, 21345, 21344, + 21359, 21358, 21435, 21487, 21476, 21491, 21484, 21486, 21481, 21480, + 21500, 21496, 21493, 21483, 21478, 21482, 21490, 21489, 21488, 21477, + 21485, 21499, 22235, 22234, 22806, 22830, 22833, 22900, 22902, 23381, + 23427, 23612, 24040, 24039, 24038, 24066, 24067, 24179, 24188, 24321, + 24344, 24343, 24517, 25098, 25171, 25172, 25170, 25169, 26021, 26086, + 26414, 26412, 26410, 26411, 26413, 27491, 27597, 27665, 27664, 27704, + 27713, 27712, 27710, 29359, 29572, 29577, 29916, 29926, 29976, 29983, + 29992, 29993, 30000, 30001, 30002, 30003, 30091, 30333, 30382, 30399, + 30446, 30683, 30690, 30707, 31034, 31166, 31348, 31435, 19998, 19999, + 20050, 20051, 20073, 20121, 20132, 20134, 20133, 20223, 20233, 20249, + 20234, 20245, 20237, 20240, 20241, 20239, 20210, 20214, 20219, 20208, + 20211, 20221, 20225, 20235, 20809, 20807, 20806, 20808, 20840, 20849, + 20877, 20912, 21015, 21009, 21010, 21006, 21014, 21155, 21256, 21281, + 21280, 21360, 21361, 21513, 21519, 21516, 21514, 21520, 21505, 21515, + 21508, 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, + 22237, 22323, 22320, 22312, 22317, 22316, 22319, 22313, 22809, 22810, + 22839, 22840, 22916, 22904, 22915, 22909, 22905, 22914, 22913, 23383, + 23384, 23431, 23432, 23429, 23433, 23546, 23574, 23673, 24030, 24070, + 24182, 24180, 24335, 24347, 24537, 24534, 25102, 25100, 25101, 25104, + 25187, 25179, 25176, 25910, 26089, 26088, 26092, 26093, 26354, 26355, + 26377, 26429, 26420, 26417, 26421, 27425, 27492, 27515, 27670, 27741, + 27735, 27737, 27743, 27744, 27728, 27733, 27745, 27739, 27725, 27726, + 28784, 29279, 29277, 30334, 31481, 31859, 31992, 32566, 32650, 32701, + 32769, 32771, 32780, 32786, 32819, 32895, 32905, 32907, 32908, 33251, + 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, 33406, 34411, + 34880, 34892, 34915, 35199, 38433, 20018, 20136, 20301, 20303, 20295, + 20311, 20318, 20276, 20315, 20309, 20272, 20304, 20305, 20285, 20282, + 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, 20302, + 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, 20918, + 20919, 21029, 21028, 21033, 21034, 21032, 21163, 21161, 21162, 21164, + 21283, 21363, 21365, 21533, 21549, 21534, 21566, 21542, 21582, 21543, + 21574, 21571, 21555, 21576, 21570, 21531, 21545, 21578, 21561, 21563, + 21560, 21550, 21557, 21558, 21536, 21564, 21568, 21553, 21547, 21535, + 21548, 22250, 22256, 22244, 22251, 22346, 22353, 22336, 22349, 22343, + 22350, 22334, 22352, 22351, 22331, 22767, 22846, 22941, 22930, 22952, + 22942, 22947, 22937, 22934, 22925, 22948, 22931, 22922, 22949, 23389, + 23388, 23386, 23387, 23436, 23435, 23439, 23596, 23616, 23617, 23615, + 23614, 23696, 23697, 23700, 23692, 24043, 24076, 24207, 24199, 24202, + 24311, 24324, 24351, 24420, 24418, 24439, 24441, 24536, 24524, 24535, + 24525, 24561, 24555, 24568, 24554, 25106, 25105, 25220, 25239, 25238, + 25216, 25206, 25225, 25197, 25226, 25212, 25214, 25209, 25203, 25234, + 25199, 25240, 25198, 25237, 25235, 25233, 25222, 25913, 25915, 25912, + 26097, 26356, 26463, 26446, 26447, 26448, 26449, 26460, 26454, 26462, + 26441, 26438, 26464, 26451, 26455, 27493, 27599, 27714, 27742, 27801, + 27777, 27784, 27785, 27781, 27803, 27754, 27770, 27792, 27760, 27788, + 27752, 27798, 27794, 27773, 27779, 27762, 27774, 27764, 27782, 27766, + 27789, 27796, 27800, 27778, 28790, 28796, 28797, 28792, 29282, 29281, + 29280, 29380, 29378, 29590, 29996, 29995, 30007, 30008, 30338, 30447, + 30691, 31169, 31168, 31167, 31350, 31995, 32597, 32918, 32915, 32925, + 32920, 32923, 32922, 32946, 33391, 33426, 33419, 33421, 35211, 35282, + 35328, 35895, 35910, 35925, 35997, 36196, 36208, 36275, 36523, 36554, + 36763, 36784, 36802, 36806, 36805, 36804, 24033, 37009, 37026, 37034, + 37030, 37027, 37193, 37318, 37324, 38450, 38446, 38449, 38442, 38444, + 20006, 20054, 20083, 20107, 20123, 20126, 20139, 20140, 20335, 20381, + 20365, 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, + 20360, 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, + 20821, 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, + 21050, 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, + 21329, 21350, 21367, 21368, 21369, 21462, 21460, 21463, 21619, 21621, + 21654, 21624, 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, + 21648, 21617, 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, + 22266, 22403, 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, + 22857, 22855, 22856, 22852, 22868, 22974, 22971, 22996, 22969, 22958, + 22993, 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, + 22981, 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, + 23578, 23624, 23621, 23622, 23735, 23713, 23736, 23721, 23723, 23729, + 23731, 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, + 24220, 24213, 24214, 24310, 24358, 24359, 24361, 24448, 24449, 24447, + 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, + 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, + 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, + 25298, 25307, 25259, 25299, 25300, 25291, 25288, 25256, 25277, 25276, + 25296, 25305, 25287, 25293, 25269, 25306, 25265, 25304, 25302, 25303, + 25286, 25260, 25294, 25918, 26023, 26044, 26106, 26132, 26131, 26124, + 26118, 26114, 26126, 26112, 26127, 26133, 26122, 26119, 26381, 26379, + 26477, 26507, 26517, 26481, 26524, 26483, 26487, 26503, 26525, 26519, + 26479, 26480, 26495, 26505, 26494, 26512, 26485, 26522, 26515, 26492, + 26474, 26482, 27427, 27494, 27495, 27519, 27667, 27675, 27875, 27880, + 27891, 27825, 27852, 27877, 27827, 27837, 27838, 27836, 27874, 27819, + 27861, 27859, 27832, 27844, 27833, 27841, 27822, 27863, 27845, 27889, + 27839, 27835, 27873, 27867, 27850, 27820, 27887, 27868, 27862, 27872, + 28821, 28814, 28818, 28810, 28825, 29228, 29229, 29240, 29256, 29287, + 29289, 29376, 29390, 29401, 29399, 29392, 29609, 29608, 29599, 29611, + 29605, 30013, 30109, 30105, 30106, 30340, 30402, 30450, 30452, 30693, + 30717, 31038, 31040, 31041, 31177, 31176, 31354, 31353, 31482, 31998, + 32596, 32652, 32651, 32773, 32954, 32933, 32930, 32945, 32929, 32939, + 32937, 32948, 32938, 32943, 33253, 33278, 33293, 33459, 33437, 33433, + 33453, 33469, 33439, 33465, 33457, 33452, 33445, 33455, 33464, 33443, + 33456, 33470, 33463, 34382, 34417, 21021, 34920, 36555, 36814, 36820, + 36817, 37045, 37048, 37041, 37046, 37319, 37329, 38263, 38272, 38428, + 38464, 38463, 38459, 38468, 38466, 38585, 38632, 38738, 38750, 20127, + 20141, 20142, 20449, 20405, 20399, 20415, 20448, 20433, 20431, 20445, + 20419, 20406, 20440, 20447, 20426, 20439, 20398, 20432, 20420, 20418, + 20442, 20430, 20446, 20407, 20823, 20882, 20881, 20896, 21070, 21059, + 21066, 21069, 21068, 21067, 21063, 21191, 21193, 21187, 21185, 21261, + 21335, 21371, 21402, 21467, 21676, 21696, 21672, 21710, 21705, 21688, + 21670, 21683, 21703, 21698, 21693, 21674, 21697, 21700, 21704, 21679, + 21675, 21681, 21691, 21673, 21671, 21695, 22271, 22402, 22411, 22432, + 22435, 22434, 22478, 22446, 22419, 22869, 22865, 22863, 22862, 22864, + 23004, 23000, 23039, 23011, 23016, 23043, 23013, 23018, 23002, 23014, + 23041, 23035, 23401, 23459, 23462, 23460, 23458, 23461, 23553, 23630, + 23631, 23629, 23627, 23769, 23762, 24055, 24093, 24101, 24095, 24189, + 24224, 24230, 24314, 24328, 24365, 24421, 24456, 24453, 24458, 24459, + 24455, 24460, 24457, 24594, 24605, 24608, 24613, 24590, 24616, 24653, + 24688, 24680, 24674, 24646, 24643, 24684, 24683, 24682, 24676, 25153, + 25308, 25366, 25353, 25340, 25325, 25345, 25326, 25341, 25351, 25329, + 25335, 25327, 25324, 25342, 25332, 25361, 25346, 25919, 25925, 26027, + 26045, 26082, 26149, 26157, 26144, 26151, 26159, 26143, 26152, 26161, + 26148, 26359, 26623, 26579, 26609, 26580, 26576, 26604, 26550, 26543, + 26613, 26601, 26607, 26564, 26577, 26548, 26586, 26597, 26552, 26575, + 26590, 26611, 26544, 26585, 26594, 26589, 26578, 27498, 27523, 27526, + 27573, 27602, 27607, 27679, 27849, 27915, 27954, 27946, 27969, 27941, + 27916, 27953, 27934, 27927, 27963, 27965, 27966, 27958, 27931, 27893, + 27961, 27943, 27960, 27945, 27950, 27957, 27918, 27947, 28843, 28858, + 28851, 28844, 28847, 28845, 28856, 28846, 28836, 29232, 29298, 29295, + 29300, 29417, 29408, 29409, 29623, 29642, 29627, 29618, 29645, 29632, + 29619, 29978, 29997, 30031, 30028, 30030, 30027, 30123, 30116, 30117, + 30114, 30115, 30328, 30342, 30343, 30344, 30408, 30406, 30403, 30405, + 30465, 30457, 30456, 30473, 30475, 30462, 30460, 30471, 30684, 30722, + 30740, 30732, 30733, 31046, 31049, 31048, 31047, 31161, 31162, 31185, + 31186, 31179, 31359, 31361, 31487, 31485, 31869, 32002, 32005, 32000, + 32009, 32007, 32004, 32006, 32568, 32654, 32703, 32772, 32784, 32781, + 32785, 32822, 32982, 32997, 32986, 32963, 32964, 32972, 32993, 32987, + 32974, 32990, 32996, 32989, 33268, 33314, 33511, 33539, 33541, 33507, + 33499, 33510, 33540, 33509, 33538, 33545, 33490, 33495, 33521, 33537, + 33500, 33492, 33489, 33502, 33491, 33503, 33519, 33542, 34384, 34425, + 34427, 34426, 34893, 34923, 35201, 35284, 35336, 35330, 35331, 35998, + 36000, 36212, 36211, 36276, 36557, 36556, 36848, 36838, 36834, 36842, + 36837, 36845, 36843, 36836, 36840, 37066, 37070, 37057, 37059, 37195, + 37194, 37325, 38274, 38480, 38475, 38476, 38477, 38754, 38761, 38859, + 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 20056, 20147, + 20492, 20493, 20515, 20463, 20518, 20517, 20472, 20521, 20502, 20486, + 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, 20520, 20465, + 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, 20478, 20523, + 20489, 20860, 20900, 20901, 20898, 20941, 20940, 20934, 20939, 21078, + 21084, 21076, 21083, 21085, 21290, 21375, 21407, 21405, 21471, 21736, + 21776, 21761, 21815, 21756, 21733, 21746, 21766, 21754, 21780, 21737, + 21741, 21729, 21769, 21742, 21738, 21734, 21799, 21767, 21757, 21775, + 22275, 22276, 22466, 22484, 22475, 22467, 22537, 22799, 22871, 22872, + 22874, 23057, 23064, 23068, 23071, 23067, 23059, 23020, 23072, 23075, + 23081, 23077, 23052, 23049, 23403, 23640, 23472, 23475, 23478, 23476, + 23470, 23477, 23481, 23480, 23556, 23633, 23637, 23632, 23789, 23805, + 23803, 23786, 23784, 23792, 23798, 23809, 23796, 24046, 24109, 24107, + 24235, 24237, 24231, 24369, 24466, 24465, 24464, 24665, 24675, 24677, + 24656, 24661, 24685, 24681, 24687, 24708, 24735, 24730, 24717, 24724, + 24716, 24709, 24726, 25159, 25331, 25352, 25343, 25422, 25406, 25391, + 25429, 25410, 25414, 25423, 25417, 25402, 25424, 25405, 25386, 25387, + 25384, 25421, 25420, 25928, 25929, 26009, 26049, 26053, 26178, 26185, + 26191, 26179, 26194, 26188, 26181, 26177, 26360, 26388, 26389, 26391, + 26657, 26680, 26696, 26694, 26707, 26681, 26690, 26708, 26665, 26803, + 26647, 26700, 26705, 26685, 26612, 26704, 26688, 26684, 26691, 26666, + 26693, 26643, 26648, 26689, 27530, 27529, 27575, 27683, 27687, 27688, + 27686, 27684, 27888, 28010, 28053, 28040, 28039, 28006, 28024, 28023, + 27993, 28051, 28012, 28041, 28014, 27994, 28020, 28009, 28044, 28042, + 28025, 28037, 28005, 28052, 28874, 28888, 28900, 28889, 28872, 28879, + 29241, 29305, 29436, 29433, 29437, 29432, 29431, 29574, 29677, 29705, + 29678, 29664, 29674, 29662, 30036, 30045, 30044, 30042, 30041, 30142, + 30149, 30151, 30130, 30131, 30141, 30140, 30137, 30146, 30136, 30347, + 30384, 30410, 30413, 30414, 30505, 30495, 30496, 30504, 30697, 30768, + 30759, 30776, 30749, 30772, 30775, 30757, 30765, 30752, 30751, 30770, + 31061, 31056, 31072, 31071, 31062, 31070, 31069, 31063, 31066, 31204, + 31203, 31207, 31199, 31206, 31209, 31192, 31364, 31368, 31449, 31494, + 31505, 31881, 32033, 32023, 32011, 32010, 32032, 32034, 32020, 32016, + 32021, 32026, 32028, 32013, 32025, 32027, 32570, 32607, 32660, 32709, + 32705, 32774, 32792, 32789, 32793, 32791, 32829, 32831, 33009, 33026, + 33008, 33029, 33005, 33012, 33030, 33016, 33011, 33032, 33021, 33034, + 33020, 33007, 33261, 33260, 33280, 33296, 33322, 33323, 33320, 33324, + 33467, 33579, 33618, 33620, 33610, 33592, 33616, 33609, 33589, 33588, + 33615, 33586, 33593, 33590, 33559, 33600, 33585, 33576, 33603, 34388, + 34442, 34474, 34451, 34468, 34473, 34444, 34467, 34460, 34928, 34935, + 34945, 34946, 34941, 34937, 35352, 35344, 35342, 35340, 35349, 35338, + 35351, 35347, 35350, 35343, 35345, 35912, 35962, 35961, 36001, 36002, + 36215, 36524, 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, + 36858, 36852, 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, + 37202, 37197, 37196, 37336, 37341, 37335, 37340, 37337, 38275, 38498, + 38499, 38497, 38491, 38493, 38500, 38488, 38494, 38587, 39138, 39340, + 39592, 39640, 39717, 39730, 39740, 20094, 20602, 20605, 20572, 20551, + 20547, 20556, 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, + 20599, 20559, 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, + 21202, 21209, 21208, 21205, 21264, 21263, 21273, 21311, 21312, 21310, + 21443, 26364, 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, + 21809, 21846, 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, + 21859, 21811, 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, + 22534, 22496, 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, + 23094, 23105, 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, + 23114, 23408, 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, + 23559, 23648, 23644, 23645, 23815, 23814, 23822, 23835, 23830, 23842, + 23825, 23849, 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, + 24115, 24119, 24247, 24248, 24246, 24245, 24254, 24373, 24375, 24407, + 24428, 24425, 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, + 24703, 24739, 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, + 24763, 24757, 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, + 24775, 25114, 25115, 25160, 25504, 25511, 25458, 25494, 25506, 25509, + 25463, 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, + 25512, 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, + 25449, 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, + 25944, 25941, 25940, 26012, 26011, 26028, 26063, 26059, 26060, 26062, + 26205, 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, + 26799, 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, + 26755, 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, + 26754, 27442, 27578, 27627, 27628, 27691, 28046, 28092, 28147, 28121, + 28082, 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, + 28113, 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, + 28085, 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, + 28074, 28140, 28095, 28134, 28921, 28937, 28938, 28925, 28911, 29245, + 29309, 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, + 29699, 29702, 29694, 29709, 29920, 29942, 29943, 29980, 29986, 30053, + 30054, 30050, 30064, 30095, 30164, 30165, 30133, 30154, 30157, 30350, + 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, 30522, 30827, + 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, 31520, 31528, + 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, 31893, 32070, + 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, 32068, 32047, + 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, 32722, 32796, + 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, 33060, 33282, + 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, 33698, 33686, + 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, 33659, 33660, + 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, 34485, 34502, + 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, 34962, 34966, + 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, 35377, 35373, + 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, 36008, 36010, + 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, 36877, 36890, + 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, 36879, 36898, + 36886, 36891, 36884, 37096, 37101, 37117, 37207, 37326, 37365, 37350, + 37347, 37351, 37357, 37353, 38281, 38506, 38517, 38515, 38520, 38512, + 38516, 38518, 38519, 38508, 38592, 38634, 38633, 31456, 31455, 38914, + 38915, 39770, 40165, 40565, 40575, 40613, 40635, 20642, 20621, 20613, + 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, 21106, 21108, + 21109, 21097, 21214, 21213, 21211, 21338, 21413, 21883, 21888, 21927, + 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, 21895, 21899, + 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, 21932, 21937, + 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, 22564, 22576, + 22577, 22561, 22557, 22560, 22777, 22778, 22880, 23159, 23194, 23167, + 23186, 23195, 23207, 23411, 23409, 23506, 23500, 23507, 23504, 23562, + 23563, 23601, 23884, 23888, 23860, 23879, 24061, 24133, 24125, 24128, + 24131, 24190, 24266, 24257, 24258, 24260, 24380, 24429, 24489, 24490, + 24488, 24785, 24801, 24754, 24758, 24800, 24860, 24867, 24826, 24853, + 24816, 24827, 24820, 24936, 24817, 24846, 24822, 24841, 24832, 24850, + 25119, 25161, 25507, 25484, 25551, 25536, 25577, 25545, 25542, 25549, + 25554, 25571, 25552, 25569, 25558, 25581, 25582, 25462, 25588, 25578, + 25563, 25682, 25562, 25593, 25950, 25958, 25954, 25955, 26001, 26000, + 26031, 26222, 26224, 26228, 26230, 26223, 26257, 26234, 26238, 26231, + 26366, 26367, 26399, 26397, 26874, 26837, 26848, 26840, 26839, 26885, + 26847, 26869, 26862, 26855, 26873, 26834, 26866, 26851, 26827, 26829, + 26893, 26898, 26894, 26825, 26842, 26990, 26875, 27454, 27450, 27453, + 27544, 27542, 27580, 27631, 27694, 27695, 27692, 28207, 28216, 28244, + 28193, 28210, 28263, 28234, 28192, 28197, 28195, 28187, 28251, 28248, + 28196, 28246, 28270, 28205, 28198, 28271, 28212, 28237, 28218, 28204, + 28227, 28189, 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, + 28265, 28255, 28953, 28954, 28966, 28976, 28961, 28982, 29038, 28956, + 29260, 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, + 29730, 29733, 29749, 29750, 29748, 29743, 29723, 29734, 29736, 29989, + 29990, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, 30176, + 30331, 30332, 30358, 30355, 30388, 30428, 30543, 30701, 30813, 30828, + 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, 31461, + 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, 31567, + 31569, 31903, 31909, 32094, 32080, 32104, 32085, 32043, 32110, 32114, + 32097, 32102, 32098, 32112, 32115, 21892, 32724, 32725, 32779, 32850, + 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, 33086, 33100, + 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, 33760, 33733, + 33803, 33729, 33775, 33777, 33780, 33879, 33802, 33776, 33804, 33740, + 33789, 33778, 33738, 33848, 33806, 33796, 33756, 33799, 33748, 33759, + 34395, 34527, 34521, 34541, 34516, 34523, 34532, 34512, 34526, 34903, + 35009, 35010, 34993, 35203, 35222, 35387, 35424, 35413, 35422, 35388, + 35393, 35412, 35419, 35408, 35398, 35380, 35386, 35382, 35414, 35937, + 35970, 36015, 36028, 36019, 36029, 36033, 36027, 36032, 36020, 36023, + 36022, 36031, 36024, 36234, 36229, 36225, 36302, 36317, 36299, 36314, + 36305, 36300, 36315, 36294, 36603, 36600, 36604, 36764, 36910, 36917, + 36913, 36920, 36914, 36918, 37122, 37109, 37129, 37118, 37219, 37221, + 37327, 37396, 37397, 37411, 37385, 37406, 37389, 37392, 37383, 37393, + 38292, 38287, 38283, 38289, 38291, 38290, 38286, 38538, 38542, 38539, + 38525, 38533, 38534, 38541, 38514, 38532, 38593, 38597, 38596, 38598, + 38599, 38639, 38642, 38860, 38917, 38918, 38920, 39143, 39146, 39151, + 39145, 39154, 39149, 39342, 39341, 40643, 40653, 40657, 20098, 20653, + 20661, 20658, 20659, 20677, 20670, 20652, 20663, 20667, 20655, 20679, + 21119, 21111, 21117, 21215, 21222, 21220, 21218, 21219, 21295, 21983, + 21992, 21971, 21990, 21966, 21980, 21959, 21969, 21987, 21988, 21999, + 21978, 21985, 21957, 21958, 21989, 21961, 22290, 22291, 22622, 22609, + 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, + 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, + 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, + 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, + 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, + 25121, 25122, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, + 25628, 25620, 25613, 25654, 25622, 25623, 25606, 25964, 26015, 26032, + 26263, 26249, 26247, 26248, 26262, 26244, 26264, 26253, 26371, 27028, + 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, + 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, + 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, + 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, + 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, + 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, + 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, + 29791, 29790, 29761, 29759, 29785, 29787, 29788, 30070, 30072, 30208, + 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, 30430, 30431, + 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, 30556, 30565, + 30568, 30562, 30702, 30862, 30896, 30871, 30872, 30860, 30857, 30844, + 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, 31260, 31258, + 31264, 31252, 31263, 31262, 31391, 31392, 31607, 31680, 31584, 31598, + 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, 32143, 32091, + 32622, 32617, 32618, 32626, 32681, 32680, 32676, 32854, 32856, 32902, + 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, 33145, 33146, + 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, 33894, 33899, + 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, 33901, 33862, + 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, 34558, 34555, + 34562, 34563, 34566, 34570, 34905, 35039, 35028, 35033, 35036, 35032, + 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, 35442, 35443, + 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, 35461, 35437, + 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, 35978, 35977, + 36042, 36039, 36040, 36036, 36018, 36035, 36034, 36037, 36321, 36319, + 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, 36611, 36617, + 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, 36948, 36924, + 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, 36929, 37138, + 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, 37437, 37440, + 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, 37445, 37433, + 37439, 37466, 38296, 38552, 38548, 38549, 38605, 38603, 38601, 38602, + 38647, 38651, 38649, 38646, 38742, 38772, 38774, 38928, 38929, 38931, + 38922, 38930, 38924, 39164, 39156, 39165, 39166, 39347, 39345, 39348, + 39649, 40169, 40578, 40718, 40723, 40736, 20711, 20718, 20709, 20694, + 20717, 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, + 21123, 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, + 22022, 22025, 22029, 22030, 22007, 22038, 22047, 22024, 22032, 22006, + 22296, 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, + 22781, 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, + 23254, 23256, 23267, 23413, 23518, 23527, 23521, 23525, 23526, 23528, + 23522, 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, + 24151, 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, + 24907, 24951, 24930, 24931, 24927, 24922, 24920, 24949, 25130, 25735, + 25688, 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, + 25723, 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, + 27029, 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, + 27088, 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, + 28467, 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, + 28418, 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, + 28459, 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, + 29081, 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, + 29796, 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, + 30217, 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, + 30887, 30899, 30889, 30883, 31118, 31119, 31117, 31278, 31281, 31402, + 31401, 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, + 31631, 31672, 31623, 31620, 31929, 31933, 31934, 32187, 32176, 32156, + 32189, 32190, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, + 32181, 32184, 32173, 32210, 32199, 32172, 32624, 32736, 32737, 32735, + 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, 33154, + 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, 33988, + 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, 33980, + 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, 34645, + 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, 35098, + 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, 35498, + 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, 36051, + 36049, 36050, 36203, 36249, 36245, 36348, 36628, 36626, 36629, 36627, + 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, 36955, + 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37504, 37509, + 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, 38305, 38312, + 38313, 38307, 38309, 38308, 38553, 38556, 38555, 38604, 38610, 38656, + 38780, 38789, 38902, 38935, 38936, 39087, 39089, 39171, 39173, 39180, + 39177, 39361, 39599, 39600, 39654, 39745, 39746, 40180, 40182, 40179, + 40636, 40763, 40778, 20740, 20736, 20731, 20725, 20729, 20738, 20744, + 20745, 20741, 20956, 21127, 21128, 21129, 21133, 21130, 21232, 21426, + 22062, 22075, 22073, 22066, 22079, 22068, 22057, 22099, 22094, 22103, + 22132, 22070, 22063, 22064, 22656, 22687, 22686, 22707, 22684, 22702, + 22697, 22694, 22893, 23305, 23291, 23307, 23285, 23308, 23304, 23534, + 23532, 23529, 23531, 23652, 23653, 23965, 23956, 24162, 24159, 24161, + 24290, 24282, 24287, 24285, 24291, 24288, 24392, 24433, 24503, 24501, + 24950, 24935, 24942, 24925, 24917, 24962, 24956, 24944, 24939, 24958, + 24999, 24976, 25003, 24974, 25004, 24986, 24996, 24980, 25006, 25134, + 25705, 25711, 25721, 25758, 25778, 25736, 25744, 25776, 25765, 25747, + 25749, 25769, 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, + 25779, 25973, 25975, 25976, 26286, 26283, 26292, 26289, 27171, 27167, + 27112, 27137, 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, + 27141, 27117, 27153, 27472, 27470, 27556, 27589, 27590, 28479, 28540, + 28548, 28497, 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, + 28538, 28528, 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, + 29100, 29105, 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, + 29822, 29824, 30079, 30240, 30249, 30239, 30244, 30246, 30241, 30242, + 30362, 30394, 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, + 30906, 30922, 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, + 31287, 31291, 31407, 31406, 31661, 31665, 31684, 31668, 31686, 31687, + 31681, 31648, 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, + 32221, 32232, 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, + 32629, 32631, 32687, 32745, 32806, 33179, 33180, 33181, 33184, 33178, + 33176, 34071, 34109, 34074, 34030, 34092, 34093, 34067, 34065, 34083, + 34081, 34068, 34028, 34085, 34047, 34054, 34690, 34676, 34678, 34656, + 34662, 34680, 34664, 34649, 34647, 34636, 34643, 34907, 34909, 35088, + 35079, 35090, 35091, 35093, 35082, 35516, 35538, 35527, 35524, 35477, + 35531, 35576, 35506, 35529, 35522, 35519, 35504, 35542, 35533, 35510, + 35513, 35547, 35916, 35918, 35948, 36064, 36062, 36070, 36068, 36076, + 36077, 36066, 36067, 36060, 36074, 36065, 36205, 36255, 36259, 36395, + 36368, 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, + 36635, 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, + 36968, 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, + 37251, 37573, 37563, 37559, 37610, 37548, 37604, 37569, 37555, 37564, + 37586, 37575, 37616, 37554, 38317, 38321, 38660, 38662, 38663, 38665, + 38752, 38797, 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, + 39186, 39192, 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, + 39607, 39662, 39663, 39719, 39749, 39748, 39799, 39791, 40198, 40201, + 40195, 40617, 40638, 40654, 22696, 40786, 20754, 20760, 20756, 20752, + 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, + 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, + 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, + 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, + 25032, 25136, 25797, 25793, 25803, 25787, 25788, 25818, 25796, 25799, + 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, + 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, + 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, + 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, + 28601, 28598, 28582, 28576, 28596, 29118, 29129, 29136, 29138, 29128, + 29141, 29113, 29134, 29145, 29148, 29123, 29124, 29544, 29852, 29859, + 29848, 29855, 29854, 29922, 29964, 29965, 30260, 30264, 30266, 30439, + 30437, 30624, 30622, 30623, 30629, 30952, 30938, 30956, 30951, 31142, + 31309, 31310, 31302, 31308, 31307, 31418, 31705, 31761, 31689, 31716, + 31707, 31713, 31721, 31718, 31957, 31958, 32266, 32273, 32264, 32283, + 32291, 32286, 32285, 32265, 32272, 32633, 32690, 32752, 32753, 32750, + 32808, 33203, 33193, 33192, 33275, 33288, 33368, 33369, 34122, 34137, + 34120, 34152, 34153, 34115, 34121, 34157, 34154, 34142, 34691, 34719, + 34718, 34722, 34701, 34913, 35114, 35122, 35109, 35115, 35105, 35242, + 35238, 35558, 35578, 35563, 35569, 35584, 35548, 35559, 35566, 35582, + 35585, 35586, 35575, 35565, 35571, 35574, 35580, 35947, 35949, 35987, + 36084, 36420, 36401, 36404, 36418, 36409, 36405, 36667, 36655, 36664, + 36659, 36776, 36774, 36981, 36980, 36984, 36978, 36988, 36986, 37172, + 37266, 37664, 37686, 37624, 37683, 37679, 37666, 37628, 37675, 37636, + 37658, 37648, 37670, 37665, 37653, 37678, 37657, 38331, 38567, 38568, + 38570, 38613, 38670, 38673, 38678, 38669, 38675, 38671, 38747, 38748, + 38758, 38808, 38960, 38968, 38971, 38967, 38957, 38969, 38948, 39184, + 39208, 39198, 39195, 39201, 39194, 39405, 39394, 39409, 39608, 39612, + 39675, 39661, 39720, 39825, 40213, 40227, 40230, 40232, 40210, 40219, + 40664, 40660, 40845, 40860, 20778, 20767, 20769, 20786, 21237, 22158, + 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, + 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, + 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, + 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, 25986, + 25987, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, 27299, + 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, 28657, + 28639, 28640, 28635, 28644, 28651, 28655, 28544, 28652, 28641, 28649, + 28629, 28654, 28656, 29159, 29151, 29166, 29158, 29157, 29165, 29164, + 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, 29862, 29864, + 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, 30631, 30637, + 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, 31319, 31423, + 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, 31966, 31970, + 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, 32323, 32299, + 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, 32319, 32303, + 32580, 32755, 32764, 32881, 32882, 32880, 32879, 32883, 33222, 33219, + 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, 33289, 33393, + 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, 34183, 34216, + 34186, 34407, 34752, 34769, 34739, 34770, 34758, 34731, 34747, 34746, + 34760, 34763, 35131, 35126, 35140, 35128, 35133, 35244, 35598, 35607, + 35609, 35611, 35594, 35616, 35613, 35588, 35600, 35905, 35903, 35955, + 36090, 36093, 36092, 36088, 36091, 36264, 36425, 36427, 36424, 36426, + 36676, 36670, 36674, 36677, 36671, 36991, 36989, 36996, 36993, 36994, + 36992, 37177, 37283, 37278, 37276, 37709, 37762, 37672, 37749, 37706, + 37733, 37707, 37656, 37758, 37740, 37723, 37744, 37722, 37716, 38346, + 38347, 38348, 38344, 38342, 38577, 38584, 38614, 38684, 38686, 38816, + 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, 39850, 39853, + 40251, 40255, 40587, 40655, 40670, 40668, 40669, 40667, 40766, 40779, + 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, 25139, 25844, + 25842, 25854, 25862, 25850, 25851, 25847, 26039, 26332, 26406, 27315, + 27308, 27331, 27323, 27320, 27330, 27310, 27311, 27487, 27512, 27567, + 28681, 28683, 28670, 28678, 28666, 28689, 28687, 29179, 29180, 29182, + 29176, 29559, 29557, 29863, 29887, 29973, 30294, 30296, 30290, 30653, + 30655, 30651, 30652, 30990, 31150, 31329, 31330, 31328, 31428, 31429, + 31787, 31783, 31786, 31774, 31779, 31777, 31975, 32340, 32341, 32350, + 32346, 32353, 32338, 32345, 32584, 32761, 32763, 32887, 32886, 33229, + 33231, 33290, 34255, 34217, 34253, 34256, 34249, 34224, 34234, 34233, + 34214, 34799, 34796, 34802, 34784, 35206, 35250, 35316, 35624, 35641, + 35628, 35627, 35920, 36101, 36441, 36451, 36454, 36452, 36447, 36437, + 36544, 36681, 36685, 36999, 36995, 37000, 37291, 37292, 37328, 37780, + 37770, 37782, 37794, 37811, 37806, 37804, 37808, 37784, 37786, 37783, + 38356, 38358, 38352, 38357, 38626, 38620, 38617, 38619, 38622, 38692, + 38819, 38822, 38829, 38905, 38989, 38991, 38988, 38990, 38995, 39098, + 39230, 39231, 39229, 39214, 39333, 39438, 39617, 39683, 39686, 39759, + 39758, 39757, 39882, 39881, 39933, 39880, 39872, 40273, 40285, 40288, + 40672, 40725, 40748, 20787, 22181, 22750, 22751, 22754, 23541, 40848, + 24300, 25074, 25079, 25078, 25077, 25856, 25871, 26336, 26333, 27365, + 27357, 27354, 27347, 28699, 28703, 28712, 28698, 28701, 28693, 28696, + 29190, 29197, 29272, 29346, 29560, 29562, 29885, 29898, 29923, 30087, + 30086, 30303, 30305, 30663, 31001, 31153, 31339, 31337, 31806, 31807, + 31800, 31805, 31799, 31808, 32363, 32365, 32377, 32361, 32362, 32645, + 32371, 32694, 32697, 32696, 33240, 34281, 34269, 34282, 34261, 34276, + 34277, 34295, 34811, 34821, 34829, 34809, 34814, 35168, 35167, 35158, + 35166, 35649, 35676, 35672, 35657, 35674, 35662, 35663, 35654, 35673, + 36104, 36106, 36476, 36466, 36487, 36470, 36460, 36474, 36468, 36692, + 36686, 36781, 37002, 37003, 37297, 37294, 37857, 37841, 37855, 37827, + 37832, 37852, 37853, 37846, 37858, 37837, 37848, 37860, 37847, 37864, + 38364, 38580, 38627, 38698, 38695, 38753, 38876, 38907, 39006, 39000, + 39003, 39100, 39237, 39241, 39446, 39449, 39693, 39912, 39911, 39894, + 39899, 40329, 40289, 40306, 40298, 40300, 40594, 40599, 40595, 40628, + 21240, 22184, 22199, 22198, 22196, 22204, 22756, 23360, 23363, 23421, + 23542, 24009, 25080, 25082, 25880, 25876, 25881, 26342, 26407, 27372, + 28734, 28720, 28722, 29200, 29563, 29903, 30306, 30309, 31014, 31018, + 31020, 31019, 31431, 31478, 31820, 31811, 31821, 31983, 31984, 36782, + 32381, 32380, 32386, 32588, 32768, 33242, 33382, 34299, 34297, 34321, + 34298, 34310, 34315, 34311, 34314, 34836, 34837, 35172, 35258, 35320, + 35696, 35692, 35686, 35695, 35679, 35691, 36111, 36109, 36489, 36481, + 36485, 36482, 37300, 37323, 37912, 37891, 37885, 38369, 38704, 39108, + 39250, 39249, 39336, 39467, 39472, 39479, 39477, 39955, 39949, 40569, + 40629, 40680, 40751, 40799, 40803, 40801, 20791, 20792, 22209, 22208, + 22210, 22804, 23660, 24013, 25084, 25086, 25885, 25884, 26005, 26345, + 27387, 27396, 27386, 27570, 28748, 29211, 29351, 29910, 29908, 30313, + 30675, 31824, 32399, 32396, 32700, 34327, 34349, 34330, 34851, 34850, + 34849, 34847, 35178, 35180, 35261, 35700, 35703, 35709, 36115, 36490, + 36493, 36491, 36703, 36783, 37306, 37934, 37939, 37941, 37946, 37944, + 37938, 37931, 38370, 38712, 38713, 38706, 38911, 39015, 39013, 39255, + 39493, 39491, 39488, 39486, 39631, 39764, 39761, 39981, 39973, 40367, + 40372, 40386, 40376, 40605, 40687, 40729, 40796, 40806, 40807, 20796, + 20795, 22216, 22218, 22217, 23423, 24020, 24018, 24398, 25087, 25892, + 27402, 27489, 28753, 28760, 29568, 29924, 30090, 30318, 30316, 31155, + 31840, 31839, 32894, 32893, 33247, 35186, 35183, 35324, 35712, 36118, + 36119, 36497, 36499, 36705, 37192, 37956, 37969, 37970, 38717, 38718, + 38851, 38849, 39019, 39253, 39509, 39501, 39634, 39706, 40009, 39985, + 39998, 39995, 40403, 40407, 40756, 40812, 40810, 40852, 22220, 24022, + 25088, 25891, 25899, 25898, 26348, 27408, 29914, 31434, 31844, 31843, + 31845, 32403, 32406, 32404, 33250, 34360, 34367, 34865, 35722, 37008, + 37007, 37987, 37984, 37988, 38760, 39023, 39260, 39514, 39515, 39511, + 39635, 39636, 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, + 22761, 25900, 28766, 30321, 30322, 30679, 32592, 32648, 34870, 34873, + 34914, 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, + 38724, 38854, 39024, 39519, 39714, 39768, 40031, 40441, 40442, 40572, + 40573, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, 34875, + 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, 40652, + 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, 36522, + 37317, 38013, 38014, 38012, 40055, 40056, 40695, 35924, 38015, 40474, + 29224, 39530, 39729, 40475, 40478, 31858, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 20022, 20031, 20101, 20128, + 20866, 20886, 20907, 21241, 21304, 21353, 21430, 22794, 23424, 24027, + 12083, 24191, 24308, 24400, 24417, 25908, 26080, 30098, 30326, 36789, + 38582, 168, 710, 12541, 12542, 12445, 12446, 12291, 20189, 12293, + 12294, 12295, 12540, 65339, 65341, 10045, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 12449, + 12450, 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, + 12460, 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, + 12470, 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, + 12480, 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, + 12490, 12491, 12492, 12493, 12494, 12495, 12496, 12497, 12498, 12499, + 12500, 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, + 12510, 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12519, + 12520, 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, + 12530, 12531, 12532, 12533, 12534, 1040, 1041, 1042, 1043, 1044, + 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, + 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, + 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, + 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, + 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 1103, 8679, 8632, 8633, 12751, 131276, 20058, 131210, 20994, 17553, + 40880, 20872, 40881, 161287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 65506, 65508, 65287, 65282, 12849, 8470, + 8481, 12443, 12444, 11904, 11908, 11910, 11911, 11912, 11914, 11916, + 11917, 11925, 11932, 11933, 11941, 11943, 11946, 11948, 11950, 11958, + 11964, 11966, 11974, 11978, 11980, 11981, 11983, 11990, 11991, 11998, + 12003, 0x0000, 0x0000, 0x0000, 643, 592, 603, 596, 629, 339, + 248, 331, 650, 618, 20034, 20060, 20981, 21274, 21378, 19975, + 19980, 20039, 20109, 22231, 64012, 23662, 24435, 19983, 20871, 19982, + 20014, 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, + 22787, 22828, 23568, 24063, 26081, 27571, 27596, 27668, 29247, 20017, + 20028, 20200, 20188, 20201, 20193, 20189, 20186, 21004, 21276, 21324, + 22306, 22307, 22807, 22831, 23425, 23428, 23570, 23611, 23668, 23667, + 24068, 24192, 24194, 24521, 25097, 25168, 27669, 27702, 27715, 27711, + 27707, 29358, 29360, 29578, 31160, 32906, 38430, 20238, 20248, 20268, + 20213, 20244, 20209, 20224, 20215, 20232, 20253, 20226, 20229, 20258, + 20243, 20228, 20212, 20242, 20913, 21011, 21001, 21008, 21158, 21282, + 21279, 21325, 21386, 21511, 22241, 22239, 22318, 22314, 22324, 22844, + 22912, 22908, 22917, 22907, 22910, 22903, 22911, 23382, 23573, 23589, + 23676, 23674, 23675, 23678, 24031, 24181, 24196, 24322, 24346, 24436, + 24533, 24532, 24527, 25180, 25182, 25188, 25185, 25190, 25186, 25177, + 25184, 25178, 25189, 26095, 26094, 26430, 26425, 26424, 26427, 26426, + 26431, 26428, 26419, 27672, 27718, 27730, 27740, 27727, 27722, 27732, + 27723, 27724, 28785, 29278, 29364, 29365, 29582, 29994, 30335, 31349, + 32593, 33400, 33404, 33408, 33405, 33407, 34381, 35198, 37017, 37015, + 37016, 37019, 37012, 38434, 38436, 38432, 38435, 20310, 20283, 20322, + 20297, 20307, 20324, 20286, 20327, 20306, 20319, 20289, 20312, 20269, + 20275, 20287, 20321, 20879, 20921, 21020, 21022, 21025, 21165, 21166, + 21257, 21347, 21362, 21390, 21391, 21552, 21559, 21546, 21588, 21573, + 21529, 21532, 21541, 21528, 21565, 21583, 21569, 21544, 21540, 21575, + 22254, 22247, 22245, 22337, 22341, 22348, 22345, 22347, 22354, 22790, + 22848, 22950, 22936, 22944, 22935, 22926, 22946, 22928, 22927, 22951, + 22945, 23438, 23442, 23592, 23594, 23693, 23695, 23688, 23691, 23689, + 23698, 23690, 23686, 23699, 23701, 24032, 24074, 24078, 24203, 24201, + 24204, 24200, 24205, 24325, 24349, 24440, 24438, 24530, 24529, 24528, + 24557, 24552, 24558, 24563, 24545, 24548, 24547, 24570, 24559, 24567, + 24571, 24576, 24564, 25146, 25219, 25228, 25230, 25231, 25236, 25223, + 25201, 25211, 25210, 25200, 25217, 25224, 25207, 25213, 25202, 25204, + 25911, 26096, 26100, 26099, 26098, 26101, 26437, 26439, 26457, 26453, + 26444, 26440, 26461, 26445, 26458, 26443, 27600, 27673, 27674, 27768, + 27751, 27755, 27780, 27787, 27791, 27761, 27759, 27753, 27802, 27757, + 27783, 27797, 27804, 27750, 27763, 27749, 27771, 27790, 28788, 28794, + 29283, 29375, 29373, 29379, 29382, 29377, 29370, 29381, 29589, 29591, + 29587, 29588, 29586, 30010, 30009, 30100, 30101, 30337, 31037, 32820, + 32917, 32921, 32912, 32914, 32924, 33424, 33423, 33413, 33422, 33425, + 33427, 33418, 33411, 33412, 35960, 36809, 36799, 37023, 37025, 37029, + 37022, 37031, 37024, 38448, 38440, 38447, 38445, 20019, 20376, 20348, + 20357, 20349, 20352, 20359, 20342, 20340, 20361, 20356, 20343, 20300, + 20375, 20330, 20378, 20345, 20353, 20344, 20368, 20380, 20372, 20382, + 20370, 20354, 20373, 20331, 20334, 20894, 20924, 20926, 21045, 21042, + 21043, 21062, 21041, 21180, 21258, 21259, 21308, 21394, 21396, 21639, + 21631, 21633, 21649, 21634, 21640, 21611, 21626, 21630, 21605, 21612, + 21620, 21606, 21645, 21615, 21601, 21600, 21656, 21603, 21607, 21604, + 22263, 22265, 22383, 22386, 22381, 22379, 22385, 22384, 22390, 22400, + 22389, 22395, 22387, 22388, 22370, 22376, 22397, 22796, 22853, 22965, + 22970, 22991, 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, + 22961, 22973, 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, + 23620, 23623, 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, + 23715, 23725, 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, + 24087, 24084, 24089, 24360, 24354, 24355, 24356, 24404, 24450, 24446, + 24445, 24542, 24549, 24621, 24614, 24601, 24626, 24587, 24628, 24586, + 24599, 24627, 24602, 24606, 24620, 24610, 24589, 24592, 24622, 24595, + 24593, 24588, 24585, 24604, 25108, 25149, 25261, 25268, 25297, 25278, + 25258, 25270, 25290, 25262, 25267, 25263, 25275, 25257, 25264, 25272, + 25917, 26024, 26043, 26121, 26108, 26116, 26130, 26120, 26107, 26115, + 26123, 26125, 26117, 26109, 26129, 26128, 26358, 26378, 26501, 26476, + 26510, 26514, 26486, 26491, 26520, 26502, 26500, 26484, 26509, 26508, + 26490, 26527, 26513, 26521, 26499, 26493, 26497, 26488, 26489, 26516, + 27429, 27520, 27518, 27614, 27677, 27795, 27884, 27883, 27886, 27865, + 27830, 27860, 27821, 27879, 27831, 27856, 27842, 27834, 27843, 27846, + 27885, 27890, 27858, 27869, 27828, 27786, 27805, 27776, 27870, 27840, + 27952, 27853, 27847, 27824, 27897, 27855, 27881, 27857, 28820, 28824, + 28805, 28819, 28806, 28804, 28817, 28822, 28802, 28826, 28803, 29290, + 29398, 29387, 29400, 29385, 29404, 29394, 29396, 29402, 29388, 29393, + 29604, 29601, 29613, 29606, 29602, 29600, 29612, 29597, 29917, 29928, + 30015, 30016, 30014, 30092, 30104, 30383, 30451, 30449, 30448, 30453, + 30712, 30716, 30713, 30715, 30714, 30711, 31042, 31039, 31173, 31352, + 31355, 31483, 31861, 31997, 32821, 32911, 32942, 32931, 32952, 32949, + 32941, 33312, 33440, 33472, 33451, 33434, 33432, 33435, 33461, 33447, + 33454, 33468, 33438, 33466, 33460, 33448, 33441, 33449, 33474, 33444, + 33475, 33462, 33442, 34416, 34415, 34413, 34414, 35926, 36818, 36811, + 36819, 36813, 36822, 36821, 36823, 37042, 37044, 37039, 37043, 37040, + 38457, 38461, 38460, 38458, 38467, 20429, 20421, 20435, 20402, 20425, + 20427, 20417, 20436, 20444, 20441, 20411, 20403, 20443, 20423, 20438, + 20410, 20416, 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, + 21399, 21398, 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, + 33549, 21687, 21678, 21718, 21686, 21701, 21702, 21664, 21616, 21692, + 21666, 21694, 21618, 21726, 21680, 22453, 22430, 22431, 22436, 22412, + 22423, 22429, 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, + 22772, 22797, 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, + 23037, 23036, 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, + 23008, 23038, 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, + 23755, 23771, 23774, 23770, 23753, 23751, 23754, 23766, 23763, 23764, + 23759, 23752, 23750, 23758, 23775, 23800, 24057, 24097, 24098, 24099, + 24096, 24100, 24240, 24228, 24226, 24219, 24227, 24229, 24327, 24366, + 24406, 24454, 24631, 24633, 24660, 24690, 24670, 24645, 24659, 24647, + 24649, 24667, 24652, 24640, 24642, 24671, 24612, 24644, 24664, 24678, + 24686, 25154, 25155, 25295, 25357, 25355, 25333, 25358, 25347, 25323, + 25337, 25359, 25356, 25336, 25334, 25344, 25363, 25364, 25338, 25365, + 25339, 25328, 25921, 25923, 26026, 26047, 26166, 26145, 26162, 26165, + 26140, 26150, 26146, 26163, 26155, 26170, 26141, 26164, 26169, 26158, + 26383, 26384, 26561, 26610, 26568, 26554, 26588, 26555, 26616, 26584, + 26560, 26551, 26565, 26603, 26596, 26591, 26549, 26573, 26547, 26615, + 26614, 26606, 26595, 26562, 26553, 26574, 26599, 26608, 26546, 26620, + 26566, 26605, 26572, 26542, 26598, 26587, 26618, 26569, 26570, 26563, + 26602, 26571, 27432, 27522, 27524, 27574, 27606, 27608, 27616, 27680, + 27681, 27944, 27956, 27949, 27935, 27964, 27967, 27922, 27914, 27866, + 27955, 27908, 27929, 27962, 27930, 27921, 27904, 27933, 27970, 27905, + 27928, 27959, 27907, 27919, 27968, 27911, 27936, 27948, 27912, 27938, + 27913, 27920, 28855, 28831, 28862, 28849, 28848, 28833, 28852, 28853, + 28841, 29249, 29257, 29258, 29292, 29296, 29299, 29294, 29386, 29412, + 29416, 29419, 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, + 29637, 29625, 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, + 29638, 29624, 29643, 29932, 29934, 29998, 30023, 30024, 30119, 30122, + 30329, 30404, 30472, 30467, 30468, 30469, 30474, 30455, 30459, 30458, + 30695, 30696, 30726, 30737, 30738, 30725, 30736, 30735, 30734, 30729, + 30723, 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, + 31190, 31182, 31360, 31358, 31441, 31488, 31489, 31866, 31864, 31865, + 31871, 31872, 31873, 32003, 32008, 32001, 32600, 32657, 32653, 32702, + 32775, 32782, 32783, 32788, 32823, 32984, 32967, 32992, 32977, 32968, + 32962, 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, + 32983, 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, + 33512, 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, + 33525, 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, + 33517, 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, + 35283, 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, + 37055, 37077, 37061, 37054, 37063, 37067, 37064, 37332, 37331, 38484, + 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, + 20528, 20507, 20469, 20468, 20531, 20535, 20524, 20470, 20471, 20503, + 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, + 20938, 20932, 20933, 20936, 20942, 21089, 21082, 21074, 21086, 21087, + 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, 21778, 21735, + 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, 21765, 21745, + 21770, 21755, 21751, 21752, 21728, 21774, 21763, 21771, 22273, 22274, + 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, 22456, 22454, + 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, 23062, 23085, + 23086, 23061, 23055, 23063, 23050, 23070, 23091, 23404, 23463, 23469, + 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, 23799, 23808, + 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, 24368, 24423, + 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, 24705, 24733, + 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, 25158, 25330, + 25360, 25430, 25388, 25412, 25413, 25398, 25411, 25572, 25401, 25419, + 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, 25389, 25415, + 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, 25926, 26054, + 26051, 26052, 26050, 26186, 26207, 26183, 26193, 26386, 26387, 26655, + 26650, 26697, 26674, 26675, 26683, 26699, 26703, 26646, 26673, 26652, + 26677, 26667, 26669, 26671, 26702, 26692, 26676, 26653, 26642, 26644, + 26662, 26664, 26670, 26701, 26682, 26661, 26656, 27436, 27439, 27437, + 27441, 27444, 27501, 32898, 27528, 27622, 27620, 27624, 27619, 27618, + 27623, 27685, 28026, 28003, 28004, 28022, 27917, 28001, 28050, 27992, + 28002, 28013, 28015, 28049, 28045, 28143, 28031, 28038, 27998, 28007, + 28000, 28055, 28016, 28028, 27999, 28034, 28056, 27951, 28008, 28043, + 28030, 28032, 28036, 27926, 28035, 28027, 28029, 28021, 28048, 28892, + 28883, 28881, 28893, 28875, 32569, 28898, 28887, 28882, 28894, 28896, + 28884, 28877, 28869, 28870, 28871, 28890, 28878, 28897, 29250, 29304, + 29303, 29302, 29440, 29434, 29428, 29438, 29430, 29427, 29435, 29441, + 29651, 29657, 29669, 29654, 29628, 29671, 29667, 29673, 29660, 29650, + 29659, 29652, 29661, 29658, 29655, 29656, 29672, 29918, 29919, 29940, + 29941, 29985, 30043, 30047, 30128, 30145, 30139, 30148, 30144, 30143, + 30134, 30138, 30346, 30409, 30493, 30491, 30480, 30483, 30482, 30499, + 30481, 30485, 30489, 30490, 30498, 30503, 30755, 30764, 30754, 30773, + 30767, 30760, 30766, 30763, 30753, 30761, 30771, 30762, 30769, 31060, + 31067, 31055, 31068, 31059, 31058, 31057, 31211, 31212, 31200, 31214, + 31213, 31210, 31196, 31198, 31197, 31366, 31369, 31365, 31371, 31372, + 31370, 31367, 31448, 31504, 31492, 31507, 31493, 31503, 31496, 31498, + 31502, 31497, 31506, 31876, 31889, 31882, 31884, 31880, 31885, 31877, + 32030, 32029, 32017, 32014, 32024, 32022, 32019, 32031, 32018, 32015, + 32012, 32604, 32609, 32606, 32608, 32605, 32603, 32662, 32658, 32707, + 32706, 32704, 32790, 32830, 32825, 33018, 33010, 33017, 33013, 33025, + 33019, 33024, 33281, 33327, 33317, 33587, 33581, 33604, 33561, 33617, + 33573, 33622, 33599, 33601, 33574, 33564, 33570, 33602, 33614, 33563, + 33578, 33544, 33596, 33613, 33558, 33572, 33568, 33591, 33583, 33577, + 33607, 33605, 33612, 33619, 33566, 33580, 33611, 33575, 33608, 34387, + 34386, 34466, 34472, 34454, 34445, 34449, 34462, 34439, 34455, 34438, + 34443, 34458, 34437, 34469, 34457, 34465, 34471, 34453, 34456, 34446, + 34461, 34448, 34452, 34883, 34884, 34925, 34933, 34934, 34930, 34944, + 34929, 34943, 34927, 34947, 34942, 34932, 34940, 35346, 35911, 35927, + 35963, 36004, 36003, 36214, 36216, 36277, 36279, 36278, 36561, 36563, + 36862, 36853, 36866, 36863, 36859, 36868, 36860, 36854, 37078, 37088, + 37081, 37082, 37091, 37087, 37093, 37080, 37083, 37079, 37084, 37092, + 37200, 37198, 37199, 37333, 37346, 37338, 38492, 38495, 38588, 39139, + 39647, 39727, 20095, 20592, 20586, 20577, 20574, 20576, 20563, 20555, + 20573, 20594, 20552, 20557, 20545, 20571, 20554, 20578, 20501, 20549, + 20575, 20585, 20587, 20579, 20580, 20550, 20544, 20590, 20595, 20567, + 20561, 20944, 21099, 21101, 21100, 21102, 21206, 21203, 21293, 21404, + 21877, 21878, 21820, 21837, 21840, 21812, 21802, 21841, 21858, 21814, + 21813, 21808, 21842, 21829, 21772, 21810, 21861, 21838, 21817, 21832, + 21805, 21819, 21824, 21835, 22282, 22279, 22523, 22548, 22498, 22518, + 22492, 22516, 22528, 22509, 22525, 22536, 22520, 22539, 22515, 22479, + 22535, 22510, 22499, 22514, 22501, 22508, 22497, 22542, 22524, 22544, + 22503, 22529, 22540, 22513, 22505, 22512, 22541, 22532, 22876, 23136, + 23128, 23125, 23143, 23134, 23096, 23093, 23149, 23120, 23135, 23141, + 23148, 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, + 23182, 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, + 23106, 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, + 23834, 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, + 23843, 23839, 23854, 24126, 24116, 24241, 24244, 24249, 24242, 24243, + 24374, 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, + 24762, 24787, 24788, 24783, 24804, 24793, 24797, 24776, 24753, 24795, + 24759, 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, + 25469, 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, + 25488, 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, + 25503, 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, + 26209, 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, + 26733, 26734, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, + 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, + 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, + 26769, 26764, 26762, 26749, 27446, 27443, 27447, 27448, 27537, 27535, + 27533, 27534, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, + 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, + 28094, 28133, 28124, 28125, 28123, 28148, 28106, 28093, 28141, 28144, + 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, + 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, + 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, + 28939, 28930, 28942, 29310, 29307, 29308, 29311, 29469, 29463, 29447, + 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, + 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, + 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, 30155, 30156, + 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, 30513, 30514, + 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, + 30794, 30796, 30758, 30789, 30800, 31076, 31079, 31081, 31082, 31075, + 31083, 31073, 31163, 31226, 31224, 31222, 31223, 31375, 31380, 31376, + 31541, 31559, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, + 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, + 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, + 32041, 32065, 32071, 32062, 32063, 32074, 32059, 32040, 32611, 32661, + 32668, 32669, 32667, 32714, 32715, 32717, 32720, 32721, 32711, 32719, + 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, 33049, + 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, 33058, + 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, 33704, + 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, 33653, + 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, 33662, + 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, 33654, + 33690, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, + 34504, 34489, 34483, 34488, 34508, 34484, 34491, 34492, 34499, 34493, + 34494, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, 34977, + 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, 34963, + 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, 35897, + 35899, 35932, 35933, 35965, 36005, 36221, 36219, 36217, 36284, 36290, + 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, 36576, 36577, + 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, 37104, 37108, + 37106, 37107, 37076, 37099, 37100, 37097, 37206, 37208, 37210, 37203, + 37205, 37356, 37364, 37361, 37363, 37368, 37348, 37369, 37354, 37355, + 37367, 37352, 37358, 38266, 38278, 38280, 38524, 38509, 38507, 38513, + 38511, 38591, 38762, 38916, 39141, 39319, 20635, 20629, 20628, 20638, + 20619, 20643, 20611, 20620, 20622, 20637, 20584, 20636, 20626, 20610, + 20615, 20831, 20948, 21266, 21265, 21412, 21415, 21905, 21928, 21925, + 21933, 21879, 22085, 21922, 21907, 21896, 21903, 21941, 21889, 21923, + 21906, 21924, 21885, 21900, 21926, 21887, 21909, 21921, 21902, 22284, + 22569, 22583, 22553, 22558, 22567, 22563, 22568, 22517, 22600, 22565, + 22556, 22555, 22579, 22591, 22582, 22574, 22585, 22584, 22573, 22572, + 22587, 22881, 23215, 23188, 23199, 23162, 23202, 23198, 23160, 23206, + 23164, 23205, 23212, 23189, 23214, 23095, 23172, 23178, 23191, 23171, + 23179, 23209, 23163, 23165, 23180, 23196, 23183, 23187, 23197, 23530, + 23501, 23499, 23508, 23505, 23498, 23502, 23564, 23600, 23863, 23875, + 23915, 23873, 23883, 23871, 23861, 23889, 23886, 23893, 23859, 23866, + 23890, 23869, 23857, 23897, 23874, 23865, 23881, 23864, 23868, 23858, + 23862, 23872, 23877, 24132, 24129, 24408, 24486, 24485, 24491, 24777, + 24761, 24780, 24802, 24782, 24772, 24852, 24818, 24842, 24854, 24837, + 24821, 24851, 24824, 24828, 24830, 24769, 24835, 24856, 24861, 24848, + 24831, 24836, 24843, 25162, 25492, 25521, 25520, 25550, 25573, 25576, + 25583, 25539, 25757, 25587, 25546, 25568, 25590, 25557, 25586, 25589, + 25697, 25567, 25534, 25565, 25564, 25540, 25560, 25555, 25538, 25543, + 25548, 25547, 25544, 25584, 25559, 25561, 25906, 25959, 25962, 25956, + 25948, 25960, 25957, 25996, 26013, 26014, 26030, 26064, 26066, 26236, + 26220, 26235, 26240, 26225, 26233, 26218, 26226, 26369, 26892, 26835, + 26884, 26844, 26922, 26860, 26858, 26865, 26895, 26838, 26871, 26859, + 26852, 26870, 26899, 26896, 26867, 26849, 26887, 26828, 26888, 26992, + 26804, 26897, 26863, 26822, 26900, 26872, 26832, 26877, 26876, 26856, + 26891, 26890, 26903, 26830, 26824, 26845, 26846, 26854, 26868, 26833, + 26886, 26836, 26857, 26901, 26917, 26823, 27449, 27451, 27455, 27452, + 27540, 27543, 27545, 27541, 27581, 27632, 27634, 27635, 27696, 28156, + 28230, 28231, 28191, 28233, 28296, 28220, 28221, 28229, 28258, 28203, + 28223, 28225, 28253, 28275, 28188, 28211, 28235, 28224, 28241, 28219, + 28163, 28206, 28254, 28264, 28252, 28257, 28209, 28200, 28256, 28273, + 28267, 28217, 28194, 28208, 28243, 28261, 28199, 28280, 28260, 28279, + 28245, 28281, 28242, 28262, 28213, 28214, 28250, 28960, 28958, 28975, + 28923, 28974, 28977, 28963, 28965, 28962, 28978, 28959, 28968, 28986, + 28955, 29259, 29274, 29320, 29321, 29318, 29317, 29323, 29458, 29451, + 29488, 29474, 29489, 29491, 29479, 29490, 29485, 29478, 29475, 29493, + 29452, 29742, 29740, 29744, 29739, 29718, 29722, 29729, 29741, 29745, + 29732, 29731, 29725, 29737, 29728, 29746, 29947, 29999, 30063, 30060, + 30183, 30170, 30177, 30182, 30173, 30175, 30180, 30167, 30357, 30354, + 30426, 30534, 30535, 30532, 30541, 30533, 30538, 30542, 30539, 30540, + 30686, 30700, 30816, 30820, 30821, 30812, 30829, 30833, 30826, 30830, + 30832, 30825, 30824, 30814, 30818, 31092, 31091, 31090, 31088, 31234, + 31242, 31235, 31244, 31236, 31385, 31462, 31460, 31562, 31547, 31556, + 31560, 31564, 31566, 31552, 31576, 31557, 31906, 31902, 31912, 31905, + 32088, 32111, 32099, 32083, 32086, 32103, 32106, 32079, 32109, 32092, + 32107, 32082, 32084, 32105, 32081, 32095, 32078, 32574, 32575, 32613, + 32614, 32674, 32672, 32673, 32727, 32849, 32847, 32848, 33022, 32980, + 33091, 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, + 33271, 33272, 33273, 33284, 33340, 33341, 33343, 33397, 33595, 33743, + 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, 33782, 33808, + 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, 33752, 33791, + 33761, 33739, 33742, 33750, 33781, 33737, 33801, 33807, 33758, 33809, + 33798, 33730, 33779, 33749, 33786, 33735, 33745, 33770, 33811, 33731, + 33772, 33774, 33732, 33787, 33751, 33762, 33819, 33755, 33790, 34520, + 34530, 34534, 34515, 34531, 34522, 34538, 34525, 34539, 34524, 34540, + 34537, 34519, 34536, 34513, 34888, 34902, 34901, 35002, 35031, 35001, + 35000, 35008, 35006, 34998, 35004, 34999, 35005, 34994, 35073, 35017, + 35221, 35224, 35223, 35293, 35290, 35291, 35406, 35405, 35385, 35417, + 35392, 35415, 35416, 35396, 35397, 35410, 35400, 35409, 35402, 35404, + 35407, 35935, 35969, 35968, 36026, 36030, 36016, 36025, 36021, 36228, + 36224, 36233, 36312, 36307, 36301, 36295, 36310, 36316, 36303, 36309, + 36313, 36296, 36311, 36293, 36591, 36599, 36602, 36601, 36582, 36590, + 36581, 36597, 36583, 36584, 36598, 36587, 36593, 36588, 36596, 36585, + 36909, 36916, 36911, 37126, 37164, 37124, 37119, 37116, 37128, 37113, + 37115, 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, + 37216, 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, + 37394, 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, + 37399, 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, 38536, + 38537, 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, + 38766, 38919, 39081, 39147, 40166, 40697, 20099, 20100, 20150, 20669, + 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, + 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, 21115, + 21116, 21955, 21979, 21964, 21968, 21963, 21962, 21981, 21952, 21972, + 21956, 21993, 21951, 21970, 21901, 21967, 21973, 21986, 21974, 21960, + 22002, 21965, 21977, 21954, 22292, 22611, 22632, 22628, 22607, 22605, + 22601, 22639, 22613, 22606, 22621, 22617, 22629, 22619, 22589, 22627, + 22641, 22780, 23239, 23236, 23243, 23226, 23224, 23217, 23221, 23216, + 23231, 23240, 23227, 23238, 23223, 23232, 23242, 23220, 23222, 23245, + 23225, 23184, 23510, 23512, 23513, 23583, 23603, 23921, 23907, 23882, + 23909, 23922, 23916, 23902, 23912, 23911, 23906, 24048, 24143, 24142, + 24138, 24141, 24139, 24261, 24268, 24262, 24267, 24263, 24384, 24495, + 24493, 24823, 24905, 24906, 24875, 24901, 24886, 24882, 24878, 24902, + 24879, 24911, 24873, 24896, 25120, 37224, 25123, 25125, 25124, 25541, + 25585, 25579, 25616, 25618, 25609, 25632, 25636, 25651, 25667, 25631, + 25621, 25624, 25657, 25655, 25634, 25635, 25612, 25638, 25648, 25640, + 25665, 25653, 25647, 25610, 25626, 25664, 25637, 25639, 25611, 25575, + 25627, 25646, 25633, 25614, 25967, 26002, 26067, 26246, 26252, 26261, + 26256, 26251, 26250, 26265, 26260, 26232, 26400, 26982, 26975, 26936, + 26958, 26978, 26993, 26943, 26949, 26986, 26937, 26946, 26967, 26969, + 27002, 26952, 26953, 26933, 26988, 26931, 26941, 26981, 26864, 27000, + 26932, 26985, 26944, 26991, 26948, 26998, 26968, 26945, 26996, 26956, + 26939, 26955, 26935, 26972, 26959, 26961, 26930, 26962, 26927, 27003, + 26940, 27462, 27461, 27459, 27458, 27464, 27457, 27547, 64013, 27643, + 27644, 27641, 27639, 27640, 28315, 28374, 28360, 28303, 28352, 28319, + 28307, 28308, 28320, 28337, 28345, 28358, 28370, 28349, 28353, 28318, + 28361, 28343, 28336, 28365, 28326, 28367, 28338, 28350, 28355, 28380, + 28376, 28313, 28306, 28302, 28301, 28324, 28321, 28351, 28339, 28368, + 28362, 28311, 28334, 28323, 28999, 29012, 29010, 29027, 29024, 28993, + 29021, 29026, 29042, 29048, 29034, 29025, 28994, 29016, 28995, 29003, + 29040, 29023, 29008, 29011, 28996, 29005, 29018, 29263, 29325, 29324, + 29329, 29328, 29326, 29500, 29506, 29499, 29498, 29504, 29514, 29513, + 29764, 29770, 29771, 29778, 29777, 29783, 29760, 29775, 29776, 29774, + 29762, 29766, 29773, 29780, 29921, 29951, 29950, 29949, 29981, 30073, + 30071, 27011, 30191, 30223, 30211, 30199, 30206, 30204, 30201, 30200, + 30224, 30203, 30198, 30189, 30197, 30205, 30361, 30389, 30429, 30549, + 30559, 30560, 30546, 30550, 30554, 30569, 30567, 30548, 30553, 30573, + 30688, 30855, 30874, 30868, 30863, 30852, 30869, 30853, 30854, 30881, + 30851, 30841, 30873, 30848, 30870, 30843, 31100, 31106, 31101, 31097, + 31249, 31256, 31257, 31250, 31255, 31253, 31266, 31251, 31259, 31248, + 31395, 31394, 31390, 31467, 31590, 31588, 31597, 31604, 31593, 31602, + 31589, 31603, 31601, 31600, 31585, 31608, 31606, 31587, 31922, 31924, + 31919, 32136, 32134, 32128, 32141, 32127, 32133, 32122, 32142, 32123, + 32131, 32124, 32140, 32148, 32132, 32125, 32146, 32621, 32619, 32615, + 32616, 32620, 32678, 32677, 32679, 32731, 32732, 32801, 33124, 33120, + 33143, 33116, 33129, 33115, 33122, 33138, 26401, 33118, 33142, 33127, + 33135, 33092, 33121, 33309, 33353, 33348, 33344, 33346, 33349, 34033, + 33855, 33878, 33910, 33913, 33935, 33933, 33893, 33873, 33856, 33926, + 33895, 33840, 33869, 33917, 33882, 33881, 33908, 33907, 33885, 34055, + 33886, 33847, 33850, 33844, 33914, 33859, 33912, 33842, 33861, 33833, + 33753, 33867, 33839, 33858, 33837, 33887, 33904, 33849, 33870, 33868, + 33874, 33903, 33989, 33934, 33851, 33863, 33846, 33843, 33896, 33918, + 33860, 33835, 33888, 33876, 33902, 33872, 34571, 34564, 34551, 34572, + 34554, 34518, 34549, 34637, 34552, 34574, 34569, 34561, 34550, 34573, + 34565, 35030, 35019, 35021, 35022, 35038, 35035, 35034, 35020, 35024, + 35205, 35227, 35295, 35301, 35300, 35297, 35296, 35298, 35292, 35302, + 35446, 35462, 35455, 35425, 35391, 35447, 35458, 35460, 35445, 35459, + 35457, 35444, 35450, 35900, 35915, 35914, 35941, 35940, 35942, 35974, + 35972, 35973, 36044, 36200, 36201, 36241, 36236, 36238, 36239, 36237, + 36243, 36244, 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, + 36329, 36323, 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, + 36608, 36613, 36615, 36616, 36610, 36619, 36946, 36927, 36932, 36937, + 36925, 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, 37230, + 37231, 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, + 37422, 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, + 37473, 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, + 37462, 37426, 38303, 38300, 38302, 38299, 38546, 38547, 38545, 38551, + 38606, 38650, 38653, 38648, 38645, 38771, 38775, 38776, 38770, 38927, + 38925, 38926, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, + 39595, 39771, 40170, 40173, 40167, 40576, 40701, 20710, 20692, 20695, + 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, 20719, + 20707, 20704, 20952, 21120, 21121, 21225, 21227, 21296, 21420, 22055, + 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, 22010, + 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, 22657, + 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, 22664, + 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, 23274, + 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, 23261, + 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, 23933, + 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, 23949, + 23929, 23935, 24152, 24153, 24147, 24280, 24273, 24279, 24270, 24284, + 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, 24872, + 24897, 24926, 24945, 24947, 24914, 24915, 24946, 24940, 24960, 24948, + 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, 25127, + 25131, 25643, 25677, 25691, 25693, 25716, 25718, 25714, 25715, 25725, + 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, 25696, + 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, 26016, + 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, 27040, + 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, 27021, + 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, 27082, + 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, 27024, + 27074, 27061, 27045, 27078, 27466, 27469, 27467, 27550, 27551, 27552, + 27587, 27588, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, + 28411, 28462, 28425, 28494, 28441, 28442, 28455, 28440, 28475, 28434, + 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, + 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, + 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, + 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, + 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, + 29813, 29810, 29799, 29806, 29952, 29954, 29955, 30077, 30096, 30230, + 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, + 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, + 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, + 31114, 31115, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, + 31275, 31306, 31280, 31279, 31272, 31270, 31400, 31403, 31404, 31470, + 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, + 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, + 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, + 32196, 32198, 32203, 32204, 32175, 32185, 32150, 32188, 32159, 32166, + 32174, 32169, 32161, 32201, 32627, 32738, 32739, 32741, 32734, 32804, + 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, + 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, + 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, + 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, 33960, 34006, + 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, 33937, + 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, 34585, + 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, 34605, + 34620, 34578, 34618, 34609, 34613, 34626, 34598, 34599, 34616, 34596, + 34586, 34608, 34577, 35063, 35047, 35057, 35058, 35066, 35070, 35054, + 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, 35230, + 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, 35901, + 35944, 35945, 36053, 36047, 36055, 36246, 36361, 36354, 36351, 36365, + 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, 36624, + 36625, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, 37146, + 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, 37494, + 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, 37497, + 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, 37512, + 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, 37533, + 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, 38787, + 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, 39085, + 39086, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, 39354, + 39362, 39357, 39367, 39601, 39651, 39655, 39742, 39743, 39776, 39777, + 39775, 40177, 40178, 40181, 40615, 20735, 20739, 20784, 20728, 20742, + 20743, 20726, 20734, 20747, 20748, 20733, 20746, 21131, 21132, 21233, + 21231, 22088, 22082, 22092, 22069, 22081, 22090, 22089, 22086, 22104, + 22106, 22080, 22067, 22077, 22060, 22078, 22072, 22058, 22074, 22298, + 22699, 22685, 22705, 22688, 22691, 22703, 22700, 22693, 22689, 22783, + 23295, 23284, 23293, 23287, 23286, 23299, 23288, 23298, 23289, 23297, + 23303, 23301, 23311, 23655, 23961, 23959, 23967, 23954, 23970, 23955, + 23957, 23968, 23964, 23969, 23962, 23966, 24169, 24157, 24160, 24156, + 32243, 24283, 24286, 24289, 24393, 24498, 24971, 24963, 24953, 25009, + 25008, 24994, 24969, 24987, 24979, 25007, 25005, 24991, 24978, 25002, + 24993, 24973, 24934, 25011, 25133, 25710, 25712, 25750, 25760, 25733, + 25751, 25756, 25743, 25739, 25738, 25740, 25763, 25759, 25704, 25777, + 25752, 25974, 25978, 25977, 25979, 26034, 26035, 26293, 26288, 26281, + 26290, 26295, 26282, 26287, 27136, 27142, 27159, 27109, 27128, 27157, + 27121, 27108, 27168, 27135, 27116, 27106, 27163, 27165, 27134, 27175, + 27122, 27118, 27156, 27127, 27111, 27200, 27144, 27110, 27131, 27149, + 27132, 27115, 27145, 27140, 27160, 27173, 27151, 27126, 27174, 27143, + 27124, 27158, 27473, 27557, 27555, 27554, 27558, 27649, 27648, 27647, + 27650, 28481, 28454, 28542, 28551, 28614, 28562, 28557, 28553, 28556, + 28514, 28495, 28549, 28506, 28566, 28534, 28524, 28546, 28501, 28530, + 28498, 28496, 28503, 28564, 28563, 28509, 28416, 28513, 28523, 28541, + 28519, 28560, 28499, 28555, 28521, 28543, 28565, 28515, 28535, 28522, + 28539, 29106, 29103, 29083, 29104, 29088, 29082, 29097, 29109, 29085, + 29093, 29086, 29092, 29089, 29098, 29084, 29095, 29107, 29336, 29338, + 29528, 29522, 29534, 29535, 29536, 29533, 29531, 29537, 29530, 29529, + 29538, 29831, 29833, 29834, 29830, 29825, 29821, 29829, 29832, 29820, + 29817, 29960, 29959, 30078, 30245, 30238, 30233, 30237, 30236, 30243, + 30234, 30248, 30235, 30364, 30365, 30366, 30363, 30605, 30607, 30601, + 30600, 30925, 30907, 30927, 30924, 30929, 30926, 30932, 30920, 30915, + 30916, 30921, 31130, 31137, 31136, 31132, 31138, 31131, 27510, 31289, + 31410, 31412, 31411, 31671, 31691, 31678, 31660, 31694, 31663, 31673, + 31690, 31669, 31941, 31944, 31948, 31947, 32247, 32219, 32234, 32231, + 32215, 32225, 32259, 32250, 32230, 32246, 32241, 32240, 32238, 32223, + 32630, 32684, 32688, 32685, 32749, 32747, 32746, 32748, 32742, 32744, + 32868, 32871, 33187, 33183, 33182, 33173, 33186, 33177, 33175, 33302, + 33359, 33363, 33362, 33360, 33358, 33361, 34084, 34107, 34063, 34048, + 34089, 34062, 34057, 34061, 34079, 34058, 34087, 34076, 34043, 34091, + 34042, 34056, 34060, 34036, 34090, 34034, 34069, 34039, 34027, 34035, + 34044, 34066, 34026, 34025, 34070, 34046, 34088, 34077, 34094, 34050, + 34045, 34078, 34038, 34097, 34086, 34023, 34024, 34032, 34031, 34041, + 34072, 34080, 34096, 34059, 34073, 34095, 34402, 34646, 34659, 34660, + 34679, 34785, 34675, 34648, 34644, 34651, 34642, 34657, 34650, 34641, + 34654, 34669, 34666, 34640, 34638, 34655, 34653, 34671, 34668, 34682, + 34670, 34652, 34661, 34639, 34683, 34677, 34658, 34663, 34665, 34906, + 35077, 35084, 35092, 35083, 35095, 35096, 35097, 35078, 35094, 35089, + 35086, 35081, 35234, 35236, 35235, 35309, 35312, 35308, 35535, 35526, + 35512, 35539, 35537, 35540, 35541, 35515, 35543, 35518, 35520, 35525, + 35544, 35523, 35514, 35517, 35545, 35902, 35917, 35983, 36069, 36063, + 36057, 36072, 36058, 36061, 36071, 36256, 36252, 36257, 36251, 36384, + 36387, 36389, 36388, 36398, 36373, 36379, 36374, 36369, 36377, 36390, + 36391, 36372, 36370, 36376, 36371, 36380, 36375, 36378, 36652, 36644, + 36632, 36634, 36640, 36643, 36630, 36631, 36979, 36976, 36975, 36967, + 36971, 37167, 37163, 37161, 37162, 37170, 37158, 37166, 37253, 37254, + 37258, 37249, 37250, 37252, 37248, 37584, 37571, 37572, 37568, 37593, + 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, + 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, + 37598, 37607, 37585, 37587, 37557, 37601, 37574, 37556, 38268, 38316, + 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, 38746, + 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, 38952, + 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, 39190, 39191, + 39189, 39388, 39373, 39375, 39379, 39380, 39374, 39369, 39382, 39384, + 39371, 39383, 39372, 39603, 39660, 39659, 39667, 39666, 39665, 39750, + 39747, 39783, 39796, 39793, 39782, 39798, 39797, 39792, 39784, 39780, + 39788, 40188, 40186, 40189, 40191, 40183, 40199, 40192, 40185, 40187, + 40200, 40197, 40196, 40579, 40659, 40719, 40720, 20764, 20755, 20759, + 20762, 20753, 20958, 21300, 21473, 22128, 22112, 22126, 22131, 22118, + 22115, 22125, 22130, 22110, 22135, 22300, 22299, 22728, 22717, 22729, + 22719, 22714, 22722, 22716, 22726, 23319, 23321, 23323, 23329, 23316, + 23315, 23312, 23318, 23336, 23322, 23328, 23326, 23535, 23980, 23985, + 23977, 23975, 23989, 23984, 23982, 23978, 23976, 23986, 23981, 23983, + 23988, 24167, 24168, 24166, 24175, 24297, 24295, 24294, 24296, 24293, + 24395, 24508, 24989, 25000, 24982, 25029, 25012, 25030, 25025, 25036, + 25018, 25023, 25016, 24972, 25815, 25814, 25808, 25807, 25801, 25789, + 25737, 25795, 25819, 25843, 25817, 25907, 25983, 25980, 26018, 26312, + 26302, 26304, 26314, 26315, 26319, 26301, 26299, 26298, 26316, 26403, + 27188, 27238, 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, + 27227, 27217, 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, + 27215, 27220, 27247, 27241, 27232, 27196, 27230, 27222, 27221, 27213, + 27214, 27206, 27477, 27476, 27478, 27559, 27562, 27563, 27592, 27591, + 27652, 27651, 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, + 28510, 28612, 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, + 28588, 28586, 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, + 28594, 28592, 29125, 29122, 29119, 29112, 29142, 29120, 29121, 29131, + 29140, 29130, 29127, 29135, 29117, 29144, 29116, 29126, 29146, 29147, + 29341, 29342, 29545, 29542, 29543, 29548, 29541, 29547, 29546, 29823, + 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, 30253, + 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, 30618, + 30621, 30625, 30620, 30619, 30626, 30627, 30613, 30617, 30615, 30941, + 30953, 30949, 30954, 30942, 30947, 30939, 30945, 30946, 30957, 30943, + 30944, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, 31415, + 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, 31700, + 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, 31952, + 31953, 32274, 32289, 32279, 32268, 32287, 32288, 32275, 32270, 32284, + 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, 32293, 32292, + 32579, 32635, 32636, 32634, 32689, 32751, 32810, 32809, 32876, 33201, + 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, 33202, 33207, + 33191, 33266, 33365, 33366, 33367, 34134, 34117, 34155, 34125, 34131, + 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, 34119, + 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, 34144, + 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, 34715, + 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, 34681, 34695, + 34723, 34693, 34704, 34705, 34717, 34692, 34708, 34716, 34714, 34697, + 35102, 35110, 35120, 35117, 35118, 35111, 35121, 35106, 35113, 35107, + 35119, 35116, 35103, 35313, 35552, 35554, 35570, 35572, 35573, 35549, + 35604, 35556, 35551, 35568, 35528, 35550, 35553, 35560, 35583, 35567, + 35579, 35985, 35986, 35984, 36085, 36078, 36081, 36080, 36083, 36204, + 36206, 36261, 36263, 36403, 36414, 36408, 36416, 36421, 36406, 36412, + 36413, 36417, 36400, 36415, 36541, 36662, 36654, 36661, 36658, 36665, + 36663, 36660, 36982, 36985, 36987, 36998, 37114, 37171, 37173, 37174, + 37267, 37264, 37265, 37261, 37263, 37671, 37662, 37640, 37663, 37638, + 37647, 37754, 37688, 37692, 37659, 37667, 37650, 37633, 37702, 37677, + 37646, 37645, 37579, 37661, 37626, 37669, 37651, 37625, 37623, 37684, + 37634, 37668, 37631, 37673, 37689, 37685, 37674, 37652, 37644, 37643, + 37630, 37641, 37632, 37627, 37654, 38332, 38349, 38334, 38329, 38330, + 38326, 38335, 38325, 38333, 38569, 38612, 38667, 38674, 38672, 38809, + 38807, 38804, 38896, 38904, 38965, 38959, 38962, 39204, 39199, 39207, + 39209, 39326, 39406, 39404, 39397, 39396, 39408, 39395, 39402, 39401, + 39399, 39609, 39615, 39604, 39611, 39670, 39674, 39673, 39671, 39731, + 39808, 39813, 39815, 39804, 39806, 39803, 39810, 39827, 39826, 39824, + 39802, 39829, 39805, 39816, 40229, 40215, 40224, 40222, 40212, 40233, + 40221, 40216, 40226, 40208, 40217, 40223, 40584, 40582, 40583, 40622, + 40621, 40661, 40662, 40698, 40722, 40765, 20774, 20773, 20770, 20772, + 20768, 20777, 21236, 22163, 22156, 22157, 22150, 22148, 22147, 22142, + 22146, 22143, 22145, 22742, 22740, 22735, 22738, 23341, 23333, 23346, + 23331, 23340, 23335, 23334, 23343, 23342, 23419, 23537, 23538, 23991, + 24172, 24170, 24510, 24507, 25027, 25013, 25020, 25063, 25056, 25061, + 25060, 25064, 25054, 25839, 25833, 25827, 25835, 25828, 25832, 25985, + 25984, 26038, 26074, 26322, 27277, 27286, 27265, 27301, 27273, 27295, + 27291, 27297, 27294, 27271, 27283, 27278, 27285, 27267, 27304, 27300, + 27281, 27263, 27302, 27290, 27269, 27276, 27282, 27483, 27565, 27657, + 28620, 28585, 28660, 28628, 28643, 28636, 28653, 28647, 28646, 28638, + 28658, 28637, 28642, 28648, 29153, 29169, 29160, 29170, 29156, 29168, + 29154, 29555, 29550, 29551, 29847, 29874, 29867, 29840, 29866, 29869, + 29873, 29861, 29871, 29968, 29969, 29970, 29967, 30084, 30275, 30280, + 30281, 30279, 30372, 30441, 30645, 30635, 30642, 30647, 30646, 30644, + 30641, 30632, 30704, 30963, 30973, 30978, 30971, 30972, 30962, 30981, + 30969, 30974, 30980, 31147, 31144, 31324, 31323, 31318, 31320, 31316, + 31322, 31422, 31424, 31425, 31749, 31759, 31730, 31744, 31743, 31739, + 31758, 31732, 31755, 31731, 31746, 31753, 31747, 31745, 31736, 31741, + 31750, 31728, 31729, 31760, 31754, 31976, 32301, 32316, 32322, 32307, + 38984, 32312, 32298, 32329, 32320, 32327, 32297, 32332, 32304, 32315, + 32310, 32324, 32314, 32581, 32639, 32638, 32637, 32756, 32754, 32812, + 33211, 33220, 33228, 33226, 33221, 33223, 33212, 33257, 33371, 33370, + 33372, 34179, 34176, 34191, 34215, 34197, 34208, 34187, 34211, 34171, + 34212, 34202, 34206, 34167, 34172, 34185, 34209, 34170, 34168, 34135, + 34190, 34198, 34182, 34189, 34201, 34205, 34177, 34210, 34178, 34184, + 34181, 34169, 34166, 34200, 34192, 34207, 34408, 34750, 34730, 34733, + 34757, 34736, 34732, 34745, 34741, 34748, 34734, 34761, 34755, 34754, + 34764, 34743, 34735, 34756, 34762, 34740, 34742, 34751, 34744, 34749, + 34782, 34738, 35125, 35123, 35132, 35134, 35137, 35154, 35127, 35138, + 35245, 35247, 35246, 35314, 35315, 35614, 35608, 35606, 35601, 35589, + 35595, 35618, 35599, 35602, 35605, 35591, 35597, 35592, 35590, 35612, + 35603, 35610, 35919, 35952, 35954, 35953, 35951, 35989, 35988, 36089, + 36207, 36430, 36429, 36435, 36432, 36428, 36423, 36675, 36672, 36997, + 36990, 37176, 37274, 37282, 37275, 37273, 37279, 37281, 37277, 37280, + 37793, 37763, 37807, 37732, 37718, 37703, 37756, 37720, 37724, 37750, + 37705, 37712, 37713, 37728, 37741, 37775, 37708, 37738, 37753, 37719, + 37717, 37714, 37711, 37745, 37751, 37755, 37729, 37726, 37731, 37735, + 37760, 37710, 37721, 38343, 38336, 38345, 38339, 38341, 38327, 38574, + 38576, 38572, 38688, 38687, 38680, 38685, 38681, 38810, 38817, 38812, + 38814, 38813, 38869, 38868, 38897, 38977, 38980, 38986, 38985, 38981, + 38979, 39205, 39211, 39212, 39210, 39219, 39218, 39215, 39213, 39217, + 39216, 39320, 39331, 39329, 39426, 39418, 39412, 39415, 39417, 39416, + 39414, 39419, 39421, 39422, 39420, 39427, 39614, 39678, 39677, 39681, + 39676, 39752, 39834, 39848, 39838, 39835, 39846, 39841, 39845, 39844, + 39814, 39842, 39840, 39855, 40243, 40257, 40295, 40246, 40238, 40239, + 40241, 40248, 40240, 40261, 40258, 40259, 40254, 40247, 40256, 40253, + 32757, 40237, 40586, 40585, 40589, 40624, 40648, 40666, 40699, 40703, + 40740, 40739, 40738, 40788, 40864, 20785, 20781, 20782, 22168, 22172, + 22167, 22170, 22173, 22169, 22896, 23356, 23657, 23658, 24000, 24173, + 24174, 25048, 25055, 25069, 25070, 25073, 25066, 25072, 25067, 25046, + 25065, 25855, 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, + 26330, 26331, 26328, 27333, 27321, 27325, 27361, 27334, 27322, 27318, + 27319, 27335, 27316, 27309, 27486, 27593, 27659, 28679, 28684, 28685, + 28673, 28677, 28692, 28686, 28671, 28672, 28667, 28710, 28668, 28663, + 28682, 29185, 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, + 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, + 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30975, + 30988, 30995, 30996, 30985, 30992, 30994, 30993, 31149, 31148, 31327, + 31772, 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, + 31781, 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, + 32352, 32343, 32339, 32693, 32691, 32759, 32760, 32885, 33233, 33234, + 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, + 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, + 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, + 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, + 34776, 34787, 34724, 34775, 34777, 34817, 34804, 34792, 34781, 35155, + 35147, 35151, 35148, 35142, 35152, 35153, 35145, 35626, 35623, 35619, + 35635, 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, + 35622, 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, + 35992, 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, + 36438, 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, + 36678, 36679, 36680, 36683, 37160, 37178, 37179, 37182, 37288, 37285, + 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, + 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37773, + 37809, 37777, 37810, 37796, 37800, 37812, 37795, 37797, 38354, 38355, + 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, + 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, + 38873, 38870, 38872, 38906, 38992, 38993, 38994, 39096, 39233, 39228, + 39226, 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, + 39430, 39616, 39644, 39688, 39684, 39685, 39721, 39733, 39754, 39756, + 39755, 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, + 39876, 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, + 40278, 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, + 40671, 40705, 40704, 40726, 40741, 40747, 40746, 40745, 40744, 40780, + 40789, 20788, 20789, 21142, 21239, 21428, 22187, 22189, 22182, 22183, + 22186, 22188, 22746, 22749, 22747, 22802, 23357, 23358, 23359, 24003, + 24176, 24511, 25083, 25863, 25872, 25869, 25865, 25868, 25870, 25988, + 26078, 26077, 26334, 27367, 27360, 27340, 27345, 27353, 27339, 27359, + 27356, 27344, 27371, 27343, 27341, 27358, 27488, 27568, 27660, 28697, + 28711, 28704, 28694, 28715, 28705, 28706, 28707, 28713, 28695, 28708, + 28700, 28714, 29196, 29194, 29191, 29186, 29189, 29349, 29350, 29348, + 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, 30665, 30666, + 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, 31152, 31335, + 31336, 31795, 31804, 31801, 31788, 31803, 31980, 31978, 32374, 32373, + 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, 32587, 32586, + 32643, 32646, 32695, 32765, 32766, 32888, 33239, 33237, 33380, 33377, + 33379, 34283, 34289, 34285, 34265, 34273, 34280, 34266, 34263, 34284, + 34290, 34296, 34264, 34271, 34275, 34268, 34257, 34288, 34278, 34287, + 34270, 34274, 34816, 34810, 34819, 34806, 34807, 34825, 34828, 34827, + 34822, 34812, 34824, 34815, 34826, 34818, 35170, 35162, 35163, 35159, + 35169, 35164, 35160, 35165, 35161, 35208, 35255, 35254, 35318, 35664, + 35656, 35658, 35648, 35667, 35670, 35668, 35659, 35669, 35665, 35650, + 35666, 35671, 35907, 35959, 35958, 35994, 36102, 36103, 36105, 36268, + 36266, 36269, 36267, 36461, 36472, 36467, 36458, 36463, 36475, 36546, + 36690, 36689, 36687, 36688, 36691, 36788, 37184, 37183, 37296, 37293, + 37854, 37831, 37839, 37826, 37850, 37840, 37881, 37868, 37836, 37849, + 37801, 37862, 37834, 37844, 37870, 37859, 37845, 37828, 37838, 37824, + 37842, 37863, 38269, 38362, 38363, 38625, 38697, 38699, 38700, 38696, + 38694, 38835, 38839, 38838, 38877, 38878, 38879, 39004, 39001, 39005, + 38999, 39103, 39101, 39099, 39102, 39240, 39239, 39235, 39334, 39335, + 39450, 39445, 39461, 39453, 39460, 39451, 39458, 39456, 39463, 39459, + 39454, 39452, 39444, 39618, 39691, 39690, 39694, 39692, 39735, 39914, + 39915, 39904, 39902, 39908, 39910, 39906, 39920, 39892, 39895, 39916, + 39900, 39897, 39909, 39893, 39905, 39898, 40311, 40321, 40330, 40324, + 40328, 40305, 40320, 40312, 40326, 40331, 40332, 40317, 40299, 40308, + 40309, 40304, 40297, 40325, 40307, 40315, 40322, 40303, 40313, 40319, + 40327, 40296, 40596, 40593, 40640, 40700, 40749, 40768, 40769, 40781, + 40790, 40791, 40792, 21303, 22194, 22197, 22195, 22755, 23365, 24006, + 24007, 24302, 24303, 24512, 24513, 25081, 25879, 25878, 25877, 25875, + 26079, 26344, 26339, 26340, 27379, 27376, 27370, 27368, 27385, 27377, + 27374, 27375, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, + 28735, 28730, 28729, 28736, 28731, 28723, 28737, 29203, 29204, 29352, + 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, 30670, 30671, + 30669, 30706, 31013, 31011, 31015, 31016, 31012, 31017, 31154, 31342, + 31340, 31341, 31479, 31817, 31816, 31818, 31815, 31813, 31982, 32379, + 32382, 32385, 32384, 32698, 32767, 32889, 33243, 33241, 33291, 33384, + 33385, 34338, 34303, 34305, 34302, 34331, 34304, 34294, 34308, 34313, + 34309, 34316, 34301, 34841, 34832, 34833, 34839, 34835, 34838, 35171, + 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, 35685, 35687, + 35693, 36270, 36486, 36488, 36484, 36697, 36694, 36695, 36693, 36696, + 36698, 37005, 37187, 37185, 37303, 37301, 37298, 37299, 37899, 37907, + 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, 37913, 37901, + 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, 37897, 37880, + 37898, 37887, 37884, 37900, 37878, 37905, 37894, 38366, 38368, 38367, + 38702, 38703, 38841, 38843, 38909, 38910, 39008, 39010, 39011, 39007, + 39105, 39106, 39248, 39246, 39257, 39244, 39243, 39251, 39474, 39476, + 39473, 39468, 39466, 39478, 39465, 39470, 39480, 39469, 39623, 39626, + 39622, 39696, 39698, 39697, 39947, 39944, 39927, 39941, 39954, 39928, + 40000, 39943, 39950, 39942, 39959, 39956, 39945, 40351, 40345, 40356, + 40349, 40338, 40344, 40336, 40347, 40352, 40340, 40348, 40362, 40343, + 40353, 40346, 40354, 40360, 40350, 40355, 40383, 40361, 40342, 40358, + 40359, 40601, 40603, 40602, 40677, 40676, 40679, 40678, 40752, 40750, + 40795, 40800, 40798, 40797, 40793, 40849, 20794, 20793, 21144, 21143, + 22211, 22205, 22206, 23368, 23367, 24011, 24015, 24305, 25085, 25883, + 27394, 27388, 27395, 27384, 27392, 28739, 28740, 28746, 28744, 28745, + 28741, 28742, 29213, 29210, 29209, 29566, 29975, 30314, 30672, 31021, + 31025, 31023, 31828, 31827, 31986, 32394, 32391, 32392, 32395, 32390, + 32397, 32589, 32699, 32816, 33245, 34328, 34346, 34342, 34335, 34339, + 34332, 34329, 34343, 34350, 34337, 34336, 34345, 34334, 34341, 34857, + 34845, 34843, 34848, 34852, 34844, 34859, 34890, 35181, 35177, 35182, + 35179, 35322, 35705, 35704, 35653, 35706, 35707, 36112, 36116, 36271, + 36494, 36492, 36702, 36699, 36701, 37190, 37188, 37189, 37305, 37951, + 37947, 37942, 37929, 37949, 37948, 37936, 37945, 37930, 37943, 37932, + 37952, 37937, 38373, 38372, 38371, 38709, 38714, 38847, 38881, 39012, + 39113, 39110, 39104, 39256, 39254, 39481, 39485, 39494, 39492, 39490, + 39489, 39482, 39487, 39629, 39701, 39703, 39704, 39702, 39738, 39762, + 39979, 39965, 39964, 39980, 39971, 39976, 39977, 39972, 39969, 40375, + 40374, 40380, 40385, 40391, 40394, 40399, 40382, 40389, 40387, 40379, + 40373, 40398, 40377, 40378, 40364, 40392, 40369, 40365, 40396, 40371, + 40397, 40370, 40570, 40604, 40683, 40686, 40685, 40731, 40728, 40730, + 40753, 40782, 40805, 40804, 40850, 20153, 22214, 22213, 22219, 22897, + 23371, 23372, 24021, 24017, 24306, 25889, 25888, 25894, 25890, 27403, + 27400, 27401, 27661, 28757, 28758, 28759, 28754, 29214, 29215, 29353, + 29567, 29912, 29909, 29913, 29911, 30317, 30381, 31029, 31156, 31344, + 31345, 31831, 31836, 31833, 31835, 31834, 31988, 31985, 32401, 32591, + 32647, 33246, 33387, 34356, 34357, 34355, 34348, 34354, 34358, 34860, + 34856, 34854, 34858, 34853, 35185, 35263, 35262, 35323, 35710, 35716, + 35714, 35718, 35717, 35711, 36117, 36501, 36500, 36506, 36498, 36496, + 36502, 36503, 36704, 36706, 37191, 37964, 37968, 37962, 37963, 37967, + 37959, 37957, 37960, 37961, 37958, 38719, 38883, 39018, 39017, 39115, + 39252, 39259, 39502, 39507, 39508, 39500, 39503, 39496, 39498, 39497, + 39506, 39504, 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, + 39999, 40004, 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, + 39990, 40411, 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, + 40425, 40409, 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, + 40755, 40754, 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, + 22898, 23373, 24024, 34863, 24399, 25089, 25091, 25092, 25897, 25893, + 26006, 26347, 27409, 27410, 27407, 27594, 28763, 28762, 29218, 29570, + 29569, 29571, 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, + 34361, 34364, 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, + 35188, 35187, 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, + 36708, 36707, 37308, 37986, 37973, 37981, 37975, 37982, 38852, 38853, + 38912, 39510, 39513, 39710, 39711, 39712, 40018, 40024, 40016, 40010, + 40013, 40011, 40021, 40025, 40012, 40014, 40443, 40439, 40431, 40419, + 40427, 40440, 40420, 40438, 40417, 40430, 40422, 40434, 40432, 40418, + 40428, 40436, 40435, 40424, 40429, 40642, 40656, 40690, 40691, 40710, + 40732, 40760, 40759, 40758, 40771, 40783, 40817, 40816, 40814, 40815, + 22227, 22221, 23374, 23661, 25901, 26349, 26350, 27411, 28767, 28769, + 28765, 28768, 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, + 32407, 32649, 33389, 34371, 34872, 34871, 34869, 34891, 35732, 35733, + 36510, 36511, 36512, 36509, 37310, 37309, 37314, 37995, 37992, 37993, + 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, + 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, + 40453, 40448, 40449, 40457, 40447, 40445, 40452, 40608, 40734, 40774, + 40820, 40821, 40822, 22228, 25902, 26040, 27416, 27417, 27415, 27418, + 28770, 29222, 29354, 30680, 30681, 31033, 31849, 31851, 31990, 32410, + 32408, 32411, 32409, 33248, 33249, 34374, 34375, 34376, 35193, 35194, + 35196, 35195, 35327, 35736, 35737, 36517, 36516, 36515, 37998, 37997, + 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, + 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, + 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, + 38004, 38008, 38006, 38005, 39520, 40052, 40051, 40049, 40053, 40468, + 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, 34878, 34877, + 34879, 35742, 35996, 36521, 36553, 38731, 39027, 39028, 39116, 39265, + 39339, 39524, 39526, 39527, 39716, 40469, 40471, 40776, 25095, 27422, + 29223, 34380, 36520, 38018, 38016, 38017, 39529, 39528, 39726, 40473, + 29225, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, + 28777, 28778, 40612, 40830, 40777, 40856, 30849, 37561, 35023, 22715, + 24658, 31911, 23290, 9556, 9574, 9559, 9568, 9580, 9571, 9562, + 9577, 9565, 9554, 9572, 9557, 9566, 9578, 9569, 9560, 9575, + 9563, 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, + 9553, 9552, 9581, 9582, 9584, 9583, 65517, 132423, 37595, 132575, + 147397, 34124, 17077, 29679, 20917, 13897, 149826, 166372, 37700, 137691, + 33518, 146632, 30780, 26436, 25311, 149811, 166314, 131744, 158643, 135941, + 20395, 140525, 20488, 159017, 162436, 144896, 150193, 140563, 20521, 131966, + 24484, 131968, 131911, 28379, 132127, 20605, 20737, 13434, 20750, 39020, + 14147, 33814, 149924, 132231, 20832, 144308, 20842, 134143, 139516, 131813, + 140592, 132494, 143923, 137603, 23426, 34685, 132531, 146585, 20914, 20920, + 40244, 20937, 20943, 20945, 15580, 20947, 150182, 20915, 20962, 21314, + 20973, 33741, 26942, 145197, 24443, 21003, 21030, 21052, 21173, 21079, + 21140, 21177, 21189, 31765, 34114, 21216, 34317, 158483, 21253, 166622, + 21833, 28377, 147328, 133460, 147436, 21299, 21316, 134114, 27851, 136998, + 26651, 29653, 24650, 16042, 14540, 136936, 29149, 17570, 21357, 21364, + 165547, 21374, 21375, 136598, 136723, 30694, 21395, 166555, 21408, 21419, + 21422, 29607, 153458, 16217, 29596, 21441, 21445, 27721, 20041, 22526, + 21465, 15019, 134031, 21472, 147435, 142755, 21494, 134263, 21523, 28793, + 21803, 26199, 27995, 21613, 158547, 134516, 21853, 21647, 21668, 18342, + 136973, 134877, 15796, 134477, 166332, 140952, 21831, 19693, 21551, 29719, + 21894, 21929, 22021, 137431, 147514, 17746, 148533, 26291, 135348, 22071, + 26317, 144010, 26276, 26285, 22093, 22095, 30961, 22257, 38791, 21502, + 22272, 22255, 22253, 166758, 13859, 135759, 22342, 147877, 27758, 28811, + 22338, 14001, 158846, 22502, 136214, 22531, 136276, 148323, 22566, 150517, + 22620, 22698, 13665, 22752, 22748, 135740, 22779, 23551, 22339, 172368, + 148088, 37843, 13729, 22815, 26790, 14019, 28249, 136766, 23076, 21843, + 136850, 34053, 22985, 134478, 158849, 159018, 137180, 23001, 137211, 137138, + 159142, 28017, 137256, 136917, 23033, 159301, 23211, 23139, 14054, 149929, + 23159, 14088, 23190, 29797, 23251, 159649, 140628, 15749, 137489, 14130, + 136888, 24195, 21200, 23414, 25992, 23420, 162318, 16388, 18525, 131588, + 23509, 24928, 137780, 154060, 132517, 23539, 23453, 19728, 23557, 138052, + 23571, 29646, 23572, 138405, 158504, 23625, 18653, 23685, 23785, 23791, + 23947, 138745, 138807, 23824, 23832, 23878, 138916, 23738, 24023, 33532, + 14381, 149761, 139337, 139635, 33415, 14390, 15298, 24110, 27274, 24181, + 24186, 148668, 134355, 21414, 20151, 24272, 21416, 137073, 24073, 24308, + 164994, 24313, 24315, 14496, 24316, 26686, 37915, 24333, 131521, 194708, + 15070, 18606, 135994, 24378, 157832, 140240, 24408, 140401, 24419, 38845, + 159342, 24434, 37696, 166454, 24487, 23990, 15711, 152144, 139114, 159992, + 140904, 37334, 131742, 166441, 24625, 26245, 137335, 14691, 15815, 13881, + 22416, 141236, 31089, 15936, 24734, 24740, 24755, 149890, 149903, 162387, + 29860, 20705, 23200, 24932, 33828, 24898, 194726, 159442, 24961, 20980, + 132694, 24967, 23466, 147383, 141407, 25043, 166813, 170333, 25040, 14642, + 141696, 141505, 24611, 24924, 25886, 25483, 131352, 25285, 137072, 25301, + 142861, 25452, 149983, 14871, 25656, 25592, 136078, 137212, 25744, 28554, + 142902, 38932, 147596, 153373, 25825, 25829, 38011, 14950, 25658, 14935, + 25933, 28438, 150056, 150051, 25989, 25965, 25951, 143486, 26037, 149824, + 19255, 26065, 16600, 137257, 26080, 26083, 24543, 144384, 26136, 143863, + 143864, 26180, 143780, 143781, 26187, 134773, 26215, 152038, 26227, 26228, + 138813, 143921, 165364, 143816, 152339, 30661, 141559, 39332, 26370, 148380, + 150049, 15147, 27130, 145346, 26462, 26471, 26466, 147917, 168173, 26583, + 17641, 26658, 28240, 37436, 26625, 144358, 159136, 26717, 144495, 27105, + 27147, 166623, 26995, 26819, 144845, 26881, 26880, 15666, 14849, 144956, + 15232, 26540, 26977, 166474, 17148, 26934, 27032, 15265, 132041, 33635, + 20624, 27129, 144985, 139562, 27205, 145155, 27293, 15347, 26545, 27336, + 168348, 15373, 27421, 133411, 24798, 27445, 27508, 141261, 28341, 146139, + 132021, 137560, 14144, 21537, 146266, 27617, 147196, 27612, 27703, 140427, + 149745, 158545, 27738, 33318, 27769, 146876, 17605, 146877, 147876, 149772, + 149760, 146633, 14053, 15595, 134450, 39811, 143865, 140433, 32655, 26679, + 159013, 159137, 159211, 28054, 27996, 28284, 28420, 149887, 147589, 159346, + 34099, 159604, 20935, 27804, 28189, 33838, 166689, 28207, 146991, 29779, + 147330, 31180, 28239, 23185, 143435, 28664, 14093, 28573, 146992, 28410, + 136343, 147517, 17749, 37872, 28484, 28508, 15694, 28532, 168304, 15675, + 28575, 147780, 28627, 147601, 147797, 147513, 147440, 147380, 147775, 20959, + 147798, 147799, 147776, 156125, 28747, 28798, 28839, 28801, 28876, 28885, + 28886, 28895, 16644, 15848, 29108, 29078, 148087, 28971, 28997, 23176, + 29002, 29038, 23708, 148325, 29007, 37730, 148161, 28972, 148570, 150055, + 150050, 29114, 166888, 28861, 29198, 37954, 29205, 22801, 37955, 29220, + 37697, 153093, 29230, 29248, 149876, 26813, 29269, 29271, 15957, 143428, + 26637, 28477, 29314, 29482, 29483, 149539, 165931, 18669, 165892, 29480, + 29486, 29647, 29610, 134202, 158254, 29641, 29769, 147938, 136935, 150052, + 26147, 14021, 149943, 149901, 150011, 29687, 29717, 26883, 150054, 29753, + 132547, 16087, 29788, 141485, 29792, 167602, 29767, 29668, 29814, 33721, + 29804, 14128, 29812, 37873, 27180, 29826, 18771, 150156, 147807, 150137, + 166799, 23366, 166915, 137374, 29896, 137608, 29966, 29929, 29982, 167641, + 137803, 23511, 167596, 37765, 30029, 30026, 30055, 30062, 151426, 16132, + 150803, 30094, 29789, 30110, 30132, 30210, 30252, 30289, 30287, 30319, + 30326, 156661, 30352, 33263, 14328, 157969, 157966, 30369, 30373, 30391, + 30412, 159647, 33890, 151709, 151933, 138780, 30494, 30502, 30528, 25775, + 152096, 30552, 144044, 30639, 166244, 166248, 136897, 30708, 30729, 136054, + 150034, 26826, 30895, 30919, 30931, 38565, 31022, 153056, 30935, 31028, + 30897, 161292, 36792, 34948, 166699, 155779, 140828, 31110, 35072, 26882, + 31104, 153687, 31133, 162617, 31036, 31145, 28202, 160038, 16040, 31174, + 168205, 31188, +}; + +static const unsigned long myhtml_encoding_map_euc_kr[] = { + 44034, 44035, 44037, 44038, 44043, 44044, 44045, 44046, 44047, 44056, + 44062, 44063, 44065, 44066, 44067, 44069, 44070, 44071, 44072, 44073, + 44074, 44075, 44078, 44082, 44083, 44084, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44085, 44086, 44087, 44090, 44091, 44093, 44094, 44095, + 44097, 44098, 44099, 44100, 44101, 44102, 44103, 44104, 44105, 44106, + 44108, 44110, 44111, 44112, 44113, 44114, 44115, 44117, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44118, 44119, 44121, 44122, 44123, 44125, + 44126, 44127, 44128, 44129, 44130, 44131, 44132, 44133, 44134, 44135, + 44136, 44137, 44138, 44139, 44140, 44141, 44142, 44143, 44146, 44147, + 44149, 44150, 44153, 44155, 44156, 44157, 44158, 44159, 44162, 44167, + 44168, 44173, 44174, 44175, 44177, 44178, 44179, 44181, 44182, 44183, + 44184, 44185, 44186, 44187, 44190, 44194, 44195, 44196, 44197, 44198, + 44199, 44203, 44205, 44206, 44209, 44210, 44211, 44212, 44213, 44214, + 44215, 44218, 44222, 44223, 44224, 44226, 44227, 44229, 44230, 44231, + 44233, 44234, 44235, 44237, 44238, 44239, 44240, 44241, 44242, 44243, + 44244, 44246, 44248, 44249, 44250, 44251, 44252, 44253, 44254, 44255, + 44258, 44259, 44261, 44262, 44265, 44267, 44269, 44270, 44274, 44276, + 44279, 44280, 44281, 44282, 44283, 44286, 44287, 44289, 44290, 44291, + 44293, 44295, 44296, 44297, 44298, 44299, 44302, 44304, 44306, 44307, + 44308, 44309, 44310, 44311, 44313, 44314, 44315, 44317, 44318, 44319, + 44321, 44322, 44323, 44324, 44325, 44326, 44327, 44328, 44330, 44331, + 44334, 44335, 44336, 44337, 44338, 44339, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44342, 44343, 44345, 44346, 44347, 44349, 44350, 44351, + 44352, 44353, 44354, 44355, 44358, 44360, 44362, 44363, 44364, 44365, + 44366, 44367, 44369, 44370, 44371, 44373, 44374, 44375, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44377, 44378, 44379, 44380, 44381, 44382, + 44383, 44384, 44386, 44388, 44389, 44390, 44391, 44392, 44393, 44394, + 44395, 44398, 44399, 44401, 44402, 44407, 44408, 44409, 44410, 44414, + 44416, 44419, 44420, 44421, 44422, 44423, 44426, 44427, 44429, 44430, + 44431, 44433, 44434, 44435, 44436, 44437, 44438, 44439, 44440, 44441, + 44442, 44443, 44446, 44447, 44448, 44449, 44450, 44451, 44453, 44454, + 44455, 44456, 44457, 44458, 44459, 44460, 44461, 44462, 44463, 44464, + 44465, 44466, 44467, 44468, 44469, 44470, 44472, 44473, 44474, 44475, + 44476, 44477, 44478, 44479, 44482, 44483, 44485, 44486, 44487, 44489, + 44490, 44491, 44492, 44493, 44494, 44495, 44498, 44500, 44501, 44502, + 44503, 44504, 44505, 44506, 44507, 44509, 44510, 44511, 44513, 44514, + 44515, 44517, 44518, 44519, 44520, 44521, 44522, 44523, 44524, 44525, + 44526, 44527, 44528, 44529, 44530, 44531, 44532, 44533, 44534, 44535, + 44538, 44539, 44541, 44542, 44546, 44547, 44548, 44549, 44550, 44551, + 44554, 44556, 44558, 44559, 44560, 44561, 44562, 44563, 44565, 44566, + 44567, 44568, 44569, 44570, 44571, 44572, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44573, 44574, 44575, 44576, 44577, 44578, 44579, 44580, + 44581, 44582, 44583, 44584, 44585, 44586, 44587, 44588, 44589, 44590, + 44591, 44594, 44595, 44597, 44598, 44601, 44603, 44604, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44605, 44606, 44607, 44610, 44612, 44615, + 44616, 44617, 44619, 44623, 44625, 44626, 44627, 44629, 44631, 44632, + 44633, 44634, 44635, 44638, 44642, 44643, 44644, 44646, 44647, 44650, + 44651, 44653, 44654, 44655, 44657, 44658, 44659, 44660, 44661, 44662, + 44663, 44666, 44670, 44671, 44672, 44673, 44674, 44675, 44678, 44679, + 44680, 44681, 44682, 44683, 44685, 44686, 44687, 44688, 44689, 44690, + 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, + 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, + 44711, 44712, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, + 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, + 44731, 44735, 44737, 44738, 44739, 44741, 44742, 44743, 44744, 44745, + 44746, 44747, 44750, 44754, 44755, 44756, 44757, 44758, 44759, 44762, + 44763, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, + 44774, 44775, 44777, 44778, 44780, 44782, 44783, 44784, 44785, 44786, + 44787, 44789, 44790, 44791, 44793, 44794, 44795, 44797, 44798, 44799, + 44800, 44801, 44802, 44803, 44804, 44805, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44806, 44809, 44810, 44811, 44812, 44814, 44815, 44817, + 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, + 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44836, 44837, 44838, 44839, 44840, 44841, + 44842, 44843, 44846, 44847, 44849, 44851, 44853, 44854, 44855, 44856, + 44857, 44858, 44859, 44862, 44864, 44868, 44869, 44870, 44871, 44874, + 44875, 44876, 44877, 44878, 44879, 44881, 44882, 44883, 44884, 44885, + 44886, 44887, 44888, 44889, 44890, 44891, 44894, 44895, 44896, 44897, + 44898, 44899, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, + 44910, 44911, 44912, 44913, 44914, 44915, 44916, 44917, 44918, 44919, + 44920, 44922, 44923, 44924, 44925, 44926, 44927, 44929, 44930, 44931, + 44933, 44934, 44935, 44937, 44938, 44939, 44940, 44941, 44942, 44943, + 44946, 44947, 44948, 44950, 44951, 44952, 44953, 44954, 44955, 44957, + 44958, 44959, 44960, 44961, 44962, 44963, 44964, 44965, 44966, 44967, + 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, + 44978, 44979, 44980, 44981, 44982, 44983, 44986, 44987, 44989, 44990, + 44991, 44993, 44994, 44995, 44996, 44997, 44998, 45002, 45004, 45007, + 45008, 45009, 45010, 45011, 45013, 45014, 45015, 45016, 45017, 45018, + 45019, 45021, 45022, 45023, 45024, 45025, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45026, 45027, 45028, 45029, 45030, 45031, 45034, 45035, + 45036, 45037, 45038, 45039, 45042, 45043, 45045, 45046, 45047, 45049, + 45050, 45051, 45052, 45053, 45054, 45055, 45058, 45059, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45061, 45062, 45063, 45064, 45065, 45066, + 45067, 45069, 45070, 45071, 45073, 45074, 45075, 45077, 45078, 45079, + 45080, 45081, 45082, 45083, 45086, 45087, 45088, 45089, 45090, 45091, + 45092, 45093, 45094, 45095, 45097, 45098, 45099, 45100, 45101, 45102, + 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45112, + 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, + 45123, 45126, 45127, 45129, 45131, 45133, 45135, 45136, 45137, 45138, + 45142, 45144, 45146, 45147, 45148, 45150, 45151, 45152, 45153, 45154, + 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, + 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, + 45175, 45176, 45177, 45178, 45179, 45182, 45183, 45185, 45186, 45187, + 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45198, 45200, 45202, + 45203, 45204, 45205, 45206, 45207, 45211, 45213, 45214, 45219, 45220, + 45221, 45222, 45223, 45226, 45232, 45234, 45238, 45239, 45241, 45242, + 45243, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45254, 45258, + 45259, 45260, 45261, 45262, 45263, 45266, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45267, 45269, 45270, 45271, 45273, 45274, 45275, 45276, + 45277, 45278, 45279, 45281, 45282, 45283, 45284, 45286, 45287, 45288, + 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45297, 45298, 45299, 45300, 45301, 45302, + 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312, + 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45322, 45325, 45326, + 45327, 45329, 45332, 45333, 45334, 45335, 45338, 45342, 45343, 45344, + 45345, 45346, 45350, 45351, 45353, 45354, 45355, 45357, 45358, 45359, + 45360, 45361, 45362, 45363, 45366, 45370, 45371, 45372, 45373, 45374, + 45375, 45378, 45379, 45381, 45382, 45383, 45385, 45386, 45387, 45388, + 45389, 45390, 45391, 45394, 45395, 45398, 45399, 45401, 45402, 45403, + 45405, 45406, 45407, 45409, 45410, 45411, 45412, 45413, 45414, 45415, + 45416, 45417, 45418, 45419, 45420, 45421, 45422, 45423, 45424, 45425, + 45426, 45427, 45428, 45429, 45430, 45431, 45434, 45435, 45437, 45438, + 45439, 45441, 45443, 45444, 45445, 45446, 45447, 45450, 45452, 45454, + 45455, 45456, 45457, 45461, 45462, 45463, 45465, 45466, 45467, 45469, + 45470, 45471, 45472, 45473, 45474, 45475, 45476, 45477, 45478, 45479, + 45481, 45482, 45483, 45484, 45485, 45486, 45487, 45488, 45489, 45490, + 45491, 45492, 45493, 45494, 45495, 45496, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45497, 45498, 45499, 45500, 45501, 45502, 45503, 45504, + 45505, 45506, 45507, 45508, 45509, 45510, 45511, 45512, 45513, 45514, + 45515, 45517, 45518, 45519, 45521, 45522, 45523, 45525, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45526, 45527, 45528, 45529, 45530, 45531, + 45534, 45536, 45537, 45538, 45539, 45540, 45541, 45542, 45543, 45546, + 45547, 45549, 45550, 45551, 45553, 45554, 45555, 45556, 45557, 45558, + 45559, 45560, 45562, 45564, 45566, 45567, 45568, 45569, 45570, 45571, + 45574, 45575, 45577, 45578, 45581, 45582, 45583, 45584, 45585, 45586, + 45587, 45590, 45592, 45594, 45595, 45596, 45597, 45598, 45599, 45601, + 45602, 45603, 45604, 45605, 45606, 45607, 45608, 45609, 45610, 45611, + 45612, 45613, 45614, 45615, 45616, 45617, 45618, 45619, 45621, 45622, + 45623, 45624, 45625, 45626, 45627, 45629, 45630, 45631, 45632, 45633, + 45634, 45635, 45636, 45637, 45638, 45639, 45640, 45641, 45642, 45643, + 45644, 45645, 45646, 45647, 45648, 45649, 45650, 45651, 45652, 45653, + 45654, 45655, 45657, 45658, 45659, 45661, 45662, 45663, 45665, 45666, + 45667, 45668, 45669, 45670, 45671, 45674, 45675, 45676, 45677, 45678, + 45679, 45680, 45681, 45682, 45683, 45686, 45687, 45688, 45689, 45690, + 45691, 45693, 45694, 45695, 45696, 45697, 45698, 45699, 45702, 45703, + 45704, 45706, 45707, 45708, 45709, 45710, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45711, 45714, 45715, 45717, 45718, 45719, 45723, 45724, + 45725, 45726, 45727, 45730, 45732, 45735, 45736, 45737, 45739, 45741, + 45742, 45743, 45745, 45746, 45747, 45749, 45750, 45751, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45752, 45753, 45754, 45755, 45756, 45757, + 45758, 45759, 45760, 45761, 45762, 45763, 45764, 45765, 45766, 45767, + 45770, 45771, 45773, 45774, 45775, 45777, 45779, 45780, 45781, 45782, + 45783, 45786, 45788, 45790, 45791, 45792, 45793, 45795, 45799, 45801, + 45802, 45808, 45809, 45810, 45814, 45820, 45821, 45822, 45826, 45827, + 45829, 45830, 45831, 45833, 45834, 45835, 45836, 45837, 45838, 45839, + 45842, 45846, 45847, 45848, 45849, 45850, 45851, 45853, 45854, 45855, + 45856, 45857, 45858, 45859, 45860, 45861, 45862, 45863, 45864, 45865, + 45866, 45867, 45868, 45869, 45870, 45871, 45872, 45873, 45874, 45875, + 45876, 45877, 45878, 45879, 45880, 45881, 45882, 45883, 45884, 45885, + 45886, 45887, 45888, 45889, 45890, 45891, 45892, 45893, 45894, 45895, + 45896, 45897, 45898, 45899, 45900, 45901, 45902, 45903, 45904, 45905, + 45906, 45907, 45911, 45913, 45914, 45917, 45920, 45921, 45922, 45923, + 45926, 45928, 45930, 45932, 45933, 45935, 45938, 45939, 45941, 45942, + 45943, 45945, 45946, 45947, 45948, 45949, 45950, 45951, 45954, 45958, + 45959, 45960, 45961, 45962, 45963, 45965, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45966, 45967, 45969, 45970, 45971, 45973, 45974, 45975, + 45976, 45977, 45978, 45979, 45980, 45981, 45982, 45983, 45986, 45987, + 45988, 45989, 45990, 45991, 45993, 45994, 45995, 45997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45998, 45999, 46000, 46001, 46002, 46003, + 46004, 46005, 46006, 46007, 46008, 46009, 46010, 46011, 46012, 46013, + 46014, 46015, 46016, 46017, 46018, 46019, 46022, 46023, 46025, 46026, + 46029, 46031, 46033, 46034, 46035, 46038, 46040, 46042, 46044, 46046, + 46047, 46049, 46050, 46051, 46053, 46054, 46055, 46057, 46058, 46059, + 46060, 46061, 46062, 46063, 46064, 46065, 46066, 46067, 46068, 46069, + 46070, 46071, 46072, 46073, 46074, 46075, 46077, 46078, 46079, 46080, + 46081, 46082, 46083, 46084, 46085, 46086, 46087, 46088, 46089, 46090, + 46091, 46092, 46093, 46094, 46095, 46097, 46098, 46099, 46100, 46101, + 46102, 46103, 46105, 46106, 46107, 46109, 46110, 46111, 46113, 46114, + 46115, 46116, 46117, 46118, 46119, 46122, 46124, 46125, 46126, 46127, + 46128, 46129, 46130, 46131, 46133, 46134, 46135, 46136, 46137, 46138, + 46139, 46140, 46141, 46142, 46143, 46144, 46145, 46146, 46147, 46148, + 46149, 46150, 46151, 46152, 46153, 46154, 46155, 46156, 46157, 46158, + 46159, 46162, 46163, 46165, 46166, 46167, 46169, 46170, 46171, 46172, + 46173, 46174, 46175, 46178, 46180, 46182, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46183, 46184, 46185, 46186, 46187, 46189, 46190, 46191, + 46192, 46193, 46194, 46195, 46196, 46197, 46198, 46199, 46200, 46201, + 46202, 46203, 46204, 46205, 46206, 46207, 46209, 46210, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46211, 46212, 46213, 46214, 46215, 46217, + 46218, 46219, 46220, 46221, 46222, 46223, 46224, 46225, 46226, 46227, + 46228, 46229, 46230, 46231, 46232, 46233, 46234, 46235, 46236, 46238, + 46239, 46240, 46241, 46242, 46243, 46245, 46246, 46247, 46249, 46250, + 46251, 46253, 46254, 46255, 46256, 46257, 46258, 46259, 46260, 46262, + 46264, 46266, 46267, 46268, 46269, 46270, 46271, 46273, 46274, 46275, + 46277, 46278, 46279, 46281, 46282, 46283, 46284, 46285, 46286, 46287, + 46289, 46290, 46291, 46292, 46294, 46295, 46296, 46297, 46298, 46299, + 46302, 46303, 46305, 46306, 46309, 46311, 46312, 46313, 46314, 46315, + 46318, 46320, 46322, 46323, 46324, 46325, 46326, 46327, 46329, 46330, + 46331, 46332, 46333, 46334, 46335, 46336, 46337, 46338, 46339, 46340, + 46341, 46342, 46343, 46344, 46345, 46346, 46347, 46348, 46349, 46350, + 46351, 46352, 46353, 46354, 46355, 46358, 46359, 46361, 46362, 46365, + 46366, 46367, 46368, 46369, 46370, 46371, 46374, 46379, 46380, 46381, + 46382, 46383, 46386, 46387, 46389, 46390, 46391, 46393, 46394, 46395, + 46396, 46397, 46398, 46399, 46402, 46406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46407, 46408, 46409, 46410, 46414, 46415, 46417, 46418, + 46419, 46421, 46422, 46423, 46424, 46425, 46426, 46427, 46430, 46434, + 46435, 46436, 46437, 46438, 46439, 46440, 46441, 46442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46443, 46444, 46445, 46446, 46447, 46448, + 46449, 46450, 46451, 46452, 46453, 46454, 46455, 46456, 46457, 46458, + 46459, 46460, 46461, 46462, 46463, 46464, 46465, 46466, 46467, 46468, + 46469, 46470, 46471, 46472, 46473, 46474, 46475, 46476, 46477, 46478, + 46479, 46480, 46481, 46482, 46483, 46484, 46485, 46486, 46487, 46488, + 46489, 46490, 46491, 46492, 46493, 46494, 46495, 46498, 46499, 46501, + 46502, 46503, 46505, 46508, 46509, 46510, 46511, 46514, 46518, 46519, + 46520, 46521, 46522, 46526, 46527, 46529, 46530, 46531, 46533, 46534, + 46535, 46536, 46537, 46538, 46539, 46542, 46546, 46547, 46548, 46549, + 46550, 46551, 46553, 46554, 46555, 46556, 46557, 46558, 46559, 46560, + 46561, 46562, 46563, 46564, 46565, 46566, 46567, 46568, 46569, 46570, + 46571, 46573, 46574, 46575, 46576, 46577, 46578, 46579, 46580, 46581, + 46582, 46583, 46584, 46585, 46586, 46587, 46588, 46589, 46590, 46591, + 46592, 46593, 46594, 46595, 46596, 46597, 46598, 46599, 46600, 46601, + 46602, 46603, 46604, 46605, 46606, 46607, 46610, 46611, 46613, 46614, + 46615, 46617, 46618, 46619, 46620, 46621, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46622, 46623, 46624, 46625, 46626, 46627, 46628, 46630, + 46631, 46632, 46633, 46634, 46635, 46637, 46638, 46639, 46640, 46641, + 46642, 46643, 46645, 46646, 46647, 46648, 46649, 46650, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46651, 46652, 46653, 46654, 46655, 46656, + 46657, 46658, 46659, 46660, 46661, 46662, 46663, 46665, 46666, 46667, + 46668, 46669, 46670, 46671, 46672, 46673, 46674, 46675, 46676, 46677, + 46678, 46679, 46680, 46681, 46682, 46683, 46684, 46685, 46686, 46687, + 46688, 46689, 46690, 46691, 46693, 46694, 46695, 46697, 46698, 46699, + 46700, 46701, 46702, 46703, 46704, 46705, 46706, 46707, 46708, 46709, + 46710, 46711, 46712, 46713, 46714, 46715, 46716, 46717, 46718, 46719, + 46720, 46721, 46722, 46723, 46724, 46725, 46726, 46727, 46728, 46729, + 46730, 46731, 46732, 46733, 46734, 46735, 46736, 46737, 46738, 46739, + 46740, 46741, 46742, 46743, 46744, 46745, 46746, 46747, 46750, 46751, + 46753, 46754, 46755, 46757, 46758, 46759, 46760, 46761, 46762, 46765, + 46766, 46767, 46768, 46770, 46771, 46772, 46773, 46774, 46775, 46776, + 46777, 46778, 46779, 46780, 46781, 46782, 46783, 46784, 46785, 46786, + 46787, 46788, 46789, 46790, 46791, 46792, 46793, 46794, 46795, 46796, + 46797, 46798, 46799, 46800, 46801, 46802, 46803, 46805, 46806, 46807, + 46808, 46809, 46810, 46811, 46812, 46813, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46814, 46815, 46816, 46817, 46818, 46819, 46820, 46821, + 46822, 46823, 46824, 46825, 46826, 46827, 46828, 46829, 46830, 46831, + 46833, 46834, 46835, 46837, 46838, 46839, 46841, 46842, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46843, 46844, 46845, 46846, 46847, 46850, + 46851, 46852, 46854, 46855, 46856, 46857, 46858, 46859, 46860, 46861, + 46862, 46863, 46864, 46865, 46866, 46867, 46868, 46869, 46870, 46871, + 46872, 46873, 46874, 46875, 46876, 46877, 46878, 46879, 46880, 46881, + 46882, 46883, 46884, 46885, 46886, 46887, 46890, 46891, 46893, 46894, + 46897, 46898, 46899, 46900, 46901, 46902, 46903, 46906, 46908, 46909, + 46910, 46911, 46912, 46913, 46914, 46915, 46917, 46918, 46919, 46921, + 46922, 46923, 46925, 46926, 46927, 46928, 46929, 46930, 46931, 46934, + 46935, 46936, 46937, 46938, 46939, 46940, 46941, 46942, 46943, 46945, + 46946, 46947, 46949, 46950, 46951, 46953, 46954, 46955, 46956, 46957, + 46958, 46959, 46962, 46964, 46966, 46967, 46968, 46969, 46970, 46971, + 46974, 46975, 46977, 46978, 46979, 46981, 46982, 46983, 46984, 46985, + 46986, 46987, 46990, 46995, 46996, 46997, 47002, 47003, 47005, 47006, + 47007, 47009, 47010, 47011, 47012, 47013, 47014, 47015, 47018, 47022, + 47023, 47024, 47025, 47026, 47027, 47030, 47031, 47033, 47034, 47035, + 47036, 47037, 47038, 47039, 47040, 47041, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47042, 47043, 47044, 47045, 47046, 47048, 47050, 47051, + 47052, 47053, 47054, 47055, 47056, 47057, 47058, 47059, 47060, 47061, + 47062, 47063, 47064, 47065, 47066, 47067, 47068, 47069, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47070, 47071, 47072, 47073, 47074, 47075, + 47076, 47077, 47078, 47079, 47080, 47081, 47082, 47083, 47086, 47087, + 47089, 47090, 47091, 47093, 47094, 47095, 47096, 47097, 47098, 47099, + 47102, 47106, 47107, 47108, 47109, 47110, 47114, 47115, 47117, 47118, + 47119, 47121, 47122, 47123, 47124, 47125, 47126, 47127, 47130, 47132, + 47134, 47135, 47136, 47137, 47138, 47139, 47142, 47143, 47145, 47146, + 47147, 47149, 47150, 47151, 47152, 47153, 47154, 47155, 47158, 47162, + 47163, 47164, 47165, 47166, 47167, 47169, 47170, 47171, 47173, 47174, + 47175, 47176, 47177, 47178, 47179, 47180, 47181, 47182, 47183, 47184, + 47186, 47188, 47189, 47190, 47191, 47192, 47193, 47194, 47195, 47198, + 47199, 47201, 47202, 47203, 47205, 47206, 47207, 47208, 47209, 47210, + 47211, 47214, 47216, 47218, 47219, 47220, 47221, 47222, 47223, 47225, + 47226, 47227, 47229, 47230, 47231, 47232, 47233, 47234, 47235, 47236, + 47237, 47238, 47239, 47240, 47241, 47242, 47243, 47244, 47246, 47247, + 47248, 47249, 47250, 47251, 47252, 47253, 47254, 47255, 47256, 47257, + 47258, 47259, 47260, 47261, 47262, 47263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47264, 47265, 47266, 47267, 47268, 47269, 47270, 47271, + 47273, 47274, 47275, 47276, 47277, 47278, 47279, 47281, 47282, 47283, + 47285, 47286, 47287, 47289, 47290, 47291, 47292, 47293, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47294, 47295, 47298, 47300, 47302, 47303, + 47304, 47305, 47306, 47307, 47309, 47310, 47311, 47313, 47314, 47315, + 47317, 47318, 47319, 47320, 47321, 47322, 47323, 47324, 47326, 47328, + 47330, 47331, 47332, 47333, 47334, 47335, 47338, 47339, 47341, 47342, + 47343, 47345, 47346, 47347, 47348, 47349, 47350, 47351, 47354, 47356, + 47358, 47359, 47360, 47361, 47362, 47363, 47365, 47366, 47367, 47368, + 47369, 47370, 47371, 47372, 47373, 47374, 47375, 47376, 47377, 47378, + 47379, 47380, 47381, 47382, 47383, 47385, 47386, 47387, 47388, 47389, + 47390, 47391, 47393, 47394, 47395, 47396, 47397, 47398, 47399, 47400, + 47401, 47402, 47403, 47404, 47405, 47406, 47407, 47408, 47409, 47410, + 47411, 47412, 47413, 47414, 47415, 47416, 47417, 47418, 47419, 47422, + 47423, 47425, 47426, 47427, 47429, 47430, 47431, 47432, 47433, 47434, + 47435, 47437, 47438, 47440, 47442, 47443, 47444, 47445, 47446, 47447, + 47450, 47451, 47453, 47454, 47455, 47457, 47458, 47459, 47460, 47461, + 47462, 47463, 47466, 47468, 47470, 47471, 47472, 47473, 47474, 47475, + 47478, 47479, 47481, 47482, 47483, 47485, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47486, 47487, 47488, 47489, 47490, 47491, 47494, 47496, + 47499, 47500, 47503, 47504, 47505, 47506, 47507, 47508, 47509, 47510, + 47511, 47512, 47513, 47514, 47515, 47516, 47517, 47518, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47519, 47520, 47521, 47522, 47523, 47524, + 47525, 47526, 47527, 47528, 47529, 47530, 47531, 47534, 47535, 47537, + 47538, 47539, 47541, 47542, 47543, 47544, 47545, 47546, 47547, 47550, + 47552, 47554, 47555, 47556, 47557, 47558, 47559, 47562, 47563, 47565, + 47571, 47572, 47573, 47574, 47575, 47578, 47580, 47583, 47584, 47586, + 47590, 47591, 47593, 47594, 47595, 47597, 47598, 47599, 47600, 47601, + 47602, 47603, 47606, 47611, 47612, 47613, 47614, 47615, 47618, 47619, + 47620, 47621, 47622, 47623, 47625, 47626, 47627, 47628, 47629, 47630, + 47631, 47632, 47633, 47634, 47635, 47636, 47638, 47639, 47640, 47641, + 47642, 47643, 47644, 47645, 47646, 47647, 47648, 47649, 47650, 47651, + 47652, 47653, 47654, 47655, 47656, 47657, 47658, 47659, 47660, 47661, + 47662, 47663, 47664, 47665, 47666, 47667, 47668, 47669, 47670, 47671, + 47674, 47675, 47677, 47678, 47679, 47681, 47683, 47684, 47685, 47686, + 47687, 47690, 47692, 47695, 47696, 47697, 47698, 47702, 47703, 47705, + 47706, 47707, 47709, 47710, 47711, 47712, 47713, 47714, 47715, 47718, + 47722, 47723, 47724, 47725, 47726, 47727, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47730, 47731, 47733, 47734, 47735, 47737, 47738, 47739, + 47740, 47741, 47742, 47743, 47744, 47745, 47746, 47750, 47752, 47753, + 47754, 47755, 47757, 47758, 47759, 47760, 47761, 47762, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47763, 47764, 47765, 47766, 47767, 47768, + 47769, 47770, 47771, 47772, 47773, 47774, 47775, 47776, 47777, 47778, + 47779, 47780, 47781, 47782, 47783, 47786, 47789, 47790, 47791, 47793, + 47795, 47796, 47797, 47798, 47799, 47802, 47804, 47806, 47807, 47808, + 47809, 47810, 47811, 47813, 47814, 47815, 47817, 47818, 47819, 47820, + 47821, 47822, 47823, 47824, 47825, 47826, 47827, 47828, 47829, 47830, + 47831, 47834, 47835, 47836, 47837, 47838, 47839, 47840, 47841, 47842, + 47843, 47844, 47845, 47846, 47847, 47848, 47849, 47850, 47851, 47852, + 47853, 47854, 47855, 47856, 47857, 47858, 47859, 47860, 47861, 47862, + 47863, 47864, 47865, 47866, 47867, 47869, 47870, 47871, 47873, 47874, + 47875, 47877, 47878, 47879, 47880, 47881, 47882, 47883, 47884, 47886, + 47888, 47890, 47891, 47892, 47893, 47894, 47895, 47897, 47898, 47899, + 47901, 47902, 47903, 47905, 47906, 47907, 47908, 47909, 47910, 47911, + 47912, 47914, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, + 47927, 47929, 47930, 47935, 47936, 47937, 47938, 47939, 47942, 47944, + 47946, 47947, 47948, 47950, 47953, 47954, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47955, 47957, 47958, 47959, 47961, 47962, 47963, 47964, + 47965, 47966, 47967, 47968, 47970, 47972, 47973, 47974, 47975, 47976, + 47977, 47978, 47979, 47981, 47982, 47983, 47984, 47985, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47986, 47987, 47988, 47989, 47990, 47991, + 47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, + 48002, 48003, 48004, 48005, 48006, 48007, 48009, 48010, 48011, 48013, + 48014, 48015, 48017, 48018, 48019, 48020, 48021, 48022, 48023, 48024, + 48025, 48026, 48027, 48028, 48029, 48030, 48031, 48032, 48033, 48034, + 48035, 48037, 48038, 48039, 48041, 48042, 48043, 48045, 48046, 48047, + 48048, 48049, 48050, 48051, 48053, 48054, 48056, 48057, 48058, 48059, + 48060, 48061, 48062, 48063, 48065, 48066, 48067, 48069, 48070, 48071, + 48073, 48074, 48075, 48076, 48077, 48078, 48079, 48081, 48082, 48084, + 48085, 48086, 48087, 48088, 48089, 48090, 48091, 48092, 48093, 48094, + 48095, 48096, 48097, 48098, 48099, 48100, 48101, 48102, 48103, 48104, + 48105, 48106, 48107, 48108, 48109, 48110, 48111, 48112, 48113, 48114, + 48115, 48116, 48117, 48118, 48119, 48122, 48123, 48125, 48126, 48129, + 48131, 48132, 48133, 48134, 48135, 48138, 48142, 48144, 48146, 48147, + 48153, 48154, 48160, 48161, 48162, 48163, 48166, 48168, 48170, 48171, + 48172, 48174, 48175, 48178, 48179, 48181, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48182, 48183, 48185, 48186, 48187, 48188, 48189, 48190, + 48191, 48194, 48198, 48199, 48200, 48202, 48203, 48206, 48207, 48209, + 48210, 48211, 48212, 48213, 48214, 48215, 48216, 48217, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48218, 48219, 48220, 48222, 48223, 48224, + 48225, 48226, 48227, 48228, 48229, 48230, 48231, 48232, 48233, 48234, + 48235, 48236, 48237, 48238, 48239, 48240, 48241, 48242, 48243, 48244, + 48245, 48246, 48247, 48248, 48249, 48250, 48251, 48252, 48253, 48254, + 48255, 48256, 48257, 48258, 48259, 48262, 48263, 48265, 48266, 48269, + 48271, 48272, 48273, 48274, 48275, 48278, 48280, 48283, 48284, 48285, + 48286, 48287, 48290, 48291, 48293, 48294, 48297, 48298, 48299, 48300, + 48301, 48302, 48303, 48306, 48310, 48311, 48312, 48313, 48314, 48315, + 48318, 48319, 48321, 48322, 48323, 48325, 48326, 48327, 48328, 48329, + 48330, 48331, 48332, 48334, 48338, 48339, 48340, 48342, 48343, 48345, + 48346, 48347, 48349, 48350, 48351, 48352, 48353, 48354, 48355, 48356, + 48357, 48358, 48359, 48360, 48361, 48362, 48363, 48364, 48365, 48366, + 48367, 48368, 48369, 48370, 48371, 48375, 48377, 48378, 48379, 48381, + 48382, 48383, 48384, 48385, 48386, 48387, 48390, 48392, 48394, 48395, + 48396, 48397, 48398, 48399, 48401, 48402, 48403, 48405, 48406, 48407, + 48408, 48409, 48410, 48411, 48412, 48413, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48414, 48415, 48416, 48417, 48418, 48419, 48421, 48422, + 48423, 48424, 48425, 48426, 48427, 48429, 48430, 48431, 48432, 48433, + 48434, 48435, 48436, 48437, 48438, 48439, 48440, 48441, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48442, 48443, 48444, 48445, 48446, 48447, + 48449, 48450, 48451, 48452, 48453, 48454, 48455, 48458, 48459, 48461, + 48462, 48463, 48465, 48466, 48467, 48468, 48469, 48470, 48471, 48474, + 48475, 48476, 48477, 48478, 48479, 48480, 48481, 48482, 48483, 48485, + 48486, 48487, 48489, 48490, 48491, 48492, 48493, 48494, 48495, 48496, + 48497, 48498, 48499, 48500, 48501, 48502, 48503, 48504, 48505, 48506, + 48507, 48508, 48509, 48510, 48511, 48514, 48515, 48517, 48518, 48523, + 48524, 48525, 48526, 48527, 48530, 48532, 48534, 48535, 48536, 48539, + 48541, 48542, 48543, 48544, 48545, 48546, 48547, 48549, 48550, 48551, + 48552, 48553, 48554, 48555, 48556, 48557, 48558, 48559, 48561, 48562, + 48563, 48564, 48565, 48566, 48567, 48569, 48570, 48571, 48572, 48573, + 48574, 48575, 48576, 48577, 48578, 48579, 48580, 48581, 48582, 48583, + 48584, 48585, 48586, 48587, 48588, 48589, 48590, 48591, 48592, 48593, + 48594, 48595, 48598, 48599, 48601, 48602, 48603, 48605, 48606, 48607, + 48608, 48609, 48610, 48611, 48612, 48613, 48614, 48615, 48616, 48618, + 48619, 48620, 48621, 48622, 48623, 48625, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48626, 48627, 48629, 48630, 48631, 48633, 48634, 48635, + 48636, 48637, 48638, 48639, 48641, 48642, 48644, 48646, 48647, 48648, + 48649, 48650, 48651, 48654, 48655, 48657, 48658, 48659, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48661, 48662, 48663, 48664, 48665, 48666, + 48667, 48670, 48672, 48673, 48674, 48675, 48676, 48677, 48678, 48679, + 48680, 48681, 48682, 48683, 48684, 48685, 48686, 48687, 48688, 48689, + 48690, 48691, 48692, 48693, 48694, 48695, 48696, 48697, 48698, 48699, + 48700, 48701, 48702, 48703, 48704, 48705, 48706, 48707, 48710, 48711, + 48713, 48714, 48715, 48717, 48719, 48720, 48721, 48722, 48723, 48726, + 48728, 48732, 48733, 48734, 48735, 48738, 48739, 48741, 48742, 48743, + 48745, 48747, 48748, 48749, 48750, 48751, 48754, 48758, 48759, 48760, + 48761, 48762, 48766, 48767, 48769, 48770, 48771, 48773, 48774, 48775, + 48776, 48777, 48778, 48779, 48782, 48786, 48787, 48788, 48789, 48790, + 48791, 48794, 48795, 48796, 48797, 48798, 48799, 48800, 48801, 48802, + 48803, 48804, 48805, 48806, 48807, 48809, 48810, 48811, 48812, 48813, + 48814, 48815, 48816, 48817, 48818, 48819, 48820, 48821, 48822, 48823, + 48824, 48825, 48826, 48827, 48828, 48829, 48830, 48831, 48832, 48833, + 48834, 48835, 48836, 48837, 48838, 48839, 48840, 48841, 48842, 48843, + 48844, 48845, 48846, 48847, 48850, 48851, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48853, 48854, 48857, 48858, 48859, 48860, 48861, 48862, + 48863, 48865, 48866, 48870, 48871, 48872, 48873, 48874, 48875, 48877, + 48878, 48879, 48880, 48881, 48882, 48883, 48884, 48885, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48886, 48887, 48888, 48889, 48890, 48891, + 48892, 48893, 48894, 48895, 48896, 48898, 48899, 48900, 48901, 48902, + 48903, 48906, 48907, 48908, 48909, 48910, 48911, 48912, 48913, 48914, + 48915, 48916, 48917, 48918, 48919, 48922, 48926, 48927, 48928, 48929, + 48930, 48931, 48932, 48933, 48934, 48935, 48936, 48937, 48938, 48939, + 48940, 48941, 48942, 48943, 48944, 48945, 48946, 48947, 48948, 48949, + 48950, 48951, 48952, 48953, 48954, 48955, 48956, 48957, 48958, 48959, + 48962, 48963, 48965, 48966, 48967, 48969, 48970, 48971, 48972, 48973, + 48974, 48975, 48978, 48979, 48980, 48982, 48983, 48984, 48985, 48986, + 48987, 48988, 48989, 48990, 48991, 48992, 48993, 48994, 48995, 48996, + 48997, 48998, 48999, 49000, 49001, 49002, 49003, 49004, 49005, 49006, + 49007, 49008, 49009, 49010, 49011, 49012, 49013, 49014, 49015, 49016, + 49017, 49018, 49019, 49020, 49021, 49022, 49023, 49024, 49025, 49026, + 49027, 49028, 49029, 49030, 49031, 49032, 49033, 49034, 49035, 49036, + 49037, 49038, 49039, 49040, 49041, 49042, 49043, 49045, 49046, 49047, + 49048, 49049, 49050, 49051, 49052, 49053, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49054, 49055, 49056, 49057, 49058, 49059, 49060, 49061, + 49062, 49063, 49064, 49065, 49066, 49067, 49068, 49069, 49070, 49071, + 49073, 49074, 49075, 49076, 49077, 49078, 49079, 49080, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49081, 49082, 49083, 49084, 49085, 49086, + 49087, 49088, 49089, 49090, 49091, 49092, 49094, 49095, 49096, 49097, + 49098, 49099, 49102, 49103, 49105, 49106, 49107, 49109, 49110, 49111, + 49112, 49113, 49114, 49115, 49117, 49118, 49120, 49122, 49123, 49124, + 49125, 49126, 49127, 49128, 49129, 49130, 49131, 49132, 49133, 49134, + 49135, 49136, 49137, 49138, 49139, 49140, 49141, 49142, 49143, 49144, + 49145, 49146, 49147, 49148, 49149, 49150, 49151, 49152, 49153, 49154, + 49155, 49156, 49157, 49158, 49159, 49160, 49161, 49162, 49163, 49164, + 49165, 49166, 49167, 49168, 49169, 49170, 49171, 49172, 49173, 49174, + 49175, 49176, 49177, 49178, 49179, 49180, 49181, 49182, 49183, 49184, + 49185, 49186, 49187, 49188, 49189, 49190, 49191, 49192, 49193, 49194, + 49195, 49196, 49197, 49198, 49199, 49200, 49201, 49202, 49203, 49204, + 49205, 49206, 49207, 49208, 49209, 49210, 49211, 49213, 49214, 49215, + 49216, 49217, 49218, 49219, 49220, 49221, 49222, 49223, 49224, 49225, + 49226, 49227, 49228, 49229, 49230, 49231, 49232, 49234, 49235, 49236, + 49237, 49238, 49239, 49241, 49242, 49243, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49245, 49246, 49247, 49249, 49250, 49251, 49252, 49253, + 49254, 49255, 49258, 49259, 49260, 49261, 49262, 49263, 49264, 49265, + 49266, 49267, 49268, 49269, 49270, 49271, 49272, 49273, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49274, 49275, 49276, 49277, 49278, 49279, + 49280, 49281, 49282, 49283, 49284, 49285, 49286, 49287, 49288, 49289, + 49290, 49291, 49292, 49293, 49294, 49295, 49298, 49299, 49301, 49302, + 49303, 49305, 49306, 49307, 49308, 49309, 49310, 49311, 49314, 49316, + 49318, 49319, 49320, 49321, 49322, 49323, 49326, 49329, 49330, 49335, + 49336, 49337, 49338, 49339, 49342, 49346, 49347, 49348, 49350, 49351, + 49354, 49355, 49357, 49358, 49359, 49361, 49362, 49363, 49364, 49365, + 49366, 49367, 49370, 49374, 49375, 49376, 49377, 49378, 49379, 49382, + 49383, 49385, 49386, 49387, 49389, 49390, 49391, 49392, 49393, 49394, + 49395, 49398, 49400, 49402, 49403, 49404, 49405, 49406, 49407, 49409, + 49410, 49411, 49413, 49414, 49415, 49417, 49418, 49419, 49420, 49421, + 49422, 49423, 49425, 49426, 49427, 49428, 49430, 49431, 49432, 49433, + 49434, 49435, 49441, 49442, 49445, 49448, 49449, 49450, 49451, 49454, + 49458, 49459, 49460, 49461, 49463, 49466, 49467, 49469, 49470, 49471, + 49473, 49474, 49475, 49476, 49477, 49478, 49479, 49482, 49486, 49487, + 49488, 49489, 49490, 49491, 49494, 49495, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49497, 49498, 49499, 49501, 49502, 49503, 49504, 49505, + 49506, 49507, 49510, 49514, 49515, 49516, 49517, 49518, 49519, 49521, + 49522, 49523, 49525, 49526, 49527, 49529, 49530, 49531, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49532, 49533, 49534, 49535, 49536, 49537, + 49538, 49539, 49540, 49542, 49543, 49544, 49545, 49546, 49547, 49551, + 49553, 49554, 49555, 49557, 49559, 49560, 49561, 49562, 49563, 49566, + 49568, 49570, 49571, 49572, 49574, 49575, 49578, 49579, 49581, 49582, + 49583, 49585, 49586, 49587, 49588, 49589, 49590, 49591, 49592, 49593, + 49594, 49595, 49596, 49598, 49599, 49600, 49601, 49602, 49603, 49605, + 49606, 49607, 49609, 49610, 49611, 49613, 49614, 49615, 49616, 49617, + 49618, 49619, 49621, 49622, 49625, 49626, 49627, 49628, 49629, 49630, + 49631, 49633, 49634, 49635, 49637, 49638, 49639, 49641, 49642, 49643, + 49644, 49645, 49646, 49647, 49650, 49652, 49653, 49654, 49655, 49656, + 49657, 49658, 49659, 49662, 49663, 49665, 49666, 49667, 49669, 49670, + 49671, 49672, 49673, 49674, 49675, 49678, 49680, 49682, 49683, 49684, + 49685, 49686, 49687, 49690, 49691, 49693, 49694, 49697, 49698, 49699, + 49700, 49701, 49702, 49703, 49706, 49708, 49710, 49712, 49715, 49717, + 49718, 49719, 49720, 49721, 49722, 49723, 49724, 49725, 49726, 49727, + 49728, 49729, 49730, 49731, 49732, 49733, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49734, 49735, 49737, 49738, 49739, 49740, 49741, 49742, + 49743, 49746, 49747, 49749, 49750, 49751, 49753, 49754, 49755, 49756, + 49757, 49758, 49759, 49761, 49762, 49763, 49764, 49766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49767, 49768, 49769, 49770, 49771, 49774, + 49775, 49777, 49778, 49779, 49781, 49782, 49783, 49784, 49785, 49786, + 49787, 49790, 49792, 49794, 49795, 49796, 49797, 49798, 49799, 49802, + 49803, 49804, 49805, 49806, 49807, 49809, 49810, 49811, 49812, 49813, + 49814, 49815, 49817, 49818, 49820, 49822, 49823, 49824, 49825, 49826, + 49827, 49830, 49831, 49833, 49834, 49835, 49838, 49839, 49840, 49841, + 49842, 49843, 49846, 49848, 49850, 49851, 49852, 49853, 49854, 49855, + 49856, 49857, 49858, 49859, 49860, 49861, 49862, 49863, 49864, 49865, + 49866, 49867, 49868, 49869, 49870, 49871, 49872, 49873, 49874, 49875, + 49876, 49877, 49878, 49879, 49880, 49881, 49882, 49883, 49886, 49887, + 49889, 49890, 49893, 49894, 49895, 49896, 49897, 49898, 49902, 49904, + 49906, 49907, 49908, 49909, 49911, 49914, 49917, 49918, 49919, 49921, + 49922, 49923, 49924, 49925, 49926, 49927, 49930, 49931, 49934, 49935, + 49936, 49937, 49938, 49942, 49943, 49945, 49946, 49947, 49949, 49950, + 49951, 49952, 49953, 49954, 49955, 49958, 49959, 49962, 49963, 49964, + 49965, 49966, 49967, 49968, 49969, 49970, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49971, 49972, 49973, 49974, 49975, 49976, 49977, 49978, + 49979, 49980, 49981, 49982, 49983, 49984, 49985, 49986, 49987, 49988, + 49990, 49991, 49992, 49993, 49994, 49995, 49996, 49997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49998, 49999, 50000, 50001, 50002, 50003, + 50004, 50005, 50006, 50007, 50008, 50009, 50010, 50011, 50012, 50013, + 50014, 50015, 50016, 50017, 50018, 50019, 50020, 50021, 50022, 50023, + 50026, 50027, 50029, 50030, 50031, 50033, 50035, 50036, 50037, 50038, + 50039, 50042, 50043, 50046, 50047, 50048, 50049, 50050, 50051, 50053, + 50054, 50055, 50057, 50058, 50059, 50061, 50062, 50063, 50064, 50065, + 50066, 50067, 50068, 50069, 50070, 50071, 50072, 50073, 50074, 50075, + 50076, 50077, 50078, 50079, 50080, 50081, 50082, 50083, 50084, 50085, + 50086, 50087, 50088, 50089, 50090, 50091, 50092, 50093, 50094, 50095, + 50096, 50097, 50098, 50099, 50100, 50101, 50102, 50103, 50104, 50105, + 50106, 50107, 50108, 50109, 50110, 50111, 50113, 50114, 50115, 50116, + 50117, 50118, 50119, 50120, 50121, 50122, 50123, 50124, 50125, 50126, + 50127, 50128, 50129, 50130, 50131, 50132, 50133, 50134, 50135, 50138, + 50139, 50141, 50142, 50145, 50147, 50148, 50149, 50150, 50151, 50154, + 50155, 50156, 50158, 50159, 50160, 50161, 50162, 50163, 50166, 50167, + 50169, 50170, 50171, 50172, 50173, 50174, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50175, 50176, 50177, 50178, 50179, 50180, 50181, 50182, + 50183, 50185, 50186, 50187, 50188, 50189, 50190, 50191, 50193, 50194, + 50195, 50196, 50197, 50198, 50199, 50200, 50201, 50202, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50203, 50204, 50205, 50206, 50207, 50208, + 50209, 50210, 50211, 50213, 50214, 50215, 50216, 50217, 50218, 50219, + 50221, 50222, 50223, 50225, 50226, 50227, 50229, 50230, 50231, 50232, + 50233, 50234, 50235, 50238, 50239, 50240, 50241, 50242, 50243, 50244, + 50245, 50246, 50247, 50249, 50250, 50251, 50252, 50253, 50254, 50255, + 50256, 50257, 50258, 50259, 50260, 50261, 50262, 50263, 50264, 50265, + 50266, 50267, 50268, 50269, 50270, 50271, 50272, 50273, 50274, 50275, + 50278, 50279, 50281, 50282, 50283, 50285, 50286, 50287, 50288, 50289, + 50290, 50291, 50294, 50295, 50296, 50298, 50299, 50300, 50301, 50302, + 50303, 50305, 50306, 50307, 50308, 50309, 50310, 50311, 50312, 50313, + 50314, 50315, 50316, 50317, 50318, 50319, 50320, 50321, 50322, 50323, + 50325, 50326, 50327, 50328, 50329, 50330, 50331, 50333, 50334, 50335, + 50336, 50337, 50338, 50339, 50340, 50341, 50342, 50343, 50344, 50345, + 50346, 50347, 50348, 50349, 50350, 50351, 50352, 50353, 50354, 50355, + 50356, 50357, 50358, 50359, 50361, 50362, 50363, 50365, 50366, 50367, + 50368, 50369, 50370, 50371, 50372, 50373, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50374, 50375, 50376, 50377, 50378, 50379, 50380, 50381, + 50382, 50383, 50384, 50385, 50386, 50387, 50388, 50389, 50390, 50391, + 50392, 50393, 50394, 50395, 50396, 50397, 50398, 50399, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50400, 50401, 50402, 50403, 50404, 50405, + 50406, 50407, 50408, 50410, 50411, 50412, 50413, 50414, 50415, 50418, + 50419, 50421, 50422, 50423, 50425, 50427, 50428, 50429, 50430, 50434, + 50435, 50436, 50437, 50438, 50439, 50440, 50441, 50442, 50443, 50445, + 50446, 50447, 50449, 50450, 50451, 50453, 50454, 50455, 50456, 50457, + 50458, 50459, 50461, 50462, 50463, 50464, 50465, 50466, 50467, 50468, + 50469, 50470, 50471, 50474, 50475, 50477, 50478, 50479, 50481, 50482, + 50483, 50484, 50485, 50486, 50487, 50490, 50492, 50494, 50495, 50496, + 50497, 50498, 50499, 50502, 50503, 50507, 50511, 50512, 50513, 50514, + 50518, 50522, 50523, 50524, 50527, 50530, 50531, 50533, 50534, 50535, + 50537, 50538, 50539, 50540, 50541, 50542, 50543, 50546, 50550, 50551, + 50552, 50553, 50554, 50555, 50558, 50559, 50561, 50562, 50563, 50565, + 50566, 50568, 50569, 50570, 50571, 50574, 50576, 50578, 50579, 50580, + 50582, 50585, 50586, 50587, 50589, 50590, 50591, 50593, 50594, 50595, + 50596, 50597, 50598, 50599, 50600, 50602, 50603, 50604, 50605, 50606, + 50607, 50608, 50609, 50610, 50611, 50614, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50615, 50618, 50623, 50624, 50625, 50626, 50627, 50635, + 50637, 50639, 50642, 50643, 50645, 50646, 50647, 50649, 50650, 50651, + 50652, 50653, 50654, 50655, 50658, 50660, 50662, 50663, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50664, 50665, 50666, 50667, 50671, 50673, + 50674, 50675, 50677, 50680, 50681, 50682, 50683, 50690, 50691, 50692, + 50697, 50698, 50699, 50701, 50702, 50703, 50705, 50706, 50707, 50708, + 50709, 50710, 50711, 50714, 50717, 50718, 50719, 50720, 50721, 50722, + 50723, 50726, 50727, 50729, 50730, 50731, 50735, 50737, 50738, 50742, + 50744, 50746, 50748, 50749, 50750, 50751, 50754, 50755, 50757, 50758, + 50759, 50761, 50762, 50763, 50764, 50765, 50766, 50767, 50770, 50774, + 50775, 50776, 50777, 50778, 50779, 50782, 50783, 50785, 50786, 50787, + 50788, 50789, 50790, 50791, 50792, 50793, 50794, 50795, 50797, 50798, + 50800, 50802, 50803, 50804, 50805, 50806, 50807, 50810, 50811, 50813, + 50814, 50815, 50817, 50818, 50819, 50820, 50821, 50822, 50823, 50826, + 50828, 50830, 50831, 50832, 50833, 50834, 50835, 50838, 50839, 50841, + 50842, 50843, 50845, 50846, 50847, 50848, 50849, 50850, 50851, 50854, + 50856, 50858, 50859, 50860, 50861, 50862, 50863, 50866, 50867, 50869, + 50870, 50871, 50875, 50876, 50877, 50878, 50879, 50882, 50884, 50886, + 50887, 50888, 50889, 50890, 50891, 50894, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50895, 50897, 50898, 50899, 50901, 50902, 50903, 50904, + 50905, 50906, 50907, 50910, 50911, 50914, 50915, 50916, 50917, 50918, + 50919, 50922, 50923, 50925, 50926, 50927, 50929, 50930, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50931, 50932, 50933, 50934, 50935, 50938, + 50939, 50940, 50942, 50943, 50944, 50945, 50946, 50947, 50950, 50951, + 50953, 50954, 50955, 50957, 50958, 50959, 50960, 50961, 50962, 50963, + 50966, 50968, 50970, 50971, 50972, 50973, 50974, 50975, 50978, 50979, + 50981, 50982, 50983, 50985, 50986, 50987, 50988, 50989, 50990, 50991, + 50994, 50996, 50998, 51000, 51001, 51002, 51003, 51006, 51007, 51009, + 51010, 51011, 51013, 51014, 51015, 51016, 51017, 51019, 51022, 51024, + 51033, 51034, 51035, 51037, 51038, 51039, 51041, 51042, 51043, 51044, + 51045, 51046, 51047, 51049, 51050, 51052, 51053, 51054, 51055, 51056, + 51057, 51058, 51059, 51062, 51063, 51065, 51066, 51067, 51071, 51072, + 51073, 51074, 51078, 51083, 51084, 51085, 51087, 51090, 51091, 51093, + 51097, 51099, 51100, 51101, 51102, 51103, 51106, 51111, 51112, 51113, + 51114, 51115, 51118, 51119, 51121, 51122, 51123, 51125, 51126, 51127, + 51128, 51129, 51130, 51131, 51134, 51138, 51139, 51140, 51141, 51142, + 51143, 51146, 51147, 51149, 51151, 51153, 51154, 51155, 51156, 51157, + 51158, 51159, 51161, 51162, 51163, 51164, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51166, 51167, 51168, 51169, 51170, 51171, 51173, 51174, + 51175, 51177, 51178, 51179, 51181, 51182, 51183, 51184, 51185, 51186, + 51187, 51188, 51189, 51190, 51191, 51192, 51193, 51194, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51195, 51196, 51197, 51198, 51199, 51202, + 51203, 51205, 51206, 51207, 51209, 51211, 51212, 51213, 51214, 51215, + 51218, 51220, 51223, 51224, 51225, 51226, 51227, 51230, 51231, 51233, + 51234, 51235, 51237, 51238, 51239, 51240, 51241, 51242, 51243, 51246, + 51248, 51250, 51251, 51252, 51253, 51254, 51255, 51257, 51258, 51259, + 51261, 51262, 51263, 51265, 51266, 51267, 51268, 51269, 51270, 51271, + 51274, 51275, 51278, 51279, 51280, 51281, 51282, 51283, 51285, 51286, + 51287, 51288, 51289, 51290, 51291, 51292, 51293, 51294, 51295, 51296, + 51297, 51298, 51299, 51300, 51301, 51302, 51303, 51304, 51305, 51306, + 51307, 51308, 51309, 51310, 51311, 51314, 51315, 51317, 51318, 51319, + 51321, 51323, 51324, 51325, 51326, 51327, 51330, 51332, 51336, 51337, + 51338, 51342, 51343, 51344, 51345, 51346, 51347, 51349, 51350, 51351, + 51352, 51353, 51354, 51355, 51356, 51358, 51360, 51362, 51363, 51364, + 51365, 51366, 51367, 51369, 51370, 51371, 51372, 51373, 51374, 51375, + 51376, 51377, 51378, 51379, 51380, 51381, 51382, 51383, 51384, 51385, + 51386, 51387, 51390, 51391, 51392, 51393, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51394, 51395, 51397, 51398, 51399, 51401, 51402, 51403, + 51405, 51406, 51407, 51408, 51409, 51410, 51411, 51414, 51416, 51418, + 51419, 51420, 51421, 51422, 51423, 51426, 51427, 51429, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51430, 51431, 51432, 51433, 51434, 51435, + 51436, 51437, 51438, 51439, 51440, 51441, 51442, 51443, 51444, 51446, + 51447, 51448, 51449, 51450, 51451, 51454, 51455, 51457, 51458, 51459, + 51463, 51464, 51465, 51466, 51467, 51470, 12288, 12289, 12290, 183, + 8229, 8230, 168, 12291, 173, 8213, 8741, 65340, 8764, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12304, 12305, 177, 215, 247, 8800, 8804, + 8805, 8734, 8756, 176, 8242, 8243, 8451, 8491, 65504, 65505, + 65509, 9794, 9792, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 167, 8251, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, + 9632, 9651, 9650, 9661, 9660, 8594, 8592, 8593, 8595, 8596, + 12307, 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 8743, 8744, 65506, + 51472, 51474, 51475, 51476, 51477, 51478, 51479, 51481, 51482, 51483, + 51484, 51485, 51486, 51487, 51488, 51489, 51490, 51491, 51492, 51493, + 51494, 51495, 51496, 51497, 51498, 51499, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51501, 51502, 51503, 51504, 51505, 51506, 51507, 51509, + 51510, 51511, 51512, 51513, 51514, 51515, 51516, 51517, 51518, 51519, + 51520, 51521, 51522, 51523, 51524, 51525, 51526, 51527, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51528, 51529, 51530, 51531, 51532, 51533, + 51534, 51535, 51538, 51539, 51541, 51542, 51543, 51545, 51546, 51547, + 51548, 51549, 51550, 51551, 51554, 51556, 51557, 51558, 51559, 51560, + 51561, 51562, 51563, 51565, 51566, 51567, 8658, 8660, 8704, 8707, + 180, 65374, 711, 728, 733, 730, 729, 184, 731, 161, + 191, 720, 8750, 8721, 8719, 164, 8457, 8240, 9665, 9664, + 9655, 9654, 9828, 9824, 9825, 9829, 9831, 9827, 8857, 9672, + 9635, 9680, 9681, 9618, 9636, 9637, 9640, 9639, 9638, 9641, + 9832, 9743, 9742, 9756, 9758, 182, 8224, 8225, 8597, 8599, + 8601, 8598, 8600, 9837, 9833, 9834, 9836, 12927, 12828, 8470, + 13255, 8482, 13250, 13272, 8481, 8364, 174, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51569, 51570, 51571, 51573, 51574, 51575, 51576, 51577, 51578, 51579, + 51581, 51582, 51583, 51584, 51585, 51586, 51587, 51588, 51589, 51590, + 51591, 51594, 51595, 51597, 51598, 51599, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51601, 51602, 51603, 51604, 51605, 51606, 51607, 51610, + 51612, 51614, 51615, 51616, 51617, 51618, 51619, 51620, 51621, 51622, + 51623, 51624, 51625, 51626, 51627, 51628, 51629, 51630, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51631, 51632, 51633, 51634, 51635, 51636, + 51637, 51638, 51639, 51640, 51641, 51642, 51643, 51644, 51645, 51646, + 51647, 51650, 51651, 51653, 51654, 51657, 51659, 51660, 51661, 51662, + 51663, 51666, 51668, 51671, 51672, 51675, 65281, 65282, 65283, 65284, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65510, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 51678, 51679, 51681, 51683, 51685, 51686, 51688, 51689, 51690, 51691, + 51694, 51698, 51699, 51700, 51701, 51702, 51703, 51706, 51707, 51709, + 51710, 51711, 51713, 51714, 51715, 51716, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51717, 51718, 51719, 51722, 51726, 51727, 51728, 51729, + 51730, 51731, 51733, 51734, 51735, 51737, 51738, 51739, 51740, 51741, + 51742, 51743, 51744, 51745, 51746, 51747, 51748, 51749, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51750, 51751, 51752, 51754, 51755, 51756, + 51757, 51758, 51759, 51760, 51761, 51762, 51763, 51764, 51765, 51766, + 51767, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, + 51777, 51778, 51779, 51780, 51781, 51782, 12593, 12594, 12595, 12596, + 12597, 12598, 12599, 12600, 12601, 12602, 12603, 12604, 12605, 12606, + 12607, 12608, 12609, 12610, 12611, 12612, 12613, 12614, 12615, 12616, + 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625, 12626, + 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635, 12636, + 12637, 12638, 12639, 12640, 12641, 12642, 12643, 12644, 12645, 12646, + 12647, 12648, 12649, 12650, 12651, 12652, 12653, 12654, 12655, 12656, + 12657, 12658, 12659, 12660, 12661, 12662, 12663, 12664, 12665, 12666, + 12667, 12668, 12669, 12670, 12671, 12672, 12673, 12674, 12675, 12676, + 12677, 12678, 12679, 12680, 12681, 12682, 12683, 12684, 12685, 12686, + 51783, 51784, 51785, 51786, 51787, 51790, 51791, 51793, 51794, 51795, + 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51806, 51810, 51811, + 51812, 51813, 51814, 51815, 51817, 51818, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51826, + 51827, 51828, 51829, 51830, 51831, 51832, 51833, 51834, 51835, 51836, + 51838, 51839, 51840, 51841, 51842, 51843, 51845, 51846, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51847, 51848, 51849, 51850, 51851, 51852, + 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, + 51863, 51865, 51866, 51867, 51868, 51869, 51870, 51871, 51872, 51873, + 51874, 51875, 51876, 51877, 51878, 51879, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, + 8553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, + 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 963, 964, 965, + 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, + 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, + 51902, 51903, 51905, 51906, 51907, 51909, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51910, 51911, 51912, 51913, 51914, 51915, 51918, 51920, + 51922, 51924, 51925, 51926, 51927, 51930, 51931, 51932, 51933, 51934, + 51935, 51937, 51938, 51939, 51940, 51941, 51942, 51943, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51944, 51945, 51946, 51947, 51949, 51950, + 51951, 51952, 51953, 51954, 51955, 51957, 51958, 51959, 51960, 51961, + 51962, 51963, 51964, 51965, 51966, 51967, 51968, 51969, 51970, 51971, + 51972, 51973, 51974, 51975, 51977, 51978, 9472, 9474, 9484, 9488, + 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, 9487, + 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, + 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, + 9498, 9497, 9494, 9493, 9486, 9485, 9502, 9503, 9505, 9506, + 9510, 9511, 9513, 9514, 9517, 9518, 9521, 9522, 9525, 9526, + 9529, 9530, 9533, 9534, 9536, 9537, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51979, 51980, 51981, 51982, 51983, 51985, 51986, 51987, 51989, 51990, + 51991, 51993, 51994, 51995, 51996, 51997, 51998, 51999, 52002, 52003, + 52004, 52005, 52006, 52007, 52008, 52009, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52010, 52011, 52012, 52013, 52014, 52015, 52016, 52017, + 52018, 52019, 52020, 52021, 52022, 52023, 52024, 52025, 52026, 52027, + 52028, 52029, 52030, 52031, 52032, 52034, 52035, 52036, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52037, 52038, 52039, 52042, 52043, 52045, + 52046, 52047, 52049, 52050, 52051, 52052, 52053, 52054, 52055, 52058, + 52059, 52060, 52062, 52063, 52064, 52065, 52066, 52067, 52069, 52070, + 52071, 52072, 52073, 52074, 52075, 52076, 13205, 13206, 13207, 8467, + 13208, 13252, 13219, 13220, 13221, 13222, 13209, 13210, 13211, 13212, + 13213, 13214, 13215, 13216, 13217, 13218, 13258, 13197, 13198, 13199, + 13263, 13192, 13193, 13256, 13223, 13224, 13232, 13233, 13234, 13235, + 13236, 13237, 13238, 13239, 13240, 13241, 13184, 13185, 13186, 13187, + 13188, 13242, 13243, 13244, 13245, 13246, 13247, 13200, 13201, 13202, + 13203, 13204, 8486, 13248, 13249, 13194, 13195, 13196, 13270, 13253, + 13229, 13230, 13231, 13275, 13225, 13226, 13227, 13228, 13277, 13264, + 13267, 13251, 13257, 13276, 13254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52077, 52078, 52079, 52080, 52081, 52082, 52083, 52084, 52085, 52086, + 52087, 52090, 52091, 52092, 52093, 52094, 52095, 52096, 52097, 52098, + 52099, 52100, 52101, 52102, 52103, 52104, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52105, 52106, 52107, 52108, 52109, 52110, 52111, 52112, + 52113, 52114, 52115, 52116, 52117, 52118, 52119, 52120, 52121, 52122, + 52123, 52125, 52126, 52127, 52128, 52129, 52130, 52131, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52132, 52133, 52134, 52135, 52136, 52137, + 52138, 52139, 52140, 52141, 52142, 52143, 52144, 52145, 52146, 52147, + 52148, 52149, 52150, 52151, 52153, 52154, 52155, 52156, 52157, 52158, + 52159, 52160, 52161, 52162, 52163, 52164, 198, 208, 170, 294, + 0x0000, 306, 0x0000, 319, 321, 216, 338, 186, 222, 358, + 330, 0x0000, 12896, 12897, 12898, 12899, 12900, 12901, 12902, 12903, + 12904, 12905, 12906, 12907, 12908, 12909, 12910, 12911, 12912, 12913, + 12914, 12915, 12916, 12917, 12918, 12919, 12920, 12921, 12922, 12923, + 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, + 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, + 9444, 9445, 9446, 9447, 9448, 9449, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, + 9326, 189, 8531, 8532, 188, 190, 8539, 8540, 8541, 8542, + 52165, 52166, 52167, 52168, 52169, 52170, 52171, 52172, 52173, 52174, + 52175, 52176, 52177, 52178, 52179, 52181, 52182, 52183, 52184, 52185, + 52186, 52187, 52188, 52189, 52190, 52191, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52192, 52193, 52194, 52195, 52197, 52198, 52200, 52202, + 52203, 52204, 52205, 52206, 52207, 52208, 52209, 52210, 52211, 52212, + 52213, 52214, 52215, 52216, 52217, 52218, 52219, 52220, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52221, 52222, 52223, 52224, 52225, 52226, + 52227, 52228, 52229, 52230, 52231, 52232, 52233, 52234, 52235, 52238, + 52239, 52241, 52242, 52243, 52245, 52246, 52247, 52248, 52249, 52250, + 52251, 52254, 52255, 52256, 52259, 52260, 230, 273, 240, 295, + 305, 307, 312, 320, 322, 248, 339, 223, 254, 359, + 331, 329, 12800, 12801, 12802, 12803, 12804, 12805, 12806, 12807, + 12808, 12809, 12810, 12811, 12812, 12813, 12814, 12815, 12816, 12817, + 12818, 12819, 12820, 12821, 12822, 12823, 12824, 12825, 12826, 12827, + 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, + 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, + 9392, 9393, 9394, 9395, 9396, 9397, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, + 9346, 185, 178, 179, 8308, 8319, 8321, 8322, 8323, 8324, + 52261, 52262, 52266, 52267, 52269, 52271, 52273, 52274, 52275, 52276, + 52277, 52278, 52279, 52282, 52287, 52288, 52289, 52290, 52291, 52294, + 52295, 52297, 52298, 52299, 52301, 52302, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52303, 52304, 52305, 52306, 52307, 52310, 52314, 52315, + 52316, 52317, 52318, 52319, 52321, 52322, 52323, 52325, 52327, 52329, + 52330, 52331, 52332, 52333, 52334, 52335, 52337, 52338, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52339, 52340, 52342, 52343, 52344, 52345, + 52346, 52347, 52348, 52349, 52350, 52351, 52352, 52353, 52354, 52355, + 52356, 52357, 52358, 52359, 52360, 52361, 52362, 52363, 52364, 52365, + 52366, 52367, 52368, 52369, 52370, 52371, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52372, 52373, 52374, 52375, 52378, 52379, 52381, 52382, 52383, 52385, + 52386, 52387, 52388, 52389, 52390, 52391, 52394, 52398, 52399, 52400, + 52401, 52402, 52403, 52406, 52407, 52409, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52410, 52411, 52413, 52414, 52415, 52416, 52417, 52418, + 52419, 52422, 52424, 52426, 52427, 52428, 52429, 52430, 52431, 52433, + 52434, 52435, 52437, 52438, 52439, 52440, 52441, 52442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52443, 52444, 52445, 52446, 52447, 52448, + 52449, 52450, 52451, 52453, 52454, 52455, 52456, 52457, 52458, 52459, + 52461, 52462, 52463, 52465, 52466, 52467, 52468, 52469, 52470, 52471, + 52472, 52473, 52474, 52475, 52476, 52477, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52478, 52479, 52480, 52482, 52483, 52484, 52485, 52486, 52487, 52490, + 52491, 52493, 52494, 52495, 52497, 52498, 52499, 52500, 52501, 52502, + 52503, 52506, 52508, 52510, 52511, 52512, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52513, 52514, 52515, 52517, 52518, 52519, 52521, 52522, + 52523, 52525, 52526, 52527, 52528, 52529, 52530, 52531, 52532, 52533, + 52534, 52535, 52536, 52538, 52539, 52540, 52541, 52542, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52543, 52544, 52545, 52546, 52547, 52548, + 52549, 52550, 52551, 52552, 52553, 52554, 52555, 52556, 52557, 52558, + 52559, 52560, 52561, 52562, 52563, 52564, 52565, 52566, 52567, 52568, + 52569, 52570, 52571, 52573, 52574, 52575, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52577, 52578, 52579, 52581, 52582, 52583, 52584, 52585, 52586, 52587, + 52590, 52592, 52594, 52595, 52596, 52597, 52598, 52599, 52601, 52602, + 52603, 52604, 52605, 52606, 52607, 52608, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52609, 52610, 52611, 52612, 52613, 52614, 52615, 52617, + 52618, 52619, 52620, 52621, 52622, 52623, 52624, 52625, 52626, 52627, + 52630, 52631, 52633, 52634, 52635, 52637, 52638, 52639, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52640, 52641, 52642, 52643, 52646, 52648, + 52650, 52651, 52652, 52653, 52654, 52655, 52657, 52658, 52659, 52660, + 52661, 52662, 52663, 52664, 52665, 52666, 52667, 52668, 52669, 52670, + 52671, 52672, 52673, 52674, 52675, 52677, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52678, 52679, 52680, 52681, 52682, 52683, 52685, 52686, 52687, 52689, + 52690, 52691, 52692, 52693, 52694, 52695, 52696, 52697, 52698, 52699, + 52700, 52701, 52702, 52703, 52704, 52705, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52706, 52707, 52708, 52709, 52710, 52711, 52713, 52714, + 52715, 52717, 52718, 52719, 52721, 52722, 52723, 52724, 52725, 52726, + 52727, 52730, 52732, 52734, 52735, 52736, 52737, 52738, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52739, 52741, 52742, 52743, 52745, 52746, + 52747, 52749, 52750, 52751, 52752, 52753, 52754, 52755, 52757, 52758, + 52759, 52760, 52762, 52763, 52764, 52765, 52766, 52767, 52770, 52771, + 52773, 52774, 52775, 52777, 52778, 52779, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52780, 52781, 52782, 52783, 52786, 52788, 52790, 52791, 52792, 52793, + 52794, 52795, 52796, 52797, 52798, 52799, 52800, 52801, 52802, 52803, + 52804, 52805, 52806, 52807, 52808, 52809, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52810, 52811, 52812, 52813, 52814, 52815, 52816, 52817, + 52818, 52819, 52820, 52821, 52822, 52823, 52826, 52827, 52829, 52830, + 52834, 52835, 52836, 52837, 52838, 52839, 52842, 52844, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52846, 52847, 52848, 52849, 52850, 52851, + 52854, 52855, 52857, 52858, 52859, 52861, 52862, 52863, 52864, 52865, + 52866, 52867, 52870, 52872, 52874, 52875, 52876, 52877, 52878, 52879, + 52882, 52883, 52885, 52886, 52887, 52889, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52890, 52891, 52892, 52893, 52894, 52895, 52898, 52902, 52903, 52904, + 52905, 52906, 52907, 52910, 52911, 52912, 52913, 52914, 52915, 52916, + 52917, 52918, 52919, 52920, 52921, 52922, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52923, 52924, 52925, 52926, 52927, 52928, 52930, 52931, + 52932, 52933, 52934, 52935, 52936, 52937, 52938, 52939, 52940, 52941, + 52942, 52943, 52944, 52945, 52946, 52947, 52948, 52949, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52950, 52951, 52952, 52953, 52954, 52955, + 52956, 52957, 52958, 52959, 52960, 52961, 52962, 52963, 52966, 52967, + 52969, 52970, 52973, 52974, 52975, 52976, 52977, 52978, 52979, 52982, + 52986, 52987, 52988, 52989, 52990, 52991, 44032, 44033, 44036, 44039, + 44040, 44041, 44042, 44048, 44049, 44050, 44051, 44052, 44053, 44054, + 44055, 44057, 44058, 44059, 44060, 44061, 44064, 44068, 44076, 44077, + 44079, 44080, 44081, 44088, 44089, 44092, 44096, 44107, 44109, 44116, + 44120, 44124, 44144, 44145, 44148, 44151, 44152, 44154, 44160, 44161, + 44163, 44164, 44165, 44166, 44169, 44170, 44171, 44172, 44176, 44180, + 44188, 44189, 44191, 44192, 44193, 44200, 44201, 44202, 44204, 44207, + 44208, 44216, 44217, 44219, 44220, 44221, 44225, 44228, 44232, 44236, + 44245, 44247, 44256, 44257, 44260, 44263, 44264, 44266, 44268, 44271, + 44272, 44273, 44275, 44277, 44278, 44284, 44285, 44288, 44292, 44294, + 52994, 52995, 52997, 52998, 52999, 53001, 53002, 53003, 53004, 53005, + 53006, 53007, 53010, 53012, 53014, 53015, 53016, 53017, 53018, 53019, + 53021, 53022, 53023, 53025, 53026, 53027, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53029, 53030, 53031, 53032, 53033, 53034, 53035, 53038, + 53042, 53043, 53044, 53045, 53046, 53047, 53049, 53050, 53051, 53052, + 53053, 53054, 53055, 53056, 53057, 53058, 53059, 53060, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53061, 53062, 53063, 53064, 53065, 53066, + 53067, 53068, 53069, 53070, 53071, 53072, 53073, 53074, 53075, 53078, + 53079, 53081, 53082, 53083, 53085, 53086, 53087, 53088, 53089, 53090, + 53091, 53094, 53096, 53098, 53099, 53100, 44300, 44301, 44303, 44305, + 44312, 44316, 44320, 44329, 44332, 44333, 44340, 44341, 44344, 44348, + 44356, 44357, 44359, 44361, 44368, 44372, 44376, 44385, 44387, 44396, + 44397, 44400, 44403, 44404, 44405, 44406, 44411, 44412, 44413, 44415, + 44417, 44418, 44424, 44425, 44428, 44432, 44444, 44445, 44452, 44471, + 44480, 44481, 44484, 44488, 44496, 44497, 44499, 44508, 44512, 44516, + 44536, 44537, 44540, 44543, 44544, 44545, 44552, 44553, 44555, 44557, + 44564, 44592, 44593, 44596, 44599, 44600, 44602, 44608, 44609, 44611, + 44613, 44614, 44618, 44620, 44621, 44622, 44624, 44628, 44630, 44636, + 44637, 44639, 44640, 44641, 44645, 44648, 44649, 44652, 44656, 44664, + 53101, 53102, 53103, 53106, 53107, 53109, 53110, 53111, 53113, 53114, + 53115, 53116, 53117, 53118, 53119, 53121, 53122, 53123, 53124, 53126, + 53127, 53128, 53129, 53130, 53131, 53133, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53134, 53135, 53136, 53137, 53138, 53139, 53140, 53141, + 53142, 53143, 53144, 53145, 53146, 53147, 53148, 53149, 53150, 53151, + 53152, 53154, 53155, 53156, 53157, 53158, 53159, 53161, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53162, 53163, 53164, 53165, 53166, 53167, + 53169, 53170, 53171, 53172, 53173, 53174, 53175, 53176, 53177, 53178, + 53179, 53180, 53181, 53182, 53183, 53184, 53185, 53186, 53187, 53189, + 53190, 53191, 53192, 53193, 53194, 53195, 44665, 44667, 44668, 44669, + 44676, 44677, 44684, 44732, 44733, 44734, 44736, 44740, 44748, 44749, + 44751, 44752, 44753, 44760, 44761, 44764, 44776, 44779, 44781, 44788, + 44792, 44796, 44807, 44808, 44813, 44816, 44844, 44845, 44848, 44850, + 44852, 44860, 44861, 44863, 44865, 44866, 44867, 44872, 44873, 44880, + 44892, 44893, 44900, 44901, 44921, 44928, 44932, 44936, 44944, 44945, + 44949, 44956, 44984, 44985, 44988, 44992, 44999, 45000, 45001, 45003, + 45005, 45006, 45012, 45020, 45032, 45033, 45040, 45041, 45044, 45048, + 45056, 45057, 45060, 45068, 45072, 45076, 45084, 45085, 45096, 45124, + 45125, 45128, 45130, 45132, 45134, 45139, 45140, 45141, 45143, 45145, + 53196, 53197, 53198, 53199, 53200, 53201, 53202, 53203, 53204, 53205, + 53206, 53207, 53208, 53209, 53210, 53211, 53212, 53213, 53214, 53215, + 53218, 53219, 53221, 53222, 53223, 53225, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53226, 53227, 53228, 53229, 53230, 53231, 53234, 53236, + 53238, 53239, 53240, 53241, 53242, 53243, 53245, 53246, 53247, 53249, + 53250, 53251, 53253, 53254, 53255, 53256, 53257, 53258, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53259, 53260, 53261, 53262, 53263, 53264, + 53266, 53267, 53268, 53269, 53270, 53271, 53273, 53274, 53275, 53276, + 53277, 53278, 53279, 53280, 53281, 53282, 53283, 53284, 53285, 53286, + 53287, 53288, 53289, 53290, 53291, 53292, 45149, 45180, 45181, 45184, + 45188, 45196, 45197, 45199, 45201, 45208, 45209, 45210, 45212, 45215, + 45216, 45217, 45218, 45224, 45225, 45227, 45228, 45229, 45230, 45231, + 45233, 45235, 45236, 45237, 45240, 45244, 45252, 45253, 45255, 45256, + 45257, 45264, 45265, 45268, 45272, 45280, 45285, 45320, 45321, 45323, + 45324, 45328, 45330, 45331, 45336, 45337, 45339, 45340, 45341, 45347, + 45348, 45349, 45352, 45356, 45364, 45365, 45367, 45368, 45369, 45376, + 45377, 45380, 45384, 45392, 45393, 45396, 45397, 45400, 45404, 45408, + 45432, 45433, 45436, 45440, 45442, 45448, 45449, 45451, 45453, 45458, + 45459, 45460, 45464, 45468, 45480, 45516, 45520, 45524, 45532, 45533, + 53294, 53295, 53296, 53297, 53298, 53299, 53302, 53303, 53305, 53306, + 53307, 53309, 53310, 53311, 53312, 53313, 53314, 53315, 53318, 53320, + 53322, 53323, 53324, 53325, 53326, 53327, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53329, 53330, 53331, 53333, 53334, 53335, 53337, 53338, + 53339, 53340, 53341, 53342, 53343, 53345, 53346, 53347, 53348, 53349, + 53350, 53351, 53352, 53353, 53354, 53355, 53358, 53359, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53361, 53362, 53363, 53365, 53366, 53367, + 53368, 53369, 53370, 53371, 53374, 53375, 53376, 53378, 53379, 53380, + 53381, 53382, 53383, 53384, 53385, 53386, 53387, 53388, 53389, 53390, + 53391, 53392, 53393, 53394, 53395, 53396, 45535, 45544, 45545, 45548, + 45552, 45561, 45563, 45565, 45572, 45573, 45576, 45579, 45580, 45588, + 45589, 45591, 45593, 45600, 45620, 45628, 45656, 45660, 45664, 45672, + 45673, 45684, 45685, 45692, 45700, 45701, 45705, 45712, 45713, 45716, + 45720, 45721, 45722, 45728, 45729, 45731, 45733, 45734, 45738, 45740, + 45744, 45748, 45768, 45769, 45772, 45776, 45778, 45784, 45785, 45787, + 45789, 45794, 45796, 45797, 45798, 45800, 45803, 45804, 45805, 45806, + 45807, 45811, 45812, 45813, 45815, 45816, 45817, 45818, 45819, 45823, + 45824, 45825, 45828, 45832, 45840, 45841, 45843, 45844, 45845, 45852, + 45908, 45909, 45910, 45912, 45915, 45916, 45918, 45919, 45924, 45925, + 53397, 53398, 53399, 53400, 53401, 53402, 53403, 53404, 53405, 53406, + 53407, 53408, 53409, 53410, 53411, 53414, 53415, 53417, 53418, 53419, + 53421, 53422, 53423, 53424, 53425, 53426, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53427, 53430, 53432, 53434, 53435, 53436, 53437, 53438, + 53439, 53442, 53443, 53445, 53446, 53447, 53450, 53451, 53452, 53453, + 53454, 53455, 53458, 53462, 53463, 53464, 53465, 53466, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53467, 53470, 53471, 53473, 53474, 53475, + 53477, 53478, 53479, 53480, 53481, 53482, 53483, 53486, 53490, 53491, + 53492, 53493, 53494, 53495, 53497, 53498, 53499, 53500, 53501, 53502, + 53503, 53504, 53505, 53506, 53507, 53508, 45927, 45929, 45931, 45934, + 45936, 45937, 45940, 45944, 45952, 45953, 45955, 45956, 45957, 45964, + 45968, 45972, 45984, 45985, 45992, 45996, 46020, 46021, 46024, 46027, + 46028, 46030, 46032, 46036, 46037, 46039, 46041, 46043, 46045, 46048, + 46052, 46056, 46076, 46096, 46104, 46108, 46112, 46120, 46121, 46123, + 46132, 46160, 46161, 46164, 46168, 46176, 46177, 46179, 46181, 46188, + 46208, 46216, 46237, 46244, 46248, 46252, 46261, 46263, 46265, 46272, + 46276, 46280, 46288, 46293, 46300, 46301, 46304, 46307, 46308, 46310, + 46316, 46317, 46319, 46321, 46328, 46356, 46357, 46360, 46363, 46364, + 46372, 46373, 46375, 46376, 46377, 46378, 46384, 46385, 46388, 46392, + 53509, 53510, 53511, 53512, 53513, 53514, 53515, 53516, 53518, 53519, + 53520, 53521, 53522, 53523, 53524, 53525, 53526, 53527, 53528, 53529, + 53530, 53531, 53532, 53533, 53534, 53535, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53536, 53537, 53538, 53539, 53540, 53541, 53542, 53543, + 53544, 53545, 53546, 53547, 53548, 53549, 53550, 53551, 53554, 53555, + 53557, 53558, 53559, 53561, 53563, 53564, 53565, 53566, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53567, 53570, 53574, 53575, 53576, 53577, + 53578, 53579, 53582, 53583, 53585, 53586, 53587, 53589, 53590, 53591, + 53592, 53593, 53594, 53595, 53598, 53600, 53602, 53603, 53604, 53605, + 53606, 53607, 53609, 53610, 53611, 53613, 46400, 46401, 46403, 46404, + 46405, 46411, 46412, 46413, 46416, 46420, 46428, 46429, 46431, 46432, + 46433, 46496, 46497, 46500, 46504, 46506, 46507, 46512, 46513, 46515, + 46516, 46517, 46523, 46524, 46525, 46528, 46532, 46540, 46541, 46543, + 46544, 46545, 46552, 46572, 46608, 46609, 46612, 46616, 46629, 46636, + 46644, 46664, 46692, 46696, 46748, 46749, 46752, 46756, 46763, 46764, + 46769, 46804, 46832, 46836, 46840, 46848, 46849, 46853, 46888, 46889, + 46892, 46895, 46896, 46904, 46905, 46907, 46916, 46920, 46924, 46932, + 46933, 46944, 46948, 46952, 46960, 46961, 46963, 46965, 46972, 46973, + 46976, 46980, 46988, 46989, 46991, 46992, 46993, 46994, 46998, 46999, + 53614, 53615, 53616, 53617, 53618, 53619, 53620, 53621, 53622, 53623, + 53624, 53625, 53626, 53627, 53629, 53630, 53631, 53632, 53633, 53634, + 53635, 53637, 53638, 53639, 53641, 53642, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53643, 53644, 53645, 53646, 53647, 53648, 53649, 53650, + 53651, 53652, 53653, 53654, 53655, 53656, 53657, 53658, 53659, 53660, + 53661, 53662, 53663, 53666, 53667, 53669, 53670, 53671, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53673, 53674, 53675, 53676, 53677, 53678, + 53679, 53682, 53684, 53686, 53687, 53688, 53689, 53691, 53693, 53694, + 53695, 53697, 53698, 53699, 53700, 53701, 53702, 53703, 53704, 53705, + 53706, 53707, 53708, 53709, 53710, 53711, 47000, 47001, 47004, 47008, + 47016, 47017, 47019, 47020, 47021, 47028, 47029, 47032, 47047, 47049, + 47084, 47085, 47088, 47092, 47100, 47101, 47103, 47104, 47105, 47111, + 47112, 47113, 47116, 47120, 47128, 47129, 47131, 47133, 47140, 47141, + 47144, 47148, 47156, 47157, 47159, 47160, 47161, 47168, 47172, 47185, + 47187, 47196, 47197, 47200, 47204, 47212, 47213, 47215, 47217, 47224, + 47228, 47245, 47272, 47280, 47284, 47288, 47296, 47297, 47299, 47301, + 47308, 47312, 47316, 47325, 47327, 47329, 47336, 47337, 47340, 47344, + 47352, 47353, 47355, 47357, 47364, 47384, 47392, 47420, 47421, 47424, + 47428, 47436, 47439, 47441, 47448, 47449, 47452, 47456, 47464, 47465, + 53712, 53713, 53714, 53715, 53716, 53717, 53718, 53719, 53721, 53722, + 53723, 53724, 53725, 53726, 53727, 53728, 53729, 53730, 53731, 53732, + 53733, 53734, 53735, 53736, 53737, 53738, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53739, 53740, 53741, 53742, 53743, 53744, 53745, 53746, + 53747, 53749, 53750, 53751, 53753, 53754, 53755, 53756, 53757, 53758, + 53759, 53760, 53761, 53762, 53763, 53764, 53765, 53766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53768, 53770, 53771, 53772, 53773, 53774, + 53775, 53777, 53778, 53779, 53780, 53781, 53782, 53783, 53784, 53785, + 53786, 53787, 53788, 53789, 53790, 53791, 53792, 53793, 53794, 53795, + 53796, 53797, 53798, 53799, 53800, 53801, 47467, 47469, 47476, 47477, + 47480, 47484, 47492, 47493, 47495, 47497, 47498, 47501, 47502, 47532, + 47533, 47536, 47540, 47548, 47549, 47551, 47553, 47560, 47561, 47564, + 47566, 47567, 47568, 47569, 47570, 47576, 47577, 47579, 47581, 47582, + 47585, 47587, 47588, 47589, 47592, 47596, 47604, 47605, 47607, 47608, + 47609, 47610, 47616, 47617, 47624, 47637, 47672, 47673, 47676, 47680, + 47682, 47688, 47689, 47691, 47693, 47694, 47699, 47700, 47701, 47704, + 47708, 47716, 47717, 47719, 47720, 47721, 47728, 47729, 47732, 47736, + 47747, 47748, 47749, 47751, 47756, 47784, 47785, 47787, 47788, 47792, + 47794, 47800, 47801, 47803, 47805, 47812, 47816, 47832, 47833, 47868, + 53802, 53803, 53806, 53807, 53809, 53810, 53811, 53813, 53814, 53815, + 53816, 53817, 53818, 53819, 53822, 53824, 53826, 53827, 53828, 53829, + 53830, 53831, 53833, 53834, 53835, 53836, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53837, 53838, 53839, 53840, 53841, 53842, 53843, 53844, + 53845, 53846, 53847, 53848, 53849, 53850, 53851, 53853, 53854, 53855, + 53856, 53857, 53858, 53859, 53861, 53862, 53863, 53864, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53865, 53866, 53867, 53868, 53869, 53870, + 53871, 53872, 53873, 53874, 53875, 53876, 53877, 53878, 53879, 53880, + 53881, 53882, 53883, 53884, 53885, 53886, 53887, 53890, 53891, 53893, + 53894, 53895, 53897, 53898, 53899, 53900, 47872, 47876, 47885, 47887, + 47889, 47896, 47900, 47904, 47913, 47915, 47924, 47925, 47926, 47928, + 47931, 47932, 47933, 47934, 47940, 47941, 47943, 47945, 47949, 47951, + 47952, 47956, 47960, 47969, 47971, 47980, 48008, 48012, 48016, 48036, + 48040, 48044, 48052, 48055, 48064, 48068, 48072, 48080, 48083, 48120, + 48121, 48124, 48127, 48128, 48130, 48136, 48137, 48139, 48140, 48141, + 48143, 48145, 48148, 48149, 48150, 48151, 48152, 48155, 48156, 48157, + 48158, 48159, 48164, 48165, 48167, 48169, 48173, 48176, 48177, 48180, + 48184, 48192, 48193, 48195, 48196, 48197, 48201, 48204, 48205, 48208, + 48221, 48260, 48261, 48264, 48267, 48268, 48270, 48276, 48277, 48279, + 53901, 53902, 53903, 53906, 53907, 53908, 53910, 53911, 53912, 53913, + 53914, 53915, 53917, 53918, 53919, 53921, 53922, 53923, 53925, 53926, + 53927, 53928, 53929, 53930, 53931, 53933, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53934, 53935, 53936, 53938, 53939, 53940, 53941, 53942, + 53943, 53946, 53947, 53949, 53950, 53953, 53955, 53956, 53957, 53958, + 53959, 53962, 53964, 53965, 53966, 53967, 53968, 53969, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53970, 53971, 53973, 53974, 53975, 53977, + 53978, 53979, 53981, 53982, 53983, 53984, 53985, 53986, 53987, 53990, + 53991, 53992, 53993, 53994, 53995, 53996, 53997, 53998, 53999, 54002, + 54003, 54005, 54006, 54007, 54009, 54010, 48281, 48282, 48288, 48289, + 48292, 48295, 48296, 48304, 48305, 48307, 48308, 48309, 48316, 48317, + 48320, 48324, 48333, 48335, 48336, 48337, 48341, 48344, 48348, 48372, + 48373, 48374, 48376, 48380, 48388, 48389, 48391, 48393, 48400, 48404, + 48420, 48428, 48448, 48456, 48457, 48460, 48464, 48472, 48473, 48484, + 48488, 48512, 48513, 48516, 48519, 48520, 48521, 48522, 48528, 48529, + 48531, 48533, 48537, 48538, 48540, 48548, 48560, 48568, 48596, 48597, + 48600, 48604, 48617, 48624, 48628, 48632, 48640, 48643, 48645, 48652, + 48653, 48656, 48660, 48668, 48669, 48671, 48708, 48709, 48712, 48716, + 48718, 48724, 48725, 48727, 48729, 48730, 48731, 48736, 48737, 48740, + 54011, 54012, 54013, 54014, 54015, 54018, 54020, 54022, 54023, 54024, + 54025, 54026, 54027, 54031, 54033, 54034, 54035, 54037, 54039, 54040, + 54041, 54042, 54043, 54046, 54050, 54051, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54052, 54054, 54055, 54058, 54059, 54061, 54062, 54063, + 54065, 54066, 54067, 54068, 54069, 54070, 54071, 54074, 54078, 54079, + 54080, 54081, 54082, 54083, 54086, 54087, 54088, 54089, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54090, 54091, 54092, 54093, 54094, 54095, + 54096, 54097, 54098, 54099, 54100, 54101, 54102, 54103, 54104, 54105, + 54106, 54107, 54108, 54109, 54110, 54111, 54112, 54113, 54114, 54115, + 54116, 54117, 54118, 54119, 54120, 54121, 48744, 48746, 48752, 48753, + 48755, 48756, 48757, 48763, 48764, 48765, 48768, 48772, 48780, 48781, + 48783, 48784, 48785, 48792, 48793, 48808, 48848, 48849, 48852, 48855, + 48856, 48864, 48867, 48868, 48869, 48876, 48897, 48904, 48905, 48920, + 48921, 48923, 48924, 48925, 48960, 48961, 48964, 48968, 48976, 48977, + 48981, 49044, 49072, 49093, 49100, 49101, 49104, 49108, 49116, 49119, + 49121, 49212, 49233, 49240, 49244, 49248, 49256, 49257, 49296, 49297, + 49300, 49304, 49312, 49313, 49315, 49317, 49324, 49325, 49327, 49328, + 49331, 49332, 49333, 49334, 49340, 49341, 49343, 49344, 49345, 49349, + 49352, 49353, 49356, 49360, 49368, 49369, 49371, 49372, 49373, 49380, + 54122, 54123, 54124, 54125, 54126, 54127, 54128, 54129, 54130, 54131, + 54132, 54133, 54134, 54135, 54136, 54137, 54138, 54139, 54142, 54143, + 54145, 54146, 54147, 54149, 54150, 54151, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54152, 54153, 54154, 54155, 54158, 54162, 54163, 54164, + 54165, 54166, 54167, 54170, 54171, 54173, 54174, 54175, 54177, 54178, + 54179, 54180, 54181, 54182, 54183, 54186, 54188, 54190, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54191, 54192, 54193, 54194, 54195, 54197, + 54198, 54199, 54201, 54202, 54203, 54205, 54206, 54207, 54208, 54209, + 54210, 54211, 54214, 54215, 54218, 54219, 54220, 54221, 54222, 54223, + 54225, 54226, 54227, 54228, 54229, 54230, 49381, 49384, 49388, 49396, + 49397, 49399, 49401, 49408, 49412, 49416, 49424, 49429, 49436, 49437, + 49438, 49439, 49440, 49443, 49444, 49446, 49447, 49452, 49453, 49455, + 49456, 49457, 49462, 49464, 49465, 49468, 49472, 49480, 49481, 49483, + 49484, 49485, 49492, 49493, 49496, 49500, 49508, 49509, 49511, 49512, + 49513, 49520, 49524, 49528, 49541, 49548, 49549, 49550, 49552, 49556, + 49558, 49564, 49565, 49567, 49569, 49573, 49576, 49577, 49580, 49584, + 49597, 49604, 49608, 49612, 49620, 49623, 49624, 49632, 49636, 49640, + 49648, 49649, 49651, 49660, 49661, 49664, 49668, 49676, 49677, 49679, + 49681, 49688, 49689, 49692, 49695, 49696, 49704, 49705, 49707, 49709, + 54231, 54233, 54234, 54235, 54236, 54237, 54238, 54239, 54240, 54242, + 54244, 54245, 54246, 54247, 54248, 54249, 54250, 54251, 54254, 54255, + 54257, 54258, 54259, 54261, 54262, 54263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54264, 54265, 54266, 54267, 54270, 54272, 54274, 54275, + 54276, 54277, 54278, 54279, 54281, 54282, 54283, 54284, 54285, 54286, + 54287, 54288, 54289, 54290, 54291, 54292, 54293, 54294, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54295, 54296, 54297, 54298, 54299, 54300, + 54302, 54303, 54304, 54305, 54306, 54307, 54308, 54309, 54310, 54311, + 54312, 54313, 54314, 54315, 54316, 54317, 54318, 54319, 54320, 54321, + 54322, 54323, 54324, 54325, 54326, 54327, 49711, 49713, 49714, 49716, + 49736, 49744, 49745, 49748, 49752, 49760, 49765, 49772, 49773, 49776, + 49780, 49788, 49789, 49791, 49793, 49800, 49801, 49808, 49816, 49819, + 49821, 49828, 49829, 49832, 49836, 49837, 49844, 49845, 49847, 49849, + 49884, 49885, 49888, 49891, 49892, 49899, 49900, 49901, 49903, 49905, + 49910, 49912, 49913, 49915, 49916, 49920, 49928, 49929, 49932, 49933, + 49939, 49940, 49941, 49944, 49948, 49956, 49957, 49960, 49961, 49989, + 50024, 50025, 50028, 50032, 50034, 50040, 50041, 50044, 50045, 50052, + 50056, 50060, 50112, 50136, 50137, 50140, 50143, 50144, 50146, 50152, + 50153, 50157, 50164, 50165, 50168, 50184, 50192, 50212, 50220, 50224, + 54328, 54329, 54330, 54331, 54332, 54333, 54334, 54335, 54337, 54338, + 54339, 54341, 54342, 54343, 54344, 54345, 54346, 54347, 54348, 54349, + 54350, 54351, 54352, 54353, 54354, 54355, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54356, 54357, 54358, 54359, 54360, 54361, 54362, 54363, + 54365, 54366, 54367, 54369, 54370, 54371, 54373, 54374, 54375, 54376, + 54377, 54378, 54379, 54380, 54382, 54384, 54385, 54386, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54387, 54388, 54389, 54390, 54391, 54394, + 54395, 54397, 54398, 54401, 54403, 54404, 54405, 54406, 54407, 54410, + 54412, 54414, 54415, 54416, 54417, 54418, 54419, 54421, 54422, 54423, + 54424, 54425, 54426, 54427, 54428, 54429, 50228, 50236, 50237, 50248, + 50276, 50277, 50280, 50284, 50292, 50293, 50297, 50304, 50324, 50332, + 50360, 50364, 50409, 50416, 50417, 50420, 50424, 50426, 50431, 50432, + 50433, 50444, 50448, 50452, 50460, 50472, 50473, 50476, 50480, 50488, + 50489, 50491, 50493, 50500, 50501, 50504, 50505, 50506, 50508, 50509, + 50510, 50515, 50516, 50517, 50519, 50520, 50521, 50525, 50526, 50528, + 50529, 50532, 50536, 50544, 50545, 50547, 50548, 50549, 50556, 50557, + 50560, 50564, 50567, 50572, 50573, 50575, 50577, 50581, 50583, 50584, + 50588, 50592, 50601, 50612, 50613, 50616, 50617, 50619, 50620, 50621, + 50622, 50628, 50629, 50630, 50631, 50632, 50633, 50634, 50636, 50638, + 54430, 54431, 54432, 54433, 54434, 54435, 54436, 54437, 54438, 54439, + 54440, 54442, 54443, 54444, 54445, 54446, 54447, 54448, 54449, 54450, + 54451, 54452, 54453, 54454, 54455, 54456, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54457, 54458, 54459, 54460, 54461, 54462, 54463, 54464, + 54465, 54466, 54467, 54468, 54469, 54470, 54471, 54472, 54473, 54474, + 54475, 54477, 54478, 54479, 54481, 54482, 54483, 54485, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54486, 54487, 54488, 54489, 54490, 54491, + 54493, 54494, 54496, 54497, 54498, 54499, 54500, 54501, 54502, 54503, + 54505, 54506, 54507, 54509, 54510, 54511, 54513, 54514, 54515, 54516, + 54517, 54518, 54519, 54521, 54522, 54524, 50640, 50641, 50644, 50648, + 50656, 50657, 50659, 50661, 50668, 50669, 50670, 50672, 50676, 50678, + 50679, 50684, 50685, 50686, 50687, 50688, 50689, 50693, 50694, 50695, + 50696, 50700, 50704, 50712, 50713, 50715, 50716, 50724, 50725, 50728, + 50732, 50733, 50734, 50736, 50739, 50740, 50741, 50743, 50745, 50747, + 50752, 50753, 50756, 50760, 50768, 50769, 50771, 50772, 50773, 50780, + 50781, 50784, 50796, 50799, 50801, 50808, 50809, 50812, 50816, 50824, + 50825, 50827, 50829, 50836, 50837, 50840, 50844, 50852, 50853, 50855, + 50857, 50864, 50865, 50868, 50872, 50873, 50874, 50880, 50881, 50883, + 50885, 50892, 50893, 50896, 50900, 50908, 50909, 50912, 50913, 50920, + 54526, 54527, 54528, 54529, 54530, 54531, 54533, 54534, 54535, 54537, + 54538, 54539, 54541, 54542, 54543, 54544, 54545, 54546, 54547, 54550, + 54552, 54553, 54554, 54555, 54556, 54557, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54558, 54559, 54560, 54561, 54562, 54563, 54564, 54565, + 54566, 54567, 54568, 54569, 54570, 54571, 54572, 54573, 54574, 54575, + 54576, 54577, 54578, 54579, 54580, 54581, 54582, 54583, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54584, 54585, 54586, 54587, 54590, 54591, + 54593, 54594, 54595, 54597, 54598, 54599, 54600, 54601, 54602, 54603, + 54606, 54608, 54610, 54611, 54612, 54613, 54614, 54615, 54618, 54619, + 54621, 54622, 54623, 54625, 54626, 54627, 50921, 50924, 50928, 50936, + 50937, 50941, 50948, 50949, 50952, 50956, 50964, 50965, 50967, 50969, + 50976, 50977, 50980, 50984, 50992, 50993, 50995, 50997, 50999, 51004, + 51005, 51008, 51012, 51018, 51020, 51021, 51023, 51025, 51026, 51027, + 51028, 51029, 51030, 51031, 51032, 51036, 51040, 51048, 51051, 51060, + 51061, 51064, 51068, 51069, 51070, 51075, 51076, 51077, 51079, 51080, + 51081, 51082, 51086, 51088, 51089, 51092, 51094, 51095, 51096, 51098, + 51104, 51105, 51107, 51108, 51109, 51110, 51116, 51117, 51120, 51124, + 51132, 51133, 51135, 51136, 51137, 51144, 51145, 51148, 51150, 51152, + 51160, 51165, 51172, 51176, 51180, 51200, 51201, 51204, 51208, 51210, + 54628, 54630, 54631, 54634, 54636, 54638, 54639, 54640, 54641, 54642, + 54643, 54646, 54647, 54649, 54650, 54651, 54653, 54654, 54655, 54656, + 54657, 54658, 54659, 54662, 54666, 54667, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54668, 54669, 54670, 54671, 54673, 54674, 54675, 54676, + 54677, 54678, 54679, 54680, 54681, 54682, 54683, 54684, 54685, 54686, + 54687, 54688, 54689, 54690, 54691, 54692, 54694, 54695, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54696, 54697, 54698, 54699, 54700, 54701, + 54702, 54703, 54704, 54705, 54706, 54707, 54708, 54709, 54710, 54711, + 54712, 54713, 54714, 54715, 54716, 54717, 54718, 54719, 54720, 54721, + 54722, 54723, 54724, 54725, 54726, 54727, 51216, 51217, 51219, 51221, + 51222, 51228, 51229, 51232, 51236, 51244, 51245, 51247, 51249, 51256, + 51260, 51264, 51272, 51273, 51276, 51277, 51284, 51312, 51313, 51316, + 51320, 51322, 51328, 51329, 51331, 51333, 51334, 51335, 51339, 51340, + 51341, 51348, 51357, 51359, 51361, 51368, 51388, 51389, 51396, 51400, + 51404, 51412, 51413, 51415, 51417, 51424, 51425, 51428, 51445, 51452, + 51453, 51456, 51460, 51461, 51462, 51468, 51469, 51471, 51473, 51480, + 51500, 51508, 51536, 51537, 51540, 51544, 51552, 51553, 51555, 51564, + 51568, 51572, 51580, 51592, 51593, 51596, 51600, 51608, 51609, 51611, + 51613, 51648, 51649, 51652, 51655, 51656, 51658, 51664, 51665, 51667, + 54730, 54731, 54733, 54734, 54735, 54737, 54739, 54740, 54741, 54742, + 54743, 54746, 54748, 54750, 54751, 54752, 54753, 54754, 54755, 54758, + 54759, 54761, 54762, 54763, 54765, 54766, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54767, 54768, 54769, 54770, 54771, 54774, 54776, 54778, + 54779, 54780, 54781, 54782, 54783, 54786, 54787, 54789, 54790, 54791, + 54793, 54794, 54795, 54796, 54797, 54798, 54799, 54802, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54806, 54807, 54808, 54809, 54810, 54811, + 54813, 54814, 54815, 54817, 54818, 54819, 54821, 54822, 54823, 54824, + 54825, 54826, 54827, 54828, 54830, 54831, 54832, 54833, 54834, 54835, + 54836, 54837, 54838, 54839, 54842, 54843, 51669, 51670, 51673, 51674, + 51676, 51677, 51680, 51682, 51684, 51687, 51692, 51693, 51695, 51696, + 51697, 51704, 51705, 51708, 51712, 51720, 51721, 51723, 51724, 51725, + 51732, 51736, 51753, 51788, 51789, 51792, 51796, 51804, 51805, 51807, + 51808, 51809, 51816, 51837, 51844, 51864, 51900, 51901, 51904, 51908, + 51916, 51917, 51919, 51921, 51923, 51928, 51929, 51936, 51948, 51956, + 51976, 51984, 51988, 51992, 52000, 52001, 52033, 52040, 52041, 52044, + 52048, 52056, 52057, 52061, 52068, 52088, 52089, 52124, 52152, 52180, + 52196, 52199, 52201, 52236, 52237, 52240, 52244, 52252, 52253, 52257, + 52258, 52263, 52264, 52265, 52268, 52270, 52272, 52280, 52281, 52283, + 54845, 54846, 54847, 54849, 54850, 54851, 54852, 54854, 54855, 54858, + 54860, 54862, 54863, 54864, 54866, 54867, 54870, 54871, 54873, 54874, + 54875, 54877, 54878, 54879, 54880, 54881, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54882, 54883, 54884, 54885, 54886, 54888, 54890, 54891, + 54892, 54893, 54894, 54895, 54898, 54899, 54901, 54902, 54903, 54904, + 54905, 54906, 54907, 54908, 54909, 54910, 54911, 54912, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54913, 54914, 54916, 54918, 54919, 54920, + 54921, 54922, 54923, 54926, 54927, 54929, 54930, 54931, 54933, 54934, + 54935, 54936, 54937, 54938, 54939, 54940, 54942, 54944, 54946, 54947, + 54948, 54949, 54950, 54951, 54953, 54954, 52284, 52285, 52286, 52292, + 52293, 52296, 52300, 52308, 52309, 52311, 52312, 52313, 52320, 52324, + 52326, 52328, 52336, 52341, 52376, 52377, 52380, 52384, 52392, 52393, + 52395, 52396, 52397, 52404, 52405, 52408, 52412, 52420, 52421, 52423, + 52425, 52432, 52436, 52452, 52460, 52464, 52481, 52488, 52489, 52492, + 52496, 52504, 52505, 52507, 52509, 52516, 52520, 52524, 52537, 52572, + 52576, 52580, 52588, 52589, 52591, 52593, 52600, 52616, 52628, 52629, + 52632, 52636, 52644, 52645, 52647, 52649, 52656, 52676, 52684, 52688, + 52712, 52716, 52720, 52728, 52729, 52731, 52733, 52740, 52744, 52748, + 52756, 52761, 52768, 52769, 52772, 52776, 52784, 52785, 52787, 52789, + 54955, 54957, 54958, 54959, 54961, 54962, 54963, 54964, 54965, 54966, + 54967, 54968, 54970, 54972, 54973, 54974, 54975, 54976, 54977, 54978, + 54979, 54982, 54983, 54985, 54986, 54987, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54989, 54990, 54991, 54992, 54994, 54995, 54997, 54998, + 55000, 55002, 55003, 55004, 55005, 55006, 55007, 55009, 55010, 55011, + 55013, 55014, 55015, 55017, 55018, 55019, 55020, 55021, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55022, 55023, 55025, 55026, 55027, 55028, + 55030, 55031, 55032, 55033, 55034, 55035, 55038, 55039, 55041, 55042, + 55043, 55045, 55046, 55047, 55048, 55049, 55050, 55051, 55052, 55053, + 55054, 55055, 55056, 55058, 55059, 55060, 52824, 52825, 52828, 52831, + 52832, 52833, 52840, 52841, 52843, 52845, 52852, 52853, 52856, 52860, + 52868, 52869, 52871, 52873, 52880, 52881, 52884, 52888, 52896, 52897, + 52899, 52900, 52901, 52908, 52909, 52929, 52964, 52965, 52968, 52971, + 52972, 52980, 52981, 52983, 52984, 52985, 52992, 52993, 52996, 53000, + 53008, 53009, 53011, 53013, 53020, 53024, 53028, 53036, 53037, 53039, + 53040, 53041, 53048, 53076, 53077, 53080, 53084, 53092, 53093, 53095, + 53097, 53104, 53105, 53108, 53112, 53120, 53125, 53132, 53153, 53160, + 53168, 53188, 53216, 53217, 53220, 53224, 53232, 53233, 53235, 53237, + 53244, 53248, 53252, 53265, 53272, 53293, 53300, 53301, 53304, 53308, + 55061, 55062, 55063, 55066, 55067, 55069, 55070, 55071, 55073, 55074, + 55075, 55076, 55077, 55078, 55079, 55082, 55084, 55086, 55087, 55088, + 55089, 55090, 55091, 55094, 55095, 55097, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 55098, 55099, 55101, 55102, 55103, 55104, 55105, 55106, + 55107, 55109, 55110, 55112, 55114, 55115, 55116, 55117, 55118, 55119, + 55122, 55123, 55125, 55130, 55131, 55132, 55133, 55134, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55135, 55138, 55140, 55142, 55143, 55144, + 55146, 55147, 55149, 55150, 55151, 55153, 55154, 55155, 55157, 55158, + 55159, 55160, 55161, 55162, 55163, 55166, 55167, 55168, 55170, 55171, + 55172, 55173, 55174, 55175, 55178, 55179, 53316, 53317, 53319, 53321, + 53328, 53332, 53336, 53344, 53356, 53357, 53360, 53364, 53372, 53373, + 53377, 53412, 53413, 53416, 53420, 53428, 53429, 53431, 53433, 53440, + 53441, 53444, 53448, 53449, 53456, 53457, 53459, 53460, 53461, 53468, + 53469, 53472, 53476, 53484, 53485, 53487, 53488, 53489, 53496, 53517, + 53552, 53553, 53556, 53560, 53562, 53568, 53569, 53571, 53572, 53573, + 53580, 53581, 53584, 53588, 53596, 53597, 53599, 53601, 53608, 53612, + 53628, 53636, 53640, 53664, 53665, 53668, 53672, 53680, 53681, 53683, + 53685, 53690, 53692, 53696, 53720, 53748, 53752, 53767, 53769, 53776, + 53804, 53805, 53808, 53812, 53820, 53821, 53823, 53825, 53832, 53852, + 55181, 55182, 55183, 55185, 55186, 55187, 55188, 55189, 55190, 55191, + 55194, 55196, 55198, 55199, 55200, 55201, 55202, 55203, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 53860, 53888, 53889, 53892, + 53896, 53904, 53905, 53909, 53916, 53920, 53924, 53932, 53937, 53944, + 53945, 53948, 53951, 53952, 53954, 53960, 53961, 53963, 53972, 53976, + 53980, 53988, 53989, 54000, 54001, 54004, 54008, 54016, 54017, 54019, + 54021, 54028, 54029, 54030, 54032, 54036, 54038, 54044, 54045, 54047, + 54048, 54049, 54053, 54056, 54057, 54060, 54064, 54072, 54073, 54075, + 54076, 54077, 54084, 54085, 54140, 54141, 54144, 54148, 54156, 54157, + 54159, 54160, 54161, 54168, 54169, 54172, 54176, 54184, 54185, 54187, + 54189, 54196, 54200, 54204, 54212, 54213, 54216, 54217, 54224, 54232, + 54241, 54243, 54252, 54253, 54256, 54260, 54268, 54269, 54271, 54273, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54280, 54301, 54336, 54340, + 54364, 54368, 54372, 54381, 54383, 54392, 54393, 54396, 54399, 54400, + 54402, 54408, 54409, 54411, 54413, 54420, 54441, 54476, 54480, 54484, + 54492, 54495, 54504, 54508, 54512, 54520, 54523, 54525, 54532, 54536, + 54540, 54548, 54549, 54551, 54588, 54589, 54592, 54596, 54604, 54605, + 54607, 54609, 54616, 54617, 54620, 54624, 54629, 54632, 54633, 54635, + 54637, 54644, 54645, 54648, 54652, 54660, 54661, 54663, 54664, 54665, + 54672, 54693, 54728, 54729, 54732, 54736, 54738, 54744, 54745, 54747, + 54749, 54756, 54757, 54760, 54764, 54772, 54773, 54775, 54777, 54784, + 54785, 54788, 54792, 54800, 54801, 54803, 54804, 54805, 54812, 54816, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54820, 54829, 54840, 54841, + 54844, 54848, 54853, 54856, 54857, 54859, 54861, 54865, 54868, 54869, + 54872, 54876, 54887, 54889, 54896, 54897, 54900, 54915, 54917, 54924, + 54925, 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, + 54971, 54980, 54981, 54984, 54988, 54993, 54996, 54999, 55001, 55008, + 55012, 55016, 55024, 55029, 55036, 55037, 55040, 55044, 55057, 55064, + 55065, 55068, 55072, 55080, 55081, 55083, 55085, 55092, 55093, 55096, + 55100, 55108, 55111, 55113, 55120, 55121, 55124, 55126, 55127, 55128, + 55129, 55136, 55137, 55139, 55141, 55145, 55148, 55152, 55156, 55164, + 55165, 55169, 55176, 55177, 55180, 55184, 55192, 55193, 55195, 55197, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20285, 20339, 20551, 20729, + 21152, 21487, 21621, 21733, 22025, 23233, 23478, 26247, 26550, 26551, + 26607, 27468, 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, + 36040, 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, + 27580, 29647, 33050, 35258, 35282, 38307, 20355, 21002, 22718, 22904, + 23014, 24178, 24185, 25031, 25536, 26438, 26604, 26751, 28567, 30286, + 30475, 30965, 31240, 31487, 31777, 32925, 33390, 33393, 35563, 38291, + 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, 34638, 38824, + 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, 26577, 27204, + 28187, 29976, 30131, 30435, 30640, 32058, 37039, 37969, 37970, 40853, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21283, 23724, 30002, 32987, + 37440, 38296, 21083, 22536, 23004, 23713, 23831, 24247, 24378, 24394, + 24951, 27743, 30074, 30086, 31968, 32115, 32177, 32652, 33108, 33313, + 34193, 35137, 35611, 37628, 38477, 40007, 20171, 20215, 20491, 20977, + 22607, 24887, 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, + 31623, 33445, 33995, 63744, 37799, 38283, 21888, 23458, 22353, 63745, + 31923, 32697, 37301, 20520, 21435, 23621, 24040, 25298, 25454, 25818, + 25831, 28192, 28844, 31067, 36317, 36382, 63746, 36989, 37445, 37624, + 20094, 20214, 20581, 24062, 24314, 24838, 26967, 33137, 34388, 36423, + 37749, 39467, 20062, 20625, 26480, 26688, 20745, 21133, 21138, 27298, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30652, 37392, 40660, 21163, + 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, + 35233, 38548, 22533, 29309, 29356, 29956, 32121, 32365, 32937, 35211, + 35700, 36963, 40273, 25225, 27770, 28500, 32080, 32570, 35363, 20860, + 24906, 31645, 35609, 37463, 37772, 20140, 20435, 20510, 20670, 20742, + 21185, 21197, 21375, 22384, 22659, 24218, 24465, 24950, 25004, 25806, + 25964, 26223, 26299, 26356, 26775, 28039, 28805, 28913, 29855, 29861, + 29898, 30169, 30828, 30956, 31455, 31478, 32069, 32147, 32789, 32831, + 33051, 33686, 35686, 36629, 36885, 37857, 38915, 38968, 39514, 39912, + 20418, 21843, 22586, 22865, 23395, 23622, 24760, 25106, 26690, 26800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26856, 28330, 30028, 30328, + 30926, 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, + 21476, 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, + 25911, 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, + 31295, 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, + 34996, 35493, 63747, 36764, 37678, 38599, 39015, 39640, 40723, 21741, + 26011, 26354, 26767, 31296, 35895, 40288, 22256, 22372, 23825, 26118, + 26801, 26829, 28414, 29736, 34974, 39908, 27752, 63748, 39592, 20379, + 20844, 20849, 21151, 23380, 24037, 24656, 24685, 25329, 25511, 25915, + 29657, 31354, 34467, 36002, 38799, 20018, 23521, 25096, 26524, 29916, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31185, 33747, 35463, 35506, + 36328, 36942, 37707, 38982, 24275, 27112, 34303, 37101, 63749, 20896, + 23448, 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, + 33733, 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, + 20809, 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, + 33009, 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, + 24871, 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, + 21676, 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, + 30350, 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, + 39171, 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21312, 21475, 21477, 21646, + 22036, 22389, 22434, 23495, 23943, 24272, 25084, 25304, 25937, 26552, + 26601, 27083, 27472, 27590, 27628, 27714, 28317, 28792, 29399, 29590, + 29699, 30655, 30697, 31350, 32127, 32777, 33276, 33285, 33290, 33503, + 34914, 35635, 36092, 36544, 36881, 37041, 37476, 37558, 39378, 39493, + 40169, 40407, 40860, 22283, 23616, 33738, 38816, 38827, 40628, 21531, + 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, 23470, + 24339, 31353, 31406, 33422, 36524, 20518, 21048, 21240, 21367, 22280, + 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, 36470, 38357, + 26426, 27331, 28528, 35437, 36556, 39243, 63750, 26231, 27512, 36020, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 39740, 63751, 21483, 22317, + 22862, 25542, 27131, 29674, 30789, 31418, 31429, 31998, 33909, 35215, + 36211, 36917, 38312, 21243, 22343, 30023, 31584, 33740, 37406, 63752, + 27224, 20811, 21067, 21127, 25119, 26840, 26997, 38553, 20677, 21156, + 21220, 25027, 26020, 26681, 27135, 29822, 31563, 33465, 33771, 35250, + 35641, 36817, 39241, 63753, 20170, 22935, 25810, 26129, 27278, 29748, + 31105, 31165, 33449, 34942, 34943, 35167, 63754, 37670, 20235, 21450, + 24613, 25201, 27762, 32026, 32102, 20120, 20834, 30684, 32943, 20225, + 20238, 20854, 20864, 21980, 22120, 22331, 22522, 22524, 22804, 22855, + 22931, 23492, 23696, 23822, 24049, 24190, 24524, 25216, 26071, 26083, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26398, 26399, 26462, 26827, + 26820, 27231, 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, + 29826, 29859, 30072, 30079, 30849, 30959, 31041, 31047, 31048, 31098, + 31637, 32000, 32186, 32648, 32774, 32813, 32908, 35352, 35663, 35912, + 36215, 37665, 37668, 39138, 39249, 39438, 39439, 39525, 40594, 32202, + 20342, 21513, 25326, 26708, 37329, 21931, 20794, 63755, 63756, 23068, + 25062, 63757, 25295, 25343, 63758, 63759, 63760, 63761, 63762, 63763, + 37027, 63764, 63765, 63766, 63767, 63768, 35582, 63769, 63770, 63771, + 63772, 26262, 63773, 29014, 63774, 63775, 38627, 63776, 25423, 25466, + 21335, 63777, 26511, 26976, 28275, 63778, 30007, 63779, 63780, 63781, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32013, 63782, 63783, 34930, + 22218, 23064, 63784, 63785, 63786, 63787, 63788, 20035, 63789, 20839, + 22856, 26608, 32784, 63790, 22899, 24180, 25754, 31178, 24565, 24684, + 25288, 25467, 23527, 23511, 21162, 63791, 22900, 24361, 24594, 63792, + 63793, 63794, 29785, 63795, 63796, 63797, 63798, 63799, 63800, 39377, + 63801, 63802, 63803, 63804, 63805, 63806, 63807, 63808, 63809, 63810, + 63811, 28611, 63812, 63813, 33215, 36786, 24817, 63814, 63815, 33126, + 63816, 63817, 23615, 63818, 63819, 63820, 63821, 63822, 63823, 63824, + 63825, 23273, 35365, 26491, 32016, 63826, 63827, 63828, 63829, 63830, + 63831, 33021, 63832, 63833, 23612, 27877, 21311, 28346, 22810, 33590, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20025, 20150, 20294, 21934, + 22296, 22727, 24406, 26039, 26086, 27264, 27573, 28237, 30701, 31471, + 31774, 32222, 34507, 34962, 37170, 37723, 25787, 28606, 29562, 30136, + 36948, 21846, 22349, 25018, 25812, 26311, 28129, 28251, 28525, 28601, + 30192, 32835, 33213, 34113, 35203, 35527, 35674, 37663, 27795, 30035, + 31572, 36367, 36957, 21776, 22530, 22616, 24162, 25095, 25758, 26848, + 30070, 31958, 34739, 40680, 20195, 22408, 22382, 22823, 23565, 23729, + 24118, 24453, 25140, 25825, 29619, 33274, 34955, 36024, 38538, 40667, + 23429, 24503, 24755, 20498, 20992, 21040, 22294, 22581, 22615, 23566, + 23648, 23798, 23947, 24230, 24466, 24764, 25361, 25481, 25623, 26691, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26873, 27330, 28120, 28193, + 28372, 28644, 29182, 30428, 30585, 31153, 31291, 33796, 35241, 36077, + 36339, 36424, 36867, 36884, 36947, 37117, 37709, 38518, 38876, 27602, + 28678, 29272, 29346, 29544, 30563, 31167, 31716, 32411, 35712, 22697, + 24775, 25958, 26109, 26302, 27788, 28958, 29129, 35930, 38931, 20077, + 31361, 20189, 20908, 20941, 21205, 21516, 24999, 26481, 26704, 26847, + 27934, 28540, 30140, 30643, 31461, 33012, 33891, 37509, 20828, 26007, + 26460, 26515, 30168, 31431, 33651, 63834, 35910, 36887, 38957, 23663, + 33216, 33434, 36929, 36975, 37389, 24471, 23965, 27225, 29128, 30331, + 31561, 34276, 35588, 37159, 39472, 21895, 25078, 63835, 30313, 32645, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34367, 34746, 35064, 37007, + 63836, 27931, 28889, 29662, 32097, 33853, 63837, 37226, 39409, 63838, + 20098, 21365, 27396, 27410, 28734, 29211, 34349, 40478, 21068, 36771, + 23888, 25829, 25900, 27414, 28651, 31811, 32412, 34253, 35172, 35261, + 25289, 33240, 34847, 24266, 26391, 28010, 29436, 29701, 29807, 34690, + 37086, 20358, 23821, 24480, 33802, 20919, 25504, 30053, 20142, 20486, + 20841, 20937, 26753, 27153, 31918, 31921, 31975, 33391, 35538, 36635, + 37327, 20406, 20791, 21237, 21570, 24300, 24942, 25150, 26053, 27354, + 28670, 31018, 34268, 34851, 38317, 39522, 39530, 40599, 40654, 21147, + 26310, 27511, 28701, 31019, 36706, 38722, 24976, 25088, 25891, 28451, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29001, 29833, 32244, 32879, + 34030, 36646, 36899, 37706, 20925, 21015, 21155, 27916, 28872, 35010, + 24265, 25986, 27566, 28610, 31806, 29557, 20196, 20278, 22265, 63839, + 23738, 23994, 24604, 29618, 31533, 32666, 32718, 32838, 36894, 37428, + 38646, 38728, 38936, 40801, 20363, 28583, 31150, 37300, 38583, 21214, + 63840, 25736, 25796, 27347, 28510, 28696, 29200, 30439, 32769, 34310, + 34396, 36335, 36613, 38706, 39791, 40442, 40565, 30860, 31103, 32160, + 33737, 37636, 40575, 40595, 35542, 22751, 24324, 26407, 28711, 29903, + 31840, 32894, 20769, 28712, 29282, 30922, 36034, 36058, 36084, 38647, + 20102, 20698, 23534, 24278, 26009, 29134, 30274, 30637, 32842, 34044, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36988, 39719, 40845, 22744, + 23105, 23650, 27155, 28122, 28431, 30267, 32047, 32311, 34078, 35128, + 37860, 38475, 21129, 26066, 26611, 27060, 27969, 28316, 28687, 29705, + 29792, 30041, 30244, 30827, 35628, 39006, 20845, 25134, 38520, 20374, + 20523, 23833, 28138, 32184, 36650, 24459, 24900, 26647, 63841, 38534, + 21202, 32907, 20956, 20940, 26974, 31260, 32190, 33777, 38517, 20442, + 21033, 21400, 21519, 21774, 23653, 24743, 26446, 26792, 28012, 29313, + 29432, 29702, 29827, 63842, 30178, 31852, 32633, 32696, 33673, 35023, + 35041, 37324, 37328, 38626, 39881, 21533, 28542, 29136, 29848, 34298, + 36522, 38563, 40023, 40607, 26519, 28107, 29747, 33256, 38678, 30764, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31435, 31520, 31890, 25705, + 29802, 30194, 30908, 30952, 39340, 39764, 40635, 23518, 24149, 28448, + 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, 24930, 25405, + 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, 34875, 36627, + 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, 38778, 20129, + 22916, 24536, 24537, 26395, 32178, 32596, 33426, 33579, 33725, 36638, + 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, 27599, 29028, + 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, 39488, 40613, + 23391, 27667, 29467, 30450, 30431, 33804, 20906, 35219, 20813, 20885, + 21193, 26825, 27796, 30468, 30496, 32191, 32236, 38754, 40629, 28357, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34065, 20901, 21517, 21629, + 26126, 26269, 26919, 28319, 30399, 30609, 33559, 33986, 34719, 37225, + 37528, 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, 25720, + 25721, 26286, 26576, 27169, 27597, 27611, 29279, 29281, 29761, 30520, + 30683, 32791, 33468, 33541, 35584, 35624, 35980, 26408, 27792, 29287, + 30446, 30566, 31302, 40361, 27519, 27794, 22818, 26406, 33945, 21359, + 22675, 22937, 24287, 25551, 26164, 26483, 28218, 29483, 31447, 33495, + 37672, 21209, 24043, 25006, 25035, 25098, 25287, 25771, 26080, 26969, + 27494, 27595, 28961, 29687, 30045, 32326, 33310, 33538, 34154, 35491, + 36031, 38695, 40289, 22696, 40664, 20497, 21006, 21563, 21839, 25991, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27766, 32010, 32011, 32862, + 34442, 38272, 38639, 21247, 27797, 29289, 21619, 23194, 23614, 23883, + 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, 31859, 32654, + 34183, 35598, 36855, 38753, 40692, 23735, 24758, 24845, 25003, 25935, + 26107, 26108, 27665, 27887, 29599, 29641, 32225, 38292, 23494, 34588, + 35600, 21085, 21338, 25293, 25615, 25778, 26420, 27192, 27850, 29632, + 29854, 31636, 31893, 32283, 33162, 33334, 34180, 36843, 38649, 39361, + 20276, 21322, 21453, 21467, 25292, 25644, 25856, 26001, 27075, 27886, + 28504, 29677, 30036, 30242, 30436, 30460, 30928, 30971, 31020, 32070, + 33324, 34784, 36820, 38930, 39151, 21187, 25300, 25765, 28196, 28497, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30332, 36299, 37297, 37474, + 39662, 39747, 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, + 25918, 26041, 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, + 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, + 20493, 20467, 63843, 22521, 24472, 25308, 25490, 26479, 28227, 28953, + 30403, 32972, 32986, 35060, 35061, 35097, 36064, 36649, 37197, 38506, + 20271, 20336, 24091, 26575, 26658, 30333, 30334, 39748, 24161, 27146, + 29033, 29140, 30058, 63844, 32321, 34115, 34281, 39132, 20240, 31567, + 32624, 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, + 33539, 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30887, 34327, 38370, 38713, + 63845, 21342, 24321, 35722, 36776, 36783, 37002, 21029, 30629, 40009, + 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, 26564, 26821, + 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, 20445, 22561, + 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, 29995, 33769, + 35036, 35091, 35676, 36628, 20239, 20693, 21264, 21340, 23443, 24489, + 26381, 31119, 33145, 33583, 34068, 35079, 35206, 36665, 36667, 39333, + 39954, 26412, 20086, 20472, 22857, 23553, 23791, 23792, 25447, 26834, + 28925, 29090, 29739, 32299, 34028, 34562, 36898, 37586, 40179, 19981, + 20184, 20463, 20613, 21078, 21103, 21542, 21648, 22496, 22827, 23142, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23386, 23413, 23500, 24220, + 63846, 25206, 25975, 26023, 28014, 28325, 29238, 31526, 31807, 32566, + 33104, 33105, 33178, 33344, 33433, 33705, 35331, 36000, 36070, 36091, + 36212, 36282, 37096, 37340, 38428, 38468, 39385, 40167, 21271, 20998, + 21545, 22132, 22707, 22868, 22894, 24575, 24996, 25198, 26128, 27774, + 28954, 30406, 31881, 31966, 32027, 33452, 36033, 38640, 63847, 20315, + 24343, 24447, 25282, 23849, 26379, 26842, 30844, 32323, 40300, 19989, + 20633, 21269, 21290, 21329, 22915, 23138, 24199, 24754, 24970, 25161, + 25209, 26000, 26503, 27047, 27604, 27606, 27607, 27608, 27832, 63848, + 29749, 30202, 30738, 30865, 31189, 31192, 31875, 32203, 32737, 32933, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 33086, 33218, 33778, 34586, + 35048, 35513, 35692, 36027, 37145, 38750, 39131, 40763, 22188, 23338, + 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, + 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, + 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, + 22763, 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, 24605, + 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, 28195, + 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, 32114, + 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, 36060, + 36198, 36781, 37034, 39164, 39391, 40605, 21066, 63849, 26388, 63850, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20632, 21034, 23665, 25955, + 27733, 29642, 29987, 30109, 31639, 33948, 37240, 38704, 20087, 25746, + 27578, 29022, 34217, 19977, 63851, 26441, 26862, 28183, 33439, 34072, + 34923, 25591, 28545, 37394, 39087, 19978, 20663, 20687, 20767, 21830, + 21930, 22039, 23360, 23577, 23776, 24120, 24202, 24224, 24258, 24819, + 26705, 27233, 28248, 29245, 29248, 29376, 30456, 31077, 31665, 32724, + 35059, 35316, 35443, 35937, 36062, 38684, 22622, 29885, 36093, 21959, + 63852, 31329, 32034, 33394, 29298, 29983, 29989, 63853, 31513, 22661, + 22779, 23996, 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, + 26329, 26360, 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32997, 33298, 34223, 35199, + 35475, 36893, 37604, 40653, 40736, 22805, 22893, 24109, 24796, 26132, + 26227, 26512, 27728, 28101, 28511, 30707, 30889, 33990, 37323, 37675, + 20185, 20682, 20808, 21892, 23307, 23459, 25159, 25982, 26059, 28210, + 29053, 29697, 29764, 29831, 29887, 30316, 31146, 32218, 32341, 32680, + 33146, 33203, 33337, 34330, 34796, 35445, 36323, 36984, 37521, 37925, + 39245, 39854, 21352, 23633, 26964, 27844, 27945, 28203, 33292, 34203, + 35131, 35373, 35498, 38634, 40807, 21089, 26297, 27570, 32406, 34814, + 36109, 38275, 38493, 25885, 28041, 29166, 63854, 22478, 22995, 23468, + 24615, 24826, 25104, 26143, 26207, 29481, 29689, 30427, 30465, 31596, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32854, 32882, 33125, 35488, + 37266, 19990, 21218, 27506, 27927, 31237, 31545, 32048, 63855, 36016, + 21484, 22063, 22609, 23477, 23567, 23569, 24034, 25152, 25475, 25620, + 26157, 26803, 27836, 28040, 28335, 28703, 28836, 29138, 29990, 30095, + 30094, 30233, 31505, 31712, 31787, 32032, 32057, 34092, 34157, 34311, + 35380, 36877, 36961, 37045, 37559, 38902, 39479, 20439, 23660, 26463, + 28049, 31903, 32396, 35606, 36118, 36895, 23403, 24061, 25613, 33984, + 36956, 39137, 29575, 23435, 24730, 26494, 28126, 35359, 35494, 36865, + 38924, 21047, 63856, 28753, 30862, 37782, 34928, 37335, 20462, 21463, + 22013, 22234, 22402, 22781, 23234, 23432, 23723, 23744, 24101, 24833, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 25101, 25163, 25480, 25628, + 25910, 25976, 27193, 27530, 27700, 27929, 28465, 29159, 29417, 29560, + 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, 32143, 32172, + 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, 35504, 35728, + 36664, 36930, 36995, 37228, 37526, 37561, 38539, 38567, 38568, 38614, + 38656, 38920, 39318, 39635, 39706, 21460, 22654, 22809, 23408, 23487, + 28113, 28506, 29087, 29729, 29881, 32901, 33789, 24033, 24455, 24490, + 24642, 26092, 26642, 26991, 27219, 27529, 27957, 28147, 29667, 30462, + 30636, 31565, 32020, 33059, 33308, 33600, 34036, 34147, 35426, 35524, + 37255, 37662, 38918, 39348, 25100, 34899, 36848, 37477, 23815, 23847, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23913, 29791, 33181, 34664, + 28629, 25342, 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, + 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, + 23608, 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, 26558, + 26612, 29468, 30690, 31034, 32709, 33940, 33997, 35222, 35430, 35433, + 35553, 35925, 35962, 22516, 23508, 24335, 24687, 25325, 26893, 27542, + 28252, 29060, 31698, 34645, 35672, 36606, 39135, 39166, 20280, 20353, + 20449, 21627, 23072, 23480, 24892, 26032, 26216, 29180, 30003, 31070, + 32051, 33102, 33251, 33688, 34218, 34254, 34563, 35338, 36523, 36763, + 63857, 36805, 22833, 23460, 23526, 24713, 23529, 23563, 24515, 27777, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63858, 28145, 28683, 29978, + 33455, 35574, 20160, 21313, 63859, 38617, 27663, 20126, 20420, 20818, + 21854, 23077, 23784, 25105, 29273, 33469, 33706, 34558, 34905, 35357, + 38463, 38597, 39187, 40201, 40285, 22538, 23731, 23997, 24132, 24801, + 24853, 25569, 27138, 28197, 37122, 37716, 38990, 39952, 40823, 23433, + 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, 26017, + 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, 33780, + 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, 27523, + 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, 30861, + 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, 38989, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27387, 32588, 40367, 40474, + 20063, 20539, 20918, 22812, 24825, 25590, 26928, 29242, 32822, 63860, + 37326, 24369, 63861, 63862, 32004, 33509, 33903, 33979, 34277, 36493, + 63863, 20335, 63864, 63865, 22756, 23363, 24665, 25562, 25880, 25965, + 26264, 63866, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, + 31344, 63867, 32650, 63868, 35140, 63869, 35731, 37312, 38525, 63870, + 39178, 22276, 24481, 26044, 28417, 30208, 31142, 35486, 39341, 39770, + 40812, 20740, 25014, 25233, 27277, 33222, 20547, 22576, 24422, 28937, + 35328, 35578, 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, + 23978, 26989, 20870, 20104, 20313, 63871, 63872, 63873, 22914, 63874, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63875, 27487, 27741, 63876, + 29877, 30998, 63877, 33287, 33349, 33593, 36671, 36701, 63878, 39192, + 63879, 63880, 63881, 20134, 63882, 22495, 24441, 26131, 63883, 63884, + 30123, 32377, 35695, 63885, 36870, 39515, 22181, 22567, 23032, 23071, + 23476, 63886, 24310, 63887, 63888, 25424, 25403, 63889, 26941, 27783, + 27839, 28046, 28051, 28149, 28436, 63890, 28895, 28982, 29017, 63891, + 29123, 29141, 63892, 30799, 30831, 63893, 31605, 32227, 63894, 32303, + 63895, 34893, 36575, 63896, 63897, 63898, 37467, 63899, 40182, 63900, + 63901, 63902, 24709, 28037, 63903, 29105, 63904, 63905, 38321, 21421, + 63906, 63907, 63908, 26579, 63909, 28814, 28976, 29744, 33398, 33490, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63910, 38331, 39653, 40573, + 26308, 63911, 29121, 33865, 63912, 63913, 22603, 63914, 63915, 23992, + 24433, 63916, 26144, 26254, 27001, 27054, 27704, 27891, 28214, 28481, + 28634, 28699, 28719, 29008, 29151, 29552, 63917, 29787, 63918, 29908, + 30408, 31310, 32403, 63919, 63920, 33521, 35424, 36814, 63921, 37704, + 63922, 38681, 63923, 63924, 20034, 20522, 63925, 21000, 21473, 26355, + 27757, 28618, 29450, 30591, 31330, 33454, 34269, 34306, 63926, 35028, + 35427, 35709, 35947, 63927, 37555, 63928, 38675, 38928, 20116, 20237, + 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, 23067, + 23524, 24735, 63929, 25034, 25942, 26111, 26212, 26791, 27738, 28595, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28879, 29100, 29522, 31613, + 34568, 35492, 39986, 40711, 23627, 27779, 29508, 29577, 37434, 28331, + 29797, 30239, 31337, 32277, 34314, 20800, 22725, 25793, 29934, 29973, + 30320, 32705, 37013, 38605, 39252, 28198, 29926, 31401, 31402, 33253, + 34521, 34680, 35355, 23113, 23436, 23451, 26785, 26880, 28003, 29609, + 29715, 29740, 30871, 32233, 32747, 33048, 33109, 33694, 35916, 38446, + 38929, 26352, 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, + 30702, 22806, 23916, 24013, 29477, 30031, 63930, 63931, 20709, 20985, + 22575, 22829, 22934, 23002, 23525, 63932, 63933, 23970, 25303, 25622, + 25747, 25854, 63934, 26332, 63935, 27208, 63936, 29183, 29796, 63937, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31368, 31407, 32327, 32350, + 32768, 33136, 63938, 34799, 35201, 35616, 36953, 63939, 36992, 39250, + 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, 20887, 21191, + 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, 28342, 29076, + 29794, 29992, 29996, 32883, 33592, 33993, 36362, 37780, 37854, 63940, + 20110, 20305, 20598, 20778, 21448, 21451, 21491, 23431, 23507, 23588, + 24858, 24962, 26100, 29275, 29591, 29760, 30402, 31056, 31121, 31161, + 32006, 32701, 33419, 34261, 34398, 36802, 36935, 37109, 37354, 38533, + 38632, 38633, 21206, 24423, 26093, 26161, 26671, 29020, 31286, 37057, + 38922, 20113, 63941, 27218, 27550, 28560, 29065, 32792, 33464, 34131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36939, 38549, 38642, 38907, + 34074, 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, + 22435, 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, + 28304, 29232, 29503, 29783, 33489, 34945, 36677, 36960, 63942, 38498, + 39000, 40219, 26376, 36234, 37470, 20301, 20553, 20702, 21361, 22285, + 22996, 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, + 33806, 33894, 34111, 34655, 34907, 35096, 35586, 36949, 38859, 39759, + 20083, 20369, 20754, 20842, 63943, 21807, 21929, 23418, 23461, 24188, + 24189, 24254, 24736, 24799, 24840, 24841, 25540, 25912, 26377, 63944, + 26580, 26586, 63945, 26977, 26978, 27833, 27943, 63946, 28216, 63947, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28641, 29494, 29495, 63948, + 29788, 30001, 63949, 30290, 63950, 63951, 32173, 33278, 33848, 35029, + 35480, 35547, 35565, 36400, 36418, 36938, 36926, 36986, 37193, 37321, + 37742, 63952, 63953, 22537, 63954, 27603, 32905, 32946, 63955, 63956, + 20801, 22891, 23609, 63957, 63958, 28516, 29607, 32996, 36103, 63959, + 37399, 38287, 63960, 63961, 63962, 63963, 32895, 25102, 28700, 32104, + 34701, 63964, 22432, 24681, 24903, 27575, 35518, 37504, 38577, 20057, + 21535, 28139, 34093, 38512, 38899, 39150, 25558, 27875, 37009, 20957, + 25033, 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, + 26885, 27589, 30097, 30691, 32681, 33380, 34191, 34811, 34915, 35516, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 35696, 37291, 20108, 20197, + 20234, 63965, 63966, 22839, 23016, 63967, 24050, 24347, 24411, 24609, + 63968, 63969, 63970, 63971, 29246, 29669, 63972, 30064, 30157, 63973, + 31227, 63974, 32780, 32819, 32900, 33505, 33617, 63975, 63976, 36029, + 36019, 36999, 63977, 63978, 39156, 39180, 63979, 63980, 28727, 30410, + 32714, 32716, 32764, 35610, 20154, 20161, 20995, 21360, 63981, 21693, + 22240, 23035, 23493, 24341, 24525, 28270, 63982, 63983, 32106, 33589, + 63984, 34451, 35469, 63985, 38765, 38775, 63986, 63987, 19968, 20314, + 20350, 22777, 26085, 28322, 36920, 37808, 39353, 20219, 22764, 22922, + 23001, 24641, 63988, 63989, 31252, 63990, 33615, 36035, 20837, 21316, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63991, 63992, 63993, 20173, + 21097, 23381, 33471, 20180, 21050, 21672, 22985, 23039, 23376, 23383, + 23388, 24675, 24904, 28363, 28825, 29038, 29574, 29943, 30133, 30913, + 32043, 32773, 33258, 33576, 34071, 34249, 35566, 36039, 38604, 20316, + 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, 33421, 37196, + 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, 26283, 28507, + 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, 22715, 22767, + 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, 27167, 27299, + 27404, 28479, 29254, 63994, 29520, 29835, 31456, 31911, 33144, 33247, + 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, 38263, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38556, 20877, 21705, 22312, + 23472, 25165, 26448, 26685, 26771, 28221, 28371, 28797, 32289, 35009, + 36001, 36617, 40779, 40782, 29229, 31631, 35533, 37658, 20295, 20302, + 20786, 21632, 22992, 24213, 25269, 26485, 26990, 27159, 27822, 28186, + 29401, 29482, 30141, 31672, 32053, 33511, 33785, 33879, 34295, 35419, + 36015, 36487, 36889, 37048, 38606, 40799, 21219, 21514, 23265, 23490, + 25688, 25973, 28404, 29380, 63995, 30340, 31309, 31515, 31821, 32318, + 32735, 33659, 35627, 36042, 36196, 36321, 36447, 36842, 36857, 36969, + 37841, 20291, 20346, 20659, 20840, 20856, 21069, 21098, 22625, 22652, + 22880, 23560, 23637, 24283, 24731, 25136, 26643, 27583, 27656, 28593, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29006, 29728, 30000, 30008, + 30033, 30322, 31564, 31627, 31661, 31686, 32399, 35438, 36670, 36681, + 37439, 37523, 37666, 37931, 38651, 39002, 39019, 39198, 20999, 25130, + 25240, 27993, 30308, 31434, 31680, 32118, 21344, 23742, 24215, 28472, + 28857, 31896, 38673, 39822, 40670, 25509, 25722, 34678, 19969, 20117, + 20141, 20572, 20597, 21576, 22979, 23450, 24128, 24237, 24311, 24449, + 24773, 25402, 25919, 25972, 26060, 26230, 26232, 26622, 26984, 27273, + 27491, 27712, 28096, 28136, 28191, 28254, 28702, 28833, 29582, 29693, + 30010, 30555, 30855, 31118, 31243, 31357, 31934, 32142, 33351, 35330, + 35562, 35998, 37165, 37194, 37336, 37478, 37580, 37664, 38662, 38742, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38748, 38914, 40718, 21046, + 21137, 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, + 31532, 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, + 38988, 40778, 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, + 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, + 28526, 29031, 29157, 29226, 29866, 30522, 31062, 31066, 31199, 31264, + 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, 35519, + 36249, 36481, 36896, 36973, 37347, 38459, 38613, 40165, 26063, 31751, + 36275, 37827, 23384, 23562, 21330, 25305, 29469, 20519, 23447, 24478, + 24752, 24939, 26837, 28121, 29742, 31278, 32066, 32156, 32305, 33131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36394, 36405, 37758, 37912, + 20304, 22352, 24038, 24231, 25387, 32618, 20027, 20303, 20367, 20570, + 23005, 32964, 21610, 21608, 22014, 22863, 23449, 24030, 24282, 26205, + 26417, 26609, 26666, 27880, 27954, 28234, 28557, 28855, 29664, 30087, + 31820, 32002, 32044, 32162, 33311, 34523, 35387, 35461, 36208, 36490, + 36659, 36913, 37198, 37202, 37956, 39376, 31481, 31909, 20426, 20737, + 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, + 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, + 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, + 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21675, 22320, 22336, 24535, + 25345, 25351, 25711, 25903, 26088, 26234, 26525, 26547, 27490, 27744, + 27802, 28460, 30693, 30757, 31049, 31063, 32025, 32930, 33026, 33267, + 33437, 33463, 34584, 35468, 63996, 36100, 36286, 36978, 30452, 31257, + 31287, 32340, 32887, 21767, 21972, 22645, 25391, 25634, 26185, 26187, + 26733, 27035, 27524, 27941, 28337, 29645, 29800, 29857, 30043, 30137, + 30433, 30494, 30603, 31206, 32265, 32285, 33275, 34095, 34967, 35386, + 36049, 36587, 36784, 36914, 37805, 38499, 38515, 38663, 20356, 21489, + 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, + 36074, 36300, 36845, 26015, 26389, 63997, 22519, 28503, 32221, 36655, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37878, 38598, 24501, 25074, + 28548, 19988, 20376, 20511, 21449, 21983, 23919, 24046, 27425, 27492, + 30923, 31642, 63998, 36425, 36554, 36974, 25417, 25662, 30528, 31364, + 37679, 38015, 40810, 25776, 28591, 29158, 29864, 29914, 31428, 31762, + 32386, 31922, 32408, 35738, 36106, 38013, 39184, 39244, 21049, 23519, + 25830, 26413, 32046, 20717, 21443, 22649, 24920, 24921, 25082, 26028, + 31449, 35730, 35734, 20489, 20513, 21109, 21809, 23100, 24288, 24432, + 24884, 25950, 26124, 26166, 26274, 27085, 28356, 28466, 29462, 30241, + 31379, 33081, 33369, 33750, 33980, 20661, 22512, 23488, 23528, 24425, + 25505, 30758, 32181, 33756, 34081, 37319, 37365, 20874, 26613, 31574, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36012, 20932, 22971, 24765, + 34389, 20508, 63999, 21076, 23610, 24957, 25114, 25299, 25842, 26021, + 28364, 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, + 24029, 25797, 27849, 28154, 29588, 31359, 33307, 34214, 36068, 36368, + 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, + 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, + 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, + 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, + 35531, 38737, 39894, 64000, 21059, 26367, 28053, 28399, 32224, 35558, + 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26898, 26970, 27189, 28818, + 28966, 30813, 30977, 30990, 31186, 31245, 32918, 33400, 33493, 33609, + 34121, 35970, 36229, 37218, 37259, 37294, 20419, 22225, 29165, 30679, + 34560, 35320, 23544, 24534, 26449, 37032, 21474, 22618, 23541, 24740, + 24961, 25696, 32317, 32880, 34085, 37507, 25774, 20652, 23828, 26368, + 22684, 25277, 25512, 26894, 27000, 27166, 28267, 30394, 31179, 33467, + 33833, 35535, 36264, 36861, 37138, 37195, 37276, 37648, 37656, 37786, + 38619, 39478, 39949, 19985, 30044, 31069, 31482, 31569, 31689, 32302, + 33988, 36441, 36468, 36600, 36880, 26149, 26943, 29763, 20986, 26414, + 40668, 20805, 24544, 27798, 34802, 34909, 34935, 24756, 33205, 33795, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36101, 21462, 21561, 22068, + 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, + 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, + 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, + 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, + 40786, 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, 23522, + 26517, 27784, 28024, 29723, 30759, 37341, 37756, 34756, 31204, 31281, + 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, 25302, 26422, + 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, 22396, 64001, + 25176, 64002, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37944, 21585, 22022, 22374, + 24392, 24986, 27470, 28760, 28845, 32187, 35477, 22890, 33067, 25506, + 30472, 32829, 36010, 22612, 25645, 27067, 23445, 24081, 28271, 64003, + 34153, 20812, 21488, 22826, 24608, 24907, 27526, 27760, 27888, 31518, + 32974, 33492, 36294, 37040, 39089, 64004, 25799, 28580, 25745, 25860, + 20814, 21520, 22303, 35342, 24927, 26742, 64005, 30171, 31570, 32113, + 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, 22871, 22956, + 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, 24052, 25226, + 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, 32631, 33453, + 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, 36774, 37393, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38442, 20843, 21485, 25420, + 20329, 21764, 24726, 25943, 27803, 28031, 29260, 29437, 31255, 35207, + 35997, 24429, 28558, 28921, 33192, 24846, 20415, 20559, 25153, 29255, + 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, + 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, + 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, + 24598, 25243, 25265, 25429, 64006, 27873, 28006, 30129, 30770, 32990, + 33071, 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, + 24133, 26292, 26333, 28689, 29190, 64007, 20469, 21117, 24426, 24915, + 26451, 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21697, 31263, 26963, 35575, + 35914, 39080, 39342, 24444, 25259, 30130, 30382, 34987, 36991, 38466, + 21305, 24380, 24517, 27852, 29644, 30050, 30091, 31558, 33534, 39325, + 20047, 36924, 19979, 20309, 21414, 22799, 24264, 26160, 27827, 29781, + 33655, 34662, 36032, 36944, 38686, 39957, 22737, 23416, 34384, 35604, + 40372, 23506, 24680, 24717, 26097, 27735, 28450, 28579, 28698, 32597, + 32752, 38289, 38290, 38480, 38867, 21106, 36676, 20989, 21547, 21688, + 21859, 21898, 27323, 28085, 32216, 33382, 37532, 38519, 40569, 21512, + 21704, 30418, 34532, 38308, 38356, 38492, 20130, 20233, 23022, 23270, + 24055, 24658, 25239, 26477, 26689, 27782, 28207, 32568, 32923, 33322, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 64008, 64009, 38917, 20133, + 20565, 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, + 34809, 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, + 24184, 26447, 33607, 34892, 20139, 21521, 22190, 29670, 37141, 38911, + 39177, 39255, 39321, 22099, 22687, 34395, 35377, 25010, 27382, 29563, + 36562, 27463, 38570, 39511, 22869, 29184, 36203, 38761, 20436, 23796, + 24358, 25080, 26203, 27883, 28843, 29572, 29625, 29694, 30505, 30541, + 32067, 32098, 32291, 33335, 34898, 64010, 36066, 37449, 39023, 23377, + 31348, 34880, 38913, 23244, 20448, 21332, 22846, 23805, 25406, 28025, + 29433, 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24418, 27842, 28366, 28677, + 28752, 28847, 29074, 29673, 29801, 33610, 34722, 34913, 36872, 37026, + 37795, 39336, 20846, 24407, 24800, 24935, 26291, 34137, 36426, 37295, + 38795, 20046, 20114, 21628, 22741, 22778, 22909, 23733, 24359, 25142, + 25160, 26122, 26215, 27627, 28009, 28111, 28246, 28408, 28564, 28640, + 28649, 28765, 29392, 29733, 29786, 29920, 30355, 31068, 31946, 32286, + 32993, 33446, 33899, 33983, 34382, 34399, 34676, 35703, 35946, 37804, + 38912, 39013, 24785, 25110, 37239, 23130, 26127, 28151, 28222, 29759, + 39746, 24573, 24794, 31503, 21700, 24344, 27742, 27859, 27946, 28888, + 32005, 34425, 35340, 40251, 21270, 21644, 23301, 27194, 28779, 30069, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31117, 31166, 33457, 33775, + 35441, 35649, 36008, 38772, 64011, 25844, 25899, 30906, 30907, 31339, + 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, + 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, 28369, 29502, + 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, 26179, + 26180, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, 31681, + 31783, 33618, 34647, 36945, 38541, 40643, 21295, 22238, 24315, 24458, + 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, 28784, 29546, + 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, 23446, 27243, + 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, 28045, 28102, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29243, 32948, 37237, 39501, + 20399, 20505, 21402, 21518, 21564, 21897, 21957, 24127, 24460, 26429, + 29030, 29661, 36869, 21211, 21235, 22628, 22734, 28932, 29071, 29179, + 34224, 35347, 26248, 34216, 21927, 26244, 29002, 33841, 21321, 21913, + 27585, 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, + 25658, 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, + 27958, 33016, 40657, 26133, 27427, 28824, 30165, 21507, 23673, 32007, + 35350, 27424, 27453, 27462, 21560, 24688, 27965, 32725, 33288, 20694, + 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, 25137, + 26206, 26342, 29081, 29113, 29114, 29351, 31143, 31232, 32690, 35440, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myhtml_encoding_map_gb18030[] = { + 19970, 19972, 19973, 19974, 19983, 19986, 19991, 19999, 20000, 20001, + 20003, 20006, 20009, 20014, 20015, 20017, 20019, 20021, 20023, 20028, + 20032, 20033, 20034, 20036, 20038, 20042, 20049, 20053, 20055, 20058, + 20059, 20066, 20067, 20068, 20069, 20071, 20072, 20074, 20075, 20076, + 20077, 20078, 20079, 20082, 20084, 20085, 20086, 20087, 20088, 20089, + 20090, 20091, 20092, 20093, 20095, 20096, 20097, 20098, 20099, 20100, + 20101, 20103, 20106, 20112, 20118, 20119, 20121, 20124, 20125, 20126, + 20131, 20138, 20143, 20144, 20145, 20148, 20150, 20151, 20152, 20153, + 20156, 20157, 20158, 20168, 20172, 20175, 20176, 20178, 20186, 20187, + 20188, 20192, 20194, 20198, 20199, 20201, 20205, 20206, 20207, 20209, + 20212, 20216, 20217, 20218, 20220, 20222, 20224, 20226, 20227, 20228, + 20229, 20230, 20231, 20232, 20235, 20236, 20242, 20243, 20244, 20245, + 20246, 20252, 20253, 20257, 20259, 20264, 20265, 20268, 20269, 20270, + 20273, 20275, 20277, 20279, 20281, 20283, 20286, 20287, 20288, 20289, + 20290, 20292, 20293, 20295, 20296, 20297, 20298, 20299, 20300, 20306, + 20308, 20310, 20321, 20322, 20326, 20328, 20330, 20331, 20333, 20334, + 20337, 20338, 20341, 20343, 20344, 20345, 20346, 20349, 20352, 20353, + 20354, 20357, 20358, 20359, 20362, 20364, 20366, 20368, 20370, 20371, + 20373, 20374, 20376, 20377, 20378, 20380, 20382, 20383, 20385, 20386, + 20388, 20395, 20397, 20400, 20401, 20402, 20403, 20404, 20406, 20407, + 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20416, 20417, 20418, + 20422, 20423, 20424, 20425, 20427, 20428, 20429, 20434, 20435, 20436, + 20437, 20438, 20441, 20443, 20448, 20450, 20452, 20453, 20455, 20459, + 20460, 20464, 20466, 20468, 20469, 20470, 20471, 20473, 20475, 20476, + 20477, 20479, 20480, 20481, 20482, 20483, 20484, 20485, 20486, 20487, + 20488, 20489, 20490, 20491, 20494, 20496, 20497, 20499, 20501, 20502, + 20503, 20507, 20509, 20510, 20512, 20514, 20515, 20516, 20519, 20523, + 20527, 20528, 20529, 20530, 20531, 20532, 20533, 20534, 20535, 20536, + 20537, 20539, 20541, 20543, 20544, 20545, 20546, 20548, 20549, 20550, + 20553, 20554, 20555, 20557, 20560, 20561, 20562, 20563, 20564, 20566, + 20567, 20568, 20569, 20571, 20573, 20574, 20575, 20576, 20577, 20578, + 20579, 20580, 20582, 20583, 20584, 20585, 20586, 20587, 20589, 20590, + 20591, 20592, 20593, 20594, 20595, 20596, 20597, 20600, 20601, 20602, + 20604, 20605, 20609, 20610, 20611, 20612, 20614, 20615, 20617, 20618, + 20619, 20620, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, + 20630, 20631, 20632, 20633, 20634, 20635, 20636, 20637, 20638, 20639, + 20640, 20641, 20642, 20644, 20646, 20650, 20651, 20653, 20654, 20655, + 20656, 20657, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20668, + 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, + 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20688, 20689, + 20690, 20691, 20692, 20693, 20695, 20696, 20697, 20699, 20700, 20701, + 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20712, 20713, + 20714, 20715, 20719, 20720, 20721, 20722, 20724, 20726, 20727, 20728, + 20729, 20730, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, + 20740, 20741, 20744, 20745, 20746, 20748, 20749, 20750, 20751, 20752, + 20753, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, + 20764, 20765, 20766, 20767, 20768, 20770, 20771, 20772, 20773, 20774, + 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, + 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, + 20795, 20796, 20797, 20798, 20802, 20807, 20810, 20812, 20814, 20815, + 20816, 20818, 20819, 20823, 20824, 20825, 20827, 20829, 20830, 20831, + 20832, 20833, 20835, 20836, 20838, 20839, 20841, 20842, 20847, 20850, + 20858, 20862, 20863, 20867, 20868, 20870, 20871, 20874, 20875, 20878, + 20879, 20880, 20881, 20883, 20884, 20888, 20890, 20893, 20894, 20895, + 20897, 20899, 20902, 20903, 20904, 20905, 20906, 20909, 20910, 20916, + 20920, 20921, 20922, 20926, 20927, 20929, 20930, 20931, 20933, 20936, + 20938, 20941, 20942, 20944, 20946, 20947, 20948, 20949, 20950, 20951, + 20952, 20953, 20954, 20956, 20958, 20959, 20962, 20963, 20965, 20966, + 20967, 20968, 20969, 20970, 20972, 20974, 20977, 20978, 20980, 20983, + 20990, 20996, 20997, 21001, 21003, 21004, 21007, 21008, 21011, 21012, + 21013, 21020, 21022, 21023, 21025, 21026, 21027, 21029, 21030, 21031, + 21034, 21036, 21039, 21041, 21042, 21044, 21045, 21052, 21054, 21060, + 21061, 21062, 21063, 21064, 21065, 21067, 21070, 21071, 21074, 21075, + 21077, 21079, 21080, 21081, 21082, 21083, 21085, 21087, 21088, 21090, + 21091, 21092, 21094, 21096, 21099, 21100, 21101, 21102, 21104, 21105, + 21107, 21108, 21109, 21110, 21111, 21112, 21113, 21114, 21115, 21116, + 21118, 21120, 21123, 21124, 21125, 21126, 21127, 21129, 21130, 21131, + 21132, 21133, 21134, 21135, 21137, 21138, 21140, 21141, 21142, 21143, + 21144, 21145, 21146, 21148, 21156, 21157, 21158, 21159, 21166, 21167, + 21168, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, + 21181, 21184, 21185, 21186, 21188, 21189, 21190, 21192, 21194, 21196, + 21197, 21198, 21199, 21201, 21203, 21204, 21205, 21207, 21209, 21210, + 21211, 21212, 21213, 21214, 21216, 21217, 21218, 21219, 21221, 21222, + 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, + 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21243, 21244, 21245, + 21249, 21250, 21251, 21252, 21255, 21257, 21258, 21259, 21260, 21262, + 21265, 21266, 21267, 21268, 21272, 21275, 21276, 21278, 21279, 21282, + 21284, 21285, 21287, 21288, 21289, 21291, 21292, 21293, 21295, 21296, + 21297, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21308, 21309, + 21312, 21314, 21316, 21318, 21323, 21324, 21325, 21328, 21332, 21336, + 21337, 21339, 21341, 21349, 21352, 21354, 21356, 21357, 21362, 21366, + 21369, 21371, 21372, 21373, 21374, 21376, 21377, 21379, 21383, 21384, + 21386, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21398, 21399, + 21401, 21403, 21404, 21406, 21408, 21409, 21412, 21415, 21418, 21419, + 21420, 21421, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21431, + 21432, 21433, 21434, 21436, 21437, 21438, 21440, 21443, 21444, 21445, + 21446, 21447, 21454, 21455, 21456, 21458, 21459, 21461, 21466, 21468, + 21469, 21470, 21473, 21474, 21479, 21492, 21498, 21502, 21503, 21504, + 21506, 21509, 21511, 21515, 21524, 21528, 21529, 21530, 21532, 21538, + 21540, 21541, 21546, 21552, 21555, 21558, 21559, 21562, 21565, 21567, + 21569, 21570, 21572, 21573, 21575, 21577, 21580, 21581, 21582, 21583, + 21585, 21594, 21597, 21598, 21599, 21600, 21601, 21603, 21605, 21607, + 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21620, 21625, + 21626, 21630, 21631, 21633, 21635, 21637, 21639, 21640, 21641, 21642, + 21645, 21649, 21651, 21655, 21656, 21660, 21662, 21663, 21664, 21665, + 21666, 21669, 21678, 21680, 21682, 21685, 21686, 21687, 21689, 21690, + 21692, 21694, 21699, 21701, 21706, 21707, 21718, 21720, 21723, 21728, + 21729, 21730, 21731, 21732, 21739, 21740, 21743, 21744, 21745, 21748, + 21749, 21750, 21751, 21752, 21753, 21755, 21758, 21760, 21762, 21763, + 21764, 21765, 21768, 21770, 21771, 21772, 21773, 21774, 21778, 21779, + 21781, 21782, 21783, 21784, 21785, 21786, 21788, 21789, 21790, 21791, + 21793, 21797, 21798, 21800, 21801, 21803, 21805, 21810, 21812, 21813, + 21814, 21816, 21817, 21818, 21819, 21821, 21824, 21826, 21829, 21831, + 21832, 21835, 21836, 21837, 21838, 21839, 21841, 21842, 21843, 21844, + 21847, 21848, 21849, 21850, 21851, 21853, 21854, 21855, 21856, 21858, + 21859, 21864, 21865, 21867, 21871, 21872, 21873, 21874, 21875, 21876, + 21881, 21882, 21885, 21887, 21893, 21894, 21900, 21901, 21902, 21904, + 21906, 21907, 21909, 21910, 21911, 21914, 21915, 21918, 21920, 21921, + 21922, 21923, 21924, 21925, 21926, 21928, 21929, 21930, 21931, 21932, + 21933, 21934, 21935, 21936, 21938, 21940, 21942, 21944, 21946, 21948, + 21951, 21952, 21953, 21954, 21955, 21958, 21959, 21960, 21962, 21963, + 21966, 21967, 21968, 21973, 21975, 21976, 21977, 21978, 21979, 21982, + 21984, 21986, 21991, 21993, 21997, 21998, 22000, 22001, 22004, 22006, + 22008, 22009, 22010, 22011, 22012, 22015, 22018, 22019, 22020, 22021, + 22022, 22023, 22026, 22027, 22029, 22032, 22033, 22034, 22035, 22036, + 22037, 22038, 22039, 22041, 22042, 22044, 22045, 22048, 22049, 22050, + 22053, 22054, 22056, 22057, 22058, 22059, 22062, 22063, 22064, 22067, + 22069, 22071, 22072, 22074, 22076, 22077, 22078, 22080, 22081, 22082, + 22083, 22084, 22085, 22086, 22087, 22088, 22089, 22090, 22091, 22095, + 22096, 22097, 22098, 22099, 22101, 22102, 22106, 22107, 22109, 22110, + 22111, 22112, 22113, 22115, 22117, 22118, 22119, 22125, 22126, 22127, + 22128, 22130, 22131, 22132, 22133, 22135, 22136, 22137, 22138, 22141, + 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22151, 22152, 22153, + 22154, 22155, 22156, 22157, 22160, 22161, 22162, 22164, 22165, 22166, + 22167, 22168, 22169, 22170, 22171, 22172, 22173, 22174, 22175, 22176, + 22177, 22178, 22180, 22181, 22182, 22183, 22184, 22185, 22186, 22187, + 22188, 22189, 22190, 22192, 22193, 22194, 22195, 22196, 22197, 22198, + 22200, 22201, 22202, 22203, 22205, 22206, 22207, 22208, 22209, 22210, + 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22219, 22220, 22221, + 22222, 22223, 22224, 22225, 22226, 22227, 22229, 22230, 22232, 22233, + 22236, 22243, 22245, 22246, 22247, 22248, 22249, 22250, 22252, 22254, + 22255, 22258, 22259, 22262, 22263, 22264, 22267, 22268, 22272, 22273, + 22274, 22277, 22279, 22283, 22284, 22285, 22286, 22287, 22288, 22289, + 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, + 22301, 22302, 22304, 22305, 22306, 22308, 22309, 22310, 22311, 22315, + 22321, 22322, 22324, 22325, 22326, 22327, 22328, 22332, 22333, 22335, + 22337, 22339, 22340, 22341, 22342, 22344, 22345, 22347, 22354, 22355, + 22356, 22357, 22358, 22360, 22361, 22370, 22371, 22373, 22375, 22380, + 22382, 22384, 22385, 22386, 22388, 22389, 22392, 22393, 22394, 22397, + 22398, 22399, 22400, 22401, 22407, 22408, 22409, 22410, 22413, 22414, + 22415, 22416, 22417, 22420, 22421, 22422, 22423, 22424, 22425, 22426, + 22428, 22429, 22430, 22431, 22437, 22440, 22442, 22444, 22447, 22448, + 22449, 22451, 22453, 22454, 22455, 22457, 22458, 22459, 22460, 22461, + 22462, 22463, 22464, 22465, 22468, 22469, 22470, 22471, 22472, 22473, + 22474, 22476, 22477, 22480, 22481, 22483, 22486, 22487, 22491, 22492, + 22494, 22497, 22498, 22499, 22501, 22502, 22503, 22504, 22505, 22506, + 22507, 22508, 22510, 22512, 22513, 22514, 22515, 22517, 22518, 22519, + 22523, 22524, 22526, 22527, 22529, 22531, 22532, 22533, 22536, 22537, + 22538, 22540, 22542, 22543, 22544, 22546, 22547, 22548, 22550, 22551, + 22552, 22554, 22555, 22556, 22557, 22559, 22562, 22563, 22565, 22566, + 22567, 22568, 22569, 22571, 22572, 22573, 22574, 22575, 22577, 22578, + 22579, 22580, 22582, 22583, 22584, 22585, 22586, 22587, 22588, 22589, + 22590, 22591, 22592, 22593, 22594, 22595, 22597, 22598, 22599, 22600, + 22601, 22602, 22603, 22606, 22607, 22608, 22610, 22611, 22613, 22614, + 22615, 22617, 22618, 22619, 22620, 22621, 22623, 22624, 22625, 22626, + 22627, 22628, 22630, 22631, 22632, 22633, 22634, 22637, 22638, 22639, + 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, + 22650, 22651, 22652, 22653, 22655, 22658, 22660, 22662, 22663, 22664, + 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22676, 22677, + 22678, 22679, 22680, 22683, 22684, 22685, 22688, 22689, 22690, 22691, + 22692, 22693, 22694, 22695, 22698, 22699, 22700, 22701, 22702, 22703, + 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, + 22714, 22715, 22717, 22718, 22719, 22720, 22722, 22723, 22724, 22726, + 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, + 22738, 22739, 22740, 22742, 22743, 22744, 22745, 22746, 22747, 22748, + 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22757, 22758, 22759, + 22760, 22761, 22762, 22765, 22767, 22769, 22770, 22772, 22773, 22775, + 22776, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22787, + 22789, 22790, 22792, 22793, 22794, 22795, 22796, 22798, 22800, 22801, + 22802, 22803, 22807, 22808, 22811, 22813, 22814, 22816, 22817, 22818, + 22819, 22822, 22824, 22828, 22832, 22834, 22835, 22837, 22838, 22843, + 22845, 22846, 22847, 22848, 22851, 22853, 22854, 22858, 22860, 22861, + 22864, 22866, 22867, 22873, 22875, 22876, 22877, 22878, 22879, 22881, + 22883, 22884, 22886, 22887, 22888, 22889, 22890, 22891, 22892, 22893, + 22894, 22895, 22896, 22897, 22898, 22901, 22903, 22906, 22907, 22908, + 22910, 22911, 22912, 22917, 22921, 22923, 22924, 22926, 22927, 22928, + 22929, 22932, 22933, 22936, 22938, 22939, 22940, 22941, 22943, 22944, + 22945, 22946, 22950, 22951, 22956, 22957, 22960, 22961, 22963, 22964, + 22965, 22966, 22967, 22968, 22970, 22972, 22973, 22975, 22976, 22977, + 22978, 22979, 22980, 22981, 22983, 22984, 22985, 22988, 22989, 22990, + 22991, 22997, 22998, 23001, 23003, 23006, 23007, 23008, 23009, 23010, + 23012, 23014, 23015, 23017, 23018, 23019, 23021, 23022, 23023, 23024, + 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23034, 23036, + 23037, 23038, 23040, 23042, 23050, 23051, 23053, 23054, 23055, 23056, + 23058, 23060, 23061, 23062, 23063, 23065, 23066, 23067, 23069, 23070, + 23073, 23074, 23076, 23078, 23079, 23080, 23082, 23083, 23084, 23085, + 23086, 23087, 23088, 23091, 23093, 23095, 23096, 23097, 23098, 23099, + 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23111, 23112, + 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, + 23126, 23127, 23128, 23129, 23131, 23132, 23133, 23134, 23135, 23136, + 23137, 23139, 23140, 23141, 23142, 23144, 23145, 23147, 23148, 23149, + 23150, 23151, 23152, 23153, 23154, 23155, 23160, 23161, 23163, 23164, + 23165, 23166, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, + 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, + 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23196, 23197, 23198, + 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, + 23209, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23220, 23222, + 23223, 23225, 23226, 23227, 23228, 23229, 23231, 23232, 23235, 23236, + 23237, 23238, 23239, 23240, 23242, 23243, 23245, 23246, 23247, 23248, + 23249, 23251, 23253, 23255, 23257, 23258, 23259, 23261, 23262, 23263, + 23266, 23268, 23269, 23271, 23272, 23274, 23276, 23277, 23278, 23279, + 23280, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, + 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, + 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23309, 23310, 23311, + 23312, 23313, 23314, 23315, 23316, 23317, 23320, 23321, 23322, 23323, + 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, + 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, + 23344, 23345, 23347, 23349, 23350, 23352, 23353, 23354, 23355, 23356, + 23357, 23358, 23359, 23361, 23362, 23363, 23364, 23365, 23366, 23367, + 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23378, 23382, + 23390, 23392, 23393, 23399, 23400, 23403, 23405, 23406, 23407, 23410, + 23412, 23414, 23415, 23416, 23417, 23419, 23420, 23422, 23423, 23426, + 23430, 23434, 23437, 23438, 23440, 23441, 23442, 23444, 23446, 23455, + 23463, 23464, 23465, 23468, 23469, 23470, 23471, 23473, 23474, 23479, + 23482, 23483, 23484, 23488, 23489, 23491, 23496, 23497, 23498, 23499, + 23501, 23502, 23503, 23505, 23508, 23509, 23510, 23511, 23512, 23513, + 23514, 23515, 23516, 23520, 23522, 23523, 23526, 23527, 23529, 23530, + 23531, 23532, 23533, 23535, 23537, 23538, 23539, 23540, 23541, 23542, + 23543, 23549, 23550, 23552, 23554, 23555, 23557, 23559, 23560, 23563, + 23564, 23565, 23566, 23568, 23570, 23571, 23575, 23577, 23579, 23582, + 23583, 23584, 23585, 23587, 23590, 23592, 23593, 23594, 23595, 23597, + 23598, 23599, 23600, 23602, 23603, 23605, 23606, 23607, 23619, 23620, + 23622, 23623, 23628, 23629, 23634, 23635, 23636, 23638, 23639, 23640, + 23642, 23643, 23644, 23645, 23647, 23650, 23652, 23655, 23656, 23657, + 23658, 23659, 23660, 23661, 23664, 23666, 23667, 23668, 23669, 23670, + 23671, 23672, 23675, 23676, 23677, 23678, 23680, 23683, 23684, 23685, + 23686, 23687, 23689, 23690, 23691, 23694, 23695, 23698, 23699, 23701, + 23709, 23710, 23711, 23712, 23713, 23716, 23717, 23718, 23719, 23720, + 23722, 23726, 23727, 23728, 23730, 23732, 23734, 23737, 23738, 23739, + 23740, 23742, 23744, 23746, 23747, 23749, 23750, 23751, 23752, 23753, + 23754, 23756, 23757, 23758, 23759, 23760, 23761, 23763, 23764, 23765, + 23766, 23767, 23768, 23770, 23771, 23772, 23773, 23774, 23775, 23776, + 23778, 23779, 23783, 23785, 23787, 23788, 23790, 23791, 23793, 23794, + 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23804, 23805, + 23806, 23807, 23808, 23809, 23812, 23813, 23816, 23817, 23818, 23819, + 23820, 23821, 23823, 23824, 23825, 23826, 23827, 23829, 23831, 23832, + 23833, 23834, 23836, 23837, 23839, 23840, 23841, 23842, 23843, 23845, + 23848, 23850, 23851, 23852, 23855, 23856, 23857, 23858, 23859, 23861, + 23862, 23863, 23864, 23865, 23866, 23867, 23868, 23871, 23872, 23873, + 23874, 23875, 23876, 23877, 23878, 23880, 23881, 23885, 23886, 23887, + 23888, 23889, 23890, 23891, 23892, 23893, 23894, 23895, 23897, 23898, + 23900, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, + 23911, 23912, 23914, 23917, 23918, 23920, 23921, 23922, 23923, 23925, + 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, 23935, + 23936, 23937, 23939, 23940, 23941, 23942, 23943, 23944, 23945, 23946, + 23947, 23948, 23949, 23950, 23951, 23952, 23953, 23954, 23955, 23956, + 23957, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, + 23969, 23970, 23971, 23972, 23973, 23974, 23975, 23976, 23977, 23978, + 23979, 23980, 23981, 23982, 23983, 23984, 23985, 23986, 23987, 23988, + 23989, 23990, 23992, 23993, 23994, 23995, 23996, 23997, 23998, 23999, + 24000, 24001, 24002, 24003, 24004, 24006, 24007, 24008, 24009, 24010, + 24011, 24012, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24021, + 24022, 24023, 24024, 24025, 24026, 24028, 24031, 24032, 24035, 24036, + 24042, 24044, 24045, 24048, 24053, 24054, 24056, 24057, 24058, 24059, + 24060, 24063, 24064, 24068, 24071, 24073, 24074, 24075, 24077, 24078, + 24082, 24083, 24087, 24094, 24095, 24096, 24097, 24098, 24099, 24100, + 24101, 24104, 24105, 24106, 24107, 24108, 24111, 24112, 24114, 24115, + 24116, 24117, 24118, 24121, 24122, 24126, 24127, 24128, 24129, 24131, + 24134, 24135, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24144, + 24145, 24146, 24147, 24150, 24151, 24152, 24153, 24154, 24156, 24157, + 24159, 24160, 24163, 24164, 24165, 24166, 24167, 24168, 24169, 24170, + 24171, 24172, 24173, 24174, 24175, 24176, 24177, 24181, 24183, 24185, + 24190, 24193, 24194, 24195, 24197, 24200, 24201, 24204, 24205, 24206, + 24210, 24216, 24219, 24221, 24225, 24226, 24227, 24228, 24232, 24233, + 24234, 24235, 24236, 24238, 24239, 24240, 24241, 24242, 24244, 24250, + 24251, 24252, 24253, 24255, 24256, 24257, 24258, 24259, 24260, 24261, + 24262, 24263, 24264, 24267, 24268, 24269, 24270, 24271, 24272, 24276, + 24277, 24279, 24280, 24281, 24282, 24284, 24285, 24286, 24287, 24288, + 24289, 24290, 24291, 24292, 24293, 24294, 24295, 24297, 24299, 24300, + 24301, 24302, 24303, 24304, 24305, 24306, 24307, 24309, 24312, 24313, + 24315, 24316, 24317, 24325, 24326, 24327, 24329, 24332, 24333, 24334, + 24336, 24338, 24340, 24342, 24345, 24346, 24348, 24349, 24350, 24353, + 24354, 24355, 24356, 24360, 24363, 24364, 24366, 24368, 24370, 24371, + 24372, 24373, 24374, 24375, 24376, 24379, 24381, 24382, 24383, 24385, + 24386, 24387, 24388, 24389, 24390, 24391, 24392, 24393, 24394, 24395, + 24396, 24397, 24398, 24399, 24401, 24404, 24409, 24410, 24411, 24412, + 24414, 24415, 24416, 24419, 24421, 24423, 24424, 24427, 24430, 24431, + 24434, 24436, 24437, 24438, 24440, 24442, 24445, 24446, 24447, 24451, + 24454, 24461, 24462, 24463, 24465, 24467, 24468, 24470, 24474, 24475, + 24477, 24478, 24479, 24480, 24482, 24483, 24484, 24485, 24486, 24487, + 24489, 24491, 24492, 24495, 24496, 24497, 24498, 24499, 24500, 24502, + 24504, 24505, 24506, 24507, 24510, 24511, 24512, 24513, 24514, 24519, + 24520, 24522, 24523, 24526, 24531, 24532, 24533, 24538, 24539, 24540, + 24542, 24543, 24546, 24547, 24549, 24550, 24552, 24553, 24556, 24559, + 24560, 24562, 24563, 24564, 24566, 24567, 24569, 24570, 24572, 24583, + 24584, 24585, 24587, 24588, 24592, 24593, 24595, 24599, 24600, 24602, + 24606, 24607, 24610, 24611, 24612, 24620, 24621, 24622, 24624, 24625, + 24626, 24627, 24628, 24630, 24631, 24632, 24633, 24634, 24637, 24638, + 24640, 24644, 24645, 24646, 24647, 24648, 24649, 24650, 24652, 24654, + 24655, 24657, 24659, 24660, 24662, 24663, 24664, 24667, 24668, 24670, + 24671, 24672, 24673, 24677, 24678, 24686, 24689, 24690, 24692, 24693, + 24695, 24702, 24704, 24705, 24706, 24709, 24710, 24711, 24712, 24714, + 24715, 24718, 24719, 24720, 24721, 24723, 24725, 24727, 24728, 24729, + 24732, 24734, 24737, 24738, 24740, 24741, 24743, 24745, 24746, 24750, + 24752, 24755, 24757, 24758, 24759, 24761, 24762, 24765, 24766, 24767, + 24768, 24769, 24770, 24771, 24772, 24775, 24776, 24777, 24780, 24781, + 24782, 24783, 24784, 24786, 24787, 24788, 24790, 24791, 24793, 24795, + 24798, 24801, 24802, 24803, 24804, 24805, 24810, 24817, 24818, 24821, + 24823, 24824, 24827, 24828, 24829, 24830, 24831, 24834, 24835, 24836, + 24837, 24839, 24842, 24843, 24844, 24848, 24849, 24850, 24851, 24852, + 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24865, 24866, + 24869, 24872, 24873, 24874, 24876, 24877, 24878, 24879, 24880, 24881, + 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24890, 24891, + 24892, 24893, 24894, 24896, 24897, 24898, 24899, 24900, 24901, 24902, + 24903, 24905, 24907, 24909, 24911, 24912, 24914, 24915, 24916, 24918, + 24919, 24920, 24921, 24922, 24923, 24924, 24926, 24927, 24928, 24929, + 24931, 24932, 24933, 24934, 24937, 24938, 24939, 24940, 24941, 24942, + 24943, 24945, 24946, 24947, 24948, 24950, 24952, 24953, 24954, 24955, + 24956, 24957, 24958, 24959, 24960, 24961, 24962, 24963, 24964, 24965, + 24966, 24967, 24968, 24969, 24970, 24972, 24973, 24975, 24976, 24977, + 24978, 24979, 24981, 24982, 24983, 24984, 24985, 24986, 24987, 24988, + 24990, 24991, 24992, 24993, 24994, 24995, 24996, 24997, 24998, 25002, + 25003, 25005, 25006, 25007, 25008, 25009, 25010, 25011, 25012, 25013, + 25014, 25016, 25017, 25018, 25019, 25020, 25021, 25023, 25024, 25025, + 25027, 25028, 25029, 25030, 25031, 25033, 25036, 25037, 25038, 25039, + 25040, 25043, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, + 25053, 25054, 25055, 25056, 25057, 25058, 25059, 25060, 25061, 25063, + 25064, 25065, 25066, 25067, 25068, 25069, 25070, 25071, 25072, 25073, + 25074, 25075, 25076, 25078, 25079, 25080, 25081, 25082, 25083, 25084, + 25085, 25086, 25088, 25089, 25090, 25091, 25092, 25093, 25095, 25097, + 25107, 25108, 25113, 25116, 25117, 25118, 25120, 25123, 25126, 25127, + 25128, 25129, 25131, 25133, 25135, 25136, 25137, 25138, 25141, 25142, + 25144, 25145, 25146, 25147, 25148, 25154, 25156, 25157, 25158, 25162, + 25167, 25168, 25173, 25174, 25175, 25177, 25178, 25180, 25181, 25182, + 25183, 25184, 25185, 25186, 25188, 25189, 25192, 25201, 25202, 25204, + 25205, 25207, 25208, 25210, 25211, 25213, 25217, 25218, 25219, 25221, + 25222, 25223, 25224, 25227, 25228, 25229, 25230, 25231, 25232, 25236, + 25241, 25244, 25245, 25246, 25251, 25254, 25255, 25257, 25258, 25261, + 25262, 25263, 25264, 25266, 25267, 25268, 25270, 25271, 25272, 25274, + 25278, 25280, 25281, 25283, 25291, 25295, 25297, 25301, 25309, 25310, + 25312, 25313, 25316, 25322, 25323, 25328, 25330, 25333, 25336, 25337, + 25338, 25339, 25344, 25347, 25348, 25349, 25350, 25354, 25355, 25356, + 25357, 25359, 25360, 25362, 25363, 25364, 25365, 25367, 25368, 25369, + 25372, 25382, 25383, 25385, 25388, 25389, 25390, 25392, 25393, 25395, + 25396, 25397, 25398, 25399, 25400, 25403, 25404, 25406, 25407, 25408, + 25409, 25412, 25415, 25416, 25418, 25425, 25426, 25427, 25428, 25430, + 25431, 25432, 25433, 25434, 25435, 25436, 25437, 25440, 25444, 25445, + 25446, 25448, 25450, 25451, 25452, 25455, 25456, 25458, 25459, 25460, + 25461, 25464, 25465, 25468, 25469, 25470, 25471, 25473, 25475, 25476, + 25477, 25478, 25483, 25485, 25489, 25491, 25492, 25493, 25495, 25497, + 25498, 25499, 25500, 25501, 25502, 25503, 25505, 25508, 25510, 25515, + 25519, 25521, 25522, 25525, 25526, 25529, 25531, 25533, 25535, 25536, + 25537, 25538, 25539, 25541, 25543, 25544, 25546, 25547, 25548, 25553, + 25555, 25556, 25557, 25559, 25560, 25561, 25562, 25563, 25564, 25565, + 25567, 25570, 25572, 25573, 25574, 25575, 25576, 25579, 25580, 25582, + 25583, 25584, 25585, 25587, 25589, 25591, 25593, 25594, 25595, 25596, + 25598, 25603, 25604, 25606, 25607, 25608, 25609, 25610, 25613, 25614, + 25617, 25618, 25621, 25622, 25623, 25624, 25625, 25626, 25629, 25631, + 25634, 25635, 25636, 25637, 25639, 25640, 25641, 25643, 25646, 25647, + 25648, 25649, 25650, 25651, 25653, 25654, 25655, 25656, 25657, 25659, + 25660, 25662, 25664, 25666, 25667, 25673, 25675, 25676, 25677, 25678, + 25679, 25680, 25681, 25683, 25685, 25686, 25687, 25689, 25690, 25691, + 25692, 25693, 25695, 25696, 25697, 25698, 25699, 25700, 25701, 25702, + 25704, 25706, 25707, 25708, 25710, 25711, 25712, 25713, 25714, 25715, + 25716, 25717, 25718, 25719, 25723, 25724, 25725, 25726, 25727, 25728, + 25729, 25731, 25734, 25736, 25737, 25738, 25739, 25740, 25741, 25742, + 25743, 25744, 25747, 25748, 25751, 25752, 25754, 25755, 25756, 25757, + 25759, 25760, 25761, 25762, 25763, 25765, 25766, 25767, 25768, 25770, + 25771, 25775, 25777, 25778, 25779, 25780, 25782, 25785, 25787, 25789, + 25790, 25791, 25793, 25795, 25796, 25798, 25799, 25800, 25801, 25802, + 25803, 25804, 25807, 25809, 25811, 25812, 25813, 25814, 25817, 25818, + 25819, 25820, 25821, 25823, 25824, 25825, 25827, 25829, 25831, 25832, + 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, + 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25850, 25851, 25852, + 25853, 25854, 25855, 25857, 25858, 25859, 25860, 25861, 25862, 25863, + 25864, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25875, + 25876, 25877, 25878, 25879, 25881, 25882, 25883, 25884, 25885, 25886, + 25887, 25888, 25889, 25890, 25891, 25892, 25894, 25895, 25896, 25897, + 25898, 25900, 25901, 25904, 25905, 25906, 25907, 25911, 25914, 25916, + 25917, 25920, 25921, 25922, 25923, 25924, 25926, 25927, 25930, 25931, + 25933, 25934, 25936, 25938, 25939, 25940, 25943, 25944, 25946, 25948, + 25951, 25952, 25953, 25956, 25957, 25959, 25960, 25961, 25962, 25965, + 25966, 25967, 25969, 25971, 25973, 25974, 25976, 25977, 25978, 25979, + 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, + 25990, 25992, 25993, 25994, 25997, 25998, 25999, 26002, 26004, 26005, + 26006, 26008, 26010, 26013, 26014, 26016, 26018, 26019, 26022, 26024, + 26026, 26028, 26030, 26033, 26034, 26035, 26036, 26037, 26038, 26039, + 26040, 26042, 26043, 26046, 26047, 26048, 26050, 26055, 26056, 26057, + 26058, 26061, 26064, 26065, 26067, 26068, 26069, 26072, 26073, 26074, + 26075, 26076, 26077, 26078, 26079, 26081, 26083, 26084, 26090, 26091, + 26098, 26099, 26100, 26101, 26104, 26105, 26107, 26108, 26109, 26110, + 26111, 26113, 26116, 26117, 26119, 26120, 26121, 26123, 26125, 26128, + 26129, 26130, 26134, 26135, 26136, 26138, 26139, 26140, 26142, 26145, + 26146, 26147, 26148, 26150, 26153, 26154, 26155, 26156, 26158, 26160, + 26162, 26163, 26167, 26168, 26169, 26170, 26171, 26173, 26175, 26176, + 26178, 26180, 26181, 26182, 26183, 26184, 26185, 26186, 26189, 26190, + 26192, 26193, 26200, 26201, 26203, 26204, 26205, 26206, 26208, 26210, + 26211, 26213, 26215, 26217, 26218, 26219, 26220, 26221, 26225, 26226, + 26227, 26229, 26232, 26233, 26235, 26236, 26237, 26239, 26240, 26241, + 26243, 26245, 26246, 26248, 26249, 26250, 26251, 26253, 26254, 26255, + 26256, 26258, 26259, 26260, 26261, 26264, 26265, 26266, 26267, 26268, + 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26281, + 26282, 26283, 26284, 26285, 26287, 26288, 26289, 26290, 26291, 26293, + 26294, 26295, 26296, 26298, 26299, 26300, 26301, 26303, 26304, 26305, + 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, + 26316, 26317, 26318, 26319, 26320, 26321, 26322, 26323, 26324, 26325, + 26326, 26327, 26328, 26330, 26334, 26335, 26336, 26337, 26338, 26339, + 26340, 26341, 26343, 26344, 26346, 26347, 26348, 26349, 26350, 26351, + 26353, 26357, 26358, 26360, 26362, 26363, 26365, 26369, 26370, 26371, + 26372, 26373, 26374, 26375, 26380, 26382, 26383, 26385, 26386, 26387, + 26390, 26392, 26393, 26394, 26396, 26398, 26400, 26401, 26402, 26403, + 26404, 26405, 26407, 26409, 26414, 26416, 26418, 26419, 26422, 26423, + 26424, 26425, 26427, 26428, 26430, 26431, 26433, 26436, 26437, 26439, + 26442, 26443, 26445, 26450, 26452, 26453, 26455, 26456, 26457, 26458, + 26459, 26461, 26466, 26467, 26468, 26470, 26471, 26475, 26476, 26478, + 26481, 26484, 26486, 26488, 26489, 26490, 26491, 26493, 26496, 26498, + 26499, 26501, 26502, 26504, 26506, 26508, 26509, 26510, 26511, 26513, + 26514, 26515, 26516, 26518, 26521, 26523, 26527, 26528, 26529, 26532, + 26534, 26537, 26540, 26542, 26545, 26546, 26548, 26553, 26554, 26555, + 26556, 26557, 26558, 26559, 26560, 26562, 26565, 26566, 26567, 26568, + 26569, 26570, 26571, 26572, 26573, 26574, 26581, 26582, 26583, 26587, + 26591, 26593, 26595, 26596, 26598, 26599, 26600, 26602, 26603, 26605, + 26606, 26610, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, + 26622, 26625, 26626, 26627, 26628, 26630, 26637, 26640, 26642, 26644, + 26645, 26648, 26649, 26650, 26651, 26652, 26654, 26655, 26656, 26658, + 26659, 26660, 26661, 26662, 26663, 26664, 26667, 26668, 26669, 26670, + 26671, 26672, 26673, 26676, 26677, 26678, 26682, 26683, 26687, 26695, + 26699, 26701, 26703, 26706, 26710, 26711, 26712, 26713, 26714, 26715, + 26716, 26717, 26718, 26719, 26730, 26732, 26733, 26734, 26735, 26736, + 26737, 26738, 26739, 26741, 26744, 26745, 26746, 26747, 26748, 26749, + 26750, 26751, 26752, 26754, 26756, 26759, 26760, 26761, 26762, 26763, + 26764, 26765, 26766, 26768, 26769, 26770, 26772, 26773, 26774, 26776, + 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26787, + 26788, 26789, 26793, 26794, 26795, 26796, 26798, 26801, 26802, 26804, + 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, + 26817, 26819, 26820, 26821, 26822, 26823, 26824, 26826, 26828, 26830, + 26831, 26832, 26833, 26835, 26836, 26838, 26839, 26841, 26843, 26844, + 26845, 26846, 26847, 26849, 26850, 26852, 26853, 26854, 26855, 26856, + 26857, 26858, 26859, 26860, 26861, 26863, 26866, 26867, 26868, 26870, + 26871, 26872, 26875, 26877, 26878, 26879, 26880, 26882, 26883, 26884, + 26886, 26887, 26888, 26889, 26890, 26892, 26895, 26897, 26899, 26900, + 26901, 26902, 26903, 26904, 26905, 26906, 26907, 26908, 26909, 26910, + 26913, 26914, 26915, 26917, 26918, 26919, 26920, 26921, 26922, 26923, + 26924, 26926, 26927, 26929, 26930, 26931, 26933, 26934, 26935, 26936, + 26938, 26939, 26940, 26942, 26944, 26945, 26947, 26948, 26949, 26950, + 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, + 26961, 26962, 26963, 26965, 26966, 26968, 26969, 26971, 26972, 26975, + 26977, 26978, 26980, 26981, 26983, 26984, 26985, 26986, 26988, 26989, + 26991, 26992, 26994, 26995, 26996, 26997, 26998, 27002, 27003, 27005, + 27006, 27007, 27009, 27011, 27013, 27018, 27019, 27020, 27022, 27023, + 27024, 27025, 27026, 27027, 27030, 27031, 27033, 27034, 27037, 27038, + 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27049, 27050, + 27052, 27054, 27055, 27056, 27058, 27059, 27061, 27062, 27064, 27065, + 27066, 27068, 27069, 27070, 27071, 27072, 27074, 27075, 27076, 27077, + 27078, 27079, 27080, 27081, 27083, 27085, 27087, 27089, 27090, 27091, + 27093, 27094, 27095, 27096, 27097, 27098, 27100, 27101, 27102, 27105, + 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, + 27116, 27118, 27119, 27120, 27121, 27123, 27124, 27125, 27126, 27127, + 27128, 27129, 27130, 27131, 27132, 27134, 27136, 27137, 27138, 27139, + 27140, 27141, 27142, 27143, 27144, 27145, 27147, 27148, 27149, 27150, + 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27161, 27162, + 27163, 27164, 27165, 27166, 27168, 27170, 27171, 27172, 27173, 27174, + 27175, 27177, 27179, 27180, 27181, 27182, 27184, 27186, 27187, 27188, + 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27199, 27200, 27201, + 27202, 27203, 27205, 27206, 27208, 27209, 27210, 27211, 27212, 27213, + 27214, 27215, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27226, + 27228, 27229, 27230, 27231, 27232, 27234, 27235, 27236, 27238, 27239, + 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27250, + 27251, 27252, 27253, 27254, 27255, 27256, 27258, 27259, 27261, 27262, + 27263, 27265, 27266, 27267, 27269, 27270, 27271, 27272, 27273, 27274, + 27275, 27276, 27277, 27279, 27282, 27283, 27284, 27285, 27286, 27288, + 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27297, 27298, 27299, + 27300, 27301, 27302, 27303, 27304, 27306, 27309, 27310, 27311, 27312, + 27313, 27314, 27315, 27316, 27317, 27318, 27319, 27320, 27321, 27322, + 27323, 27324, 27325, 27326, 27327, 27328, 27329, 27330, 27331, 27332, + 27333, 27334, 27335, 27336, 27337, 27338, 27339, 27340, 27341, 27342, + 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, + 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, + 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, + 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27381, 27382, + 27383, 27384, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, + 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, + 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, + 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, + 27423, 27429, 27430, 27432, 27433, 27434, 27435, 27436, 27437, 27438, + 27439, 27440, 27441, 27443, 27444, 27445, 27446, 27448, 27451, 27452, + 27453, 27455, 27456, 27457, 27458, 27460, 27461, 27464, 27466, 27467, + 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, + 27479, 27480, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, + 27496, 27497, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, + 27507, 27508, 27509, 27510, 27511, 27512, 27514, 27517, 27518, 27519, + 27520, 27525, 27528, 27532, 27534, 27535, 27536, 27537, 27540, 27541, + 27543, 27544, 27545, 27548, 27549, 27550, 27551, 27552, 27554, 27555, + 27556, 27557, 27558, 27559, 27560, 27561, 27563, 27564, 27565, 27566, + 27567, 27568, 27569, 27570, 27574, 27576, 27577, 27578, 27579, 27580, + 27581, 27582, 27584, 27587, 27588, 27590, 27591, 27592, 27593, 27594, + 27596, 27598, 27600, 27601, 27608, 27610, 27612, 27613, 27614, 27615, + 27616, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27628, + 27629, 27630, 27632, 27633, 27634, 27636, 27638, 27639, 27640, 27642, + 27643, 27644, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27656, + 27657, 27658, 27659, 27660, 27662, 27666, 27671, 27676, 27677, 27678, + 27680, 27683, 27685, 27691, 27692, 27693, 27697, 27699, 27702, 27703, + 27705, 27706, 27707, 27708, 27710, 27711, 27715, 27716, 27717, 27720, + 27723, 27724, 27725, 27726, 27727, 27729, 27730, 27731, 27734, 27736, + 27737, 27738, 27746, 27747, 27749, 27750, 27751, 27755, 27756, 27757, + 27758, 27759, 27761, 27763, 27765, 27767, 27768, 27770, 27771, 27772, + 27775, 27776, 27780, 27783, 27786, 27787, 27789, 27790, 27793, 27794, + 27797, 27798, 27799, 27800, 27802, 27804, 27805, 27806, 27808, 27810, + 27816, 27820, 27823, 27824, 27828, 27829, 27830, 27831, 27834, 27840, + 27841, 27842, 27843, 27846, 27847, 27848, 27851, 27853, 27854, 27855, + 27857, 27858, 27864, 27865, 27866, 27868, 27869, 27871, 27876, 27878, + 27879, 27881, 27884, 27885, 27890, 27892, 27897, 27903, 27904, 27906, + 27907, 27909, 27910, 27912, 27913, 27914, 27917, 27919, 27920, 27921, + 27923, 27924, 27925, 27926, 27928, 27932, 27933, 27935, 27936, 27937, + 27938, 27939, 27940, 27942, 27944, 27945, 27948, 27949, 27951, 27952, + 27956, 27958, 27959, 27960, 27962, 27967, 27968, 27970, 27972, 27977, + 27980, 27984, 27989, 27990, 27991, 27992, 27995, 27997, 27999, 28001, + 28002, 28004, 28005, 28007, 28008, 28011, 28012, 28013, 28016, 28017, + 28018, 28019, 28021, 28022, 28025, 28026, 28027, 28029, 28030, 28031, + 28032, 28033, 28035, 28036, 28038, 28039, 28042, 28043, 28045, 28047, + 28048, 28050, 28054, 28055, 28056, 28057, 28058, 28060, 28066, 28069, + 28076, 28077, 28080, 28081, 28083, 28084, 28086, 28087, 28089, 28090, + 28091, 28092, 28093, 28094, 28097, 28098, 28099, 28104, 28105, 28106, + 28109, 28110, 28111, 28112, 28114, 28115, 28116, 28117, 28119, 28122, + 28123, 28124, 28127, 28130, 28131, 28133, 28135, 28136, 28137, 28138, + 28141, 28143, 28144, 28146, 28148, 28149, 28150, 28152, 28154, 28157, + 28158, 28159, 28160, 28161, 28162, 28163, 28164, 28166, 28167, 28168, + 28169, 28171, 28175, 28178, 28179, 28181, 28184, 28185, 28187, 28188, + 28190, 28191, 28194, 28198, 28199, 28200, 28202, 28204, 28206, 28208, + 28209, 28211, 28213, 28214, 28215, 28217, 28219, 28220, 28221, 28222, + 28223, 28224, 28225, 28226, 28229, 28230, 28231, 28232, 28233, 28234, + 28235, 28236, 28239, 28240, 28241, 28242, 28245, 28247, 28249, 28250, + 28252, 28253, 28254, 28256, 28257, 28258, 28259, 28260, 28261, 28262, + 28263, 28264, 28265, 28266, 28268, 28269, 28271, 28272, 28273, 28274, + 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, + 28285, 28288, 28289, 28290, 28292, 28295, 28296, 28298, 28299, 28300, + 28301, 28302, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28313, + 28314, 28315, 28317, 28318, 28320, 28321, 28323, 28324, 28326, 28328, + 28329, 28331, 28332, 28333, 28334, 28336, 28339, 28341, 28344, 28345, + 28348, 28350, 28351, 28352, 28355, 28356, 28357, 28358, 28360, 28361, + 28362, 28364, 28365, 28366, 28368, 28370, 28374, 28376, 28377, 28379, + 28380, 28381, 28387, 28391, 28394, 28395, 28396, 28397, 28398, 28399, + 28400, 28401, 28402, 28403, 28405, 28406, 28407, 28408, 28410, 28411, + 28412, 28413, 28414, 28415, 28416, 28417, 28419, 28420, 28421, 28423, + 28424, 28426, 28427, 28428, 28429, 28430, 28432, 28433, 28434, 28438, + 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28449, + 28450, 28451, 28453, 28454, 28455, 28456, 28460, 28462, 28464, 28466, + 28468, 28469, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28479, + 28480, 28481, 28482, 28483, 28484, 28485, 28488, 28489, 28490, 28492, + 28494, 28495, 28496, 28497, 28498, 28499, 28500, 28501, 28502, 28503, + 28505, 28506, 28507, 28509, 28511, 28512, 28513, 28515, 28516, 28517, + 28519, 28520, 28521, 28522, 28523, 28524, 28527, 28528, 28529, 28531, + 28533, 28534, 28535, 28537, 28539, 28541, 28542, 28543, 28544, 28545, + 28546, 28547, 28549, 28550, 28551, 28554, 28555, 28559, 28560, 28561, + 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, + 28573, 28574, 28575, 28576, 28578, 28579, 28580, 28581, 28582, 28584, + 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, + 28596, 28597, 28599, 28600, 28602, 28603, 28604, 28605, 28606, 28607, + 28609, 28611, 28612, 28613, 28614, 28615, 28616, 28618, 28619, 28620, + 28621, 28622, 28623, 28624, 28627, 28628, 28629, 28630, 28631, 28632, + 28633, 28634, 28635, 28636, 28637, 28639, 28642, 28643, 28644, 28645, + 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28656, 28657, + 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, + 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, + 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28686, 28687, + 28688, 28690, 28691, 28692, 28693, 28694, 28695, 28696, 28697, 28700, + 28701, 28702, 28703, 28704, 28705, 28706, 28708, 28709, 28710, 28711, + 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, + 28722, 28723, 28724, 28726, 28727, 28728, 28730, 28731, 28732, 28733, + 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, + 28744, 28745, 28746, 28747, 28749, 28750, 28752, 28753, 28754, 28755, + 28756, 28757, 28758, 28759, 28760, 28761, 28762, 28763, 28764, 28765, + 28767, 28768, 28769, 28770, 28771, 28772, 28773, 28774, 28775, 28776, + 28777, 28778, 28782, 28785, 28786, 28787, 28788, 28791, 28793, 28794, + 28795, 28797, 28801, 28802, 28803, 28804, 28806, 28807, 28808, 28811, + 28812, 28813, 28815, 28816, 28817, 28819, 28823, 28824, 28826, 28827, + 28830, 28831, 28832, 28833, 28834, 28835, 28836, 28837, 28838, 28839, + 28840, 28841, 28842, 28848, 28850, 28852, 28853, 28854, 28858, 28862, + 28863, 28868, 28869, 28870, 28871, 28873, 28875, 28876, 28877, 28878, + 28879, 28880, 28881, 28882, 28883, 28884, 28885, 28886, 28887, 28890, + 28892, 28893, 28894, 28896, 28897, 28898, 28899, 28901, 28906, 28910, + 28912, 28913, 28914, 28915, 28916, 28917, 28918, 28920, 28922, 28923, + 28924, 28926, 28927, 28928, 28929, 28930, 28931, 28932, 28933, 28934, + 28935, 28936, 28939, 28940, 28941, 28942, 28943, 28945, 28946, 28948, + 28951, 28955, 28956, 28957, 28958, 28959, 28960, 28961, 28962, 28963, + 28964, 28965, 28967, 28968, 28969, 28970, 28971, 28972, 28973, 28974, + 28978, 28979, 28980, 28981, 28983, 28984, 28985, 28986, 28987, 28988, + 28989, 28990, 28991, 28992, 28993, 28994, 28995, 28996, 28998, 28999, + 29000, 29001, 29003, 29005, 29007, 29008, 29009, 29010, 29011, 29012, + 29013, 29014, 29015, 29016, 29017, 29018, 29019, 29021, 29023, 29024, + 29025, 29026, 29027, 29029, 29033, 29034, 29035, 29036, 29037, 29039, + 29040, 29041, 29044, 29045, 29046, 29047, 29049, 29051, 29052, 29054, + 29055, 29056, 29057, 29058, 29059, 29061, 29062, 29063, 29064, 29065, + 29067, 29068, 29069, 29070, 29072, 29073, 29074, 29075, 29077, 29078, + 29079, 29082, 29083, 29084, 29085, 29086, 29089, 29090, 29091, 29092, + 29093, 29094, 29095, 29097, 29098, 29099, 29101, 29102, 29103, 29104, + 29105, 29106, 29108, 29110, 29111, 29112, 29114, 29115, 29116, 29117, + 29118, 29119, 29120, 29121, 29122, 29124, 29125, 29126, 29127, 29128, + 29129, 29130, 29131, 29132, 29133, 29135, 29136, 29137, 29138, 29139, + 29142, 29143, 29144, 29145, 29146, 29147, 29148, 29149, 29150, 29151, + 29153, 29154, 29155, 29156, 29158, 29160, 29161, 29162, 29163, 29164, + 29165, 29167, 29168, 29169, 29170, 29171, 29172, 29173, 29174, 29175, + 29176, 29178, 29179, 29180, 29181, 29182, 29183, 29184, 29185, 29186, + 29187, 29188, 29189, 29191, 29192, 29193, 29194, 29195, 29196, 29197, + 29198, 29199, 29200, 29201, 29202, 29203, 29204, 29205, 29206, 29207, + 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, + 29219, 29220, 29221, 29222, 29223, 29225, 29227, 29229, 29230, 29231, + 29234, 29235, 29236, 29242, 29244, 29246, 29248, 29249, 29250, 29251, + 29252, 29253, 29254, 29257, 29258, 29259, 29262, 29263, 29264, 29265, + 29267, 29268, 29269, 29271, 29272, 29274, 29276, 29278, 29280, 29283, + 29284, 29285, 29288, 29290, 29291, 29292, 29293, 29296, 29297, 29299, + 29300, 29302, 29303, 29304, 29307, 29308, 29309, 29314, 29315, 29317, + 29318, 29319, 29320, 29321, 29324, 29326, 29328, 29329, 29331, 29332, + 29333, 29334, 29335, 29336, 29337, 29338, 29339, 29340, 29341, 29342, + 29344, 29345, 29346, 29347, 29348, 29349, 29350, 29351, 29352, 29353, + 29354, 29355, 29358, 29361, 29362, 29363, 29365, 29370, 29371, 29372, + 29373, 29374, 29375, 29376, 29381, 29382, 29383, 29385, 29386, 29387, + 29388, 29391, 29393, 29395, 29396, 29397, 29398, 29400, 29402, 29403, + 58566, 58567, 58568, 58569, 58570, 58571, 58572, 58573, 58574, 58575, + 58576, 58577, 58578, 58579, 58580, 58581, 58582, 58583, 58584, 58585, + 58586, 58587, 58588, 58589, 58590, 58591, 58592, 58593, 58594, 58595, + 58596, 58597, 58598, 58599, 58600, 58601, 58602, 58603, 58604, 58605, + 58606, 58607, 58608, 58609, 58610, 58611, 58612, 58613, 58614, 58615, + 58616, 58617, 58618, 58619, 58620, 58621, 58622, 58623, 58624, 58625, + 58626, 58627, 58628, 58629, 58630, 58631, 58632, 58633, 58634, 58635, + 58636, 58637, 58638, 58639, 58640, 58641, 58642, 58643, 58644, 58645, + 58646, 58647, 58648, 58649, 58650, 58651, 58652, 58653, 58654, 58655, + 58656, 58657, 58658, 58659, 58660, 58661, 12288, 12289, 12290, 183, + 713, 711, 168, 12291, 12293, 8212, 65374, 8214, 8230, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12310, 12311, 12304, 12305, 177, 215, 247, + 8758, 8743, 8744, 8721, 8719, 8746, 8745, 8712, 8759, 8730, + 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, 8780, 8776, + 8765, 8733, 8800, 8814, 8815, 8804, 8805, 8734, 8757, 8756, + 9794, 9792, 176, 8242, 8243, 8451, 65284, 164, 65504, 65505, + 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, + 9633, 9632, 9651, 9650, 8251, 8594, 8592, 8593, 8595, 12307, + 58662, 58663, 58664, 58665, 58666, 58667, 58668, 58669, 58670, 58671, + 58672, 58673, 58674, 58675, 58676, 58677, 58678, 58679, 58680, 58681, + 58682, 58683, 58684, 58685, 58686, 58687, 58688, 58689, 58690, 58691, + 58692, 58693, 58694, 58695, 58696, 58697, 58698, 58699, 58700, 58701, + 58702, 58703, 58704, 58705, 58706, 58707, 58708, 58709, 58710, 58711, + 58712, 58713, 58714, 58715, 58716, 58717, 58718, 58719, 58720, 58721, + 58722, 58723, 58724, 58725, 58726, 58727, 58728, 58729, 58730, 58731, + 58732, 58733, 58734, 58735, 58736, 58737, 58738, 58739, 58740, 58741, + 58742, 58743, 58744, 58745, 58746, 58747, 58748, 58749, 58750, 58751, + 58752, 58753, 58754, 58755, 58756, 58757, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 59238, 59239, 59240, 59241, + 59242, 59243, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, + 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, + 9370, 9371, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, + 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, + 9350, 9351, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, + 9320, 9321, 8364, 59245, 12832, 12833, 12834, 12835, 12836, 12837, + 12838, 12839, 12840, 12841, 59246, 59247, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 59248, 59249, + 58758, 58759, 58760, 58761, 58762, 58763, 58764, 58765, 58766, 58767, + 58768, 58769, 58770, 58771, 58772, 58773, 58774, 58775, 58776, 58777, + 58778, 58779, 58780, 58781, 58782, 58783, 58784, 58785, 58786, 58787, + 58788, 58789, 58790, 58791, 58792, 58793, 58794, 58795, 58796, 58797, + 58798, 58799, 58800, 58801, 58802, 58803, 58804, 58805, 58806, 58807, + 58808, 58809, 58810, 58811, 58812, 58813, 58814, 58815, 58816, 58817, + 58818, 58819, 58820, 58821, 58822, 58823, 58824, 58825, 58826, 58827, + 58828, 58829, 58830, 58831, 58832, 58833, 58834, 58835, 58836, 58837, + 58838, 58839, 58840, 58841, 58842, 58843, 58844, 58845, 58846, 58847, + 58848, 58849, 58850, 58851, 58852, 12288, 65281, 65282, 65283, 65509, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 58854, 58855, 58856, 58857, 58858, 58859, 58860, 58861, 58862, 58863, + 58864, 58865, 58866, 58867, 58868, 58869, 58870, 58871, 58872, 58873, + 58874, 58875, 58876, 58877, 58878, 58879, 58880, 58881, 58882, 58883, + 58884, 58885, 58886, 58887, 58888, 58889, 58890, 58891, 58892, 58893, + 58894, 58895, 58896, 58897, 58898, 58899, 58900, 58901, 58902, 58903, + 58904, 58905, 58906, 58907, 58908, 58909, 58910, 58911, 58912, 58913, + 58914, 58915, 58916, 58917, 58918, 58919, 58920, 58921, 58922, 58923, + 58924, 58925, 58926, 58927, 58928, 58929, 58930, 58931, 58932, 58933, + 58934, 58935, 58936, 58937, 58938, 58939, 58940, 58941, 58942, 58943, + 58944, 58945, 58946, 58947, 58948, 58949, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 59250, + 59251, 59252, 59253, 59254, 59255, 59256, 59257, 59258, 59259, 59260, + 58950, 58951, 58952, 58953, 58954, 58955, 58956, 58957, 58958, 58959, + 58960, 58961, 58962, 58963, 58964, 58965, 58966, 58967, 58968, 58969, + 58970, 58971, 58972, 58973, 58974, 58975, 58976, 58977, 58978, 58979, + 58980, 58981, 58982, 58983, 58984, 58985, 58986, 58987, 58988, 58989, + 58990, 58991, 58992, 58993, 58994, 58995, 58996, 58997, 58998, 58999, + 59000, 59001, 59002, 59003, 59004, 59005, 59006, 59007, 59008, 59009, + 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59017, 59018, 59019, + 59020, 59021, 59022, 59023, 59024, 59025, 59026, 59027, 59028, 59029, + 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, 59038, 59039, + 59040, 59041, 59042, 59043, 59044, 59045, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 59261, 59262, 59263, 59264, 59265, 59266, 59267, 59268, + 59046, 59047, 59048, 59049, 59050, 59051, 59052, 59053, 59054, 59055, + 59056, 59057, 59058, 59059, 59060, 59061, 59062, 59063, 59064, 59065, + 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, 59074, 59075, + 59076, 59077, 59078, 59079, 59080, 59081, 59082, 59083, 59084, 59085, + 59086, 59087, 59088, 59089, 59090, 59091, 59092, 59093, 59094, 59095, + 59096, 59097, 59098, 59099, 59100, 59101, 59102, 59103, 59104, 59105, + 59106, 59107, 59108, 59109, 59110, 59111, 59112, 59113, 59114, 59115, + 59116, 59117, 59118, 59119, 59120, 59121, 59122, 59123, 59124, 59125, + 59126, 59127, 59128, 59129, 59130, 59131, 59132, 59133, 59134, 59135, + 59136, 59137, 59138, 59139, 59140, 59141, 913, 914, 915, 916, + 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 59269, 59270, 59271, 59272, 59273, 59274, 59275, 59276, 945, 946, + 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, + 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, + 968, 969, 59277, 59278, 59279, 59280, 59281, 59282, 59283, 65077, + 65078, 65081, 65082, 65087, 65088, 65085, 65086, 65089, 65090, 65091, + 65092, 59284, 59285, 65083, 65084, 65079, 65080, 65073, 59286, 65075, + 65076, 59287, 59288, 59289, 59290, 59291, 59292, 59293, 59294, 59295, + 59142, 59143, 59144, 59145, 59146, 59147, 59148, 59149, 59150, 59151, + 59152, 59153, 59154, 59155, 59156, 59157, 59158, 59159, 59160, 59161, + 59162, 59163, 59164, 59165, 59166, 59167, 59168, 59169, 59170, 59171, + 59172, 59173, 59174, 59175, 59176, 59177, 59178, 59179, 59180, 59181, + 59182, 59183, 59184, 59185, 59186, 59187, 59188, 59189, 59190, 59191, + 59192, 59193, 59194, 59195, 59196, 59197, 59198, 59199, 59200, 59201, + 59202, 59203, 59204, 59205, 59206, 59207, 59208, 59209, 59210, 59211, + 59212, 59213, 59214, 59215, 59216, 59217, 59218, 59219, 59220, 59221, + 59222, 59223, 59224, 59225, 59226, 59227, 59228, 59229, 59230, 59231, + 59232, 59233, 59234, 59235, 59236, 59237, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 59296, + 59297, 59298, 59299, 59300, 59301, 59302, 59303, 59304, 59305, 59306, + 59307, 59308, 59309, 59310, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 59311, 59312, 59313, + 59314, 59315, 59316, 59317, 59318, 59319, 59320, 59321, 59322, 59323, + 714, 715, 729, 8211, 8213, 8229, 8245, 8453, 8457, 8598, + 8599, 8600, 8601, 8725, 8735, 8739, 8786, 8806, 8807, 8895, + 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, + 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, + 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, + 9582, 9583, 9584, 9585, 9586, 9587, 9601, 9602, 9603, 9604, + 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, 9614, + 9615, 9619, 9620, 9621, 9660, 9661, 9698, 9699, 9700, 9701, + 9737, 8853, 12306, 12317, 12318, 59324, 59325, 59326, 59327, 59328, + 59329, 59330, 59331, 59332, 59333, 59334, 257, 225, 462, 224, + 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, + 466, 242, 363, 250, 468, 249, 470, 472, 474, 476, + 252, 234, 593, 7743, 324, 328, 505, 609, 59337, 59338, + 59339, 59340, 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, + 12557, 12558, 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, + 12567, 12568, 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, + 12577, 12578, 12579, 12580, 12581, 12582, 12583, 12584, 12585, 59341, + 59342, 59343, 59344, 59345, 59346, 59347, 59348, 59349, 59350, 59351, + 59352, 59353, 59354, 59355, 59356, 59357, 59358, 59359, 59360, 59361, + 12321, 12322, 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12963, + 13198, 13199, 13212, 13213, 13214, 13217, 13252, 13262, 13265, 13266, + 13269, 65072, 65506, 65508, 59362, 8481, 12849, 59363, 8208, 59364, + 59365, 59366, 12540, 12443, 12444, 12541, 12542, 12294, 12445, 12446, + 65097, 65098, 65099, 65100, 65101, 65102, 65103, 65104, 65105, 65106, + 65108, 65109, 65110, 65111, 65113, 65114, 65115, 65116, 65117, 65118, + 65119, 65120, 65121, 65122, 65123, 65124, 65125, 65126, 65128, 65129, + 65130, 65131, 12350, 12272, 12273, 12274, 12275, 12276, 12277, 12278, + 12279, 12280, 12281, 12282, 12283, 12295, 59380, 59381, 59382, 59383, + 59384, 59385, 59386, 59387, 59388, 59389, 59390, 59391, 59392, 9472, + 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, + 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, + 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, + 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, + 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, + 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, + 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 9547, 59393, 59394, 59395, 59396, 59397, + 59398, 59399, 59400, 59401, 59402, 59403, 59404, 59405, 59406, 59407, + 29404, 29405, 29407, 29410, 29411, 29412, 29413, 29414, 29415, 29418, + 29419, 29429, 29430, 29433, 29437, 29438, 29439, 29440, 29442, 29444, + 29445, 29446, 29447, 29448, 29449, 29451, 29452, 29453, 29455, 29456, + 29457, 29458, 29460, 29464, 29465, 29466, 29471, 29472, 29475, 29476, + 29478, 29479, 29480, 29485, 29487, 29488, 29490, 29491, 29493, 29494, + 29498, 29499, 29500, 29501, 29504, 29505, 29506, 29507, 29508, 29509, + 29510, 29511, 29512, 29513, 29514, 29515, 29516, 29518, 29519, 29521, + 29523, 29524, 29525, 29526, 29528, 29529, 29530, 29531, 29532, 29533, + 29534, 29535, 29537, 29538, 29539, 29540, 29541, 29542, 29543, 29544, + 29545, 29546, 29547, 29550, 29552, 29553, 57344, 57345, 57346, 57347, + 57348, 57349, 57350, 57351, 57352, 57353, 57354, 57355, 57356, 57357, + 57358, 57359, 57360, 57361, 57362, 57363, 57364, 57365, 57366, 57367, + 57368, 57369, 57370, 57371, 57372, 57373, 57374, 57375, 57376, 57377, + 57378, 57379, 57380, 57381, 57382, 57383, 57384, 57385, 57386, 57387, + 57388, 57389, 57390, 57391, 57392, 57393, 57394, 57395, 57396, 57397, + 57398, 57399, 57400, 57401, 57402, 57403, 57404, 57405, 57406, 57407, + 57408, 57409, 57410, 57411, 57412, 57413, 57414, 57415, 57416, 57417, + 57418, 57419, 57420, 57421, 57422, 57423, 57424, 57425, 57426, 57427, + 57428, 57429, 57430, 57431, 57432, 57433, 57434, 57435, 57436, 57437, + 29554, 29555, 29556, 29557, 29558, 29559, 29560, 29561, 29562, 29563, + 29564, 29565, 29567, 29568, 29569, 29570, 29571, 29573, 29574, 29576, + 29578, 29580, 29581, 29583, 29584, 29586, 29587, 29588, 29589, 29591, + 29592, 29593, 29594, 29596, 29597, 29598, 29600, 29601, 29603, 29604, + 29605, 29606, 29607, 29608, 29610, 29612, 29613, 29617, 29620, 29621, + 29622, 29624, 29625, 29628, 29629, 29630, 29631, 29633, 29635, 29636, + 29637, 29638, 29639, 29643, 29644, 29646, 29650, 29651, 29652, 29653, + 29654, 29655, 29656, 29658, 29659, 29660, 29661, 29663, 29665, 29666, + 29667, 29668, 29670, 29672, 29674, 29675, 29676, 29678, 29679, 29680, + 29681, 29683, 29684, 29685, 29686, 29687, 57438, 57439, 57440, 57441, + 57442, 57443, 57444, 57445, 57446, 57447, 57448, 57449, 57450, 57451, + 57452, 57453, 57454, 57455, 57456, 57457, 57458, 57459, 57460, 57461, + 57462, 57463, 57464, 57465, 57466, 57467, 57468, 57469, 57470, 57471, + 57472, 57473, 57474, 57475, 57476, 57477, 57478, 57479, 57480, 57481, + 57482, 57483, 57484, 57485, 57486, 57487, 57488, 57489, 57490, 57491, + 57492, 57493, 57494, 57495, 57496, 57497, 57498, 57499, 57500, 57501, + 57502, 57503, 57504, 57505, 57506, 57507, 57508, 57509, 57510, 57511, + 57512, 57513, 57514, 57515, 57516, 57517, 57518, 57519, 57520, 57521, + 57522, 57523, 57524, 57525, 57526, 57527, 57528, 57529, 57530, 57531, + 29688, 29689, 29690, 29691, 29692, 29693, 29694, 29695, 29696, 29697, + 29698, 29700, 29703, 29704, 29707, 29708, 29709, 29710, 29713, 29714, + 29715, 29716, 29717, 29718, 29719, 29720, 29721, 29724, 29725, 29726, + 29727, 29728, 29729, 29731, 29732, 29735, 29737, 29739, 29741, 29743, + 29745, 29746, 29751, 29752, 29753, 29754, 29755, 29757, 29758, 29759, + 29760, 29762, 29763, 29764, 29765, 29766, 29767, 29768, 29769, 29770, + 29771, 29772, 29773, 29774, 29775, 29776, 29777, 29778, 29779, 29780, + 29782, 29784, 29789, 29792, 29793, 29794, 29795, 29796, 29797, 29798, + 29799, 29800, 29801, 29802, 29803, 29804, 29806, 29807, 29809, 29810, + 29811, 29812, 29813, 29816, 29817, 29818, 57532, 57533, 57534, 57535, + 57536, 57537, 57538, 57539, 57540, 57541, 57542, 57543, 57544, 57545, + 57546, 57547, 57548, 57549, 57550, 57551, 57552, 57553, 57554, 57555, + 57556, 57557, 57558, 57559, 57560, 57561, 57562, 57563, 57564, 57565, + 57566, 57567, 57568, 57569, 57570, 57571, 57572, 57573, 57574, 57575, + 57576, 57577, 57578, 57579, 57580, 57581, 57582, 57583, 57584, 57585, + 57586, 57587, 57588, 57589, 57590, 57591, 57592, 57593, 57594, 57595, + 57596, 57597, 57598, 57599, 57600, 57601, 57602, 57603, 57604, 57605, + 57606, 57607, 57608, 57609, 57610, 57611, 57612, 57613, 57614, 57615, + 57616, 57617, 57618, 57619, 57620, 57621, 57622, 57623, 57624, 57625, + 29819, 29820, 29821, 29823, 29826, 29828, 29829, 29830, 29832, 29833, + 29834, 29836, 29837, 29839, 29841, 29842, 29843, 29844, 29845, 29846, + 29847, 29848, 29849, 29850, 29851, 29853, 29855, 29856, 29857, 29858, + 29859, 29860, 29861, 29862, 29866, 29867, 29868, 29869, 29870, 29871, + 29872, 29873, 29874, 29875, 29876, 29877, 29878, 29879, 29880, 29881, + 29883, 29884, 29885, 29886, 29887, 29888, 29889, 29890, 29891, 29892, + 29893, 29894, 29895, 29896, 29897, 29898, 29899, 29900, 29901, 29902, + 29903, 29904, 29905, 29907, 29908, 29909, 29910, 29911, 29912, 29913, + 29914, 29915, 29917, 29919, 29921, 29925, 29927, 29928, 29929, 29930, + 29931, 29932, 29933, 29936, 29937, 29938, 57626, 57627, 57628, 57629, + 57630, 57631, 57632, 57633, 57634, 57635, 57636, 57637, 57638, 57639, + 57640, 57641, 57642, 57643, 57644, 57645, 57646, 57647, 57648, 57649, + 57650, 57651, 57652, 57653, 57654, 57655, 57656, 57657, 57658, 57659, + 57660, 57661, 57662, 57663, 57664, 57665, 57666, 57667, 57668, 57669, + 57670, 57671, 57672, 57673, 57674, 57675, 57676, 57677, 57678, 57679, + 57680, 57681, 57682, 57683, 57684, 57685, 57686, 57687, 57688, 57689, + 57690, 57691, 57692, 57693, 57694, 57695, 57696, 57697, 57698, 57699, + 57700, 57701, 57702, 57703, 57704, 57705, 57706, 57707, 57708, 57709, + 57710, 57711, 57712, 57713, 57714, 57715, 57716, 57717, 57718, 57719, + 29939, 29941, 29944, 29945, 29946, 29947, 29948, 29949, 29950, 29952, + 29953, 29954, 29955, 29957, 29958, 29959, 29960, 29961, 29962, 29963, + 29964, 29966, 29968, 29970, 29972, 29973, 29974, 29975, 29979, 29981, + 29982, 29984, 29985, 29986, 29987, 29988, 29990, 29991, 29994, 29998, + 30004, 30006, 30009, 30012, 30013, 30015, 30017, 30018, 30019, 30020, + 30022, 30023, 30025, 30026, 30029, 30032, 30033, 30034, 30035, 30037, + 30038, 30039, 30040, 30045, 30046, 30047, 30048, 30049, 30050, 30051, + 30052, 30055, 30056, 30057, 30059, 30060, 30061, 30062, 30063, 30064, + 30065, 30067, 30069, 30070, 30071, 30074, 30075, 30076, 30077, 30078, + 30080, 30081, 30082, 30084, 30085, 30087, 57720, 57721, 57722, 57723, + 57724, 57725, 57726, 57727, 57728, 57729, 57730, 57731, 57732, 57733, + 57734, 57735, 57736, 57737, 57738, 57739, 57740, 57741, 57742, 57743, + 57744, 57745, 57746, 57747, 57748, 57749, 57750, 57751, 57752, 57753, + 57754, 57755, 57756, 57757, 57758, 57759, 57760, 57761, 57762, 57763, + 57764, 57765, 57766, 57767, 57768, 57769, 57770, 57771, 57772, 57773, + 57774, 57775, 57776, 57777, 57778, 57779, 57780, 57781, 57782, 57783, + 57784, 57785, 57786, 57787, 57788, 57789, 57790, 57791, 57792, 57793, + 57794, 57795, 57796, 57797, 57798, 57799, 57800, 57801, 57802, 57803, + 57804, 57805, 57806, 57807, 57808, 57809, 57810, 57811, 57812, 57813, + 30088, 30089, 30090, 30092, 30093, 30094, 30096, 30099, 30101, 30104, + 30107, 30108, 30110, 30114, 30118, 30119, 30120, 30121, 30122, 30125, + 30134, 30135, 30138, 30139, 30143, 30144, 30145, 30150, 30155, 30156, + 30158, 30159, 30160, 30161, 30163, 30167, 30169, 30170, 30172, 30173, + 30175, 30176, 30177, 30181, 30185, 30188, 30189, 30190, 30191, 30194, + 30195, 30197, 30198, 30199, 30200, 30202, 30203, 30205, 30206, 30210, + 30212, 30214, 30215, 30216, 30217, 30219, 30221, 30222, 30223, 30225, + 30226, 30227, 30228, 30230, 30234, 30236, 30237, 30238, 30241, 30243, + 30247, 30248, 30252, 30254, 30255, 30257, 30258, 30262, 30263, 30265, + 30266, 30267, 30269, 30273, 30274, 30276, 57814, 57815, 57816, 57817, + 57818, 57819, 57820, 57821, 57822, 57823, 57824, 57825, 57826, 57827, + 57828, 57829, 57830, 57831, 57832, 57833, 57834, 57835, 57836, 57837, + 57838, 57839, 57840, 57841, 57842, 57843, 57844, 57845, 57846, 57847, + 57848, 57849, 57850, 57851, 57852, 57853, 57854, 57855, 57856, 57857, + 57858, 57859, 57860, 57861, 57862, 57863, 57864, 57865, 57866, 57867, + 57868, 57869, 57870, 57871, 57872, 57873, 57874, 57875, 57876, 57877, + 57878, 57879, 57880, 57881, 57882, 57883, 57884, 57885, 57886, 57887, + 57888, 57889, 57890, 57891, 57892, 57893, 57894, 57895, 57896, 57897, + 57898, 57899, 57900, 57901, 57902, 57903, 57904, 57905, 57906, 57907, + 30277, 30278, 30279, 30280, 30281, 30282, 30283, 30286, 30287, 30288, + 30289, 30290, 30291, 30293, 30295, 30296, 30297, 30298, 30299, 30301, + 30303, 30304, 30305, 30306, 30308, 30309, 30310, 30311, 30312, 30313, + 30314, 30316, 30317, 30318, 30320, 30321, 30322, 30323, 30324, 30325, + 30326, 30327, 30329, 30330, 30332, 30335, 30336, 30337, 30339, 30341, + 30345, 30346, 30348, 30349, 30351, 30352, 30354, 30356, 30357, 30359, + 30360, 30362, 30363, 30364, 30365, 30366, 30367, 30368, 30369, 30370, + 30371, 30373, 30374, 30375, 30376, 30377, 30378, 30379, 30380, 30381, + 30383, 30384, 30387, 30389, 30390, 30391, 30392, 30393, 30394, 30395, + 30396, 30397, 30398, 30400, 30401, 30403, 21834, 38463, 22467, 25384, + 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, 29233, + 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, 26696, + 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, 22885, + 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, 20843, 30116, + 24052, 25300, 36299, 38774, 25226, 32793, 22365, 38712, 32610, 29240, + 30333, 26575, 30334, 25670, 20336, 36133, 25308, 31255, 26001, 29677, + 25644, 25203, 33324, 39041, 26495, 29256, 25198, 25292, 20276, 29923, + 21322, 21150, 32458, 37030, 24110, 26758, 27036, 33152, 32465, 26834, + 30917, 34444, 38225, 20621, 35876, 33502, 32990, 21253, 35090, 21093, + 30404, 30407, 30409, 30411, 30412, 30419, 30421, 30425, 30426, 30428, + 30429, 30430, 30432, 30433, 30434, 30435, 30436, 30438, 30439, 30440, + 30441, 30442, 30443, 30444, 30445, 30448, 30451, 30453, 30454, 30455, + 30458, 30459, 30461, 30463, 30464, 30466, 30467, 30469, 30470, 30474, + 30476, 30478, 30479, 30480, 30481, 30482, 30483, 30484, 30485, 30486, + 30487, 30488, 30491, 30492, 30493, 30494, 30497, 30499, 30500, 30501, + 30503, 30506, 30507, 30508, 30510, 30512, 30513, 30514, 30515, 30516, + 30521, 30523, 30525, 30526, 30527, 30530, 30532, 30533, 30534, 30536, + 30537, 30538, 30539, 30540, 30541, 30542, 30543, 30546, 30547, 30548, + 30549, 30550, 30551, 30552, 30553, 30556, 34180, 38649, 20445, 22561, + 39281, 23453, 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, + 24754, 21329, 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, + 24811, 28953, 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, + 27893, 36454, 36856, 36924, 40763, 27604, 37145, 31508, 24444, 30887, + 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, + 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, + 36140, 25153, 20415, 21464, 21342, 36776, 36777, 36779, 36941, 26631, + 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, + 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, + 30557, 30558, 30559, 30560, 30564, 30567, 30569, 30570, 30573, 30574, + 30575, 30576, 30577, 30578, 30579, 30580, 30581, 30582, 30583, 30584, + 30586, 30587, 30588, 30593, 30594, 30595, 30598, 30599, 30600, 30601, + 30602, 30603, 30607, 30608, 30611, 30612, 30613, 30614, 30615, 30616, + 30617, 30618, 30619, 30620, 30621, 30622, 30625, 30627, 30628, 30630, + 30632, 30635, 30637, 30638, 30639, 30641, 30642, 30644, 30646, 30647, + 30648, 30649, 30650, 30652, 30654, 30656, 30657, 30658, 30659, 30660, + 30661, 30662, 30663, 30664, 30665, 30666, 30667, 30668, 30670, 30671, + 30672, 30673, 30674, 30675, 30676, 30677, 30678, 30680, 30681, 30682, + 30685, 30686, 30687, 30688, 30689, 30692, 30149, 24182, 29627, 33760, + 25773, 25320, 38069, 27874, 21338, 21187, 25615, 38082, 31636, 20271, + 24091, 33334, 33046, 33162, 28196, 27850, 39539, 25429, 21340, 21754, + 34917, 22496, 19981, 24067, 27493, 31807, 37096, 24598, 25830, 29468, + 35009, 26448, 25165, 36130, 30572, 36393, 37319, 24425, 33756, 34081, + 39184, 21442, 34453, 27531, 24813, 24808, 28799, 33485, 33329, 20179, + 27815, 34255, 25805, 31961, 27133, 26361, 33609, 21397, 31574, 20391, + 20876, 27979, 23618, 36461, 25554, 21449, 33580, 33590, 26597, 30900, + 25661, 23519, 23700, 24046, 35815, 25286, 26612, 35962, 25600, 25530, + 34633, 39307, 35863, 32544, 38130, 20135, 38416, 39076, 26124, 29462, + 30694, 30696, 30698, 30703, 30704, 30705, 30706, 30708, 30709, 30711, + 30713, 30714, 30715, 30716, 30723, 30724, 30725, 30726, 30727, 30728, + 30730, 30731, 30734, 30735, 30736, 30739, 30741, 30745, 30747, 30750, + 30752, 30753, 30754, 30756, 30760, 30762, 30763, 30766, 30767, 30769, + 30770, 30771, 30773, 30774, 30781, 30783, 30785, 30786, 30787, 30788, + 30790, 30792, 30793, 30794, 30795, 30797, 30799, 30801, 30803, 30804, + 30808, 30809, 30810, 30811, 30812, 30814, 30815, 30816, 30817, 30818, + 30819, 30820, 30821, 30822, 30823, 30824, 30825, 30831, 30832, 30833, + 30834, 30835, 30836, 30837, 30838, 30840, 30841, 30842, 30843, 30845, + 30846, 30847, 30848, 30849, 30850, 30851, 22330, 23581, 24120, 38271, + 20607, 32928, 21378, 25950, 30021, 21809, 20513, 36229, 25220, 38046, + 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, + 24443, 28552, 37108, 33251, 36784, 23576, 26216, 24561, 27785, 38472, + 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, 20056, 31243, + 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, 30196, 25345, + 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, 23610, 36196, + 32709, 26021, 28861, 20805, 20914, 34411, 23815, 23456, 25277, 37228, + 30068, 36364, 31264, 24833, 31609, 20167, 32504, 30597, 19985, 33261, + 21021, 20986, 27249, 21416, 36487, 38148, 38607, 28353, 38500, 26970, + 30852, 30853, 30854, 30856, 30858, 30859, 30863, 30864, 30866, 30868, + 30869, 30870, 30873, 30877, 30878, 30880, 30882, 30884, 30886, 30888, + 30889, 30890, 30891, 30892, 30893, 30894, 30895, 30901, 30902, 30903, + 30904, 30906, 30907, 30908, 30909, 30911, 30912, 30914, 30915, 30916, + 30918, 30919, 30920, 30924, 30925, 30926, 30927, 30929, 30930, 30931, + 30934, 30935, 30936, 30938, 30939, 30940, 30941, 30942, 30943, 30944, + 30945, 30946, 30947, 30948, 30949, 30950, 30951, 30953, 30954, 30955, + 30957, 30958, 30959, 30960, 30961, 30963, 30965, 30966, 30968, 30969, + 30971, 30972, 30973, 30974, 30975, 30976, 30978, 30979, 30980, 30982, + 30983, 30984, 30985, 30986, 30987, 30988, 30784, 20648, 30679, 25616, + 35302, 22788, 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, + 30126, 31383, 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, + 22402, 26149, 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, + 30133, 33576, 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, + 36176, 27425, 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, + 37259, 31751, 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, + 30209, 31929, 28140, 32736, 26449, 23384, 23544, 30923, 25774, 25619, + 25514, 25387, 38169, 25645, 36798, 31572, 30249, 25171, 22823, 21574, + 27513, 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, 36910, + 30989, 30990, 30991, 30992, 30993, 30994, 30996, 30997, 30998, 30999, + 31000, 31001, 31002, 31003, 31004, 31005, 31007, 31008, 31009, 31010, + 31011, 31013, 31014, 31015, 31016, 31017, 31018, 31019, 31020, 31021, + 31022, 31023, 31024, 31025, 31026, 31027, 31029, 31030, 31031, 31032, + 31033, 31037, 31039, 31042, 31043, 31044, 31045, 31047, 31050, 31051, + 31052, 31053, 31054, 31055, 31056, 31057, 31058, 31060, 31061, 31064, + 31065, 31073, 31075, 31076, 31078, 31081, 31082, 31083, 31084, 31086, + 31088, 31089, 31090, 31091, 31092, 31093, 31094, 31097, 31099, 31100, + 31101, 31102, 31103, 31106, 31107, 31110, 31111, 31112, 31113, 31115, + 31116, 31117, 31118, 31120, 31121, 31122, 24608, 32829, 25285, 20025, + 21333, 37112, 25528, 32966, 26086, 27694, 20294, 24814, 28129, 35806, + 24377, 34507, 24403, 25377, 20826, 33633, 26723, 20992, 25443, 36424, + 20498, 23707, 31095, 23548, 21040, 31291, 24764, 36947, 30423, 24503, + 24471, 30340, 36460, 28783, 30331, 31561, 30634, 20979, 37011, 22564, + 20302, 28404, 36842, 25932, 31515, 29380, 28068, 32735, 23265, 25269, + 24213, 22320, 33922, 31532, 24093, 24351, 36882, 32532, 39072, 25474, + 28359, 30872, 28857, 20856, 38747, 22443, 30005, 20291, 30008, 24215, + 24806, 22880, 28096, 27583, 30857, 21500, 38613, 20939, 20993, 25481, + 21514, 38035, 35843, 36300, 29241, 30879, 34678, 36845, 35853, 21472, + 31123, 31124, 31125, 31126, 31127, 31128, 31129, 31131, 31132, 31133, + 31134, 31135, 31136, 31137, 31138, 31139, 31140, 31141, 31142, 31144, + 31145, 31146, 31147, 31148, 31149, 31150, 31151, 31152, 31153, 31154, + 31156, 31157, 31158, 31159, 31160, 31164, 31167, 31170, 31172, 31173, + 31175, 31176, 31178, 31180, 31182, 31183, 31184, 31187, 31188, 31190, + 31191, 31193, 31194, 31195, 31196, 31197, 31198, 31200, 31201, 31202, + 31205, 31208, 31210, 31212, 31214, 31217, 31218, 31219, 31220, 31221, + 31222, 31223, 31225, 31226, 31228, 31230, 31231, 31233, 31236, 31237, + 31239, 31240, 31241, 31242, 31244, 31247, 31248, 31249, 31250, 31251, + 31253, 31254, 31256, 31257, 31259, 31260, 19969, 30447, 21486, 38025, + 39030, 40718, 38189, 23450, 35746, 20002, 19996, 20908, 33891, 25026, + 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, 26007, 38497, + 35910, 36887, 30168, 37117, 30563, 27602, 29322, 29420, 35835, 22581, + 30585, 36172, 26460, 38208, 32922, 24230, 28193, 22930, 31471, 30701, + 38203, 27573, 26029, 32526, 22534, 20817, 38431, 23545, 22697, 21544, + 36466, 25958, 39039, 22244, 38045, 30462, 36929, 25479, 21702, 22810, + 22842, 22427, 36530, 26421, 36346, 33333, 21057, 24816, 22549, 34558, + 23784, 40517, 20420, 39069, 35769, 23077, 24694, 21380, 25212, 36943, + 37122, 39295, 24681, 32780, 20799, 32819, 23572, 39285, 27953, 20108, + 31261, 31263, 31265, 31266, 31268, 31269, 31270, 31271, 31272, 31273, + 31274, 31275, 31276, 31277, 31278, 31279, 31280, 31281, 31282, 31284, + 31285, 31286, 31288, 31290, 31294, 31296, 31297, 31298, 31299, 31300, + 31301, 31303, 31304, 31305, 31306, 31307, 31308, 31309, 31310, 31311, + 31312, 31314, 31315, 31316, 31317, 31318, 31320, 31321, 31322, 31323, + 31324, 31325, 31326, 31327, 31328, 31329, 31330, 31331, 31332, 31333, + 31334, 31335, 31336, 31337, 31338, 31339, 31340, 31341, 31342, 31343, + 31345, 31346, 31347, 31349, 31355, 31356, 31357, 31358, 31362, 31365, + 31367, 31369, 31370, 31371, 31372, 31374, 31375, 31376, 31379, 31380, + 31385, 31386, 31387, 31390, 31393, 31394, 36144, 21457, 32602, 31567, + 20240, 20047, 38400, 27861, 29648, 34281, 24070, 30058, 32763, 27146, + 30718, 38034, 32321, 20961, 28902, 21453, 36820, 33539, 36137, 29359, + 39277, 27867, 22346, 33459, 26041, 32938, 25151, 38450, 22952, 20223, + 35775, 32442, 25918, 33778, 38750, 21857, 39134, 32933, 21290, 35837, + 21536, 32954, 24223, 27832, 36153, 33452, 37210, 21545, 27675, 20998, + 32439, 22367, 28954, 27774, 31881, 22859, 20221, 24575, 24868, 31914, + 20016, 23553, 26539, 34562, 23792, 38155, 39118, 30127, 28925, 36898, + 20911, 32541, 35773, 22857, 20964, 20315, 21542, 22827, 25975, 32932, + 23413, 25206, 25282, 36752, 24133, 27679, 31526, 20239, 20440, 26381, + 31395, 31396, 31399, 31401, 31402, 31403, 31406, 31407, 31408, 31409, + 31410, 31412, 31413, 31414, 31415, 31416, 31417, 31418, 31419, 31420, + 31421, 31422, 31424, 31425, 31426, 31427, 31428, 31429, 31430, 31431, + 31432, 31433, 31434, 31436, 31437, 31438, 31439, 31440, 31441, 31442, + 31443, 31444, 31445, 31447, 31448, 31450, 31451, 31452, 31453, 31457, + 31458, 31460, 31463, 31464, 31465, 31466, 31467, 31468, 31470, 31472, + 31473, 31474, 31475, 31476, 31477, 31478, 31479, 31480, 31483, 31484, + 31486, 31488, 31489, 31490, 31493, 31495, 31497, 31500, 31501, 31502, + 31504, 31506, 31507, 31510, 31511, 31512, 31514, 31516, 31517, 31519, + 31521, 31522, 31523, 31527, 31529, 31533, 28014, 28074, 31119, 34993, + 24343, 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, + 33104, 36212, 21103, 35206, 36171, 22797, 20613, 20184, 38428, 29238, + 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, 22134, 22030, + 35813, 25913, 27010, 38041, 30422, 28297, 24178, 29976, 26438, 26577, + 31487, 32925, 36214, 24863, 31174, 25954, 36195, 20872, 21018, 38050, + 32568, 32923, 32434, 23703, 28207, 26464, 31705, 30347, 39640, 33167, + 32660, 31957, 25630, 38224, 31295, 21578, 21733, 27468, 25601, 25096, + 40509, 33011, 30105, 21106, 38761, 33883, 26684, 34532, 38401, 38548, + 38124, 20010, 21508, 32473, 26681, 36319, 32789, 26356, 24218, 32697, + 31535, 31536, 31538, 31540, 31541, 31542, 31543, 31545, 31547, 31549, + 31551, 31552, 31553, 31554, 31555, 31556, 31558, 31560, 31562, 31565, + 31566, 31571, 31573, 31575, 31577, 31580, 31582, 31583, 31585, 31587, + 31588, 31589, 31590, 31591, 31592, 31593, 31594, 31595, 31596, 31597, + 31599, 31600, 31603, 31604, 31606, 31608, 31610, 31612, 31613, 31615, + 31617, 31618, 31619, 31620, 31622, 31623, 31624, 31625, 31626, 31627, + 31628, 31630, 31631, 31633, 31634, 31635, 31638, 31640, 31641, 31642, + 31643, 31646, 31647, 31648, 31651, 31652, 31653, 31662, 31663, 31664, + 31666, 31667, 31669, 31670, 31671, 31673, 31674, 31675, 31676, 31677, + 31678, 31679, 31680, 31682, 31683, 31684, 22466, 32831, 26775, 24037, + 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, 24339, 24041, + 27742, 25329, 36129, 20849, 38057, 21246, 27807, 33503, 29399, 22434, + 26500, 36141, 22815, 36764, 33735, 21653, 31629, 20272, 27837, 23396, + 22993, 40723, 21476, 34506, 39592, 35895, 32929, 25925, 39038, 22266, + 38599, 21038, 29916, 21072, 23521, 25346, 35074, 20054, 25296, 24618, + 26874, 20851, 23448, 20896, 35266, 31649, 39302, 32592, 24815, 28748, + 36143, 20809, 24191, 36891, 29808, 35268, 22317, 30789, 24402, 40863, + 38394, 36712, 39740, 35809, 30328, 26690, 26588, 36330, 36149, 21053, + 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, + 31685, 31688, 31689, 31690, 31691, 31693, 31694, 31695, 31696, 31698, + 31700, 31701, 31702, 31703, 31704, 31707, 31708, 31710, 31711, 31712, + 31714, 31715, 31716, 31719, 31720, 31721, 31723, 31724, 31725, 31727, + 31728, 31730, 31731, 31732, 31733, 31734, 31736, 31737, 31738, 31739, + 31741, 31743, 31744, 31745, 31746, 31747, 31748, 31749, 31750, 31752, + 31753, 31754, 31757, 31758, 31760, 31761, 31762, 31763, 31764, 31765, + 31767, 31768, 31769, 31770, 31771, 31772, 31773, 31774, 31776, 31777, + 31778, 31779, 31780, 31781, 31784, 31785, 31787, 31788, 31789, 31790, + 31791, 31792, 31793, 31794, 31795, 31796, 31797, 31798, 31799, 31801, + 31802, 31803, 31804, 31805, 31806, 31810, 39608, 23401, 28023, 27686, + 20133, 23475, 39559, 37219, 25000, 37039, 38889, 21547, 28085, 23506, + 20989, 21898, 32597, 32752, 25788, 25421, 26097, 25022, 24717, 28938, + 27735, 27721, 22831, 26477, 33322, 22741, 22158, 35946, 27627, 37085, + 22909, 32791, 21495, 28009, 21621, 21917, 33655, 33743, 26680, 31166, + 21644, 20309, 21512, 30418, 35977, 38402, 27827, 28088, 36203, 35088, + 40548, 36154, 22079, 40657, 30165, 24456, 29408, 24680, 21756, 20136, + 27178, 34913, 24658, 36720, 21700, 28888, 34425, 40511, 27946, 23439, + 24344, 32418, 21897, 20399, 29492, 21564, 21402, 20505, 21518, 21628, + 20046, 24573, 29786, 22774, 33899, 32993, 34676, 29392, 31946, 28246, + 31811, 31812, 31813, 31814, 31815, 31816, 31817, 31818, 31819, 31820, + 31822, 31823, 31824, 31825, 31826, 31827, 31828, 31829, 31830, 31831, + 31832, 31833, 31834, 31835, 31836, 31837, 31838, 31839, 31840, 31841, + 31842, 31843, 31844, 31845, 31846, 31847, 31848, 31849, 31850, 31851, + 31852, 31853, 31854, 31855, 31856, 31857, 31858, 31861, 31862, 31863, + 31864, 31865, 31866, 31870, 31871, 31872, 31873, 31874, 31875, 31876, + 31877, 31878, 31879, 31880, 31882, 31883, 31884, 31885, 31886, 31887, + 31888, 31891, 31892, 31894, 31897, 31898, 31899, 31904, 31905, 31907, + 31910, 31911, 31912, 31913, 31915, 31916, 31917, 31919, 31920, 31924, + 31925, 31926, 31927, 31928, 31930, 31931, 24359, 34382, 21804, 25252, + 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, + 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, + 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, + 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, + 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, + 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, + 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, + 27985, 28151, 35905, 27963, 20249, 28779, 33719, 25110, 24785, 38669, + 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, 31637, + 31935, 31936, 31938, 31939, 31940, 31942, 31945, 31947, 31950, 31951, + 31952, 31953, 31954, 31955, 31956, 31960, 31962, 31963, 31965, 31966, + 31969, 31970, 31971, 31972, 31973, 31974, 31975, 31977, 31978, 31979, + 31980, 31981, 31982, 31984, 31985, 31986, 31987, 31988, 31989, 31990, + 31991, 31993, 31994, 31996, 31997, 31998, 31999, 32000, 32001, 32002, + 32003, 32004, 32005, 32006, 32007, 32008, 32009, 32011, 32012, 32013, + 32014, 32015, 32016, 32017, 32018, 32019, 32020, 32021, 32022, 32023, + 32024, 32025, 32026, 32027, 32028, 32029, 32030, 32031, 32033, 32035, + 32036, 32037, 32038, 32040, 32041, 32042, 32044, 32045, 32046, 32048, + 32049, 32050, 32051, 32052, 32053, 32054, 32908, 39269, 36857, 28608, + 35749, 40481, 23020, 32489, 32521, 21513, 26497, 26840, 36753, 31821, + 38598, 21450, 24613, 30142, 27762, 21363, 23241, 32423, 25380, 20960, + 33034, 24049, 34015, 25216, 20864, 23395, 20238, 31085, 21058, 24760, + 27982, 23492, 23490, 35745, 35760, 26082, 24524, 38469, 22931, 32487, + 32426, 22025, 26551, 22841, 20339, 23478, 21152, 33626, 39050, 36158, + 30002, 38078, 20551, 31292, 20215, 26550, 39550, 23233, 27516, 30417, + 22362, 23574, 31546, 38388, 29006, 20860, 32937, 33392, 22904, 32516, + 33575, 26816, 26604, 30897, 30839, 25315, 25441, 31616, 20461, 21098, + 20943, 33616, 27099, 37492, 36341, 36145, 35265, 38190, 31661, 20214, + 32055, 32056, 32057, 32058, 32059, 32060, 32061, 32062, 32063, 32064, + 32065, 32066, 32067, 32068, 32069, 32070, 32071, 32072, 32073, 32074, + 32075, 32076, 32077, 32078, 32079, 32080, 32081, 32082, 32083, 32084, + 32085, 32086, 32087, 32088, 32089, 32090, 32091, 32092, 32093, 32094, + 32095, 32096, 32097, 32098, 32099, 32100, 32101, 32102, 32103, 32104, + 32105, 32106, 32107, 32108, 32109, 32111, 32112, 32113, 32114, 32115, + 32116, 32117, 32118, 32120, 32121, 32122, 32123, 32124, 32125, 32126, + 32127, 32128, 32129, 32130, 32131, 32132, 32133, 32134, 32135, 32136, + 32137, 32138, 32139, 32140, 32141, 32142, 32143, 32144, 32145, 32146, + 32147, 32148, 32149, 32150, 32151, 32152, 20581, 33328, 21073, 39279, + 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, 30086, + 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, 30977, + 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, 38128, + 30699, 20389, 33050, 29409, 35282, 39290, 32564, 32478, 21119, 25945, + 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, 31224, 34903, + 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, 31469, 27905, + 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, 20171, 30117, + 35819, 23626, 24062, 31563, 26020, 37329, 20170, 27941, 35167, 32039, + 38182, 20165, 35880, 36827, 38771, 26187, 31105, 36817, 28908, 28024, + 32153, 32154, 32155, 32156, 32157, 32158, 32159, 32160, 32161, 32162, + 32163, 32164, 32165, 32167, 32168, 32169, 32170, 32171, 32172, 32173, + 32175, 32176, 32177, 32178, 32179, 32180, 32181, 32182, 32183, 32184, + 32185, 32186, 32187, 32188, 32189, 32190, 32191, 32192, 32193, 32194, + 32195, 32196, 32197, 32198, 32199, 32200, 32201, 32202, 32203, 32204, + 32205, 32206, 32207, 32208, 32209, 32210, 32211, 32212, 32213, 32214, + 32215, 32216, 32217, 32218, 32219, 32220, 32221, 32222, 32223, 32224, + 32225, 32226, 32227, 32228, 32229, 32230, 32231, 32232, 32233, 32234, + 32235, 32236, 32237, 32238, 32239, 32240, 32241, 32242, 32243, 32244, + 32245, 32246, 32247, 32248, 32249, 32250, 23613, 21170, 33606, 20834, + 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, + 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, + 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, 38893, + 20037, 28792, 20061, 37202, 21417, 25937, 26087, 33276, 33285, 21646, + 23601, 30106, 38816, 25304, 29401, 30141, 23621, 39545, 33738, 23616, + 21632, 30697, 20030, 27822, 32858, 25298, 25454, 24040, 20855, 36317, + 36382, 38191, 20465, 21477, 24807, 28844, 21095, 25424, 40515, 23071, + 20518, 30519, 21367, 32482, 25733, 25899, 25225, 25496, 20500, 29237, + 35273, 20915, 35776, 32477, 22343, 33740, 38055, 20891, 21531, 23803, + 32251, 32252, 32253, 32254, 32255, 32256, 32257, 32258, 32259, 32260, + 32261, 32262, 32263, 32264, 32265, 32266, 32267, 32268, 32269, 32270, + 32271, 32272, 32273, 32274, 32275, 32276, 32277, 32278, 32279, 32280, + 32281, 32282, 32283, 32284, 32285, 32286, 32287, 32288, 32289, 32290, + 32291, 32292, 32293, 32294, 32295, 32296, 32297, 32298, 32299, 32300, + 32301, 32302, 32303, 32304, 32305, 32306, 32307, 32308, 32309, 32310, + 32311, 32312, 32313, 32314, 32316, 32317, 32318, 32319, 32320, 32322, + 32323, 32324, 32325, 32326, 32328, 32329, 32330, 32331, 32332, 32333, + 32334, 32335, 32336, 32337, 32338, 32339, 32340, 32341, 32342, 32343, + 32344, 32345, 32346, 32347, 32348, 32349, 20426, 31459, 27994, 37089, + 39567, 21888, 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, + 21002, 22570, 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, + 25239, 20130, 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, + 26869, 30933, 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, + 23458, 35838, 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, + 23380, 25511, 25248, 21475, 25187, 23495, 26543, 21741, 31391, 33510, + 37239, 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, + 20393, 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, + 26103, 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, + 32350, 32351, 32352, 32353, 32354, 32355, 32356, 32357, 32358, 32359, + 32360, 32361, 32362, 32363, 32364, 32365, 32366, 32367, 32368, 32369, + 32370, 32371, 32372, 32373, 32374, 32375, 32376, 32377, 32378, 32379, + 32380, 32381, 32382, 32383, 32384, 32385, 32387, 32388, 32389, 32390, + 32391, 32392, 32393, 32394, 32395, 32396, 32397, 32398, 32399, 32400, + 32401, 32402, 32403, 32404, 32405, 32406, 32407, 32408, 32409, 32410, + 32412, 32413, 32414, 32430, 32436, 32443, 32444, 32470, 32484, 32492, + 32505, 32522, 32528, 32542, 32567, 32569, 32571, 32572, 32573, 32574, + 32575, 32576, 32577, 32579, 32582, 32583, 32584, 32585, 32586, 32587, + 32588, 32589, 32590, 32591, 32594, 32595, 39304, 24871, 28291, 22372, + 26118, 25414, 22256, 25324, 25193, 24275, 38420, 22403, 25289, 21895, + 34593, 33098, 36771, 21862, 33713, 26469, 36182, 34013, 23146, 26639, + 25318, 31726, 38417, 20848, 28572, 35888, 25597, 35272, 25042, 32518, + 28866, 28389, 29701, 27028, 29436, 24266, 37070, 26391, 28010, 25438, + 21171, 29282, 32769, 20332, 23013, 37226, 28889, 28061, 21202, 20048, + 38647, 38253, 34174, 30922, 32047, 20769, 22418, 25794, 32907, 31867, + 27882, 26865, 26974, 20919, 21400, 26792, 29313, 40654, 31729, 29432, + 31163, 28435, 29702, 26446, 37324, 40100, 31036, 33673, 33620, 21519, + 26647, 20029, 21385, 21169, 30782, 21382, 21033, 20616, 20363, 20432, + 32598, 32601, 32603, 32604, 32605, 32606, 32608, 32611, 32612, 32613, + 32614, 32615, 32619, 32620, 32621, 32623, 32624, 32627, 32629, 32630, + 32631, 32632, 32634, 32635, 32636, 32637, 32639, 32640, 32642, 32643, + 32644, 32645, 32646, 32647, 32648, 32649, 32651, 32653, 32655, 32656, + 32657, 32658, 32659, 32661, 32662, 32663, 32664, 32665, 32667, 32668, + 32672, 32674, 32675, 32677, 32678, 32680, 32681, 32682, 32683, 32684, + 32685, 32686, 32689, 32691, 32692, 32693, 32694, 32695, 32698, 32699, + 32702, 32704, 32706, 32707, 32708, 32710, 32711, 32712, 32713, 32715, + 32717, 32719, 32720, 32721, 32722, 32723, 32726, 32727, 32729, 32730, + 32731, 32732, 32733, 32734, 32738, 32739, 30178, 31435, 31890, 27813, + 38582, 21147, 29827, 21737, 20457, 32852, 33714, 36830, 38256, 24265, + 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, 32451, 31918, + 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, 20142, 35845, + 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, 20102, 25730, + 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, 29747, 26519, + 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, 21533, 25294, + 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, 28789, 38517, + 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, 39311, 30041, + 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, 31548, 31423, + 32740, 32743, 32744, 32746, 32747, 32748, 32749, 32751, 32754, 32756, + 32757, 32758, 32759, 32760, 32761, 32762, 32765, 32766, 32767, 32770, + 32775, 32776, 32777, 32778, 32782, 32783, 32785, 32787, 32794, 32795, + 32797, 32798, 32799, 32801, 32803, 32804, 32811, 32812, 32813, 32814, + 32815, 32816, 32818, 32820, 32825, 32826, 32828, 32830, 32832, 32833, + 32836, 32837, 32839, 32840, 32841, 32846, 32847, 32848, 32849, 32851, + 32853, 32854, 32855, 32857, 32859, 32860, 32861, 32862, 32863, 32864, + 32865, 32866, 32867, 32868, 32869, 32870, 32871, 32872, 32875, 32876, + 32877, 32878, 32879, 32880, 32882, 32883, 32884, 32885, 32886, 32887, + 32888, 32889, 32890, 32891, 32892, 32893, 38534, 22404, 25314, 38471, + 27004, 23044, 25602, 31699, 28431, 38475, 33446, 21346, 39045, 24208, + 28809, 25523, 21348, 34383, 40065, 40595, 30860, 38706, 36335, 36162, + 40575, 28510, 31108, 24405, 38470, 25134, 39540, 21525, 38109, 20387, + 26053, 23653, 23649, 32533, 34385, 27695, 24459, 29575, 28388, 32511, + 23782, 25371, 23402, 28390, 21365, 20081, 25504, 30053, 25249, 36718, + 20262, 20177, 27814, 32438, 35770, 33821, 34746, 32599, 36923, 38179, + 31657, 39585, 35064, 33853, 27931, 39558, 32476, 22920, 40635, 29595, + 30721, 34434, 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, + 36808, 33033, 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, + 32894, 32897, 32898, 32901, 32904, 32906, 32909, 32910, 32911, 32912, + 32913, 32914, 32916, 32917, 32919, 32921, 32926, 32931, 32934, 32935, + 32936, 32940, 32944, 32947, 32949, 32950, 32952, 32953, 32955, 32965, + 32967, 32968, 32969, 32970, 32971, 32975, 32976, 32977, 32978, 32979, + 32980, 32981, 32984, 32991, 32992, 32994, 32995, 32998, 33006, 33013, + 33015, 33017, 33019, 33022, 33023, 33024, 33025, 33027, 33028, 33029, + 33031, 33032, 33035, 33036, 33045, 33047, 33049, 33051, 33052, 33053, + 33055, 33056, 33057, 33058, 33059, 33060, 33061, 33062, 33063, 33064, + 33065, 33066, 33067, 33069, 33070, 33072, 33075, 33076, 33077, 33079, + 33081, 33082, 33083, 33084, 33085, 33087, 35881, 33426, 33579, 30450, + 27667, 24537, 33725, 29483, 33541, 38170, 27611, 30683, 38086, 21359, + 33538, 20882, 24125, 35980, 36152, 20040, 29611, 26522, 26757, 37238, + 38665, 29028, 27809, 30473, 23186, 38209, 27599, 32654, 26151, 23504, + 22969, 23194, 38376, 38391, 20204, 33804, 33945, 27308, 30431, 38192, + 29467, 26790, 23391, 30511, 37274, 38753, 31964, 36855, 35868, 24357, + 31859, 31192, 35269, 27852, 34588, 23494, 24130, 26825, 30496, 32501, + 20885, 20813, 21193, 23081, 32517, 38754, 33495, 25551, 30596, 34256, + 31186, 28218, 24217, 22937, 34065, 28781, 27665, 25279, 30399, 25935, + 24751, 38397, 26126, 34719, 40483, 38125, 21517, 21629, 35884, 25720, + 33088, 33089, 33090, 33091, 33092, 33093, 33095, 33097, 33101, 33102, + 33103, 33106, 33110, 33111, 33112, 33115, 33116, 33117, 33118, 33119, + 33121, 33122, 33123, 33124, 33126, 33128, 33130, 33131, 33132, 33135, + 33138, 33139, 33141, 33142, 33143, 33144, 33153, 33155, 33156, 33157, + 33158, 33159, 33161, 33163, 33164, 33165, 33166, 33168, 33170, 33171, + 33172, 33173, 33174, 33175, 33177, 33178, 33182, 33183, 33184, 33185, + 33186, 33188, 33189, 33191, 33193, 33195, 33196, 33197, 33198, 33199, + 33200, 33201, 33202, 33204, 33205, 33206, 33207, 33208, 33209, 33212, + 33213, 33214, 33215, 33220, 33221, 33223, 33224, 33225, 33227, 33229, + 33230, 33231, 33232, 33233, 33234, 33235, 25721, 34321, 27169, 33180, + 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, 28448, + 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, 27597, + 22675, 26286, 24149, 21215, 24917, 26408, 30446, 30566, 29287, 31302, + 25343, 21738, 21584, 38048, 37027, 23068, 32435, 27670, 20035, 22902, + 32784, 22856, 21335, 30007, 38590, 22218, 25376, 33041, 24700, 38393, + 28118, 21602, 39297, 20869, 23273, 33021, 22958, 38675, 20522, 27877, + 23612, 25311, 20320, 21311, 33147, 36870, 28346, 34091, 25288, 24180, + 30910, 25781, 25467, 24565, 23064, 37247, 40479, 23615, 25423, 32834, + 23421, 21870, 38218, 38221, 28037, 24744, 26592, 29406, 20957, 23425, + 33236, 33237, 33238, 33239, 33240, 33241, 33242, 33243, 33244, 33245, + 33246, 33247, 33248, 33249, 33250, 33252, 33253, 33254, 33256, 33257, + 33259, 33262, 33263, 33264, 33265, 33266, 33269, 33270, 33271, 33272, + 33273, 33274, 33277, 33279, 33283, 33287, 33288, 33289, 33290, 33291, + 33294, 33295, 33297, 33299, 33301, 33302, 33303, 33304, 33305, 33306, + 33309, 33312, 33316, 33317, 33318, 33319, 33321, 33326, 33330, 33338, + 33340, 33341, 33343, 33344, 33345, 33346, 33347, 33349, 33350, 33352, + 33354, 33356, 33357, 33358, 33360, 33361, 33362, 33363, 33364, 33365, + 33366, 33367, 33369, 33371, 33372, 33373, 33374, 33376, 33377, 33378, + 33379, 33380, 33381, 33382, 33383, 33385, 25319, 27870, 29275, 25197, + 38062, 32445, 33043, 27987, 20892, 24324, 22900, 21162, 24594, 22899, + 26262, 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, + 27572, 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, + 29750, 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, + 30928, 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, + 25243, 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, + 35060, 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, + 28921, 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, + 25447, 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, + 33386, 33387, 33388, 33389, 33393, 33397, 33398, 33399, 33400, 33403, + 33404, 33408, 33409, 33411, 33413, 33414, 33415, 33417, 33420, 33424, + 33427, 33428, 33429, 33430, 33434, 33435, 33438, 33440, 33442, 33443, + 33447, 33458, 33461, 33462, 33466, 33467, 33468, 33471, 33472, 33474, + 33475, 33477, 33478, 33481, 33488, 33494, 33497, 33498, 33501, 33506, + 33511, 33512, 33513, 33514, 33516, 33517, 33518, 33520, 33522, 33523, + 33525, 33526, 33528, 33530, 33532, 33533, 33534, 33535, 33536, 33546, + 33547, 33549, 33552, 33554, 33555, 33558, 33560, 33561, 33565, 33566, + 33567, 33568, 33569, 33570, 33571, 33572, 33573, 33574, 33577, 33578, + 33582, 33584, 33586, 33591, 33595, 33597, 21860, 33086, 30130, 30382, + 21305, 30174, 20731, 23617, 35692, 31687, 20559, 29255, 39575, 39128, + 28418, 29922, 31080, 25735, 30629, 25340, 39057, 36139, 21697, 32856, + 20050, 22378, 33529, 33805, 24179, 20973, 29942, 35780, 23631, 22369, + 27900, 39047, 23110, 30772, 39748, 36843, 31893, 21078, 25169, 38138, + 20166, 33670, 33889, 33769, 33970, 22484, 26420, 22275, 26222, 28006, + 35889, 26333, 28689, 26399, 27450, 26646, 25114, 22971, 19971, 20932, + 28422, 26578, 27791, 20854, 26827, 22855, 27495, 30054, 23822, 33040, + 40784, 26071, 31048, 31041, 39569, 36215, 23682, 20062, 20225, 21551, + 22865, 30732, 22120, 27668, 36804, 24323, 27773, 27875, 35755, 25488, + 33598, 33599, 33601, 33602, 33604, 33605, 33608, 33610, 33611, 33612, + 33613, 33614, 33619, 33621, 33622, 33623, 33624, 33625, 33629, 33634, + 33648, 33649, 33650, 33651, 33652, 33653, 33654, 33657, 33658, 33662, + 33663, 33664, 33665, 33666, 33667, 33668, 33671, 33672, 33674, 33675, + 33676, 33677, 33679, 33680, 33681, 33684, 33685, 33686, 33687, 33689, + 33690, 33693, 33695, 33697, 33698, 33699, 33700, 33701, 33702, 33703, + 33708, 33709, 33710, 33711, 33717, 33723, 33726, 33727, 33730, 33731, + 33732, 33734, 33736, 33737, 33739, 33741, 33742, 33744, 33745, 33746, + 33747, 33749, 33751, 33753, 33754, 33755, 33758, 33762, 33763, 33764, + 33766, 33767, 33768, 33771, 33772, 33773, 24688, 27965, 29301, 25190, + 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, + 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, 27424, 27465, + 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, 38201, + 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, 32728, + 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, 20405, + 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, 38738, + 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, 39031, + 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, 22234, + 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, 28192, + 33774, 33775, 33779, 33780, 33781, 33782, 33783, 33786, 33787, 33788, + 33790, 33791, 33792, 33794, 33797, 33799, 33800, 33801, 33802, 33808, + 33810, 33811, 33812, 33813, 33814, 33815, 33817, 33818, 33819, 33822, + 33823, 33824, 33825, 33826, 33827, 33833, 33834, 33835, 33836, 33837, + 33838, 33839, 33840, 33842, 33843, 33844, 33845, 33846, 33847, 33849, + 33850, 33851, 33854, 33855, 33856, 33857, 33858, 33859, 33860, 33861, + 33863, 33864, 33865, 33866, 33867, 33868, 33869, 33870, 33871, 33872, + 33874, 33875, 33876, 33877, 33878, 33880, 33885, 33886, 33887, 33888, + 33890, 33892, 33893, 33894, 33895, 33896, 33898, 33902, 33903, 33904, + 33906, 33908, 33911, 33913, 33915, 33916, 21462, 23094, 40843, 36259, + 21435, 22280, 39079, 26435, 37275, 27849, 20840, 30154, 25331, 29356, + 21048, 21149, 32570, 28820, 30264, 21364, 40522, 27063, 30830, 38592, + 35033, 32676, 28982, 29123, 20873, 26579, 29924, 22756, 25880, 22199, + 35753, 39286, 25200, 32469, 24825, 28909, 22764, 20161, 20154, 24525, + 38887, 20219, 35748, 20995, 22922, 32427, 25172, 20173, 26085, 25102, + 33592, 33993, 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, + 26580, 32905, 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, + 20837, 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, 33509, + 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, 21441, + 33917, 33918, 33919, 33920, 33921, 33923, 33924, 33925, 33926, 33930, + 33933, 33935, 33936, 33937, 33938, 33939, 33940, 33941, 33942, 33944, + 33946, 33947, 33949, 33950, 33951, 33952, 33954, 33955, 33956, 33957, + 33958, 33959, 33960, 33961, 33962, 33963, 33964, 33965, 33966, 33968, + 33969, 33971, 33973, 33974, 33975, 33979, 33980, 33982, 33984, 33986, + 33987, 33989, 33990, 33991, 33992, 33995, 33996, 33998, 33999, 34002, + 34004, 34005, 34007, 34008, 34009, 34010, 34011, 34012, 34014, 34017, + 34018, 34020, 34023, 34024, 34025, 34026, 34027, 34029, 34030, 34031, + 34033, 34034, 34035, 34036, 34037, 34038, 34039, 34040, 34041, 34042, + 34043, 34045, 34046, 34048, 34049, 34050, 20254, 25955, 26705, 21971, + 20007, 25620, 39578, 25195, 23234, 29791, 33394, 28073, 26862, 20711, + 33678, 30722, 26432, 21049, 27801, 32433, 20667, 21861, 29022, 31579, + 26194, 29642, 33515, 26441, 23665, 21024, 29053, 34923, 38378, 38485, + 25797, 36193, 33203, 21892, 27733, 25159, 32558, 22674, 20260, 21830, + 36175, 26188, 19978, 23578, 35059, 26786, 25422, 31245, 28903, 33421, + 21242, 38902, 23569, 21736, 37045, 32461, 22882, 36170, 34503, 33292, + 33293, 36198, 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, + 21627, 20280, 36523, 28145, 23072, 32453, 31070, 27784, 23457, 23158, + 29978, 32958, 24910, 28183, 22768, 29983, 29989, 29298, 21319, 32499, + 34051, 34052, 34053, 34054, 34055, 34056, 34057, 34058, 34059, 34061, + 34062, 34063, 34064, 34066, 34068, 34069, 34070, 34072, 34073, 34075, + 34076, 34077, 34078, 34080, 34082, 34083, 34084, 34085, 34086, 34087, + 34088, 34089, 34090, 34093, 34094, 34095, 34096, 34097, 34098, 34099, + 34100, 34101, 34102, 34110, 34111, 34112, 34113, 34114, 34116, 34117, + 34118, 34119, 34123, 34124, 34125, 34126, 34127, 34128, 34129, 34130, + 34131, 34132, 34133, 34135, 34136, 34138, 34139, 34140, 34141, 34143, + 34144, 34145, 34146, 34147, 34149, 34150, 34151, 34153, 34154, 34155, + 34156, 34157, 34158, 34159, 34160, 34161, 34163, 34165, 34166, 34167, + 34168, 34172, 34173, 34175, 34176, 34177, 30465, 30427, 21097, 32988, + 22307, 24072, 22833, 29422, 26045, 28287, 35799, 23608, 34417, 21313, + 30707, 25342, 26102, 20160, 39135, 34432, 23454, 35782, 21490, 30690, + 20351, 23630, 39542, 22987, 24335, 31034, 22763, 19990, 26623, 20107, + 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, 20365, + 37322, 39280, 27663, 24066, 24643, 23460, 35270, 35797, 25910, 25163, + 39318, 23432, 23551, 25480, 21806, 21463, 30246, 20861, 34092, 26530, + 26803, 27530, 25234, 36755, 21460, 33298, 28113, 30095, 20070, 36174, + 23408, 29087, 34223, 26257, 26329, 32626, 34560, 40653, 40736, 23646, + 26415, 36848, 26641, 26463, 25101, 31446, 22661, 24246, 25968, 28465, + 34178, 34179, 34182, 34184, 34185, 34186, 34187, 34188, 34189, 34190, + 34192, 34193, 34194, 34195, 34196, 34197, 34198, 34199, 34200, 34201, + 34202, 34205, 34206, 34207, 34208, 34209, 34210, 34211, 34213, 34214, + 34215, 34217, 34219, 34220, 34221, 34225, 34226, 34227, 34228, 34229, + 34230, 34232, 34234, 34235, 34236, 34237, 34238, 34239, 34240, 34242, + 34243, 34244, 34245, 34246, 34247, 34248, 34250, 34251, 34252, 34253, + 34254, 34257, 34258, 34260, 34262, 34263, 34264, 34265, 34266, 34267, + 34269, 34270, 34271, 34272, 34273, 34274, 34275, 34277, 34278, 34279, + 34280, 34282, 34283, 34284, 34285, 34286, 34287, 34288, 34289, 34290, + 34291, 34292, 34293, 34294, 34295, 34296, 24661, 21047, 32781, 25684, + 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, 27700, + 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, 26388, 28865, + 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, 32902, 23546, + 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, 24578, 39042, + 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, 33487, 37221, + 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, 35785, 32899, + 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, 30862, 23681, + 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, 26797, 21766, + 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, 22905, 22612, + 34297, 34298, 34300, 34301, 34302, 34304, 34305, 34306, 34307, 34308, + 34310, 34311, 34312, 34313, 34314, 34315, 34316, 34317, 34318, 34319, + 34320, 34322, 34323, 34324, 34325, 34327, 34328, 34329, 34330, 34331, + 34332, 34333, 34334, 34335, 34336, 34337, 34338, 34339, 34340, 34341, + 34342, 34344, 34346, 34347, 34348, 34349, 34350, 34351, 34352, 34353, + 34354, 34355, 34356, 34357, 34358, 34359, 34361, 34362, 34363, 34365, + 34366, 34367, 34368, 34369, 34370, 34371, 34372, 34373, 34374, 34375, + 34376, 34377, 34378, 34379, 34380, 34386, 34387, 34389, 34390, 34391, + 34392, 34393, 34395, 34396, 34397, 34399, 34400, 34401, 34403, 34404, + 34405, 34406, 34407, 34408, 34409, 34410, 29549, 25374, 36427, 36367, + 32974, 33492, 25260, 21488, 27888, 37214, 22826, 24577, 27760, 22349, + 25674, 36138, 30251, 28393, 22363, 27264, 30192, 28525, 35885, 35848, + 22374, 27631, 34962, 30899, 25506, 21497, 28845, 27748, 22616, 25642, + 22530, 26848, 33179, 21776, 31958, 20504, 36538, 28108, 36255, 28907, + 25487, 28059, 28372, 32486, 33796, 26691, 36867, 28120, 38518, 35752, + 22871, 29305, 34276, 33150, 30140, 35466, 26799, 21076, 36386, 38161, + 25552, 39064, 36420, 21884, 20307, 26367, 22159, 24789, 28053, 21059, + 23625, 22825, 28155, 22635, 30000, 29980, 24684, 33300, 33094, 25361, + 26465, 36834, 30522, 36339, 36148, 38081, 24086, 21381, 21548, 28867, + 34413, 34415, 34416, 34418, 34419, 34420, 34421, 34422, 34423, 34424, + 34435, 34436, 34437, 34438, 34439, 34440, 34441, 34446, 34447, 34448, + 34449, 34450, 34452, 34454, 34455, 34456, 34457, 34458, 34459, 34462, + 34463, 34464, 34465, 34466, 34469, 34470, 34475, 34477, 34478, 34482, + 34483, 34487, 34488, 34489, 34491, 34492, 34493, 34494, 34495, 34497, + 34498, 34499, 34501, 34504, 34508, 34509, 34514, 34515, 34517, 34518, + 34519, 34522, 34524, 34525, 34528, 34529, 34530, 34531, 34533, 34534, + 34535, 34536, 34538, 34539, 34540, 34543, 34549, 34550, 34551, 34554, + 34555, 34556, 34557, 34559, 34561, 34564, 34565, 34566, 34571, 34572, + 34574, 34575, 34576, 34577, 34580, 34582, 27712, 24311, 20572, 20141, + 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, 24420, + 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, 36879, + 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, 22303, 21520, + 20820, 28237, 22242, 25512, 39059, 33151, 34581, 35114, 36864, 21534, + 23663, 33216, 25302, 25176, 33073, 40501, 38464, 39534, 39548, 26925, + 22949, 25299, 21822, 25366, 21703, 34521, 27964, 23043, 29926, 34972, + 27498, 22806, 35916, 24367, 28286, 29609, 39037, 20024, 28919, 23436, + 30871, 25405, 26202, 30358, 24779, 23451, 23113, 19975, 33109, 27754, + 29579, 20129, 26505, 32593, 24448, 26106, 26395, 24536, 22916, 23041, + 34585, 34587, 34589, 34591, 34592, 34596, 34598, 34599, 34600, 34602, + 34603, 34604, 34605, 34607, 34608, 34610, 34611, 34613, 34614, 34616, + 34617, 34618, 34620, 34621, 34624, 34625, 34626, 34627, 34628, 34629, + 34630, 34634, 34635, 34637, 34639, 34640, 34641, 34642, 34644, 34645, + 34646, 34648, 34650, 34651, 34652, 34653, 34654, 34655, 34657, 34658, + 34662, 34663, 34664, 34665, 34666, 34667, 34668, 34669, 34671, 34673, + 34674, 34675, 34677, 34679, 34680, 34681, 34682, 34687, 34688, 34689, + 34692, 34694, 34695, 34697, 34698, 34700, 34702, 34703, 34704, 34705, + 34706, 34708, 34709, 34710, 34712, 34713, 34714, 34715, 34716, 34717, + 34718, 34720, 34721, 34722, 34723, 34724, 24013, 24494, 21361, 38886, + 36829, 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, + 22996, 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, + 21890, 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, + 34442, 25991, 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, + 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, + 24043, 21596, 38056, 20044, 27745, 35820, 23627, 26080, 33436, 26791, + 21566, 21556, 27595, 27494, 20116, 25410, 21320, 33310, 20237, 20398, + 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, 35823, 26132, + 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, 38177, 29306, + 34725, 34726, 34727, 34729, 34730, 34734, 34736, 34737, 34738, 34740, + 34742, 34743, 34744, 34745, 34747, 34748, 34750, 34751, 34753, 34754, + 34755, 34756, 34757, 34759, 34760, 34761, 34764, 34765, 34766, 34767, + 34768, 34772, 34773, 34774, 34775, 34776, 34777, 34778, 34780, 34781, + 34782, 34783, 34785, 34786, 34787, 34788, 34790, 34791, 34792, 34793, + 34795, 34796, 34797, 34799, 34800, 34801, 34802, 34803, 34804, 34805, + 34806, 34807, 34808, 34810, 34811, 34812, 34813, 34815, 34816, 34817, + 34818, 34820, 34821, 34822, 34823, 34824, 34825, 34827, 34828, 34829, + 34830, 34831, 34832, 34833, 34834, 34836, 34839, 34840, 34841, 34842, + 34844, 34845, 34846, 34847, 34848, 34851, 31232, 24687, 24076, 24713, + 33181, 22805, 24796, 29060, 28911, 28330, 27728, 29312, 27268, 34989, + 24109, 20064, 23219, 21916, 38115, 27927, 31995, 38553, 25103, 32454, + 30606, 34430, 21283, 38686, 36758, 26247, 23777, 20384, 29421, 19979, + 21414, 22799, 21523, 25472, 38184, 20808, 20185, 40092, 32420, 21688, + 36132, 34900, 33335, 38386, 28046, 24358, 23244, 26174, 38505, 29616, + 29486, 21439, 33146, 39301, 32673, 23466, 38519, 38480, 32447, 30456, + 21410, 38262, 39321, 31665, 35140, 28248, 20065, 32724, 31077, 35814, + 24819, 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, + 30813, 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, + 34852, 34853, 34854, 34855, 34856, 34857, 34858, 34859, 34860, 34861, + 34862, 34863, 34864, 34865, 34867, 34868, 34869, 34870, 34871, 34872, + 34874, 34875, 34877, 34878, 34879, 34881, 34882, 34883, 34886, 34887, + 34888, 34889, 34890, 34891, 34894, 34895, 34896, 34897, 34898, 34899, + 34901, 34902, 34904, 34906, 34907, 34908, 34909, 34910, 34911, 34912, + 34918, 34919, 34922, 34925, 34927, 34929, 34931, 34932, 34933, 34934, + 34936, 34937, 34938, 34939, 34940, 34944, 34947, 34950, 34951, 34953, + 34954, 34956, 34958, 34959, 34960, 34961, 34963, 34964, 34965, 34967, + 34968, 34969, 34970, 34971, 34973, 34974, 34975, 34976, 34977, 34979, + 34981, 34982, 34983, 34984, 34985, 34986, 23567, 23389, 26657, 32918, + 21880, 31505, 25928, 26964, 20123, 27463, 34638, 38795, 21327, 25375, + 25658, 37034, 26012, 32961, 35856, 20889, 26800, 21368, 34809, 25032, + 27844, 27899, 35874, 23633, 34218, 33455, 38156, 27427, 36763, 26032, + 24571, 24515, 20449, 34885, 26143, 33125, 29481, 24826, 20852, 21009, + 22411, 24418, 37026, 34892, 37266, 24184, 26447, 24615, 22995, 20804, + 20982, 33016, 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, + 21957, 38152, 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, + 39035, 24464, 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, + 32110, 23167, 32490, 32493, 36713, 21927, 23459, 24748, 26059, 29572, + 34988, 34990, 34991, 34992, 34994, 34995, 34996, 34997, 34998, 35000, + 35001, 35002, 35003, 35005, 35006, 35007, 35008, 35011, 35012, 35015, + 35016, 35018, 35019, 35020, 35021, 35023, 35024, 35025, 35027, 35030, + 35031, 35034, 35035, 35036, 35037, 35038, 35040, 35041, 35046, 35047, + 35049, 35050, 35051, 35052, 35053, 35054, 35055, 35058, 35061, 35062, + 35063, 35066, 35067, 35069, 35071, 35072, 35073, 35075, 35076, 35077, + 35078, 35079, 35080, 35081, 35083, 35084, 35085, 35086, 35087, 35089, + 35092, 35093, 35094, 35095, 35096, 35100, 35101, 35102, 35103, 35104, + 35106, 35107, 35108, 35110, 35111, 35112, 35113, 35116, 35117, 35118, + 35119, 35121, 35122, 35123, 35125, 35127, 36873, 30307, 30505, 32474, + 38772, 34203, 23398, 31348, 38634, 34880, 21195, 29071, 24490, 26092, + 35810, 23547, 39535, 24033, 27529, 27739, 35757, 35759, 36874, 36805, + 21387, 25276, 40486, 40493, 21568, 20011, 33469, 29273, 34460, 23830, + 34905, 28079, 38597, 21713, 20122, 35766, 28937, 21693, 38409, 28895, + 28153, 30416, 20005, 30740, 34578, 23721, 24310, 35328, 39068, 38414, + 28814, 27839, 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, + 21388, 30746, 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, + 22830, 40495, 31207, 26472, 25196, 20335, 30113, 32650, 27915, 38451, + 27687, 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, + 35128, 35129, 35130, 35131, 35132, 35133, 35134, 35135, 35136, 35138, + 35139, 35141, 35142, 35143, 35144, 35145, 35146, 35147, 35148, 35149, + 35150, 35151, 35152, 35153, 35154, 35155, 35156, 35157, 35158, 35159, + 35160, 35161, 35162, 35163, 35164, 35165, 35168, 35169, 35170, 35171, + 35172, 35173, 35175, 35176, 35177, 35178, 35179, 35180, 35181, 35182, + 35183, 35184, 35185, 35186, 35187, 35188, 35189, 35190, 35191, 35192, + 35193, 35194, 35196, 35197, 35198, 35200, 35202, 35204, 35205, 35207, + 35208, 35209, 35210, 35211, 35212, 35213, 35214, 35215, 35216, 35217, + 35218, 35219, 35220, 35221, 35222, 35223, 35224, 35225, 35226, 35227, + 35228, 35229, 35230, 35231, 35232, 35233, 25671, 23591, 36965, 31377, + 35875, 23002, 21676, 33280, 33647, 35201, 32768, 26928, 22094, 32822, + 29239, 37326, 20918, 20063, 39029, 25494, 19994, 21494, 26355, 33099, + 22812, 28082, 19968, 22777, 21307, 25558, 38129, 20381, 20234, 34915, + 39056, 22839, 36951, 31227, 20202, 33008, 30097, 27778, 23452, 23016, + 24413, 26885, 34433, 20506, 24050, 20057, 30691, 20197, 33402, 25233, + 26131, 37009, 23673, 20159, 24441, 33222, 36920, 32900, 30123, 20134, + 35028, 24847, 27589, 24518, 20041, 30410, 28322, 35811, 35758, 35850, + 35793, 24322, 32764, 32716, 32462, 33589, 33643, 22240, 27575, 38899, + 38452, 23035, 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, + 35234, 35235, 35236, 35237, 35238, 35239, 35240, 35241, 35242, 35243, + 35244, 35245, 35246, 35247, 35248, 35249, 35250, 35251, 35252, 35253, + 35254, 35255, 35256, 35257, 35258, 35259, 35260, 35261, 35262, 35263, + 35264, 35267, 35277, 35283, 35284, 35285, 35287, 35288, 35289, 35291, + 35293, 35295, 35296, 35297, 35298, 35300, 35303, 35304, 35305, 35306, + 35308, 35309, 35310, 35312, 35313, 35314, 35316, 35317, 35318, 35319, + 35320, 35321, 35322, 35323, 35324, 35325, 35326, 35327, 35329, 35330, + 35331, 35332, 35333, 35334, 35336, 35337, 35338, 35339, 35340, 35341, + 35342, 35343, 35344, 35345, 35346, 35347, 35348, 35349, 35350, 35351, + 35352, 35353, 35354, 35355, 35356, 35357, 21360, 33521, 27185, 23156, + 40560, 24212, 32552, 33721, 33828, 33829, 33639, 34631, 36814, 36194, + 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, 33219, 30152, + 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, 24703, 21191, + 29992, 24189, 20248, 24736, 24551, 23588, 30001, 37038, 38080, 29369, + 27833, 28216, 37193, 26377, 21451, 21491, 20305, 37321, 35825, 21448, + 24188, 36802, 28132, 20110, 30402, 27014, 34398, 24858, 33286, 20313, + 20446, 36926, 40060, 24841, 28189, 28180, 38533, 20104, 23089, 38632, + 19982, 23679, 31161, 23431, 35821, 32701, 29577, 22495, 33419, 37057, + 21505, 36935, 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, + 35358, 35359, 35360, 35361, 35362, 35363, 35364, 35365, 35366, 35367, + 35368, 35369, 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377, + 35378, 35379, 35380, 35381, 35382, 35383, 35384, 35385, 35386, 35387, + 35388, 35389, 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398, + 35399, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35408, 35409, + 35410, 35411, 35412, 35413, 35414, 35415, 35416, 35417, 35418, 35419, + 35420, 35421, 35422, 35423, 35424, 35425, 35426, 35427, 35428, 35429, + 35430, 35431, 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439, + 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35450, + 35451, 35452, 35453, 35454, 35455, 35456, 28020, 23507, 35029, 39044, + 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, 21407, 25588, + 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, 33489, 24895, + 24616, 38498, 26352, 32422, 36234, 36291, 38053, 23731, 31908, 26376, + 24742, 38405, 32792, 20113, 37095, 21248, 38504, 20801, 36816, 34164, + 37213, 26197, 38901, 23381, 21277, 30776, 26434, 26685, 21705, 28798, + 23472, 36733, 20877, 22312, 21681, 25874, 26242, 36190, 36163, 33039, + 33900, 36973, 31967, 20991, 34299, 26531, 26089, 28577, 34468, 36481, + 22122, 36896, 30338, 28790, 29157, 36131, 25321, 21017, 27901, 36156, + 24590, 22686, 24974, 26366, 36192, 25166, 21939, 28195, 26413, 36711, + 35457, 35458, 35459, 35460, 35461, 35462, 35463, 35464, 35467, 35468, + 35469, 35470, 35471, 35472, 35473, 35474, 35476, 35477, 35478, 35479, + 35480, 35481, 35482, 35483, 35484, 35485, 35486, 35487, 35488, 35489, + 35490, 35491, 35492, 35493, 35494, 35495, 35496, 35497, 35498, 35499, + 35500, 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508, 35509, + 35510, 35511, 35512, 35513, 35514, 35515, 35516, 35517, 35518, 35519, + 35520, 35521, 35522, 35523, 35524, 35525, 35526, 35527, 35528, 35529, + 35530, 35531, 35532, 35533, 35534, 35535, 35536, 35537, 35538, 35539, + 35540, 35541, 35542, 35543, 35544, 35545, 35546, 35547, 35548, 35549, + 35550, 35551, 35552, 35553, 35554, 35555, 38113, 38392, 30504, 26629, + 27048, 21643, 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, + 23528, 30651, 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, + 23637, 34360, 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, + 24432, 28467, 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, + 32960, 30260, 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, + 20806, 32903, 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, + 34071, 36825, 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, + 38024, 20390, 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, + 25379, 30529, 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, + 35556, 35557, 35558, 35559, 35560, 35561, 35562, 35563, 35564, 35565, + 35566, 35567, 35568, 35569, 35570, 35571, 35572, 35573, 35574, 35575, + 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35583, 35584, 35585, + 35586, 35587, 35588, 35589, 35590, 35592, 35593, 35594, 35595, 35596, + 35597, 35598, 35599, 35600, 35601, 35602, 35603, 35604, 35605, 35606, + 35607, 35608, 35609, 35610, 35611, 35612, 35613, 35614, 35615, 35616, + 35617, 35618, 35619, 35620, 35621, 35623, 35624, 35625, 35626, 35627, + 35628, 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636, 35637, + 35638, 35639, 35640, 35641, 35642, 35643, 35644, 35645, 35646, 35647, + 35648, 35649, 35650, 35651, 35652, 35653, 24103, 30151, 37073, 35777, + 33437, 26525, 25903, 21553, 34584, 30693, 32930, 33026, 27713, 20043, + 32455, 32844, 30452, 26893, 27542, 25191, 20540, 20356, 22336, 25351, + 27490, 36286, 21482, 26088, 32440, 24535, 25370, 25527, 33267, 33268, + 32622, 24092, 23769, 21046, 26234, 31209, 31258, 36136, 28825, 30164, + 28382, 27835, 31378, 20013, 30405, 24544, 38047, 34935, 32456, 31181, + 32959, 37325, 20210, 20247, 33311, 21608, 24030, 27954, 35788, 31909, + 36724, 32920, 24090, 21650, 30385, 23449, 26172, 39588, 29664, 26666, + 34523, 26417, 29482, 35832, 35803, 36880, 31481, 28891, 29038, 25284, + 30633, 22065, 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, + 35654, 35655, 35656, 35657, 35658, 35659, 35660, 35661, 35662, 35663, + 35664, 35665, 35666, 35667, 35668, 35669, 35670, 35671, 35672, 35673, + 35674, 35675, 35676, 35677, 35678, 35679, 35680, 35681, 35682, 35683, + 35684, 35685, 35687, 35688, 35689, 35690, 35691, 35693, 35694, 35695, + 35696, 35697, 35698, 35699, 35700, 35701, 35702, 35703, 35704, 35705, + 35706, 35707, 35708, 35709, 35710, 35711, 35712, 35713, 35714, 35715, + 35716, 35717, 35718, 35719, 35720, 35721, 35722, 35723, 35724, 35725, + 35726, 35727, 35728, 35729, 35730, 35731, 35732, 35733, 35734, 35735, + 35736, 35737, 35738, 35739, 35740, 35741, 35742, 35743, 35756, 35761, + 35771, 35783, 35792, 35818, 35849, 35870, 20303, 27880, 31069, 39547, + 25235, 29226, 25341, 19987, 30742, 36716, 25776, 36186, 31686, 26729, + 24196, 35013, 22918, 25758, 22766, 29366, 26894, 38181, 36861, 36184, + 22368, 32512, 35846, 20934, 25417, 25305, 21331, 26700, 29730, 33537, + 37196, 21828, 30528, 28796, 27978, 20857, 21672, 36164, 23039, 28363, + 28100, 23388, 32043, 20180, 31869, 28371, 23376, 33258, 28173, 23383, + 39683, 26837, 36394, 23447, 32508, 24635, 32437, 37049, 36208, 22863, + 25549, 31199, 36275, 21330, 26063, 31062, 35781, 38459, 32452, 38075, + 32386, 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, + 26590, 20570, 20316, 22352, 24231, 59408, 59409, 59410, 59411, 59412, + 35896, 35897, 35898, 35899, 35900, 35901, 35902, 35903, 35904, 35906, + 35907, 35908, 35909, 35912, 35914, 35915, 35917, 35918, 35919, 35920, + 35921, 35922, 35923, 35924, 35926, 35927, 35928, 35929, 35931, 35932, + 35933, 35934, 35935, 35936, 35939, 35940, 35941, 35942, 35943, 35944, + 35945, 35948, 35949, 35950, 35951, 35952, 35953, 35954, 35956, 35957, + 35958, 35959, 35963, 35964, 35965, 35966, 35967, 35968, 35969, 35971, + 35972, 35974, 35975, 35976, 35979, 35981, 35982, 35983, 35984, 35985, + 35986, 35987, 35989, 35990, 35991, 35993, 35994, 35995, 35996, 35997, + 35998, 35999, 36000, 36001, 36002, 36003, 36004, 36005, 36006, 36007, + 36008, 36009, 36010, 36011, 36012, 36013, 20109, 19980, 20800, 19984, + 24319, 21317, 19989, 20120, 19998, 39730, 23404, 22121, 20008, 31162, + 20031, 21269, 20039, 22829, 29243, 21358, 27664, 22239, 32996, 39319, + 27603, 30590, 40727, 20022, 20127, 40720, 20060, 20073, 20115, 33416, + 23387, 21868, 22031, 20164, 21389, 21405, 21411, 21413, 21422, 38757, + 36189, 21274, 21493, 21286, 21294, 21310, 36188, 21350, 21347, 20994, + 21000, 21006, 21037, 21043, 21055, 21056, 21068, 21086, 21089, 21084, + 33967, 21117, 21122, 21121, 21136, 21139, 20866, 32596, 20155, 20163, + 20169, 20162, 20200, 20193, 20203, 20190, 20251, 20211, 20258, 20324, + 20213, 20261, 20263, 20233, 20267, 20318, 20327, 25912, 20314, 20317, + 36014, 36015, 36016, 36017, 36018, 36019, 36020, 36021, 36022, 36023, + 36024, 36025, 36026, 36027, 36028, 36029, 36030, 36031, 36032, 36033, + 36034, 36035, 36036, 36037, 36038, 36039, 36040, 36041, 36042, 36043, + 36044, 36045, 36046, 36047, 36048, 36049, 36050, 36051, 36052, 36053, + 36054, 36055, 36056, 36057, 36058, 36059, 36060, 36061, 36062, 36063, + 36064, 36065, 36066, 36067, 36068, 36069, 36070, 36071, 36072, 36073, + 36074, 36075, 36076, 36077, 36078, 36079, 36080, 36081, 36082, 36083, + 36084, 36085, 36086, 36087, 36088, 36089, 36090, 36091, 36092, 36093, + 36094, 36095, 36096, 36097, 36098, 36099, 36100, 36101, 36102, 36103, + 36104, 36105, 36106, 36107, 36108, 36109, 20319, 20311, 20274, 20285, + 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, 20348, + 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, 20433, + 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, 20478, + 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, 20588, + 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, 20710, + 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, 40864, 27718, + 31860, 20846, 24061, 40649, 39320, 20865, 22804, 21241, 21261, 35335, + 21264, 20971, 22809, 20821, 20128, 20822, 20147, 34926, 34980, 20149, + 33044, 35026, 31104, 23348, 34819, 32696, 20907, 20913, 20925, 20924, + 36110, 36111, 36112, 36113, 36114, 36115, 36116, 36117, 36118, 36119, + 36120, 36121, 36122, 36123, 36124, 36128, 36177, 36178, 36183, 36191, + 36197, 36200, 36201, 36202, 36204, 36206, 36207, 36209, 36210, 36216, + 36217, 36218, 36219, 36220, 36221, 36222, 36223, 36224, 36226, 36227, + 36230, 36231, 36232, 36233, 36236, 36237, 36238, 36239, 36240, 36242, + 36243, 36245, 36246, 36247, 36248, 36249, 36250, 36251, 36252, 36253, + 36254, 36256, 36257, 36258, 36260, 36261, 36262, 36263, 36264, 36265, + 36266, 36267, 36268, 36269, 36270, 36271, 36272, 36274, 36278, 36279, + 36281, 36283, 36285, 36288, 36289, 36290, 36293, 36295, 36296, 36297, + 36298, 36301, 36304, 36306, 36307, 36308, 20935, 20886, 20898, 20901, + 35744, 35750, 35751, 35754, 35764, 35765, 35767, 35778, 35779, 35787, + 35791, 35790, 35794, 35795, 35796, 35798, 35800, 35801, 35804, 35807, + 35808, 35812, 35816, 35817, 35822, 35824, 35827, 35830, 35833, 35836, + 35839, 35840, 35842, 35844, 35847, 35852, 35855, 35857, 35858, 35860, + 35861, 35862, 35865, 35867, 35864, 35869, 35871, 35872, 35873, 35877, + 35879, 35882, 35883, 35886, 35887, 35890, 35891, 35893, 35894, 21353, + 21370, 38429, 38434, 38433, 38449, 38442, 38461, 38460, 38466, 38473, + 38484, 38495, 38503, 38508, 38514, 38516, 38536, 38541, 38551, 38576, + 37015, 37019, 37021, 37017, 37036, 37025, 37044, 37043, 37046, 37050, + 36309, 36312, 36313, 36316, 36320, 36321, 36322, 36325, 36326, 36327, + 36329, 36333, 36334, 36336, 36337, 36338, 36340, 36342, 36348, 36350, + 36351, 36352, 36353, 36354, 36355, 36356, 36358, 36359, 36360, 36363, + 36365, 36366, 36368, 36369, 36370, 36371, 36373, 36374, 36375, 36376, + 36377, 36378, 36379, 36380, 36384, 36385, 36388, 36389, 36390, 36391, + 36392, 36395, 36397, 36400, 36402, 36403, 36404, 36406, 36407, 36408, + 36411, 36412, 36414, 36415, 36419, 36421, 36422, 36428, 36429, 36430, + 36431, 36432, 36435, 36436, 36437, 36438, 36439, 36440, 36442, 36443, + 36444, 36445, 36446, 36447, 36448, 36449, 36450, 36451, 36452, 36453, + 36455, 36456, 36458, 36459, 36462, 36465, 37048, 37040, 37071, 37061, + 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, 37083, + 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, 37177, + 37187, 37190, 21005, 22850, 21154, 21164, 21165, 21182, 21759, 21200, + 21206, 21232, 21471, 29166, 30669, 24308, 20981, 20988, 39727, 21430, + 24321, 30042, 24047, 22348, 22441, 22433, 22654, 22716, 22725, 22737, + 22313, 22316, 22314, 22323, 22329, 22318, 22319, 22364, 22331, 22338, + 22377, 22405, 22379, 22406, 22396, 22395, 22376, 22381, 22390, 22387, + 22445, 22436, 22412, 22450, 22479, 22439, 22452, 22419, 22432, 22485, + 22488, 22490, 22489, 22482, 22456, 22516, 22511, 22520, 22500, 22493, + 36467, 36469, 36471, 36472, 36473, 36474, 36475, 36477, 36478, 36480, + 36482, 36483, 36484, 36486, 36488, 36489, 36490, 36491, 36492, 36493, + 36494, 36497, 36498, 36499, 36501, 36502, 36503, 36504, 36505, 36506, + 36507, 36509, 36511, 36512, 36513, 36514, 36515, 36516, 36517, 36518, + 36519, 36520, 36521, 36522, 36525, 36526, 36528, 36529, 36531, 36532, + 36533, 36534, 36535, 36536, 36537, 36539, 36540, 36541, 36542, 36543, + 36544, 36545, 36546, 36547, 36548, 36549, 36550, 36551, 36552, 36553, + 36554, 36555, 36556, 36557, 36559, 36560, 36561, 36562, 36563, 36564, + 36565, 36566, 36567, 36568, 36569, 36570, 36571, 36572, 36573, 36574, + 36575, 36576, 36577, 36578, 36579, 36580, 22539, 22541, 22525, 22509, + 22528, 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, + 22656, 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, + 33412, 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, + 33482, 33507, 33432, 33463, 33454, 33483, 33484, 33473, 33449, 33460, + 33441, 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, + 33551, 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, + 33562, 33542, 33556, 33557, 33504, 33493, 33564, 33617, 33627, 33628, + 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, + 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, + 36581, 36582, 36583, 36584, 36585, 36586, 36587, 36588, 36589, 36590, + 36591, 36592, 36593, 36594, 36595, 36596, 36597, 36598, 36599, 36600, + 36601, 36602, 36603, 36604, 36605, 36606, 36607, 36608, 36609, 36610, + 36611, 36612, 36613, 36614, 36615, 36616, 36617, 36618, 36619, 36620, + 36621, 36622, 36623, 36624, 36625, 36626, 36627, 36628, 36629, 36630, + 36631, 36632, 36633, 36634, 36635, 36636, 36637, 36638, 36639, 36640, + 36641, 36642, 36643, 36644, 36645, 36646, 36647, 36648, 36649, 36650, + 36651, 36652, 36653, 36654, 36655, 36656, 36657, 36658, 36659, 36660, + 36661, 36662, 36663, 36664, 36665, 36666, 36667, 36668, 36669, 36670, + 36671, 36672, 36673, 36674, 36675, 36676, 33640, 33563, 33641, 33644, + 33642, 33645, 33646, 33712, 33656, 33715, 33716, 33696, 33706, 33683, + 33692, 33669, 33660, 33718, 33705, 33661, 33720, 33659, 33688, 33694, + 33704, 33722, 33724, 33729, 33793, 33765, 33752, 22535, 33816, 33803, + 33757, 33789, 33750, 33820, 33848, 33809, 33798, 33748, 33759, 33807, + 33795, 33784, 33785, 33770, 33733, 33728, 33830, 33776, 33761, 33884, + 33873, 33882, 33881, 33907, 33927, 33928, 33914, 33929, 33912, 33852, + 33862, 33897, 33910, 33932, 33934, 33841, 33901, 33985, 33997, 34000, + 34022, 33981, 34003, 33994, 33983, 33978, 34016, 33953, 33977, 33972, + 33943, 34021, 34019, 34060, 29965, 34104, 34032, 34105, 34079, 34106, + 36677, 36678, 36679, 36680, 36681, 36682, 36683, 36684, 36685, 36686, + 36687, 36688, 36689, 36690, 36691, 36692, 36693, 36694, 36695, 36696, + 36697, 36698, 36699, 36700, 36701, 36702, 36703, 36704, 36705, 36706, + 36707, 36708, 36709, 36714, 36736, 36748, 36754, 36765, 36768, 36769, + 36770, 36772, 36773, 36774, 36775, 36778, 36780, 36781, 36782, 36783, + 36786, 36787, 36788, 36789, 36791, 36792, 36794, 36795, 36796, 36799, + 36800, 36803, 36806, 36809, 36810, 36811, 36812, 36813, 36815, 36818, + 36822, 36823, 36826, 36832, 36833, 36835, 36839, 36844, 36847, 36849, + 36850, 36852, 36853, 36854, 36858, 36859, 36860, 36862, 36863, 36871, + 36872, 36876, 36878, 36883, 36885, 36888, 34134, 34107, 34047, 34044, + 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, + 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, + 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, + 24318, 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, 23586, + 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, 25306, 25303, + 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, 25457, 25466, + 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, 25586, 25592, + 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, 25669, 25665, + 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, 25709, 25750, + 36889, 36892, 36899, 36900, 36901, 36903, 36904, 36905, 36906, 36907, + 36908, 36912, 36913, 36914, 36915, 36916, 36919, 36921, 36922, 36925, + 36927, 36928, 36931, 36933, 36934, 36936, 36937, 36938, 36939, 36940, + 36942, 36948, 36949, 36950, 36953, 36954, 36956, 36957, 36958, 36959, + 36960, 36961, 36964, 36966, 36967, 36969, 36970, 36971, 36972, 36975, + 36976, 36977, 36978, 36979, 36982, 36983, 36984, 36985, 36986, 36987, + 36988, 36990, 36993, 36996, 36997, 36998, 36999, 37001, 37002, 37004, + 37005, 37006, 37007, 37008, 37010, 37012, 37014, 37016, 37018, 37020, + 37022, 37023, 37024, 37028, 37029, 37031, 37032, 37033, 37035, 37037, + 37042, 37047, 37052, 37053, 37055, 37056, 25722, 25783, 25784, 25753, + 25786, 25792, 25808, 25815, 25828, 25826, 25865, 25893, 25902, 24331, + 24530, 29977, 24337, 21343, 21489, 21501, 21481, 21480, 21499, 21522, + 21526, 21510, 21579, 21586, 21587, 21588, 21590, 21571, 21537, 21591, + 21593, 21539, 21554, 21634, 21652, 21623, 21617, 21604, 21658, 21659, + 21636, 21622, 21606, 21661, 21712, 21677, 21698, 21684, 21714, 21671, + 21670, 21715, 21716, 21618, 21667, 21717, 21691, 21695, 21708, 21721, + 21722, 21724, 21673, 21674, 21668, 21725, 21711, 21726, 21787, 21735, + 21792, 21757, 21780, 21747, 21794, 21795, 21775, 21777, 21799, 21802, + 21863, 21903, 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, + 37058, 37059, 37062, 37064, 37065, 37067, 37068, 37069, 37074, 37076, + 37077, 37078, 37080, 37081, 37082, 37086, 37087, 37088, 37091, 37092, + 37093, 37097, 37098, 37100, 37102, 37104, 37105, 37106, 37107, 37109, + 37110, 37111, 37113, 37114, 37115, 37116, 37119, 37120, 37121, 37123, + 37125, 37126, 37127, 37128, 37129, 37130, 37131, 37132, 37133, 37134, + 37135, 37136, 37137, 37138, 37139, 37140, 37141, 37142, 37143, 37144, + 37146, 37147, 37148, 37149, 37151, 37152, 37153, 37156, 37157, 37158, + 37159, 37160, 37161, 37162, 37163, 37164, 37165, 37166, 37168, 37170, + 37171, 37172, 37173, 37174, 37175, 37176, 37178, 37179, 37180, 37181, + 37182, 37183, 37184, 37185, 37186, 37188, 21815, 21846, 21877, 21878, + 21879, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, 21896, + 21889, 21919, 21886, 21974, 21905, 21883, 21983, 21949, 21950, 21908, + 21913, 21994, 22007, 21961, 22047, 21969, 21995, 21996, 21972, 21990, + 21981, 21956, 21999, 21989, 22002, 22003, 21964, 21965, 21992, 22005, + 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, 22014, 22016, + 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, 22105, 22108, + 22092, 22100, 22150, 22116, 22129, 22123, 22139, 22140, 22149, 22163, + 22191, 22228, 22231, 22237, 22241, 22261, 22251, 22265, 22271, 22276, + 22282, 22281, 22300, 24079, 24089, 24084, 24081, 24113, 24123, 24124, + 37189, 37191, 37192, 37201, 37203, 37204, 37205, 37206, 37208, 37209, + 37211, 37212, 37215, 37216, 37222, 37223, 37224, 37227, 37229, 37235, + 37242, 37243, 37244, 37248, 37249, 37250, 37251, 37252, 37254, 37256, + 37258, 37262, 37263, 37267, 37268, 37269, 37270, 37271, 37272, 37273, + 37276, 37277, 37278, 37279, 37280, 37281, 37284, 37285, 37286, 37287, + 37288, 37289, 37291, 37292, 37296, 37297, 37298, 37299, 37302, 37303, + 37304, 37305, 37307, 37308, 37309, 37310, 37311, 37312, 37313, 37314, + 37315, 37316, 37317, 37318, 37320, 37323, 37328, 37330, 37331, 37332, + 37333, 37334, 37335, 37336, 37337, 37338, 37339, 37341, 37342, 37343, + 37344, 37345, 37346, 37347, 37348, 37349, 24119, 24132, 24148, 24155, + 24158, 24161, 23692, 23674, 23693, 23696, 23702, 23688, 23704, 23705, + 23697, 23706, 23708, 23733, 23714, 23741, 23724, 23723, 23729, 23715, + 23745, 23735, 23748, 23762, 23780, 23755, 23781, 23810, 23811, 23847, + 23846, 23854, 23844, 23838, 23814, 23835, 23896, 23870, 23860, 23869, + 23916, 23899, 23919, 23901, 23915, 23883, 23882, 23913, 23924, 23938, + 23961, 23965, 35955, 23991, 24005, 24435, 24439, 24450, 24455, 24457, + 24460, 24469, 24473, 24476, 24488, 24493, 24501, 24508, 34914, 24417, + 29357, 29360, 29364, 29367, 29368, 29379, 29377, 29390, 29389, 29394, + 29416, 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, 29434, + 37350, 37351, 37352, 37353, 37354, 37355, 37356, 37357, 37358, 37359, + 37360, 37361, 37362, 37363, 37364, 37365, 37366, 37367, 37368, 37369, + 37370, 37371, 37372, 37373, 37374, 37375, 37376, 37377, 37378, 37379, + 37380, 37381, 37382, 37383, 37384, 37385, 37386, 37387, 37388, 37389, + 37390, 37391, 37392, 37393, 37394, 37395, 37396, 37397, 37398, 37399, + 37400, 37401, 37402, 37403, 37404, 37405, 37406, 37407, 37408, 37409, + 37410, 37411, 37412, 37413, 37414, 37415, 37416, 37417, 37418, 37419, + 37420, 37421, 37422, 37423, 37424, 37425, 37426, 37427, 37428, 37429, + 37430, 37431, 37432, 37433, 37434, 37435, 37436, 37437, 37438, 37439, + 37440, 37441, 37442, 37443, 37444, 37445, 29435, 29463, 29459, 29473, + 29450, 29470, 29469, 29461, 29474, 29497, 29477, 29484, 29496, 29489, + 29520, 29517, 29527, 29536, 29548, 29551, 29566, 33307, 22821, 39143, + 22820, 22786, 39267, 39271, 39272, 39273, 39274, 39275, 39276, 39284, + 39287, 39293, 39296, 39300, 39303, 39306, 39309, 39312, 39313, 39315, + 39316, 39317, 24192, 24209, 24203, 24214, 24229, 24224, 24249, 24245, + 24254, 24243, 36179, 24274, 24273, 24283, 24296, 24298, 33210, 24516, + 24521, 24534, 24527, 24579, 24558, 24580, 24545, 24548, 24574, 24581, + 24582, 24554, 24557, 24568, 24601, 24629, 24614, 24603, 24591, 24589, + 24617, 24619, 24586, 24639, 24609, 24696, 24697, 24699, 24698, 24642, + 37446, 37447, 37448, 37449, 37450, 37451, 37452, 37453, 37454, 37455, + 37456, 37457, 37458, 37459, 37460, 37461, 37462, 37463, 37464, 37465, + 37466, 37467, 37468, 37469, 37470, 37471, 37472, 37473, 37474, 37475, + 37476, 37477, 37478, 37479, 37480, 37481, 37482, 37483, 37484, 37485, + 37486, 37487, 37488, 37489, 37490, 37491, 37493, 37494, 37495, 37496, + 37497, 37498, 37499, 37500, 37501, 37502, 37503, 37504, 37505, 37506, + 37507, 37508, 37509, 37510, 37511, 37512, 37513, 37514, 37515, 37516, + 37517, 37519, 37520, 37521, 37522, 37523, 37524, 37525, 37526, 37527, + 37528, 37529, 37530, 37531, 37532, 37533, 37534, 37535, 37536, 37537, + 37538, 37539, 37540, 37541, 37542, 37543, 24682, 24701, 24726, 24730, + 24749, 24733, 24707, 24722, 24716, 24731, 24812, 24763, 24753, 24797, + 24792, 24774, 24794, 24756, 24864, 24870, 24853, 24867, 24820, 24832, + 24846, 24875, 24906, 24949, 25004, 24980, 24999, 25015, 25044, 25077, + 24541, 38579, 38377, 38379, 38385, 38387, 38389, 38390, 38396, 38398, + 38403, 38404, 38406, 38408, 38410, 38411, 38412, 38413, 38415, 38418, + 38421, 38422, 38423, 38425, 38426, 20012, 29247, 25109, 27701, 27732, + 27740, 27722, 27811, 27781, 27792, 27796, 27788, 27752, 27753, 27764, + 27766, 27782, 27817, 27856, 27860, 27821, 27895, 27896, 27889, 27863, + 27826, 27872, 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, + 37544, 37545, 37546, 37547, 37548, 37549, 37551, 37552, 37553, 37554, + 37555, 37556, 37557, 37558, 37559, 37560, 37561, 37562, 37563, 37564, + 37565, 37566, 37567, 37568, 37569, 37570, 37571, 37572, 37573, 37574, + 37575, 37577, 37578, 37579, 37580, 37581, 37582, 37583, 37584, 37585, + 37586, 37587, 37588, 37589, 37590, 37591, 37592, 37593, 37594, 37595, + 37596, 37597, 37598, 37599, 37600, 37601, 37602, 37603, 37604, 37605, + 37606, 37607, 37608, 37609, 37610, 37611, 37612, 37613, 37614, 37615, + 37616, 37617, 37618, 37619, 37620, 37621, 37622, 37623, 37624, 37625, + 37626, 37627, 37628, 37629, 37630, 37631, 37632, 37633, 37634, 37635, + 37636, 37637, 37638, 37639, 37640, 37641, 27961, 27943, 27916, 27971, + 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, 27957, 27930, + 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, 27998, 28051, + 28052, 27996, 28000, 28028, 28003, 28186, 28103, 28101, 28126, 28174, + 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, 28172, 28078, + 28203, 28270, 28238, 28267, 28338, 28255, 28294, 28243, 28244, 28210, + 28197, 28228, 28383, 28337, 28312, 28384, 28461, 28386, 28325, 28327, + 28349, 28347, 28343, 28375, 28340, 28367, 28303, 28354, 28319, 28514, + 28486, 28487, 28452, 28437, 28409, 28463, 28470, 28491, 28532, 28458, + 28425, 28457, 28553, 28557, 28556, 28536, 28530, 28540, 28538, 28625, + 37642, 37643, 37644, 37645, 37646, 37647, 37648, 37649, 37650, 37651, + 37652, 37653, 37654, 37655, 37656, 37657, 37658, 37659, 37660, 37661, + 37662, 37663, 37664, 37665, 37666, 37667, 37668, 37669, 37670, 37671, + 37672, 37673, 37674, 37675, 37676, 37677, 37678, 37679, 37680, 37681, + 37682, 37683, 37684, 37685, 37686, 37687, 37688, 37689, 37690, 37691, + 37692, 37693, 37695, 37696, 37697, 37698, 37699, 37700, 37701, 37702, + 37703, 37704, 37705, 37706, 37707, 37708, 37709, 37710, 37711, 37712, + 37713, 37714, 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722, + 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730, 37731, 37732, + 37733, 37734, 37735, 37736, 37737, 37739, 28617, 28583, 28601, 28598, + 28610, 28641, 28654, 28638, 28640, 28655, 28698, 28707, 28699, 28729, + 28725, 28751, 28766, 23424, 23428, 23445, 23443, 23461, 23480, 29999, + 39582, 25652, 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, + 36821, 36837, 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, + 36875, 36902, 36881, 36877, 36886, 36897, 36917, 36918, 36909, 36911, + 36932, 36945, 36946, 36944, 36968, 36952, 36962, 36955, 26297, 36980, + 36989, 36994, 37000, 36995, 37003, 24400, 24407, 24406, 24408, 23611, + 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, + 33396, 24380, 39739, 23662, 22913, 22915, 22925, 22953, 22954, 22947, + 37740, 37741, 37742, 37743, 37744, 37745, 37746, 37747, 37748, 37749, + 37750, 37751, 37752, 37753, 37754, 37755, 37756, 37757, 37758, 37759, + 37760, 37761, 37762, 37763, 37764, 37765, 37766, 37767, 37768, 37769, + 37770, 37771, 37772, 37773, 37774, 37776, 37777, 37778, 37779, 37780, + 37781, 37782, 37783, 37784, 37785, 37786, 37787, 37788, 37789, 37790, + 37791, 37792, 37793, 37794, 37795, 37796, 37797, 37798, 37799, 37800, + 37801, 37802, 37803, 37804, 37805, 37806, 37807, 37808, 37809, 37810, + 37811, 37812, 37813, 37814, 37815, 37816, 37817, 37818, 37819, 37820, + 37821, 37822, 37823, 37824, 37825, 37826, 37827, 37828, 37829, 37830, + 37831, 37832, 37833, 37835, 37836, 37837, 22935, 22986, 22955, 22942, + 22948, 22994, 22962, 22959, 22999, 22974, 23045, 23046, 23005, 23048, + 23011, 23000, 23033, 23052, 23049, 23090, 23092, 23057, 23075, 23059, + 23104, 23143, 23114, 23125, 23100, 23138, 23157, 33004, 23210, 23195, + 23159, 23162, 23230, 23275, 23218, 23250, 23252, 23224, 23264, 23267, + 23281, 23254, 23270, 23256, 23260, 23305, 23319, 23318, 23346, 23351, + 23360, 23573, 23580, 23386, 23397, 23411, 23377, 23379, 23394, 39541, + 39543, 39544, 39546, 39551, 39549, 39552, 39553, 39557, 39560, 39562, + 39568, 39570, 39571, 39574, 39576, 39579, 39580, 39581, 39583, 39584, + 39586, 39587, 39589, 39591, 32415, 32417, 32419, 32421, 32424, 32425, + 37838, 37839, 37840, 37841, 37842, 37843, 37844, 37845, 37847, 37848, + 37849, 37850, 37851, 37852, 37853, 37854, 37855, 37856, 37857, 37858, + 37859, 37860, 37861, 37862, 37863, 37864, 37865, 37866, 37867, 37868, + 37869, 37870, 37871, 37872, 37873, 37874, 37875, 37876, 37877, 37878, + 37879, 37880, 37881, 37882, 37883, 37884, 37885, 37886, 37887, 37888, + 37889, 37890, 37891, 37892, 37893, 37894, 37895, 37896, 37897, 37898, + 37899, 37900, 37901, 37902, 37903, 37904, 37905, 37906, 37907, 37908, + 37909, 37910, 37911, 37912, 37913, 37914, 37915, 37916, 37917, 37918, + 37919, 37920, 37921, 37922, 37923, 37924, 37925, 37926, 37927, 37928, + 37929, 37930, 37931, 37932, 37933, 37934, 32429, 32432, 32446, 32448, + 32449, 32450, 32457, 32459, 32460, 32464, 32468, 32471, 32475, 32480, + 32481, 32488, 32491, 32494, 32495, 32497, 32498, 32525, 32502, 32506, + 32507, 32510, 32513, 32514, 32515, 32519, 32520, 32523, 32524, 32527, + 32529, 32530, 32535, 32537, 32540, 32539, 32543, 32545, 32546, 32547, + 32548, 32549, 32550, 32551, 32554, 32555, 32556, 32557, 32559, 32560, + 32561, 32562, 32563, 32565, 24186, 30079, 24027, 30014, 37013, 29582, + 29585, 29614, 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, + 29641, 29640, 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, + 29682, 29711, 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, + 37935, 37936, 37937, 37938, 37939, 37940, 37941, 37942, 37943, 37944, + 37945, 37946, 37947, 37948, 37949, 37951, 37952, 37953, 37954, 37955, + 37956, 37957, 37958, 37959, 37960, 37961, 37962, 37963, 37964, 37965, + 37966, 37967, 37968, 37969, 37970, 37971, 37972, 37973, 37974, 37975, + 37976, 37977, 37978, 37979, 37980, 37981, 37982, 37983, 37984, 37985, + 37986, 37987, 37988, 37989, 37990, 37991, 37992, 37993, 37994, 37996, + 37997, 37998, 37999, 38000, 38001, 38002, 38003, 38004, 38005, 38006, + 38007, 38008, 38009, 38010, 38011, 38012, 38013, 38014, 38015, 38016, + 38017, 38018, 38019, 38020, 38033, 38038, 38040, 38087, 38095, 38099, + 38100, 38106, 38118, 38139, 38172, 38176, 29723, 29722, 29761, 29788, + 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, 29824, 29825, + 29831, 29835, 29854, 29864, 29865, 29840, 29863, 29906, 29882, 38890, + 38891, 38892, 26444, 26451, 26462, 26440, 26473, 26533, 26503, 26474, + 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, 26487, 26492, + 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, 26549, 26586, + 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, 26621, 26674, + 26675, 26720, 26721, 26702, 26722, 26692, 26724, 26755, 26653, 26709, + 26726, 26689, 26727, 26688, 26686, 26698, 26697, 26665, 26805, 26767, + 26740, 26743, 26771, 26731, 26818, 26990, 26876, 26911, 26912, 26873, + 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, + 38260, 38261, 38263, 38264, 38265, 38266, 38267, 38268, 38269, 38270, + 38272, 38273, 38274, 38275, 38276, 38277, 38278, 38279, 38280, 38281, + 38282, 38283, 38284, 38285, 38286, 38287, 38288, 38289, 38290, 38291, + 38292, 38293, 38294, 38295, 38296, 38297, 38298, 38299, 38300, 38301, + 38302, 38303, 38304, 38305, 38306, 38307, 38308, 38309, 38310, 38311, + 38312, 38313, 38314, 38315, 38316, 38317, 38318, 38319, 38320, 38321, + 38322, 38323, 38324, 38325, 38326, 38327, 38328, 38329, 38330, 38331, + 38332, 38333, 38334, 38335, 38336, 38337, 38338, 38339, 38340, 38341, + 38342, 38343, 38344, 38345, 38346, 38347, 26916, 26864, 26891, 26881, + 26967, 26851, 26896, 26993, 26937, 26976, 26946, 26973, 27012, 26987, + 27008, 27032, 27000, 26932, 27084, 27015, 27016, 27086, 27017, 26982, + 26979, 27001, 27035, 27047, 27067, 27051, 27053, 27092, 27057, 27073, + 27082, 27103, 27029, 27104, 27021, 27135, 27183, 27117, 27159, 27160, + 27237, 27122, 27204, 27198, 27296, 27216, 27227, 27189, 27278, 27257, + 27197, 27176, 27224, 27260, 27281, 27280, 27305, 27287, 27307, 29495, + 29522, 27521, 27522, 27527, 27524, 27538, 27539, 27533, 27546, 27547, + 27553, 27562, 36715, 36717, 36721, 36722, 36723, 36725, 36726, 36728, + 36727, 36729, 36730, 36732, 36734, 36737, 36738, 36740, 36743, 36747, + 38348, 38349, 38350, 38351, 38352, 38353, 38354, 38355, 38356, 38357, + 38358, 38359, 38360, 38361, 38362, 38363, 38364, 38365, 38366, 38367, + 38368, 38369, 38370, 38371, 38372, 38373, 38374, 38375, 38380, 38399, + 38407, 38419, 38424, 38427, 38430, 38432, 38435, 38436, 38437, 38438, + 38439, 38440, 38441, 38443, 38444, 38445, 38447, 38448, 38455, 38456, + 38457, 38458, 38462, 38465, 38467, 38474, 38478, 38479, 38481, 38482, + 38483, 38486, 38487, 38488, 38489, 38490, 38492, 38493, 38494, 38496, + 38499, 38501, 38502, 38507, 38509, 38510, 38511, 38512, 38513, 38515, + 38520, 38521, 38522, 38523, 38524, 38525, 38526, 38527, 38528, 38529, + 38530, 38531, 38532, 38535, 38537, 38538, 36749, 36750, 36751, 36760, + 36762, 36558, 25099, 25111, 25115, 25119, 25122, 25121, 25125, 25124, + 25132, 33255, 29935, 29940, 29951, 29967, 29969, 29971, 25908, 26094, + 26095, 26096, 26122, 26137, 26482, 26115, 26133, 26112, 28805, 26359, + 26141, 26164, 26161, 26166, 26165, 32774, 26207, 26196, 26177, 26191, + 26198, 26209, 26199, 26231, 26244, 26252, 26279, 26269, 26302, 26331, + 26332, 26342, 26345, 36146, 36147, 36150, 36155, 36157, 36160, 36165, + 36166, 36168, 36169, 36167, 36173, 36181, 36185, 35271, 35274, 35275, + 35276, 35278, 35279, 35280, 35281, 29294, 29343, 29277, 29286, 29295, + 29310, 29311, 29316, 29323, 29325, 29327, 29330, 25352, 25394, 25520, + 38540, 38542, 38545, 38546, 38547, 38549, 38550, 38554, 38555, 38557, + 38558, 38559, 38560, 38561, 38562, 38563, 38564, 38565, 38566, 38568, + 38569, 38570, 38571, 38572, 38573, 38574, 38575, 38577, 38578, 38580, + 38581, 38583, 38584, 38586, 38587, 38591, 38594, 38595, 38600, 38602, + 38603, 38608, 38609, 38611, 38612, 38614, 38615, 38616, 38617, 38618, + 38619, 38620, 38621, 38622, 38623, 38625, 38626, 38627, 38628, 38629, + 38630, 38631, 38635, 38636, 38637, 38638, 38640, 38641, 38642, 38644, + 38645, 38648, 38650, 38651, 38652, 38653, 38655, 38658, 38659, 38661, + 38666, 38667, 38668, 38672, 38673, 38674, 38676, 38677, 38679, 38680, + 38681, 38682, 38683, 38685, 38687, 38688, 25663, 25816, 32772, 27626, + 27635, 27645, 27637, 27641, 27653, 27655, 27654, 27661, 27669, 27672, + 27673, 27674, 27681, 27689, 27684, 27690, 27698, 25909, 25941, 25963, + 29261, 29266, 29270, 29232, 34402, 21014, 32927, 32924, 32915, 32956, + 26378, 32957, 32945, 32939, 32941, 32948, 32951, 32999, 33000, 33001, + 33002, 32987, 32962, 32964, 32985, 32973, 32983, 26384, 32989, 33003, + 33009, 33012, 33005, 33037, 33038, 33010, 33020, 26389, 33042, 35930, + 33078, 33054, 33068, 33048, 33074, 33096, 33100, 33107, 33140, 33113, + 33114, 33137, 33120, 33129, 33148, 33149, 33133, 33127, 22605, 23221, + 33160, 33154, 33169, 28373, 33187, 33194, 33228, 26406, 33226, 33211, + 38689, 38690, 38691, 38692, 38693, 38694, 38695, 38696, 38697, 38699, + 38700, 38702, 38703, 38705, 38707, 38708, 38709, 38710, 38711, 38714, + 38715, 38716, 38717, 38719, 38720, 38721, 38722, 38723, 38724, 38725, + 38726, 38727, 38728, 38729, 38730, 38731, 38732, 38733, 38734, 38735, + 38736, 38737, 38740, 38741, 38743, 38744, 38746, 38748, 38749, 38751, + 38755, 38756, 38758, 38759, 38760, 38762, 38763, 38764, 38765, 38766, + 38767, 38768, 38769, 38770, 38773, 38775, 38776, 38777, 38778, 38779, + 38781, 38782, 38783, 38784, 38785, 38786, 38787, 38788, 38790, 38791, + 38792, 38793, 38794, 38796, 38798, 38799, 38800, 38803, 38805, 38806, + 38807, 38809, 38810, 38811, 38812, 38813, 33217, 33190, 27428, 27447, + 27449, 27459, 27462, 27481, 39121, 39122, 39123, 39125, 39129, 39130, + 27571, 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, 26052, + 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, 28859, + 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, 28975, + 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, 29080, + 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, 29224, + 28780, 28952, 29030, 29113, 25150, 25149, 25155, 25160, 25161, 31035, + 31040, 31046, 31049, 31067, 31068, 31059, 31066, 31074, 31063, 31072, + 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, 24528, + 38814, 38815, 38817, 38818, 38820, 38821, 38822, 38823, 38824, 38825, + 38826, 38828, 38830, 38832, 38833, 38835, 38837, 38838, 38839, 38840, + 38841, 38842, 38843, 38844, 38845, 38846, 38847, 38848, 38849, 38850, + 38851, 38852, 38853, 38854, 38855, 38856, 38857, 38858, 38859, 38860, + 38861, 38862, 38863, 38864, 38865, 38866, 38867, 38868, 38869, 38870, + 38871, 38872, 38873, 38874, 38875, 38876, 38877, 38878, 38879, 38880, + 38881, 38882, 38883, 38884, 38885, 38888, 38894, 38895, 38896, 38897, + 38898, 38900, 38903, 38904, 38905, 38906, 38907, 38908, 38909, 38910, + 38911, 38912, 38913, 38914, 38915, 38916, 38917, 38918, 38919, 38920, + 38921, 38922, 38923, 38924, 38925, 38926, 24636, 24669, 24666, 24679, + 24641, 24665, 24675, 24747, 24838, 24845, 24925, 25001, 24989, 25035, + 25041, 25094, 32896, 32895, 27795, 27894, 28156, 30710, 30712, 30720, + 30729, 30743, 30744, 30737, 26027, 30765, 30748, 30749, 30777, 30778, + 30779, 30751, 30780, 30757, 30764, 30755, 30761, 30798, 30829, 30806, + 30807, 30758, 30800, 30791, 30796, 30826, 30875, 30867, 30874, 30855, + 30876, 30881, 30883, 30898, 30905, 30885, 30932, 30937, 30921, 30956, + 30962, 30981, 30964, 30995, 31012, 31006, 31028, 40859, 40697, 40699, + 40700, 30449, 30468, 30477, 30457, 30471, 30472, 30490, 30498, 30489, + 30509, 30502, 30517, 30520, 30544, 30545, 30535, 30531, 30554, 30568, + 38927, 38928, 38929, 38930, 38931, 38932, 38933, 38934, 38935, 38936, + 38937, 38938, 38939, 38940, 38941, 38942, 38943, 38944, 38945, 38946, + 38947, 38948, 38949, 38950, 38951, 38952, 38953, 38954, 38955, 38956, + 38957, 38958, 38959, 38960, 38961, 38962, 38963, 38964, 38965, 38966, + 38967, 38968, 38969, 38970, 38971, 38972, 38973, 38974, 38975, 38976, + 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38986, + 38987, 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995, 38996, + 38997, 38998, 38999, 39000, 39001, 39002, 39003, 39004, 39005, 39006, + 39007, 39008, 39009, 39010, 39011, 39012, 39013, 39014, 39015, 39016, + 39017, 39018, 39019, 39020, 39021, 39022, 30562, 30565, 30591, 30605, + 30589, 30592, 30604, 30609, 30623, 30624, 30640, 30645, 30653, 30010, + 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, 32609, + 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, 30437, + 34866, 38021, 38022, 38023, 38027, 38026, 38028, 38029, 38031, 38032, + 38036, 38039, 38037, 38042, 38043, 38044, 38051, 38052, 38059, 38058, + 38061, 38060, 38063, 38064, 38066, 38068, 38070, 38071, 38072, 38073, + 38074, 38076, 38077, 38079, 38084, 38088, 38089, 38090, 38091, 38092, + 38093, 38094, 38096, 38097, 38098, 38101, 38102, 38103, 38105, 38104, + 38107, 38110, 38111, 38112, 38114, 38116, 38117, 38119, 38120, 38122, + 39023, 39024, 39025, 39026, 39027, 39028, 39051, 39054, 39058, 39061, + 39065, 39075, 39080, 39081, 39082, 39083, 39084, 39085, 39086, 39087, + 39088, 39089, 39090, 39091, 39092, 39093, 39094, 39095, 39096, 39097, + 39098, 39099, 39100, 39101, 39102, 39103, 39104, 39105, 39106, 39107, + 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115, 39116, 39117, + 39119, 39120, 39124, 39126, 39127, 39131, 39132, 39133, 39136, 39137, + 39138, 39139, 39140, 39141, 39142, 39145, 39146, 39147, 39148, 39149, + 39150, 39151, 39152, 39153, 39154, 39155, 39156, 39157, 39158, 39159, + 39160, 39161, 39162, 39163, 39164, 39165, 39166, 39167, 39168, 39169, + 39170, 39171, 39172, 39173, 39174, 39175, 38121, 38123, 38126, 38127, + 38131, 38132, 38133, 38135, 38137, 38140, 38141, 38143, 38147, 38146, + 38150, 38151, 38153, 38154, 38157, 38158, 38159, 38162, 38163, 38164, + 38165, 38166, 38168, 38171, 38173, 38174, 38175, 38178, 38186, 38187, + 38185, 38188, 38193, 38194, 38196, 38198, 38199, 38200, 38204, 38206, + 38207, 38210, 38197, 38212, 38213, 38214, 38217, 38220, 38222, 38223, + 38226, 38227, 38228, 38230, 38231, 38232, 38233, 38235, 38238, 38239, + 38237, 38241, 38242, 38244, 38245, 38246, 38247, 38248, 38249, 38250, + 38251, 38252, 38255, 38257, 38258, 38259, 38202, 30695, 30700, 38601, + 31189, 31213, 31203, 31211, 31238, 23879, 31235, 31234, 31262, 31252, + 39176, 39177, 39178, 39179, 39180, 39182, 39183, 39185, 39186, 39187, + 39188, 39189, 39190, 39191, 39192, 39193, 39194, 39195, 39196, 39197, + 39198, 39199, 39200, 39201, 39202, 39203, 39204, 39205, 39206, 39207, + 39208, 39209, 39210, 39211, 39212, 39213, 39215, 39216, 39217, 39218, + 39219, 39220, 39221, 39222, 39223, 39224, 39225, 39226, 39227, 39228, + 39229, 39230, 39231, 39232, 39233, 39234, 39235, 39236, 39237, 39238, + 39239, 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247, 39248, + 39249, 39250, 39251, 39254, 39255, 39256, 39257, 39258, 39259, 39260, + 39261, 39262, 39263, 39264, 39265, 39266, 39268, 39270, 39283, 39288, + 39289, 39291, 39294, 39298, 39299, 39305, 31289, 31287, 31313, 40655, + 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, + 40480, 40482, 40488, 40489, 40490, 40491, 40492, 40498, 40497, 40502, + 40504, 40503, 40505, 40506, 40510, 40513, 40514, 40516, 40518, 40519, + 40520, 40521, 40523, 40524, 40526, 40529, 40533, 40535, 40538, 40539, + 40540, 40542, 40547, 40550, 40551, 40552, 40553, 40554, 40555, 40556, + 40561, 40557, 40563, 30098, 30100, 30102, 30112, 30109, 30124, 30115, + 30131, 30132, 30136, 30148, 30129, 30128, 30147, 30146, 30166, 30157, + 30179, 30184, 30182, 30180, 30187, 30183, 30211, 30193, 30204, 30207, + 30224, 30208, 30213, 30220, 30231, 30218, 30245, 30232, 30229, 30233, + 39308, 39310, 39322, 39323, 39324, 39325, 39326, 39327, 39328, 39329, + 39330, 39331, 39332, 39334, 39335, 39337, 39338, 39339, 39340, 39341, + 39342, 39343, 39344, 39345, 39346, 39347, 39348, 39349, 39350, 39351, + 39352, 39353, 39354, 39355, 39356, 39357, 39358, 39359, 39360, 39361, + 39362, 39363, 39364, 39365, 39366, 39367, 39368, 39369, 39370, 39371, + 39372, 39373, 39374, 39375, 39376, 39377, 39378, 39379, 39380, 39381, + 39382, 39383, 39384, 39385, 39386, 39387, 39388, 39389, 39390, 39391, + 39392, 39393, 39394, 39395, 39396, 39397, 39398, 39399, 39400, 39401, + 39402, 39403, 39404, 39405, 39406, 39407, 39408, 39409, 39410, 39411, + 39412, 39413, 39414, 39415, 39416, 39417, 30235, 30268, 30242, 30240, + 30272, 30253, 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, + 30292, 30300, 30294, 30315, 30319, 32714, 31462, 31352, 31353, 31360, + 31366, 31368, 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, + 34921, 34930, 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, + 35042, 35022, 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, + 35105, 35097, 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, + 35195, 30091, 32997, 30386, 30388, 30684, 32786, 32788, 32790, 32796, + 32800, 32802, 32805, 32806, 32807, 32809, 32808, 32817, 32779, 32821, + 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, + 39418, 39419, 39420, 39421, 39422, 39423, 39424, 39425, 39426, 39427, + 39428, 39429, 39430, 39431, 39432, 39433, 39434, 39435, 39436, 39437, + 39438, 39439, 39440, 39441, 39442, 39443, 39444, 39445, 39446, 39447, + 39448, 39449, 39450, 39451, 39452, 39453, 39454, 39455, 39456, 39457, + 39458, 39459, 39460, 39461, 39462, 39463, 39464, 39465, 39466, 39467, + 39468, 39469, 39470, 39471, 39472, 39473, 39474, 39475, 39476, 39477, + 39478, 39479, 39480, 39481, 39482, 39483, 39484, 39485, 39486, 39487, + 39488, 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, 39497, + 39498, 39499, 39500, 39501, 39502, 39503, 39504, 39505, 39506, 39507, + 39508, 39509, 39510, 39511, 39512, 39513, 39049, 39052, 39053, 39055, + 39060, 39066, 39067, 39070, 39071, 39073, 39074, 39077, 39078, 34381, + 34388, 34412, 34414, 34431, 34426, 34428, 34427, 34472, 34445, 34443, + 34476, 34461, 34471, 34467, 34474, 34451, 34473, 34486, 34500, 34485, + 34510, 34480, 34490, 34481, 34479, 34505, 34511, 34484, 34537, 34545, + 34546, 34541, 34547, 34512, 34579, 34526, 34548, 34527, 34520, 34513, + 34563, 34567, 34552, 34568, 34570, 34573, 34569, 34595, 34619, 34590, + 34597, 34606, 34586, 34622, 34632, 34612, 34609, 34601, 34615, 34623, + 34690, 34594, 34685, 34686, 34683, 34656, 34672, 34636, 34670, 34699, + 34643, 34659, 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, + 39514, 39515, 39516, 39517, 39518, 39519, 39520, 39521, 39522, 39523, + 39524, 39525, 39526, 39527, 39528, 39529, 39530, 39531, 39538, 39555, + 39561, 39565, 39566, 39572, 39573, 39577, 39590, 39593, 39594, 39595, + 39596, 39597, 39598, 39599, 39602, 39603, 39604, 39605, 39609, 39611, + 39613, 39614, 39615, 39619, 39620, 39622, 39623, 39624, 39625, 39626, + 39629, 39630, 39631, 39632, 39634, 39636, 39637, 39638, 39639, 39641, + 39642, 39643, 39644, 39645, 39646, 39648, 39650, 39651, 39652, 39653, + 39655, 39656, 39657, 39658, 39660, 39662, 39664, 39665, 39666, 39667, + 39668, 39669, 39670, 39671, 39672, 39674, 39676, 39677, 39678, 39679, + 39680, 39681, 39682, 39684, 39685, 39686, 34758, 34696, 34693, 34733, + 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, 34771, 34749, + 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, 34835, 34814, + 34826, 34843, 34849, 34873, 34876, 32566, 32578, 32580, 32581, 33296, + 31482, 31485, 31496, 31491, 31492, 31509, 31498, 31531, 31503, 31559, + 31544, 31530, 31513, 31534, 31537, 31520, 31525, 31524, 31539, 31550, + 31518, 31576, 31578, 31557, 31605, 31564, 31581, 31584, 31598, 31611, + 31586, 31602, 31601, 31632, 31654, 31655, 31672, 31660, 31645, 31656, + 31621, 31658, 31644, 31650, 31659, 31668, 31697, 31681, 31692, 31709, + 31706, 31717, 31718, 31722, 31756, 31742, 31740, 31759, 31766, 31755, + 39687, 39689, 39690, 39691, 39692, 39693, 39694, 39696, 39697, 39698, + 39700, 39701, 39702, 39703, 39704, 39705, 39706, 39707, 39708, 39709, + 39710, 39712, 39713, 39714, 39716, 39717, 39718, 39719, 39720, 39721, + 39722, 39723, 39724, 39725, 39726, 39728, 39729, 39731, 39732, 39733, + 39734, 39735, 39736, 39737, 39738, 39741, 39742, 39743, 39744, 39750, + 39754, 39755, 39756, 39758, 39760, 39762, 39763, 39765, 39766, 39767, + 39768, 39769, 39770, 39771, 39772, 39773, 39774, 39775, 39776, 39777, + 39778, 39779, 39780, 39781, 39782, 39783, 39784, 39785, 39786, 39787, + 39788, 39789, 39790, 39791, 39792, 39793, 39794, 39795, 39796, 39797, + 39798, 39799, 39800, 39801, 39802, 39803, 31775, 31786, 31782, 31800, + 31809, 31808, 33278, 33281, 33282, 33284, 33260, 34884, 33313, 33314, + 33315, 33325, 33327, 33320, 33323, 33336, 33339, 33331, 33332, 33342, + 33348, 33353, 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, + 35032, 35039, 35166, 32669, 32671, 32679, 32687, 32688, 32690, 31868, + 25929, 31889, 31901, 31900, 31902, 31906, 31922, 31932, 31933, 31937, + 31943, 31948, 31949, 31944, 31941, 31959, 31976, 33390, 26280, 32703, + 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, 31992, 32119, + 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, 36241, + 36273, 36199, 36205, 35911, 35913, 37194, 37200, 37198, 37199, 37220, + 39804, 39805, 39806, 39807, 39808, 39809, 39810, 39811, 39812, 39813, + 39814, 39815, 39816, 39817, 39818, 39819, 39820, 39821, 39822, 39823, + 39824, 39825, 39826, 39827, 39828, 39829, 39830, 39831, 39832, 39833, + 39834, 39835, 39836, 39837, 39838, 39839, 39840, 39841, 39842, 39843, + 39844, 39845, 39846, 39847, 39848, 39849, 39850, 39851, 39852, 39853, + 39854, 39855, 39856, 39857, 39858, 39859, 39860, 39861, 39862, 39863, + 39864, 39865, 39866, 39867, 39868, 39869, 39870, 39871, 39872, 39873, + 39874, 39875, 39876, 39877, 39878, 39879, 39880, 39881, 39882, 39883, + 39884, 39885, 39886, 39887, 39888, 39889, 39890, 39891, 39892, 39893, + 39894, 39895, 39896, 39897, 39898, 39899, 37218, 37217, 37232, 37225, + 37231, 37245, 37246, 37234, 37236, 37241, 37260, 37253, 37264, 37261, + 37265, 37282, 37283, 37290, 37293, 37294, 37295, 37301, 37300, 37306, + 35925, 40574, 36280, 36331, 36357, 36441, 36457, 36277, 36287, 36284, + 36282, 36292, 36310, 36311, 36314, 36318, 36302, 36303, 36315, 36294, + 36332, 36343, 36344, 36323, 36345, 36347, 36324, 36361, 36349, 36372, + 36381, 36383, 36396, 36398, 36387, 36399, 36410, 36416, 36409, 36405, + 36413, 36401, 36425, 36417, 36418, 36433, 36434, 36426, 36464, 36470, + 36476, 36463, 36468, 36485, 36495, 36500, 36496, 36508, 36510, 35960, + 35970, 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, + 39900, 39901, 39902, 39903, 39904, 39905, 39906, 39907, 39908, 39909, + 39910, 39911, 39912, 39913, 39914, 39915, 39916, 39917, 39918, 39919, + 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39927, 39928, 39929, + 39930, 39931, 39932, 39933, 39934, 39935, 39936, 39937, 39938, 39939, + 39940, 39941, 39942, 39943, 39944, 39945, 39946, 39947, 39948, 39949, + 39950, 39951, 39952, 39953, 39954, 39955, 39956, 39957, 39958, 39959, + 39960, 39961, 39962, 39963, 39964, 39965, 39966, 39967, 39968, 39969, + 39970, 39971, 39972, 39973, 39974, 39975, 39976, 39977, 39978, 39979, + 39980, 39981, 39982, 39983, 39984, 39985, 39986, 39987, 39988, 39989, + 39990, 39991, 39992, 39993, 39994, 39995, 35301, 35307, 35311, 35390, + 35622, 38739, 38633, 38643, 38639, 38662, 38657, 38664, 38671, 38670, + 38698, 38701, 38704, 38718, 40832, 40835, 40837, 40838, 40839, 40840, + 40841, 40842, 40844, 40702, 40715, 40717, 38585, 38588, 38589, 38606, + 38610, 30655, 38624, 37518, 37550, 37576, 37694, 37738, 37834, 37775, + 37950, 37995, 40063, 40066, 40069, 40070, 40071, 40072, 31267, 40075, + 40078, 40080, 40081, 40082, 40084, 40085, 40090, 40091, 40094, 40095, + 40096, 40097, 40098, 40099, 40101, 40102, 40103, 40104, 40105, 40107, + 40109, 40110, 40112, 40113, 40114, 40115, 40116, 40117, 40118, 40119, + 40122, 40123, 40124, 40125, 40132, 40133, 40134, 40135, 40138, 40139, + 39996, 39997, 39998, 39999, 40000, 40001, 40002, 40003, 40004, 40005, + 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40015, + 40016, 40017, 40018, 40019, 40020, 40021, 40022, 40023, 40024, 40025, + 40026, 40027, 40028, 40029, 40030, 40031, 40032, 40033, 40034, 40035, + 40036, 40037, 40038, 40039, 40040, 40041, 40042, 40043, 40044, 40045, + 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40053, 40054, 40055, + 40056, 40057, 40058, 40059, 40061, 40062, 40064, 40067, 40068, 40073, + 40074, 40076, 40079, 40083, 40086, 40087, 40088, 40089, 40093, 40106, + 40108, 40111, 40121, 40126, 40127, 40128, 40129, 40130, 40136, 40137, + 40145, 40146, 40154, 40155, 40160, 40161, 40140, 40141, 40142, 40143, + 40144, 40147, 40148, 40149, 40151, 40152, 40153, 40156, 40157, 40159, + 40162, 38780, 38789, 38801, 38802, 38804, 38831, 38827, 38819, 38834, + 38836, 39601, 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, + 39621, 39618, 39627, 39628, 39633, 39749, 39747, 39751, 39753, 39752, + 39757, 39761, 39144, 39181, 39214, 39253, 39252, 39647, 39649, 39654, + 39663, 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, + 40637, 40638, 32315, 40578, 40583, 40584, 40587, 40594, 37846, 40605, + 40607, 40667, 40668, 40669, 40672, 40671, 40674, 40681, 40679, 40677, + 40682, 40687, 40738, 40748, 40751, 40761, 40759, 40765, 40766, 40772, + 40163, 40164, 40165, 40166, 40167, 40168, 40169, 40170, 40171, 40172, + 40173, 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181, 40182, + 40183, 40184, 40185, 40186, 40187, 40188, 40189, 40190, 40191, 40192, + 40193, 40194, 40195, 40196, 40197, 40198, 40199, 40200, 40201, 40202, + 40203, 40204, 40205, 40206, 40207, 40208, 40209, 40210, 40211, 40212, + 40213, 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, + 40223, 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231, 40232, + 40233, 40234, 40235, 40236, 40237, 40238, 40239, 40240, 40241, 40242, + 40243, 40244, 40245, 40246, 40247, 40248, 40249, 40250, 40251, 40252, + 40253, 40254, 40255, 40256, 40257, 40258, 57908, 57909, 57910, 57911, + 57912, 57913, 57914, 57915, 57916, 57917, 57918, 57919, 57920, 57921, + 57922, 57923, 57924, 57925, 57926, 57927, 57928, 57929, 57930, 57931, + 57932, 57933, 57934, 57935, 57936, 57937, 57938, 57939, 57940, 57941, + 57942, 57943, 57944, 57945, 57946, 57947, 57948, 57949, 57950, 57951, + 57952, 57953, 57954, 57955, 57956, 57957, 57958, 57959, 57960, 57961, + 57962, 57963, 57964, 57965, 57966, 57967, 57968, 57969, 57970, 57971, + 57972, 57973, 57974, 57975, 57976, 57977, 57978, 57979, 57980, 57981, + 57982, 57983, 57984, 57985, 57986, 57987, 57988, 57989, 57990, 57991, + 57992, 57993, 57994, 57995, 57996, 57997, 57998, 57999, 58000, 58001, + 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, + 40269, 40270, 40271, 40272, 40273, 40274, 40275, 40276, 40277, 40278, + 40279, 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287, 40288, + 40289, 40290, 40291, 40292, 40293, 40294, 40295, 40296, 40297, 40298, + 40299, 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307, 40308, + 40309, 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317, 40318, + 40319, 40320, 40321, 40322, 40323, 40324, 40325, 40326, 40327, 40328, + 40329, 40330, 40331, 40332, 40333, 40334, 40335, 40336, 40337, 40338, + 40339, 40340, 40341, 40342, 40343, 40344, 40345, 40346, 40347, 40348, + 40349, 40350, 40351, 40352, 40353, 40354, 58002, 58003, 58004, 58005, + 58006, 58007, 58008, 58009, 58010, 58011, 58012, 58013, 58014, 58015, + 58016, 58017, 58018, 58019, 58020, 58021, 58022, 58023, 58024, 58025, + 58026, 58027, 58028, 58029, 58030, 58031, 58032, 58033, 58034, 58035, + 58036, 58037, 58038, 58039, 58040, 58041, 58042, 58043, 58044, 58045, + 58046, 58047, 58048, 58049, 58050, 58051, 58052, 58053, 58054, 58055, + 58056, 58057, 58058, 58059, 58060, 58061, 58062, 58063, 58064, 58065, + 58066, 58067, 58068, 58069, 58070, 58071, 58072, 58073, 58074, 58075, + 58076, 58077, 58078, 58079, 58080, 58081, 58082, 58083, 58084, 58085, + 58086, 58087, 58088, 58089, 58090, 58091, 58092, 58093, 58094, 58095, + 40355, 40356, 40357, 40358, 40359, 40360, 40361, 40362, 40363, 40364, + 40365, 40366, 40367, 40368, 40369, 40370, 40371, 40372, 40373, 40374, + 40375, 40376, 40377, 40378, 40379, 40380, 40381, 40382, 40383, 40384, + 40385, 40386, 40387, 40388, 40389, 40390, 40391, 40392, 40393, 40394, + 40395, 40396, 40397, 40398, 40399, 40400, 40401, 40402, 40403, 40404, + 40405, 40406, 40407, 40408, 40409, 40410, 40411, 40412, 40413, 40414, + 40415, 40416, 40417, 40418, 40419, 40420, 40421, 40422, 40423, 40424, + 40425, 40426, 40427, 40428, 40429, 40430, 40431, 40432, 40433, 40434, + 40435, 40436, 40437, 40438, 40439, 40440, 40441, 40442, 40443, 40444, + 40445, 40446, 40447, 40448, 40449, 40450, 58096, 58097, 58098, 58099, + 58100, 58101, 58102, 58103, 58104, 58105, 58106, 58107, 58108, 58109, + 58110, 58111, 58112, 58113, 58114, 58115, 58116, 58117, 58118, 58119, + 58120, 58121, 58122, 58123, 58124, 58125, 58126, 58127, 58128, 58129, + 58130, 58131, 58132, 58133, 58134, 58135, 58136, 58137, 58138, 58139, + 58140, 58141, 58142, 58143, 58144, 58145, 58146, 58147, 58148, 58149, + 58150, 58151, 58152, 58153, 58154, 58155, 58156, 58157, 58158, 58159, + 58160, 58161, 58162, 58163, 58164, 58165, 58166, 58167, 58168, 58169, + 58170, 58171, 58172, 58173, 58174, 58175, 58176, 58177, 58178, 58179, + 58180, 58181, 58182, 58183, 58184, 58185, 58186, 58187, 58188, 58189, + 40451, 40452, 40453, 40454, 40455, 40456, 40457, 40458, 40459, 40460, + 40461, 40462, 40463, 40464, 40465, 40466, 40467, 40468, 40469, 40470, + 40471, 40472, 40473, 40474, 40475, 40476, 40477, 40478, 40484, 40487, + 40494, 40496, 40500, 40507, 40508, 40512, 40525, 40528, 40530, 40531, + 40532, 40534, 40537, 40541, 40543, 40544, 40545, 40546, 40549, 40558, + 40559, 40562, 40564, 40565, 40566, 40567, 40568, 40569, 40570, 40571, + 40572, 40573, 40576, 40577, 40579, 40580, 40581, 40582, 40585, 40586, + 40588, 40589, 40590, 40591, 40592, 40593, 40596, 40597, 40598, 40599, + 40600, 40601, 40602, 40603, 40604, 40606, 40608, 40609, 40610, 40611, + 40612, 40613, 40615, 40616, 40617, 40618, 58190, 58191, 58192, 58193, + 58194, 58195, 58196, 58197, 58198, 58199, 58200, 58201, 58202, 58203, + 58204, 58205, 58206, 58207, 58208, 58209, 58210, 58211, 58212, 58213, + 58214, 58215, 58216, 58217, 58218, 58219, 58220, 58221, 58222, 58223, + 58224, 58225, 58226, 58227, 58228, 58229, 58230, 58231, 58232, 58233, + 58234, 58235, 58236, 58237, 58238, 58239, 58240, 58241, 58242, 58243, + 58244, 58245, 58246, 58247, 58248, 58249, 58250, 58251, 58252, 58253, + 58254, 58255, 58256, 58257, 58258, 58259, 58260, 58261, 58262, 58263, + 58264, 58265, 58266, 58267, 58268, 58269, 58270, 58271, 58272, 58273, + 58274, 58275, 58276, 58277, 58278, 58279, 58280, 58281, 58282, 58283, + 40619, 40620, 40621, 40622, 40623, 40624, 40625, 40626, 40627, 40629, + 40630, 40631, 40633, 40634, 40636, 40639, 40640, 40641, 40642, 40643, + 40645, 40646, 40647, 40648, 40650, 40651, 40652, 40656, 40658, 40659, + 40661, 40662, 40663, 40665, 40666, 40670, 40673, 40675, 40676, 40678, + 40680, 40683, 40684, 40685, 40686, 40688, 40689, 40690, 40691, 40692, + 40693, 40694, 40695, 40696, 40698, 40701, 40703, 40704, 40705, 40706, + 40707, 40708, 40709, 40710, 40711, 40712, 40713, 40714, 40716, 40719, + 40721, 40722, 40724, 40725, 40726, 40728, 40730, 40731, 40732, 40733, + 40734, 40735, 40737, 40739, 40740, 40741, 40742, 40743, 40744, 40745, + 40746, 40747, 40749, 40750, 40752, 40753, 58284, 58285, 58286, 58287, + 58288, 58289, 58290, 58291, 58292, 58293, 58294, 58295, 58296, 58297, + 58298, 58299, 58300, 58301, 58302, 58303, 58304, 58305, 58306, 58307, + 58308, 58309, 58310, 58311, 58312, 58313, 58314, 58315, 58316, 58317, + 58318, 58319, 58320, 58321, 58322, 58323, 58324, 58325, 58326, 58327, + 58328, 58329, 58330, 58331, 58332, 58333, 58334, 58335, 58336, 58337, + 58338, 58339, 58340, 58341, 58342, 58343, 58344, 58345, 58346, 58347, + 58348, 58349, 58350, 58351, 58352, 58353, 58354, 58355, 58356, 58357, + 58358, 58359, 58360, 58361, 58362, 58363, 58364, 58365, 58366, 58367, + 58368, 58369, 58370, 58371, 58372, 58373, 58374, 58375, 58376, 58377, + 40754, 40755, 40756, 40757, 40758, 40760, 40762, 40764, 40767, 40768, + 40769, 40770, 40771, 40773, 40774, 40775, 40776, 40777, 40778, 40779, + 40780, 40781, 40782, 40783, 40786, 40787, 40788, 40789, 40790, 40791, + 40792, 40793, 40794, 40795, 40796, 40797, 40798, 40799, 40800, 40801, + 40802, 40803, 40804, 40805, 40806, 40807, 40808, 40809, 40810, 40811, + 40812, 40813, 40814, 40815, 40816, 40817, 40818, 40819, 40820, 40821, + 40822, 40823, 40824, 40825, 40826, 40827, 40828, 40829, 40830, 40833, + 40834, 40845, 40846, 40847, 40848, 40849, 40850, 40851, 40852, 40853, + 40854, 40855, 40856, 40860, 40861, 40862, 40865, 40866, 40867, 40868, + 40869, 63788, 63865, 63893, 63975, 63985, 58378, 58379, 58380, 58381, + 58382, 58383, 58384, 58385, 58386, 58387, 58388, 58389, 58390, 58391, + 58392, 58393, 58394, 58395, 58396, 58397, 58398, 58399, 58400, 58401, + 58402, 58403, 58404, 58405, 58406, 58407, 58408, 58409, 58410, 58411, + 58412, 58413, 58414, 58415, 58416, 58417, 58418, 58419, 58420, 58421, + 58422, 58423, 58424, 58425, 58426, 58427, 58428, 58429, 58430, 58431, + 58432, 58433, 58434, 58435, 58436, 58437, 58438, 58439, 58440, 58441, + 58442, 58443, 58444, 58445, 58446, 58447, 58448, 58449, 58450, 58451, + 58452, 58453, 58454, 58455, 58456, 58457, 58458, 58459, 58460, 58461, + 58462, 58463, 58464, 58465, 58466, 58467, 58468, 58469, 58470, 58471, + 64012, 64013, 64014, 64015, 64017, 64019, 64020, 64024, 64031, 64032, + 64033, 64035, 64036, 64039, 64040, 64041, 11905, 59414, 59415, 59416, + 11908, 13427, 13383, 11912, 11915, 59422, 13726, 13850, 13838, 11916, + 11927, 14702, 14616, 59430, 14799, 14815, 14963, 14800, 59435, 59436, + 15182, 15470, 15584, 11943, 59441, 59442, 11946, 16470, 16735, 11950, + 17207, 11955, 11958, 11959, 59451, 17329, 17324, 11963, 17373, 17622, + 18017, 17996, 59459, 18211, 18217, 18300, 18317, 11978, 18759, 18810, + 18813, 18818, 18819, 18821, 18822, 18847, 18843, 18871, 18870, 59476, + 59477, 19619, 19615, 19616, 19617, 19575, 19618, 19731, 19732, 19733, + 19734, 19735, 19736, 19737, 19886, 59492, 58472, 58473, 58474, 58475, + 58476, 58477, 58478, 58479, 58480, 58481, 58482, 58483, 58484, 58485, + 58486, 58487, 58488, 58489, 58490, 58491, 58492, 58493, 58494, 58495, + 58496, 58497, 58498, 58499, 58500, 58501, 58502, 58503, 58504, 58505, + 58506, 58507, 58508, 58509, 58510, 58511, 58512, 58513, 58514, 58515, + 58516, 58517, 58518, 58519, 58520, 58521, 58522, 58523, 58524, 58525, + 58526, 58527, 58528, 58529, 58530, 58531, 58532, 58533, 58534, 58535, + 58536, 58537, 58538, 58539, 58540, 58541, 58542, 58543, 58544, 58545, + 58546, 58547, 58548, 58549, 58550, 58551, 58552, 58553, 58554, 58555, + 58556, 58557, 58558, 58559, 58560, 58561, 58562, 58563, 58564, 58565, + +}; + +static const unsigned long myhtml_encoding_map_gb18030_ranges[][2] = { + {0, 128}, {36, 165}, {38, 169}, {45, 178}, {50, 184}, + {81, 216}, {89, 226}, {95, 235}, {96, 238}, {100, 244}, + {103, 248}, {104, 251}, {105, 253}, {109, 258}, {126, 276}, + {133, 284}, {148, 300}, {172, 325}, {175, 329}, {179, 334}, + {208, 364}, {306, 463}, {307, 465}, {308, 467}, {309, 469}, + {310, 471}, {311, 473}, {312, 475}, {313, 477}, {341, 506}, + {428, 594}, {443, 610}, {544, 712}, {545, 716}, {558, 730}, + {741, 930}, {742, 938}, {749, 962}, {750, 970}, {805, 1026}, + {819, 1104}, {820, 1106}, {7922, 8209}, {7924, 8215}, {7925, 8218}, + {7927, 8222}, {7934, 8231}, {7943, 8241}, {7944, 8244}, {7945, 8246}, + {7950, 8252}, {8062, 8365}, {8148, 8452}, {8149, 8454}, {8152, 8458}, + {8164, 8471}, {8174, 8482}, {8236, 8556}, {8240, 8570}, {8262, 8596}, + {8264, 8602}, {8374, 8713}, {8380, 8720}, {8381, 8722}, {8384, 8726}, + {8388, 8731}, {8390, 8737}, {8392, 8740}, {8393, 8742}, {8394, 8748}, + {8396, 8751}, {8401, 8760}, {8406, 8766}, {8416, 8777}, {8419, 8781}, + {8424, 8787}, {8437, 8802}, {8439, 8808}, {8445, 8816}, {8482, 8854}, + {8485, 8858}, {8496, 8870}, {8521, 8896}, {8603, 8979}, {8936, 9322}, + {8946, 9372}, {9046, 9548}, {9050, 9588}, {9063, 9616}, {9066, 9622}, + {9076, 9634}, {9092, 9652}, {9100, 9662}, {9108, 9672}, {9111, 9676}, + {9113, 9680}, {9131, 9702}, {9162, 9735}, {9164, 9738}, {9218, 9793}, + {9219, 9795}, {11329, 11906}, {11331, 11909}, {11334, 11913}, {11336, 11917}, + {11346, 11928}, {11361, 11944}, {11363, 11947}, {11366, 11951}, {11370, 11956}, + {11372, 11960}, {11375, 11964}, {11389, 11979}, {11682, 12284}, {11686, 12292}, + {11687, 12312}, {11692, 12319}, {11694, 12330}, {11714, 12351}, {11716, 12436}, + {11723, 12447}, {11725, 12535}, {11730, 12543}, {11736, 12586}, {11982, 12842}, + {11989, 12850}, {12102, 12964}, {12336, 13200}, {12348, 13215}, {12350, 13218}, + {12384, 13253}, {12393, 13263}, {12395, 13267}, {12397, 13270}, {12510, 13384}, + {12553, 13428}, {12851, 13727}, {12962, 13839}, {12973, 13851}, {13738, 14617}, + {13823, 14703}, {13919, 14801}, {13933, 14816}, {14080, 14964}, {14298, 15183}, + {14585, 15471}, {14698, 15585}, {15583, 16471}, {15847, 16736}, {16318, 17208}, + {16434, 17325}, {16438, 17330}, {16481, 17374}, {16729, 17623}, {17102, 17997}, + {17122, 18018}, {17315, 18212}, {17320, 18218}, {17402, 18301}, {17418, 18318}, + {17859, 18760}, {17909, 18811}, {17911, 18814}, {17915, 18820}, {17916, 18823}, + {17936, 18844}, {17939, 18848}, {17961, 18872}, {18664, 19576}, {18703, 19620}, + {18814, 19738}, {18962, 19887}, {19043, 40870}, {33469, 59244}, {33470, 59336}, + {33471, 59367}, {33484, 59413}, {33485, 59417}, {33490, 59423}, {33497, 59431}, + {33501, 59437}, {33505, 59443}, {33513, 59452}, {33520, 59460}, {33536, 59478}, + {33550, 59493}, {37845, 63789}, {37921, 63866}, {37948, 63894}, {38029, 63976}, + {38038, 63986}, {38064, 64016}, {38065, 64018}, {38066, 64021}, {38069, 64025}, + {38075, 64034}, {38076, 64037}, {38078, 64042}, {39108, 65074}, {39109, 65093}, + {39113, 65107}, {39114, 65112}, {39115, 65127}, {39116, 65132}, {39265, 65375}, + {39394, 65510}, {189000, 65536}, +}; + +static const unsigned long myhtml_encoding_map_ibm866[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, + 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 9617, 9618, + 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, + 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, + 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, + 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, + 9484, 9608, 9604, 9612, 9616, 9600, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 1025, 1105, 1028, 1108, 1031, 1111, 1038, 1118, + 176, 8729, 183, 8730, 8470, 164, 9632, 160, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_10[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 274, 290, 298, 296, 310, 167, + 315, 272, 352, 358, 381, 173, 362, 330, 176, 261, + 275, 291, 299, 297, 311, 183, 316, 273, 353, 359, + 382, 8213, 363, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 207, + 208, 325, 332, 211, 212, 213, 214, 360, 216, 370, + 218, 219, 220, 221, 222, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 239, 240, 326, 333, 243, 244, 245, 246, 361, + 248, 371, 250, 251, 252, 253, 254, 312, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_13[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8221, 162, 163, 164, 8222, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 8220, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 8217, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_14[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 7682, 7683, 163, 266, 267, 7690, 167, + 7808, 169, 7810, 7691, 7922, 173, 174, 376, 7710, 7711, + 288, 289, 7744, 7745, 182, 7766, 7809, 7767, 7811, 7776, + 7923, 7812, 7813, 7777, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 372, 209, 210, 211, 212, 213, 214, 7786, 216, 217, + 218, 219, 220, 221, 374, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 373, 241, 242, 243, 244, 245, 246, 7787, + 248, 249, 250, 251, 252, 253, 375, 255, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_15[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 8364, 165, 352, 167, + 353, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 381, 181, 182, 183, 382, 185, 186, 187, + 338, 339, 376, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_16[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 261, 321, 8364, 8222, 352, 167, + 353, 169, 536, 171, 377, 173, 378, 379, 176, 177, + 268, 322, 381, 8221, 182, 183, 382, 269, 537, 187, + 338, 339, 376, 380, 192, 193, 194, 258, 196, 262, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 272, 323, 210, 211, 212, 336, 214, 346, 368, 217, + 218, 219, 220, 280, 538, 223, 224, 225, 226, 259, + 228, 263, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 273, 324, 242, 243, 244, 337, 246, 347, + 369, 249, 250, 251, 252, 281, 539, 255, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_2[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 728, 321, 164, 317, 346, 167, + 168, 352, 350, 356, 377, 173, 381, 379, 176, 261, + 731, 322, 180, 318, 347, 711, 184, 353, 351, 357, + 378, 733, 382, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_3[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 294, 728, 163, 164, 0x0000, 292, 167, + 168, 304, 350, 286, 308, 173, 0x0000, 379, 176, 295, + 178, 179, 180, 181, 293, 183, 184, 305, 351, 287, + 309, 189, 0x0000, 380, 192, 193, 194, 0x0000, 196, 266, + 264, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 0x0000, 209, 210, 211, 212, 288, 214, 215, 284, 217, + 218, 219, 220, 364, 348, 223, 224, 225, 226, 0x0000, + 228, 267, 265, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 0x0000, 241, 242, 243, 244, 289, 246, 247, + 285, 249, 250, 251, 252, 365, 349, 729, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_4[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 312, 342, 164, 296, 315, 167, + 168, 352, 274, 290, 358, 173, 381, 175, 176, 261, + 731, 343, 180, 297, 316, 711, 184, 353, 275, 291, + 359, 330, 382, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 298, + 272, 325, 332, 310, 212, 213, 214, 215, 216, 370, + 218, 219, 220, 360, 362, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 299, 273, 326, 333, 311, 244, 245, 246, 247, + 248, 371, 250, 251, 252, 361, 363, 729, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_5[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 1032, 1033, 1034, 1035, 1036, 173, 1038, 1039, 1040, 1041, + 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, + 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, + 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 8470, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 167, 1118, 1119, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_6[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 0x0000, 0x0000, 164, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1548, 173, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1563, + 0x0000, 0x0000, 0x0000, 1567, 0x0000, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1600, 1601, 1602, 1603, + 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_7[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8216, 8217, 163, 8364, 8367, 166, 167, + 168, 169, 890, 171, 172, 173, 0x0000, 8213, 176, 177, + 178, 179, 900, 901, 902, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_iso_8859_8[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 162, 163, 164, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8215, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_jis0208[] = { + 12288, 12289, 12290, 65292, 65294, 12539, 65306, 65307, 65311, 65281, + 12443, 12444, 180, 65344, 168, 65342, 65507, 65343, 12541, 12542, + 12445, 12446, 12291, 20189, 12293, 12294, 12295, 12540, 8213, 8208, + 65295, 65340, 65374, 8741, 65372, 8230, 8229, 8216, 8217, 8220, + 8221, 65288, 65289, 12308, 12309, 65339, 65341, 65371, 65373, 12296, + 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 65291, + 65293, 177, 215, 247, 65309, 8800, 65308, 65310, 8806, 8807, + 8734, 8756, 9794, 9792, 176, 8242, 8243, 8451, 65509, 65284, + 65504, 65505, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, + 9675, 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, + 9660, 8251, 12306, 8594, 8592, 8593, 8595, 12307, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8743, 8744, 65506, 8658, 8660, + 8704, 8707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8491, 8240, 9839, 9837, 9834, + 8224, 8225, 182, 0x0000, 0x0000, 0x0000, 0x0000, 9711, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 65296, 65297, 65298, 65299, 65300, 65301, 65302, + 65303, 65304, 65305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, + 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, + 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 0x0000, 0x0000, + 0x0000, 0x0000, 12353, 12354, 12355, 12356, 12357, 12358, 12359, 12360, + 12361, 12362, 12363, 12364, 12365, 12366, 12367, 12368, 12369, 12370, + 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 12380, + 12381, 12382, 12383, 12384, 12385, 12386, 12387, 12388, 12389, 12390, + 12391, 12392, 12393, 12394, 12395, 12396, 12397, 12398, 12399, 12400, + 12401, 12402, 12403, 12404, 12405, 12406, 12407, 12408, 12409, 12410, + 12411, 12412, 12413, 12414, 12415, 12416, 12417, 12418, 12419, 12420, + 12421, 12422, 12423, 12424, 12425, 12426, 12427, 12428, 12429, 12430, + 12431, 12432, 12433, 12434, 12435, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, + 934, 935, 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 963, + 964, 965, 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1040, 1041, 1042, 1043, 1044, 1045, + 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, + 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, + 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, + 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, + 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, + 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9472, 9474, + 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, + 9475, 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, + 9504, 9519, 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9312, 9313, + 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, + 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 0x0000, 13129, + 13076, 13090, 13133, 13080, 13095, 13059, 13110, 13137, 13143, 13069, + 13094, 13091, 13099, 13130, 13115, 13212, 13213, 13214, 13198, 13199, + 13252, 13217, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 13179, 12317, 12319, 8470, 13261, 8481, 12964, 12965, 12966, 12967, + 12968, 12849, 12850, 12857, 13182, 13181, 13180, 8786, 8801, 8747, + 8750, 8721, 8730, 8869, 8736, 8735, 8895, 8757, 8745, 8746, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 20124, 21782, 23043, 38463, 21696, 24859, 25384, 23030, 36898, 33909, + 33564, 31312, 24746, 25569, 28197, 26093, 33894, 33446, 39925, 26771, + 22311, 26017, 25201, 23451, 22992, 34427, 39156, 32098, 32190, 39822, + 25110, 31903, 34999, 23433, 24245, 25353, 26263, 26696, 38343, 38797, + 26447, 20197, 20234, 20301, 20381, 20553, 22258, 22839, 22996, 23041, + 23561, 24799, 24847, 24944, 26131, 26885, 28858, 30031, 30064, 31227, + 32173, 32239, 32963, 33806, 34915, 35586, 36949, 36986, 21307, 20117, + 20133, 22495, 32946, 37057, 30959, 19968, 22769, 28322, 36920, 31282, + 33576, 33419, 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, + 39154, 28139, 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, + 23431, 28879, 32701, 36802, 38632, 21359, 40284, 31418, 19985, 30867, + 33276, 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, 28006, + 29916, 38287, 22082, 20113, 36939, 38642, 33615, 39180, 21473, 21942, + 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, 29787, 30408, + 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, 30410, 39365, + 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, 22576, 22852, + 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, 28948, 29017, + 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, 40219, 22633, + 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, 25276, 26106, + 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, 40644, 23713, + 27798, 33659, 20740, 23627, 25014, 33222, 26742, 29281, 20057, 20474, + 21368, 24681, 28201, 31311, 38899, 19979, 21270, 20206, 20309, 20285, + 20385, 20339, 21152, 21487, 22025, 22799, 23233, 23478, 23521, 31185, + 26247, 26524, 26550, 27468, 27827, 28779, 29634, 31117, 31166, 31292, + 31623, 33457, 33499, 33540, 33655, 33775, 33747, 34662, 35506, 22057, + 36008, 36838, 36942, 38686, 34442, 20420, 23784, 25105, 29273, 30011, + 33253, 33469, 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, + 22238, 22602, 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, + 25296, 25913, 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, + 33445, 34809, 38283, 38542, 35997, 20977, 21182, 22806, 21683, 23475, + 23830, 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, + 28012, 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, + 24275, 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, + 35282, 36203, 36611, 37101, 38307, 38548, 38761, 23398, 23731, 27005, + 38989, 38990, 25499, 31520, 27179, 27263, 26806, 39949, 28511, 21106, + 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, 36676, 19988, + 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, 33970, 37340, + 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, 33477, 29926, + 20094, 20355, 20896, 23506, 21002, 21208, 21223, 24059, 21914, 22570, + 23014, 23436, 23448, 23515, 24178, 24185, 24739, 24863, 24931, 25022, + 25563, 25954, 26577, 26707, 26874, 27454, 27475, 27735, 28450, 28567, + 28485, 29872, 29976, 30435, 30475, 31487, 31649, 31777, 32233, 32566, + 32752, 32925, 33382, 33694, 35251, 35532, 36011, 36996, 37969, 38291, + 38289, 38306, 38501, 38867, 39208, 33304, 20024, 21547, 23736, 24012, + 29609, 30284, 30524, 23721, 32747, 36107, 38593, 38929, 38996, 39000, + 20225, 20238, 21361, 21916, 22120, 22522, 22855, 23305, 23492, 23696, + 24076, 24190, 24524, 25582, 26426, 26071, 26082, 26399, 26827, 26820, + 27231, 24112, 27589, 27671, 27773, 30079, 31048, 23395, 31232, 32000, + 24509, 35215, 35352, 36020, 36215, 36556, 36637, 39138, 39438, 39740, + 20096, 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, + 30097, 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, + 21507, 21931, 26708, 27224, 35440, 30759, 26485, 40653, 21364, 23458, + 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, + 24339, 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, 31350, + 31406, 31496, 32026, 31998, 32102, 26087, 29275, 21435, 23621, 24040, + 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, 28417, 31142, + 39770, 20136, 20139, 20140, 20379, 20384, 20689, 20807, 31478, 20849, + 20982, 21332, 21281, 21375, 21483, 21932, 22659, 23777, 24375, 24394, + 24623, 24656, 24685, 25375, 25945, 27211, 27841, 29378, 29421, 30703, + 33016, 33029, 33288, 34126, 37111, 37857, 38911, 39255, 39514, 20208, + 20957, 23597, 26241, 26989, 23616, 26354, 26997, 29577, 26704, 31873, + 20677, 21220, 22343, 24062, 37670, 26020, 27427, 27453, 29748, 31105, + 31165, 31563, 32202, 33465, 33740, 34943, 35167, 35641, 36817, 37329, + 21535, 37504, 20061, 20534, 21477, 21306, 29399, 29590, 30697, 33510, + 36527, 39366, 39368, 39378, 20855, 24858, 34398, 21936, 31354, 20598, + 23507, 36935, 38533, 20018, 27355, 37351, 23633, 23624, 25496, 31391, + 27795, 38772, 36705, 31402, 29066, 38536, 31874, 26647, 32368, 26705, + 37740, 21234, 21531, 34219, 35347, 32676, 36557, 37089, 21350, 34952, + 31041, 20418, 20670, 21009, 20804, 21843, 22317, 29674, 22411, 22865, + 24418, 24452, 24693, 24950, 24935, 25001, 25522, 25658, 25964, 26223, + 26690, 28179, 30054, 31293, 31995, 32076, 32153, 32331, 32619, 33550, + 33610, 34509, 35336, 35427, 35686, 36605, 38938, 40335, 33464, 36814, + 39912, 21127, 25119, 25731, 28608, 38553, 26689, 20625, 27424, 27770, + 28500, 31348, 32080, 34880, 35363, 26376, 20214, 20537, 20518, 20581, + 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, 25010, 25080, + 25331, 25458, 26908, 27177, 29309, 29356, 29486, 30740, 30831, 32121, + 30476, 32937, 35211, 35609, 36066, 36562, 36963, 37749, 38522, 38997, + 39443, 40568, 20803, 21407, 21427, 24187, 24358, 28187, 28304, 29572, + 29694, 32067, 33335, 35328, 35578, 38480, 20046, 20491, 21476, 21628, + 22266, 22993, 23396, 24049, 24235, 24359, 25144, 25925, 26543, 28246, + 29392, 31946, 34996, 32929, 32993, 33776, 34382, 35463, 36328, 37431, + 38599, 39015, 40723, 20116, 20114, 20237, 21320, 21577, 21566, 23087, + 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, 35703, + 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, 20844, + 21151, 21177, 21246, 21402, 21475, 21521, 21518, 21897, 22353, 22434, + 22909, 23380, 23389, 23439, 24037, 24039, 24055, 24184, 24195, 24218, + 24247, 24344, 24658, 24908, 25239, 25304, 25511, 25915, 26114, 26179, + 26356, 26477, 26657, 26775, 27083, 27743, 27946, 28009, 28207, 28317, + 30002, 30343, 30828, 31295, 31968, 32005, 32024, 32094, 32177, 32789, + 32771, 32943, 32945, 33108, 33167, 33322, 33618, 34892, 34913, 35611, + 36002, 36092, 37066, 37237, 37489, 30783, 37628, 38308, 38477, 38917, + 39321, 39640, 40251, 21083, 21163, 21495, 21512, 22741, 25335, 28640, + 35946, 36703, 40633, 20811, 21051, 21578, 22269, 31296, 37239, 40288, + 40658, 29508, 28425, 33136, 29969, 24573, 24794, 39592, 29403, 36796, + 27492, 38915, 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, + 26118, 26681, 26801, 28151, 30165, 32058, 33390, 39746, 20123, 20304, + 21449, 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, + 37782, 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, + 22622, 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, + 37319, 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, + 38555, 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, + 27018, 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, + 25662, 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, + 31545, 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, + 34217, 38609, 30352, 39894, 25420, 37638, 39851, 30399, 26194, 19977, + 20632, 21442, 23665, 24808, 25746, 25955, 26719, 29158, 29642, 29987, + 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, 27531, + 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, 22763, + 22987, 22985, 23039, 23376, 23629, 24066, 24107, 24535, 24605, 25351, + 25903, 23388, 26031, 26045, 26088, 26525, 27490, 27515, 27663, 29509, + 31049, 31169, 31992, 32025, 32043, 32930, 33026, 33267, 35222, 35422, + 35433, 35430, 35468, 35566, 36039, 36060, 38604, 39164, 27503, 20107, + 20284, 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, + 27835, 29246, 29885, 30164, 30913, 31034, 32780, 32819, 33258, 33940, + 36766, 27728, 40575, 24335, 35672, 40235, 31482, 36600, 23437, 38635, + 19971, 21489, 22519, 22833, 23241, 23460, 24713, 28287, 28422, 30142, + 36074, 23455, 34048, 31712, 20594, 26612, 33437, 23649, 34122, 32286, + 33294, 20889, 23556, 25448, 36198, 26012, 29038, 31038, 32023, 32773, + 35613, 36554, 36974, 34503, 37034, 20511, 21242, 23610, 26451, 28796, + 29237, 37196, 37320, 37675, 33509, 23490, 24369, 24825, 20027, 21462, + 23432, 25163, 26417, 27530, 29417, 29664, 31278, 33131, 36259, 37202, + 39318, 20754, 21463, 21610, 23551, 25480, 27193, 32172, 38656, 22234, + 21454, 21608, 23447, 23601, 24030, 20462, 24833, 25342, 27954, 31168, + 31179, 32066, 32333, 32722, 33261, 33311, 33936, 34886, 35186, 35728, + 36468, 36655, 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, + 21313, 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, + 21460, 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, + 34899, 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, + 24490, 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, + 36981, 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, + 32210, 32626, 26360, 34223, 34295, 35576, 21161, 21465, 22899, 24207, + 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, + 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, 23567, + 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, 25307, 25484, + 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, 27189, 27836, + 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, 30813, 30977, + 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, 33931, 34121, + 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, 37284, 37478, + 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, 20887, 21104, + 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, 26454, 27972, + 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, 22516, 39166, + 25325, 26893, 27542, 29165, 32340, 32887, 33394, 35302, 39135, 34645, + 36785, 23611, 20280, 20449, 20405, 21767, 23072, 23517, 23529, 24515, + 24910, 25391, 26032, 26187, 26862, 27035, 28024, 28145, 30003, 30137, + 30495, 31070, 31206, 32051, 33251, 33455, 34218, 35242, 35386, 36523, + 36763, 36914, 37341, 38663, 20154, 20161, 20995, 22645, 22764, 23563, + 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, + 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, 27700, 28810, + 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, 29790, + 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, 26905, + 33733, 38935, 38592, 35070, 28548, 25722, 23544, 19990, 28716, 30045, + 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, 25919, 25972, + 26143, 26228, 26866, 26646, 27491, 28165, 29298, 29983, 30427, 31934, + 32854, 22768, 35069, 35199, 35488, 35475, 35531, 36893, 37266, 38738, + 38745, 25993, 31246, 33030, 38587, 24109, 24796, 25114, 26021, 26132, + 26512, 30707, 31309, 31821, 32318, 33034, 36012, 36196, 36321, 36447, + 30889, 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, + 38634, 32118, 33292, 34633, 20185, 20808, 21315, 21344, 23459, 23554, + 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, + 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, + 33146, 33307, 33337, 34214, 35438, 36046, 36341, 36984, 36983, 37549, + 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, 32341, + 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, 29401, + 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, 35380, + 38459, 36961, 40736, 20711, 21109, 21452, 21474, 20489, 21930, 22766, + 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, 25475, 25407, + 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, 29157, 20105, + 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, 33624, 33900, + 33980, 34299, 35013, 36208, 36865, 36973, 37783, 38684, 39442, 20687, + 22679, 24974, 33235, 34101, 36104, 36896, 20419, 20596, 21063, 21363, + 24687, 25417, 26463, 28204, 36275, 36895, 20439, 23646, 36042, 26063, + 32154, 21330, 34966, 20854, 25539, 23384, 23403, 23562, 25613, 26449, + 36956, 20182, 22810, 22826, 27760, 35409, 21822, 22549, 22949, 24816, + 25171, 26561, 33333, 26965, 38464, 39364, 39464, 20307, 22534, 23550, + 32784, 23729, 24111, 24453, 24608, 24907, 25140, 26367, 27888, 28382, + 32974, 33151, 33492, 34955, 36024, 36864, 36910, 38538, 40667, 39899, + 20195, 21488, 22823, 31532, 37261, 38988, 40441, 28381, 28711, 21331, + 21828, 23429, 25176, 25246, 25299, 27810, 28655, 29730, 35351, 37944, + 28609, 35582, 33592, 20967, 34552, 21482, 21481, 20294, 36948, 36784, + 22890, 33073, 24061, 31466, 36799, 26842, 35895, 29432, 40008, 27197, + 35504, 20025, 21336, 22022, 22374, 25285, 25506, 26086, 27470, 28129, + 28251, 28845, 30701, 31471, 31658, 32187, 32829, 32966, 34507, 35477, + 37723, 22243, 22727, 24382, 26029, 26262, 27264, 27573, 30007, 35527, + 20516, 30693, 22320, 24347, 24677, 26234, 27744, 30196, 31258, 32622, + 33268, 34584, 36933, 39347, 31689, 30044, 31481, 31569, 33988, 36880, + 31209, 31378, 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, + 26172, 26609, 27880, 34411, 34935, 35387, 37198, 37619, 39376, 27159, + 28710, 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, + 24086, 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, + 26397, 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, + 35548, 36229, 36339, 37530, 38263, 38914, 40165, 21189, 25431, 30452, + 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, 26894, 27084, + 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, 20291, 28460, + 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, 22775, 23340, + 32044, 29226, 21514, 37347, 40372, 20141, 20302, 20572, 20597, 21059, + 35998, 21576, 22564, 23450, 24093, 24213, 24237, 24311, 24351, 24716, + 25269, 25402, 25552, 26799, 27712, 30855, 31118, 31243, 32224, 33351, + 35330, 35558, 36420, 36883, 37048, 37165, 37336, 40718, 27877, 25688, + 25826, 25973, 28404, 30340, 31515, 36969, 37841, 28346, 21746, 24505, + 25764, 36685, 36845, 37444, 20856, 22635, 22825, 23637, 24215, 28155, + 32399, 29980, 36028, 36578, 39003, 28857, 20253, 27583, 28593, 30000, + 38651, 20814, 21520, 22581, 22615, 22956, 23648, 24466, 26007, 26460, + 28193, 30331, 33759, 36077, 36884, 37117, 37709, 30757, 30778, 21162, + 24230, 22303, 22900, 24594, 20498, 20826, 20908, 20941, 20992, 21776, + 22612, 22616, 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, + 26691, 26812, 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, + 30168, 31095, 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, + 34276, 35342, 35588, 35910, 36367, 36867, 36879, 37913, 38518, 38957, + 39472, 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, + 30643, 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, + 24499, 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, + 27233, 20984, 31361, 26932, 23626, 40182, 33515, 23493, 37193, 28702, + 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, + 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, + 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, + 20108, 23612, 24336, 36841, 21250, 36049, 32905, 34425, 24319, 26085, + 20083, 20837, 22914, 23615, 38894, 20219, 22922, 24525, 35469, 28641, + 31152, 31074, 23527, 33905, 29483, 29105, 24180, 24565, 25467, 25754, + 29123, 31896, 20035, 24316, 20043, 22492, 22178, 24745, 28611, 32013, + 33021, 33075, 33215, 36786, 35223, 34468, 24052, 25226, 25773, 35207, + 26487, 27874, 27966, 29750, 30772, 23110, 32629, 33453, 39340, 20467, + 24259, 25309, 25490, 25943, 26479, 30403, 29260, 32972, 32954, 36649, + 37197, 20493, 22521, 23186, 26757, 26995, 29028, 29437, 36023, 22770, + 36064, 38506, 36889, 34687, 31204, 30695, 33833, 20271, 21093, 21338, + 25293, 26575, 27850, 30333, 31636, 31893, 33334, 34180, 36843, 26333, + 28448, 29190, 32283, 33707, 39361, 40614, 20989, 31665, 30834, 31672, + 32903, 31560, 27368, 24161, 32908, 30033, 30048, 20843, 37474, 28300, + 30330, 37271, 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, + 22617, 34532, 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, + 26001, 26495, 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, + 34281, 36009, 31684, 37318, 29033, 38930, 39151, 25405, 26217, 30058, + 30436, 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, + 24754, 25161, 25209, 25259, 26000, 27604, 27852, 30130, 30382, 30865, + 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, 38750, 39131, + 27147, 31800, 20633, 23614, 24494, 26503, 27608, 29749, 30473, 32654, + 40763, 26570, 31255, 21305, 30091, 39661, 24422, 33181, 33777, 32920, + 24380, 24517, 30050, 31558, 36924, 26727, 23019, 23195, 32016, 30334, + 35628, 20469, 24426, 27161, 27703, 28418, 29922, 31080, 34920, 35413, + 35961, 24287, 25551, 30149, 31186, 33495, 37672, 37618, 33948, 34541, + 39981, 21697, 24428, 25996, 27996, 28693, 36007, 36051, 38971, 25935, + 29942, 19981, 20184, 22496, 22827, 23142, 23500, 20904, 24067, 24220, + 24598, 25206, 25975, 26023, 26222, 28014, 29238, 31526, 33104, 33178, + 33433, 35676, 36000, 36070, 36212, 38428, 38468, 20398, 25771, 27494, + 33310, 33889, 34154, 37096, 23553, 26963, 39080, 33914, 34135, 20239, + 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, + 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, + 25198, 28954, 22894, 31881, 31966, 32027, 38640, 25991, 32862, 19993, + 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, 38281, + 38491, 31859, 38913, 20731, 22721, 30294, 30887, 21029, 30629, 34065, + 31622, 20559, 22793, 29255, 31687, 32232, 36794, 36820, 36941, 20415, + 21193, 23081, 24321, 38829, 20445, 33303, 37610, 22275, 25429, 27497, + 29995, 35036, 36628, 31298, 21215, 22675, 24917, 25098, 26286, 27597, + 31807, 33769, 20515, 20472, 21253, 21574, 22577, 22857, 23453, 23792, + 23791, 23849, 24214, 25265, 25447, 25918, 26041, 26379, 27861, 27873, + 28921, 30770, 32299, 32990, 33459, 33804, 34028, 34562, 35090, 35370, + 35914, 37030, 37586, 39165, 40179, 40300, 20047, 20129, 20621, 21078, + 22346, 22952, 24125, 24536, 24537, 25151, 26292, 26395, 26576, 26834, + 20882, 32033, 32938, 33192, 35584, 35980, 36031, 37502, 38450, 21536, + 38956, 21271, 20693, 21340, 22696, 25778, 26420, 29287, 30566, 31302, + 37350, 21187, 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, + 30406, 25705, 30952, 39764, 40635, 22475, 22969, 26151, 26522, 27598, + 21737, 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, + 20451, 21448, 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, + 24930, 28288, 28459, 34067, 21619, 26410, 39749, 24051, 31637, 23724, + 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, 27665, 30496, + 21209, 22818, 28961, 29279, 30683, 38695, 40289, 26891, 23167, 23064, + 20901, 21517, 21629, 26126, 30431, 36855, 37528, 40180, 23018, 29277, + 28357, 20813, 26825, 32191, 32236, 38754, 40634, 25720, 27169, 33538, + 22916, 23391, 27611, 29467, 30450, 32178, 32791, 33945, 20786, 26408, + 40665, 30446, 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, + 24758, 32011, 38272, 21249, 20063, 20918, 22812, 29242, 32822, 37326, + 24357, 30690, 21380, 24441, 32004, 34220, 35379, 36493, 38742, 26611, + 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, 21807, 20305, + 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, 26377, 26586, + 28263, 28044, 29494, 29495, 30001, 31056, 35029, 35480, 36938, 37009, + 37109, 38596, 34701, 22805, 20104, 20313, 19982, 35465, 36671, 38928, + 20653, 24188, 22934, 23481, 24248, 25562, 25594, 25793, 26332, 26954, + 27096, 27915, 28342, 29076, 29992, 31407, 32650, 32768, 33865, 33993, + 35201, 35617, 36362, 36965, 38525, 39178, 24958, 25233, 27442, 27779, + 28020, 32716, 32764, 28096, 32645, 34746, 35064, 26469, 33713, 38972, + 38647, 27931, 32097, 33853, 37226, 20081, 21365, 23888, 27396, 28651, + 34253, 34349, 35239, 21033, 21519, 23653, 26446, 26792, 29702, 29827, + 30178, 35023, 35041, 37324, 38626, 38520, 24459, 29575, 31435, 33870, + 25504, 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, + 31452, 40845, 20406, 24942, 26053, 34396, 20102, 20142, 20698, 20001, + 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, 31260, 31975, + 33391, 35538, 36988, 37327, 38517, 38936, 21147, 32209, 20523, 21400, + 26519, 28107, 29136, 29747, 33256, 36650, 38563, 40023, 40607, 29792, + 22593, 28057, 32047, 39006, 20196, 20278, 20363, 20919, 21169, 23994, + 24604, 29618, 31036, 33491, 37428, 38583, 38646, 38666, 40599, 40802, + 26278, 27508, 21015, 21155, 28872, 35010, 24265, 24651, 24976, 28451, + 29001, 31806, 32244, 32879, 34030, 36899, 37676, 21570, 39791, 27347, + 28809, 36034, 36335, 38706, 21172, 23105, 24266, 24324, 26391, 27004, + 27028, 28010, 28431, 29282, 29436, 31725, 32769, 32894, 34635, 37070, + 20845, 40595, 31108, 32907, 37682, 35542, 20525, 21644, 35441, 27498, + 36036, 33031, 24785, 26528, 40434, 20121, 20120, 39952, 35435, 34241, + 34152, 26880, 28286, 30871, 33109, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24332, 19984, + 19989, 20010, 20017, 20022, 20028, 20031, 20034, 20054, 20056, 20098, + 20101, 35947, 20106, 33298, 24333, 20110, 20126, 20127, 20128, 20130, + 20144, 20147, 20150, 20174, 20173, 20164, 20166, 20162, 20183, 20190, + 20205, 20191, 20215, 20233, 20314, 20272, 20315, 20317, 20311, 20295, + 20342, 20360, 20367, 20376, 20347, 20329, 20336, 20369, 20335, 20358, + 20374, 20760, 20436, 20447, 20430, 20440, 20443, 20433, 20442, 20432, + 20452, 20453, 20506, 20520, 20500, 20522, 20517, 20485, 20252, 20470, + 20513, 20521, 20524, 20478, 20463, 20497, 20486, 20547, 20551, 26371, + 20565, 20560, 20552, 20570, 20566, 20588, 20600, 20608, 20634, 20613, + 20660, 20658, 20681, 20682, 20659, 20674, 20694, 20702, 20709, 20717, + 20707, 20718, 20729, 20725, 20745, 20737, 20738, 20758, 20757, 20756, + 20762, 20769, 20794, 20791, 20796, 20795, 20799, 20800, 20818, 20812, + 20820, 20834, 31480, 20841, 20842, 20846, 20864, 20866, 22232, 20876, + 20873, 20879, 20881, 20883, 20885, 20886, 20900, 20902, 20898, 20905, + 20906, 20907, 20915, 20913, 20914, 20912, 20917, 20925, 20933, 20937, + 20955, 20960, 34389, 20969, 20973, 20976, 20981, 20990, 20996, 21003, + 21012, 21006, 21031, 21034, 21038, 21043, 21049, 21071, 21060, 21067, + 21068, 21086, 21076, 21098, 21108, 21097, 21107, 21119, 21117, 21133, + 21140, 21138, 21105, 21128, 21137, 36776, 36775, 21164, 21165, 21180, + 21173, 21185, 21197, 21207, 21214, 21219, 21222, 39149, 21216, 21235, + 21237, 21240, 21241, 21254, 21256, 30008, 21261, 21264, 21263, 21269, + 21274, 21283, 21295, 21297, 21299, 21304, 21312, 21318, 21317, 19991, + 21321, 21325, 20950, 21342, 21353, 21358, 22808, 21371, 21367, 21378, + 21398, 21408, 21414, 21413, 21422, 21424, 21430, 21443, 31762, 38617, + 21471, 26364, 29166, 21486, 21480, 21485, 21498, 21505, 21565, 21568, + 21548, 21549, 21564, 21550, 21558, 21545, 21533, 21582, 21647, 21621, + 21646, 21599, 21617, 21623, 21616, 21650, 21627, 21632, 21622, 21636, + 21648, 21638, 21703, 21666, 21688, 21669, 21676, 21700, 21704, 21672, + 21675, 21698, 21668, 21694, 21692, 21720, 21733, 21734, 21775, 21780, + 21757, 21742, 21741, 21754, 21730, 21817, 21824, 21859, 21836, 21806, + 21852, 21829, 21846, 21847, 21816, 21811, 21853, 21913, 21888, 21679, + 21898, 21919, 21883, 21886, 21912, 21918, 21934, 21884, 21891, 21929, + 21895, 21928, 21978, 21957, 21983, 21956, 21980, 21988, 21972, 22036, + 22007, 22038, 22014, 22013, 22043, 22009, 22094, 22096, 29151, 22068, + 22070, 22066, 22072, 22123, 22116, 22063, 22124, 22122, 22150, 22144, + 22154, 22176, 22164, 22159, 22181, 22190, 22198, 22196, 22210, 22204, + 22209, 22211, 22208, 22216, 22222, 22225, 22227, 22231, 22254, 22265, + 22272, 22271, 22276, 22281, 22280, 22283, 22285, 22291, 22296, 22294, + 21959, 22300, 22310, 22327, 22328, 22350, 22331, 22336, 22351, 22377, + 22464, 22408, 22369, 22399, 22409, 22419, 22432, 22451, 22436, 22442, + 22448, 22467, 22470, 22484, 22482, 22483, 22538, 22486, 22499, 22539, + 22553, 22557, 22642, 22561, 22626, 22603, 22640, 27584, 22610, 22589, + 22649, 22661, 22713, 22687, 22699, 22714, 22750, 22715, 22712, 22702, + 22725, 22739, 22737, 22743, 22745, 22744, 22757, 22748, 22756, 22751, + 22767, 22778, 22777, 22779, 22780, 22781, 22786, 22794, 22800, 22811, + 26790, 22821, 22828, 22829, 22834, 22840, 22846, 31442, 22869, 22864, + 22862, 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, + 22941, 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, 23001, + 23002, 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, + 23093, 23094, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, + 23267, 23255, 23270, 23273, 23254, 23290, 23291, 23308, 23307, 23318, + 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, + 23386, 23387, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, + 23424, 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, 23524, + 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, 23559, + 23560, 23565, 23571, 23584, 23586, 23592, 23608, 23609, 23617, 23622, + 23630, 23635, 23632, 23631, 23409, 23660, 23662, 20066, 23670, 23673, + 23692, 23697, 23700, 22939, 23723, 23739, 23734, 23740, 23735, 23749, + 23742, 23751, 23769, 23785, 23805, 23802, 23789, 23948, 23786, 23819, + 23829, 23831, 23900, 23839, 23835, 23825, 23828, 23842, 23834, 23833, + 23832, 23884, 23890, 23886, 23883, 23916, 23923, 23926, 23943, 23940, + 23938, 23970, 23965, 23980, 23982, 23997, 23952, 23991, 23996, 24009, + 24013, 24019, 24018, 24022, 24027, 24043, 24050, 24053, 24075, 24090, + 24089, 24081, 24091, 24118, 24119, 24132, 24131, 24128, 24142, 24151, + 24148, 24159, 24162, 24164, 24135, 24181, 24182, 24186, 40636, 24191, + 24224, 24257, 24258, 24264, 24272, 24271, 24278, 24291, 24285, 24282, + 24283, 24290, 24289, 24296, 24297, 24300, 24305, 24307, 24304, 24308, + 24312, 24318, 24323, 24329, 24413, 24412, 24331, 24337, 24342, 24361, + 24365, 24376, 24385, 24392, 24396, 24398, 24367, 24401, 24406, 24407, + 24409, 24417, 24429, 24435, 24439, 24451, 24450, 24447, 24458, 24456, + 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, 24534, + 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, 24601, + 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, 24634, + 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, 24643, + 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, 24730, + 24708, 24731, 24726, 24727, 24722, 24743, 24715, 24801, 24760, 24800, + 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, 24838, + 24822, 24823, 24832, 24820, 24826, 24835, 24865, 24827, 24817, 24845, + 24846, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, 24884, + 24893, 24898, 24900, 24947, 24951, 24920, 24921, 24922, 24939, 24948, + 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, + 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, + 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, + 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, 25096, 25097, + 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, 25138, + 25139, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, 25218, + 25225, 25214, 25234, 25235, 25238, 25300, 25219, 25236, 25303, 25297, + 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, 25282, + 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, 25327, + 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, 25515, + 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, 25577, + 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, 25606, + 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, 25718, + 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, 25810, + 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, 25824, 25825, + 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, 25856, 25853, + 25880, 25884, 25861, 25892, 25891, 25899, 25908, 25909, 25911, 25910, + 25912, 30027, 25928, 25942, 25941, 25933, 25944, 25950, 25949, 25970, + 25976, 25986, 25987, 35722, 26011, 26015, 26027, 26039, 26051, 26054, + 26049, 26052, 26060, 26066, 26075, 26073, 26080, 26081, 26097, 26482, + 26122, 26115, 26107, 26483, 26165, 26166, 26164, 26140, 26191, 26180, + 26185, 26177, 26206, 26205, 26212, 26215, 26216, 26207, 26210, 26224, + 26243, 26248, 26254, 26249, 26244, 26264, 26269, 26305, 26297, 26313, + 26302, 26300, 26308, 26296, 26326, 26330, 26336, 26175, 26342, 26345, + 26352, 26357, 26359, 26383, 26390, 26398, 26406, 26407, 38712, 26414, + 26431, 26422, 26433, 26424, 26423, 26438, 26462, 26464, 26457, 26467, + 26468, 26505, 26480, 26537, 26492, 26474, 26508, 26507, 26534, 26529, + 26501, 26551, 26607, 26548, 26604, 26547, 26601, 26552, 26596, 26590, + 26589, 26594, 26606, 26553, 26574, 26566, 26599, 27292, 26654, 26694, + 26665, 26688, 26701, 26674, 26702, 26803, 26667, 26713, 26723, 26743, + 26751, 26783, 26767, 26797, 26772, 26781, 26779, 26755, 27310, 26809, + 26740, 26805, 26784, 26810, 26895, 26765, 26750, 26881, 26826, 26888, + 26840, 26914, 26918, 26849, 26892, 26829, 26836, 26855, 26837, 26934, + 26898, 26884, 26839, 26851, 26917, 26873, 26848, 26863, 26920, 26922, + 26906, 26915, 26913, 26822, 27001, 26999, 26972, 27000, 26987, 26964, + 27006, 26990, 26937, 26996, 26941, 26969, 26928, 26977, 26974, 26973, + 27009, 26986, 27058, 27054, 27088, 27071, 27073, 27091, 27070, 27086, + 23528, 27082, 27101, 27067, 27075, 27047, 27182, 27025, 27040, 27036, + 27029, 27060, 27102, 27112, 27138, 27163, 27135, 27402, 27129, 27122, + 27111, 27141, 27057, 27166, 27117, 27156, 27115, 27146, 27154, 27329, + 27171, 27155, 27204, 27148, 27250, 27190, 27256, 27207, 27234, 27225, + 27238, 27208, 27192, 27170, 27280, 27277, 27296, 27268, 27298, 27299, + 27287, 34327, 27323, 27331, 27330, 27320, 27315, 27308, 27358, 27345, + 27359, 27306, 27354, 27370, 27387, 27397, 34326, 27386, 27410, 27414, + 39729, 27423, 27448, 27447, 30428, 27449, 39150, 27463, 27459, 27465, + 27472, 27481, 27476, 27483, 27487, 27489, 27512, 27513, 27519, 27520, + 27524, 27523, 27533, 27544, 27541, 27550, 27556, 27562, 27563, 27567, + 27570, 27569, 27571, 27575, 27580, 27590, 27595, 27603, 27615, 27628, + 27627, 27635, 27631, 40638, 27656, 27667, 27668, 27675, 27684, 27683, + 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, 27774, + 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, 27845, + 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, 27935, + 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, 27916, + 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, 28037, + 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, 28126, + 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, 28142, + 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, 28203, + 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, 28216, + 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, 28338, + 28372, 28373, 28303, 28325, 28354, 28319, 28481, 28433, 28748, 28396, + 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, 28435, + 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, 28525, + 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, 28577, + 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, 28657, + 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, 28699, + 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, 28771, + 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, 28875, + 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, 29030, + 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, 29100, + 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, 29159, + 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, 29228, + 29232, 29234, 29243, 29244, 29247, 29248, 29254, 29259, 29272, 29300, + 29310, 29314, 29313, 29319, 29330, 29334, 29346, 29351, 29369, 29362, + 29379, 29382, 29380, 29390, 29394, 29410, 29408, 29409, 29433, 29431, + 20495, 29463, 29450, 29468, 29462, 29469, 29492, 29487, 29481, 29477, + 29502, 29518, 29519, 40664, 29527, 29546, 29544, 29552, 29560, 29557, + 29563, 29562, 29640, 29619, 29646, 29627, 29632, 29669, 29678, 29662, + 29858, 29701, 29807, 29733, 29688, 29746, 29754, 29781, 29759, 29791, + 29785, 29761, 29788, 29801, 29808, 29795, 29802, 29814, 29822, 29835, + 29854, 29863, 29898, 29903, 29908, 29681, 29920, 29923, 29927, 29929, + 29934, 29938, 29936, 29937, 29944, 29943, 29956, 29955, 29957, 29964, + 29966, 29965, 29973, 29971, 29982, 29990, 29996, 30012, 30020, 30029, + 30026, 30025, 30043, 30022, 30042, 30057, 30052, 30055, 30059, 30061, + 30072, 30070, 30086, 30087, 30068, 30090, 30089, 30082, 30100, 30106, + 30109, 30117, 30115, 30146, 30131, 30147, 30133, 30141, 30136, 30140, + 30129, 30157, 30154, 30162, 30169, 30179, 30174, 30206, 30207, 30204, + 30209, 30192, 30202, 30194, 30195, 30219, 30221, 30217, 30239, 30247, + 30240, 30241, 30242, 30244, 30260, 30256, 30267, 30279, 30280, 30278, + 30300, 30296, 30305, 30306, 30312, 30313, 30314, 30311, 30316, 30320, + 30322, 30326, 30328, 30332, 30336, 30339, 30344, 30347, 30350, 30358, + 30355, 30361, 30362, 30384, 30388, 30392, 30393, 30394, 30402, 30413, + 30422, 30418, 30430, 30433, 30437, 30439, 30442, 34351, 30459, 30472, + 30471, 30468, 30505, 30500, 30494, 30501, 30502, 30491, 30519, 30520, + 30535, 30554, 30568, 30571, 30555, 30565, 30591, 30590, 30585, 30606, + 30603, 30609, 30624, 30622, 30640, 30646, 30649, 30655, 30652, 30653, + 30651, 30663, 30669, 30679, 30682, 30684, 30691, 30702, 30716, 30732, + 30738, 31014, 30752, 31018, 30789, 30862, 30836, 30854, 30844, 30874, + 30860, 30883, 30901, 30890, 30895, 30929, 30918, 30923, 30932, 30910, + 30908, 30917, 30922, 30956, 30951, 30938, 30973, 30964, 30983, 30994, + 30993, 31001, 31020, 31019, 31040, 31072, 31063, 31071, 31066, 31061, + 31059, 31098, 31103, 31114, 31133, 31143, 40779, 31146, 31150, 31155, + 31161, 31162, 31177, 31189, 31207, 31212, 31201, 31203, 31240, 31245, + 31256, 31257, 31264, 31263, 31104, 31281, 31291, 31294, 31287, 31299, + 31319, 31305, 31329, 31330, 31337, 40861, 31344, 31353, 31357, 31368, + 31383, 31381, 31384, 31382, 31401, 31432, 31408, 31414, 31429, 31428, + 31423, 36995, 31431, 31434, 31437, 31439, 31445, 31443, 31449, 31450, + 31453, 31457, 31458, 31462, 31469, 31472, 31490, 31503, 31498, 31494, + 31539, 31512, 31513, 31518, 31541, 31528, 31542, 31568, 31610, 31492, + 31565, 31499, 31564, 31557, 31605, 31589, 31604, 31591, 31600, 31601, + 31596, 31598, 31645, 31640, 31647, 31629, 31644, 31642, 31627, 31634, + 31631, 31581, 31641, 31691, 31681, 31692, 31695, 31668, 31686, 31709, + 31721, 31761, 31764, 31718, 31717, 31840, 31744, 31751, 31763, 31731, + 31735, 31767, 31757, 31734, 31779, 31783, 31786, 31775, 31799, 31787, + 31805, 31820, 31811, 31828, 31823, 31808, 31824, 31832, 31839, 31844, + 31830, 31845, 31852, 31861, 31875, 31888, 31908, 31917, 31906, 31915, + 31905, 31912, 31923, 31922, 31921, 31918, 31929, 31933, 31936, 31941, + 31938, 31960, 31954, 31964, 31970, 39739, 31983, 31986, 31988, 31990, + 31994, 32006, 32002, 32028, 32021, 32010, 32069, 32075, 32046, 32050, + 32063, 32053, 32070, 32115, 32086, 32078, 32114, 32104, 32110, 32079, + 32099, 32147, 32137, 32091, 32143, 32125, 32155, 32186, 32174, 32163, + 32181, 32199, 32189, 32171, 32317, 32162, 32175, 32220, 32184, 32159, + 32176, 32216, 32221, 32228, 32222, 32251, 32242, 32225, 32261, 32266, + 32291, 32289, 32274, 32305, 32287, 32265, 32267, 32290, 32326, 32358, + 32315, 32309, 32313, 32323, 32311, 32306, 32314, 32359, 32349, 32342, + 32350, 32345, 32346, 32377, 32362, 32361, 32380, 32379, 32387, 32213, + 32381, 36782, 32383, 32392, 32393, 32396, 32402, 32400, 32403, 32404, + 32406, 32398, 32411, 32412, 32568, 32570, 32581, 32588, 32589, 32590, + 32592, 32593, 32597, 32596, 32600, 32607, 32608, 32616, 32617, 32615, + 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, 32669, + 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, 32709, + 32710, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, 39132, + 32774, 32772, 32779, 32786, 32792, 32793, 32796, 32801, 32808, 32831, + 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, 32872, 32883, + 32882, 32880, 32886, 32889, 32893, 32895, 32900, 32902, 32901, 32923, + 32915, 32922, 32941, 20880, 32940, 32987, 32997, 32985, 32989, 32964, + 32986, 32982, 33033, 33007, 33009, 33051, 33065, 33059, 33071, 33099, + 38539, 33094, 33086, 33107, 33105, 33020, 33137, 33134, 33125, 33126, + 33140, 33155, 33160, 33162, 33152, 33154, 33184, 33173, 33188, 33187, + 33119, 33171, 33193, 33200, 33205, 33214, 33208, 33213, 33216, 33218, + 33210, 33225, 33229, 33233, 33241, 33240, 33224, 33242, 33247, 33248, + 33255, 33274, 33275, 33278, 33281, 33282, 33285, 33287, 33290, 33293, + 33296, 33302, 33321, 33323, 33336, 33331, 33344, 33369, 33368, 33373, + 33370, 33375, 33380, 33378, 33384, 33386, 33387, 33326, 33393, 33399, + 33400, 33406, 33421, 33426, 33451, 33439, 33467, 33452, 33505, 33507, + 33503, 33490, 33524, 33523, 33530, 33683, 33539, 33531, 33529, 33502, + 33542, 33500, 33545, 33497, 33589, 33588, 33558, 33586, 33585, 33600, + 33593, 33616, 33605, 33583, 33579, 33559, 33560, 33669, 33690, 33706, + 33695, 33698, 33686, 33571, 33678, 33671, 33674, 33660, 33717, 33651, + 33653, 33696, 33673, 33704, 33780, 33811, 33771, 33742, 33789, 33795, + 33752, 33803, 33729, 33783, 33799, 33760, 33778, 33805, 33826, 33824, + 33725, 33848, 34054, 33787, 33901, 33834, 33852, 34138, 33924, 33911, + 33899, 33965, 33902, 33922, 33897, 33862, 33836, 33903, 33913, 33845, + 33994, 33890, 33977, 33983, 33951, 34009, 33997, 33979, 34010, 34000, + 33985, 33990, 34006, 33953, 34081, 34047, 34036, 34071, 34072, 34092, + 34079, 34069, 34068, 34044, 34112, 34147, 34136, 34120, 34113, 34306, + 34123, 34133, 34176, 34212, 34184, 34193, 34186, 34216, 34157, 34196, + 34203, 34282, 34183, 34204, 34167, 34174, 34192, 34249, 34234, 34255, + 34233, 34256, 34261, 34269, 34277, 34268, 34297, 34314, 34323, 34315, + 34302, 34298, 34310, 34338, 34330, 34352, 34367, 34381, 20053, 34388, + 34399, 34407, 34417, 34451, 34467, 34473, 34474, 34443, 34444, 34486, + 34479, 34500, 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, + 34540, 34527, 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, + 34577, 34569, 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, + 34601, 34586, 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, + 34670, 34649, 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, + 34763, 34749, 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, + 34747, 34799, 34802, 34784, 34831, 34829, 34814, 34806, 34807, 34830, + 34770, 34833, 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, + 34875, 34884, 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, + 34974, 34933, 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, + 34978, 34957, 34980, 34992, 35007, 34993, 35011, 35012, 35028, 35032, + 35033, 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, + 35082, 35091, 35139, 35102, 35109, 35114, 35115, 35137, 35140, 35131, + 35126, 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, + 35183, 35188, 35191, 35198, 35203, 35208, 35210, 35219, 35224, 35233, + 35241, 35238, 35244, 35247, 35250, 35258, 35261, 35263, 35264, 35290, + 35292, 35293, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, + 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, + 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, 35493, 35494, + 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, + 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, + 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, + 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, + 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, 35730, 35731, + 35734, 35737, 35738, 35898, 35905, 35903, 35912, 35916, 35918, 35920, + 35925, 35938, 35948, 35960, 35962, 35970, 35977, 35973, 35978, 35981, + 35982, 35988, 35964, 35992, 25117, 36013, 36010, 36029, 36018, 36019, + 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, 36090, 36091, + 36100, 36101, 36106, 36103, 36111, 36109, 36112, 40782, 36115, 36045, + 36116, 36118, 36199, 36205, 36209, 36211, 36225, 36249, 36290, 36286, + 36282, 36303, 36314, 36310, 36300, 36315, 36299, 36330, 36331, 36319, + 36323, 36348, 36360, 36361, 36351, 36381, 36382, 36368, 36383, 36418, + 36405, 36400, 36404, 36426, 36423, 36425, 36428, 36432, 36424, 36441, + 36452, 36448, 36394, 36451, 36437, 36470, 36466, 36476, 36481, 36487, + 36485, 36484, 36491, 36490, 36499, 36497, 36500, 36505, 36522, 36513, + 36524, 36528, 36550, 36529, 36542, 36549, 36552, 36555, 36571, 36579, + 36604, 36603, 36587, 36606, 36618, 36613, 36629, 36626, 36633, 36627, + 36636, 36639, 36635, 36620, 36646, 36659, 36667, 36665, 36677, 36674, + 36670, 36684, 36681, 36678, 36686, 36695, 36700, 36706, 36707, 36708, + 36764, 36767, 36771, 36781, 36783, 36791, 36826, 36837, 36834, 36842, + 36847, 36999, 36852, 36869, 36857, 36858, 36881, 36885, 36897, 36877, + 36894, 36886, 36875, 36903, 36918, 36917, 36921, 36856, 36943, 36944, + 36945, 36946, 36878, 36937, 36926, 36950, 36952, 36958, 36968, 36975, + 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, 37001, 37007, + 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, 37122, 37138, + 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, 37225, 37235, + 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, 37301, 37300, + 37306, 37312, 37313, 37321, 37323, 37328, 37334, 37343, 37345, 37339, + 37372, 37365, 37366, 37406, 37375, 37396, 37420, 37397, 37393, 37470, + 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, 37456, 37532, + 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, 37647, 37626, + 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, 37691, 37724, + 37728, 37756, 37742, 37718, 37808, 37804, 37805, 37780, 37817, 37846, + 37847, 37864, 37861, 37848, 37827, 37853, 37840, 37832, 37860, 37914, + 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, 37921, 37946, + 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, 37417, 38000, + 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, 38274, 38279, + 38282, 38292, 38294, 38296, 38297, 38304, 38312, 38311, 38317, 38332, + 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, 38357, 38356, + 38358, 38364, 38369, 38373, 38370, 38433, 38440, 38446, 38447, 38466, + 38476, 38479, 38475, 38519, 38492, 38494, 38493, 38495, 38502, 38514, + 38508, 38541, 38552, 38549, 38551, 38570, 38567, 38577, 38578, 38576, + 38580, 38582, 38584, 38585, 38606, 38603, 38601, 38605, 35149, 38620, + 38669, 38613, 38649, 38660, 38662, 38664, 38675, 38670, 38673, 38671, + 38678, 38681, 38692, 38698, 38704, 38713, 38717, 38718, 38724, 38726, + 38728, 38722, 38729, 38748, 38752, 38756, 38758, 38760, 21202, 38763, + 38769, 38777, 38789, 38780, 38785, 38778, 38790, 38795, 38799, 38800, + 38812, 38824, 38822, 38819, 38835, 38836, 38851, 38854, 38856, 38859, + 38876, 38893, 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, + 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, 39023, 39024, + 39025, 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, + 39145, 39147, 39171, 39177, 39186, 39188, 39192, 39201, 39197, 39198, + 39204, 39200, 39212, 39214, 39229, 39230, 39234, 39241, 39237, 39248, + 39243, 39249, 39250, 39244, 39253, 39319, 39320, 39333, 39341, 39342, + 39356, 39391, 39387, 39389, 39384, 39377, 39405, 39406, 39409, 39410, + 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, 39479, 39493, + 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, 39519, 39522, + 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, 39616, 39631, + 39633, 39635, 39636, 39646, 39647, 39650, 39651, 39654, 39663, 39659, + 39662, 39668, 39665, 39671, 39675, 39686, 39704, 39706, 39711, 39714, + 39715, 39717, 39719, 39720, 39721, 39722, 39726, 39727, 39730, 39748, + 39747, 39759, 39757, 39758, 39761, 39768, 39796, 39827, 39811, 39825, + 39830, 39831, 39839, 39840, 39848, 39860, 39872, 39882, 39865, 39878, + 39887, 39889, 39890, 39907, 39906, 39908, 39892, 39905, 39994, 39922, + 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, 39954, + 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, 39986, + 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, 40176, + 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, 40223, + 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, 40285, 40286, + 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, 40303, 40314, + 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, 40378, 40390, + 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, 40445, 40474, + 40475, 40478, 40565, 40569, 40573, 40577, 40584, 40587, 40588, 40594, + 40597, 40593, 40605, 40613, 40617, 40632, 40618, 40621, 38753, 40652, + 40654, 40655, 40656, 40660, 40668, 40670, 40669, 40672, 40677, 40680, + 40687, 40692, 40694, 40695, 40697, 40699, 40700, 40701, 40711, 40712, + 30391, 40725, 40737, 40748, 40766, 40778, 40786, 40788, 40803, 40799, + 40800, 40801, 40806, 40807, 40812, 40810, 40823, 40818, 40822, 40853, + 40860, 40864, 22575, 27079, 36953, 29796, 20956, 29081, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 32394, 35100, 37704, 37512, 34012, 20425, 28859, 26161, + 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, 20227, 20281, + 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, 20479, 20510, + 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, 20893, 20926, + 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, 21284, 21362, + 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, 21894, 22361, + 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, 22795, 22867, + 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, 23512, 23532, + 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, 23917, 23992, + 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, 24709, 24714, + 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, 25107, 25254, + 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, 26121, 26158, + 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, 26290, + 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, 26625, 26692, + 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, + 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, + 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, + 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, + 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, 29182, 29361, + 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, + 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, 29953, 30063, + 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, + 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, 31131, 31441, + 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, 32160, 32214, + 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, 33782, 33864, + 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, 34823, 35061, + 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, 35667, 35711, + 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, 36967, 37086, + 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, 37348, 37349, + 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, 37457, 37433, + 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, 64039, 37589, + 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, 37661, 37634, + 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, 37960, 38290, + 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, 38735, 38737, + 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, 39502, 39641, + 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, 40299, 64045, + 40473, 40657, 0x0000, 0x0000, 8560, 8561, 8562, 8563, 8564, 8565, + 8566, 8567, 8568, 8569, 65506, 65508, 65287, 65282, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 65506, 65508, 65287, 65282, + 12849, 8470, 8481, 8757, 32394, 35100, 37704, 37512, 34012, 20425, + 28859, 26161, 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, + 20227, 20281, 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, + 20479, 20510, 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, + 20893, 20926, 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, + 21284, 21362, 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, + 21894, 22361, 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, + 22795, 22867, 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, + 23512, 23532, 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, + 23917, 23992, 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, + 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, + 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, + 26121, 26158, 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, + 26272, 26290, 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, + 26625, 26692, 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, + 27206, 27251, 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, + 27866, 27908, 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, + 28217, 28252, 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, + 28712, 28805, 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, + 29182, 29361, 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, + 29650, 29703, 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, + 29953, 30063, 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, + 30753, 30798, 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, + 31131, 31441, 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, + 32160, 32214, 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, + 33782, 33864, 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, + 34823, 35061, 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, + 35667, 35711, 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, + 36967, 37086, 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, + 37348, 37349, 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, + 37457, 37433, 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, + 64039, 37589, 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, + 37661, 37634, 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, + 37960, 38290, 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, + 38735, 38737, 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, + 39502, 39641, 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, + 40299, 64045, 40473, 40657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myhtml_encoding_map_jis0212[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 728, 711, + 184, 729, 733, 175, 731, 730, 65374, 900, 901, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 161, 166, 191, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 186, 170, + 169, 174, 8482, 164, 8470, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 902, 904, 905, 906, 938, 0x0000, + 908, 0x0000, 910, 939, 0x0000, 911, 0x0000, 0x0000, 0x0000, 0x0000, + 940, 941, 942, 943, 970, 912, 972, 962, 973, 971, + 944, 974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1026, 1027, 1028, + 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, 1039, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1106, 1107, 1108, 1109, 1110, + 1111, 1112, 1113, 1114, 1115, 1116, 1118, 1119, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 198, 272, 0x0000, 294, 0x0000, 306, 0x0000, 321, + 319, 0x0000, 330, 216, 338, 0x0000, 358, 222, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 230, 273, 240, 295, 305, 307, + 312, 322, 320, 329, 331, 248, 339, 223, 359, 254, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 193, 192, 196, 194, + 258, 461, 256, 260, 197, 195, 262, 264, 268, 199, + 266, 270, 201, 200, 203, 202, 282, 278, 274, 280, + 0x0000, 284, 286, 290, 288, 292, 205, 204, 207, 206, + 463, 304, 298, 302, 296, 308, 310, 313, 317, 315, + 323, 327, 325, 209, 211, 210, 214, 212, 465, 336, + 332, 213, 340, 344, 342, 346, 348, 352, 350, 356, + 354, 218, 217, 220, 219, 364, 467, 368, 362, 370, + 366, 360, 471, 475, 473, 469, 372, 221, 376, 374, + 377, 381, 379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 225, 224, 228, 226, 259, 462, 257, 261, 229, 227, + 263, 265, 269, 231, 267, 271, 233, 232, 235, 234, + 283, 279, 275, 281, 501, 285, 287, 0x0000, 289, 293, + 237, 236, 239, 238, 464, 0x0000, 299, 303, 297, 309, + 311, 314, 318, 316, 324, 328, 326, 241, 243, 242, + 246, 244, 466, 337, 333, 245, 341, 345, 343, 347, + 349, 353, 351, 357, 355, 250, 249, 252, 251, 365, + 468, 369, 363, 371, 367, 361, 472, 476, 474, 470, + 373, 253, 255, 375, 378, 382, 380, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 19970, 19972, 19973, 19980, 19986, 19999, 20003, 20004, 20008, 20011, + 20014, 20015, 20016, 20021, 20032, 20033, 20036, 20039, 20049, 20058, + 20060, 20067, 20072, 20073, 20084, 20085, 20089, 20095, 20109, 20118, + 20119, 20125, 20143, 20153, 20163, 20176, 20186, 20187, 20192, 20193, + 20194, 20200, 20207, 20209, 20211, 20213, 20221, 20222, 20223, 20224, + 20226, 20227, 20232, 20235, 20236, 20242, 20245, 20246, 20247, 20249, + 20270, 20273, 20320, 20275, 20277, 20279, 20281, 20283, 20286, 20288, + 20290, 20296, 20297, 20299, 20300, 20306, 20308, 20310, 20312, 20319, + 20323, 20330, 20332, 20334, 20337, 20343, 20344, 20345, 20346, 20349, + 20350, 20353, 20354, 20356, 20357, 20361, 20362, 20364, 20366, 20368, + 20370, 20371, 20372, 20375, 20377, 20378, 20382, 20383, 20402, 20407, + 20409, 20411, 20412, 20413, 20414, 20416, 20417, 20421, 20422, 20424, + 20425, 20427, 20428, 20429, 20431, 20434, 20444, 20448, 20450, 20464, + 20466, 20476, 20477, 20479, 20480, 20481, 20484, 20487, 20490, 20492, + 20494, 20496, 20499, 20503, 20504, 20507, 20508, 20509, 20510, 20514, + 20519, 20526, 20528, 20530, 20531, 20533, 20544, 20545, 20546, 20549, + 20550, 20554, 20556, 20558, 20561, 20562, 20563, 20567, 20569, 20575, + 20576, 20578, 20579, 20582, 20583, 20586, 20589, 20592, 20593, 20539, + 20609, 20611, 20612, 20614, 20618, 20622, 20623, 20624, 20626, 20627, + 20628, 20630, 20635, 20636, 20638, 20639, 20640, 20641, 20642, 20650, + 20655, 20656, 20665, 20666, 20669, 20672, 20675, 20676, 20679, 20684, + 20686, 20688, 20691, 20692, 20696, 20700, 20701, 20703, 20706, 20708, + 20710, 20712, 20713, 20719, 20721, 20726, 20730, 20734, 20739, 20742, + 20743, 20744, 20747, 20748, 20749, 20750, 20722, 20752, 20759, 20761, + 20763, 20764, 20765, 20766, 20771, 20775, 20776, 20780, 20781, 20783, + 20785, 20787, 20788, 20789, 20792, 20793, 20802, 20810, 20815, 20819, + 20821, 20823, 20824, 20831, 20836, 20838, 20862, 20867, 20868, 20875, + 20878, 20888, 20893, 20897, 20899, 20909, 20920, 20922, 20924, 20926, + 20927, 20930, 20936, 20943, 20945, 20946, 20947, 20949, 20952, 20958, + 20962, 20965, 20974, 20978, 20979, 20980, 20983, 20993, 20994, 20997, + 21010, 21011, 21013, 21014, 21016, 21026, 21032, 21041, 21042, 21045, + 21052, 21061, 21065, 21077, 21079, 21080, 21082, 21084, 21087, 21088, + 21089, 21094, 21102, 21111, 21112, 21113, 21120, 21122, 21125, 21130, + 21132, 21139, 21141, 21142, 21143, 21144, 21146, 21148, 21156, 21157, + 21158, 21159, 21167, 21168, 21174, 21175, 21176, 21178, 21179, 21181, + 21184, 21188, 21190, 21192, 21196, 21199, 21201, 21204, 21206, 21211, + 21212, 21217, 21221, 21224, 21225, 21226, 21228, 21232, 21233, 21236, + 21238, 21239, 21248, 21251, 21258, 21259, 21260, 21265, 21267, 21272, + 21275, 21276, 21278, 21279, 21285, 21287, 21288, 21289, 21291, 21292, + 21293, 21296, 21298, 21301, 21308, 21309, 21310, 21314, 21324, 21323, + 21337, 21339, 21345, 21347, 21349, 21356, 21357, 21362, 21369, 21374, + 21379, 21383, 21384, 21390, 21395, 21396, 21401, 21405, 21409, 21412, + 21418, 21419, 21423, 21426, 21428, 21429, 21431, 21432, 21434, 21437, + 21440, 21445, 21455, 21458, 21459, 21461, 21466, 21469, 21470, 21472, + 21478, 21479, 21493, 21506, 21523, 21530, 21537, 21543, 21544, 21546, + 21551, 21553, 21556, 21557, 21571, 21572, 21575, 21581, 21583, 21598, + 21602, 21604, 21606, 21607, 21609, 21611, 21613, 21614, 21620, 21631, + 21633, 21635, 21637, 21640, 21641, 21645, 21649, 21653, 21654, 21660, + 21663, 21665, 21670, 21671, 21673, 21674, 21677, 21678, 21681, 21687, + 21689, 21690, 21691, 21695, 21702, 21706, 21709, 21710, 21728, 21738, + 21740, 21743, 21750, 21756, 21758, 21759, 21760, 21761, 21765, 21768, + 21769, 21772, 21773, 21774, 21781, 21802, 21803, 21810, 21813, 21814, + 21819, 21820, 21821, 21825, 21831, 21833, 21834, 21837, 21840, 21841, + 21848, 21850, 21851, 21854, 21856, 21857, 21860, 21862, 21887, 21889, + 21890, 21894, 21896, 21902, 21903, 21905, 21906, 21907, 21908, 21911, + 21923, 21924, 21933, 21938, 21951, 21953, 21955, 21958, 21961, 21963, + 21964, 21966, 21969, 21970, 21971, 21975, 21976, 21979, 21982, 21986, + 21993, 22006, 22015, 22021, 22024, 22026, 22029, 22030, 22031, 22032, + 22033, 22034, 22041, 22060, 22064, 22067, 22069, 22071, 22073, 22075, + 22076, 22077, 22079, 22080, 22081, 22083, 22084, 22086, 22089, 22091, + 22093, 22095, 22100, 22110, 22112, 22113, 22114, 22115, 22118, 22121, + 22125, 22127, 22129, 22130, 22133, 22148, 22149, 22152, 22155, 22156, + 22165, 22169, 22170, 22173, 22174, 22175, 22182, 22183, 22184, 22185, + 22187, 22188, 22189, 22193, 22195, 22199, 22206, 22213, 22217, 22218, + 22219, 22223, 22224, 22220, 22221, 22233, 22236, 22237, 22239, 22241, + 22244, 22245, 22246, 22247, 22248, 22257, 22251, 22253, 22262, 22263, + 22273, 22274, 22279, 22282, 22284, 22289, 22293, 22298, 22299, 22301, + 22304, 22306, 22307, 22308, 22309, 22313, 22314, 22316, 22318, 22319, + 22323, 22324, 22333, 22334, 22335, 22341, 22342, 22348, 22349, 22354, + 22370, 22373, 22375, 22376, 22379, 22381, 22382, 22383, 22384, 22385, + 22387, 22388, 22389, 22391, 22393, 22394, 22395, 22396, 22398, 22401, + 22403, 22412, 22420, 22423, 22425, 22426, 22428, 22429, 22430, 22431, + 22433, 22421, 22439, 22440, 22441, 22444, 22456, 22461, 22471, 22472, + 22476, 22479, 22485, 22493, 22494, 22500, 22502, 22503, 22505, 22509, + 22512, 22517, 22518, 22520, 22525, 22526, 22527, 22531, 22532, 22536, + 22537, 22497, 22540, 22541, 22555, 22558, 22559, 22560, 22566, 22567, + 22573, 22578, 22585, 22591, 22601, 22604, 22605, 22607, 22608, 22613, + 22623, 22625, 22628, 22631, 22632, 22648, 22652, 22655, 22656, 22657, + 22663, 22664, 22665, 22666, 22668, 22669, 22671, 22672, 22676, 22678, + 22685, 22688, 22689, 22690, 22694, 22697, 22705, 22706, 22724, 22716, + 22722, 22728, 22733, 22734, 22736, 22738, 22740, 22742, 22746, 22749, + 22753, 22754, 22761, 22771, 22789, 22790, 22795, 22796, 22802, 22803, + 22804, 34369, 22813, 22817, 22819, 22820, 22824, 22831, 22832, 22835, + 22837, 22838, 22847, 22851, 22854, 22866, 22867, 22873, 22875, 22877, + 22878, 22879, 22881, 22883, 22891, 22893, 22895, 22898, 22901, 22902, + 22905, 22907, 22908, 22923, 22924, 22926, 22930, 22933, 22935, 22943, + 22948, 22951, 22957, 22958, 22959, 22960, 22963, 22967, 22970, 22972, + 22977, 22979, 22980, 22984, 22986, 22989, 22994, 23005, 23006, 23007, + 23011, 23012, 23015, 23022, 23023, 23025, 23026, 23028, 23031, 23040, + 23044, 23052, 23053, 23054, 23058, 23059, 23070, 23075, 23076, 23079, + 23080, 23082, 23085, 23088, 23108, 23109, 23111, 23112, 23116, 23120, + 23125, 23134, 23139, 23141, 23143, 23149, 23159, 23162, 23163, 23166, + 23179, 23184, 23187, 23190, 23193, 23196, 23198, 23199, 23200, 23202, + 23207, 23212, 23217, 23218, 23219, 23221, 23224, 23226, 23227, 23231, + 23236, 23238, 23240, 23247, 23258, 23260, 23264, 23269, 23274, 23278, + 23285, 23286, 23293, 23296, 23297, 23304, 23319, 23348, 23321, 23323, + 23325, 23329, 23333, 23341, 23352, 23361, 23371, 23372, 23378, 23382, + 23390, 23400, 23406, 23407, 23420, 23421, 23422, 23423, 23425, 23428, + 23430, 23434, 23438, 23440, 23441, 23443, 23444, 23446, 23464, 23465, + 23468, 23469, 23471, 23473, 23474, 23479, 23482, 23484, 23488, 23489, + 23501, 23503, 23510, 23511, 23512, 23513, 23514, 23520, 23535, 23537, + 23540, 23549, 23564, 23575, 23582, 23583, 23587, 23590, 23593, 23595, + 23596, 23598, 23600, 23602, 23605, 23606, 23641, 23642, 23644, 23650, + 23651, 23655, 23656, 23657, 23661, 23664, 23668, 23669, 23674, 23675, + 23676, 23677, 23687, 23688, 23690, 23695, 23698, 23709, 23711, 23712, + 23714, 23715, 23718, 23722, 23730, 23732, 23733, 23738, 23753, 23755, + 23762, 23773, 23767, 23790, 23793, 23794, 23796, 23809, 23814, 23821, + 23826, 23851, 23843, 23844, 23846, 23847, 23857, 23860, 23865, 23869, + 23871, 23874, 23875, 23878, 23880, 23893, 23889, 23897, 23882, 23903, + 23904, 23905, 23906, 23908, 23914, 23917, 23920, 23929, 23930, 23934, + 23935, 23937, 23939, 23944, 23946, 23954, 23955, 23956, 23957, 23961, + 23963, 23967, 23968, 23975, 23979, 23984, 23988, 23992, 23993, 24003, + 24007, 24011, 24016, 24014, 24024, 24025, 24032, 24036, 24041, 24056, + 24057, 24064, 24071, 24077, 24082, 24084, 24085, 24088, 24095, 24096, + 24110, 24104, 24114, 24117, 24126, 24139, 24144, 24137, 24145, 24150, + 24152, 24155, 24156, 24158, 24168, 24170, 24171, 24172, 24173, 24174, + 24176, 24192, 24203, 24206, 24226, 24228, 24229, 24232, 24234, 24236, + 24241, 24243, 24253, 24254, 24255, 24262, 24268, 24267, 24270, 24273, + 24274, 24276, 24277, 24284, 24286, 24293, 24299, 24322, 24326, 24327, + 24328, 24334, 24345, 24348, 24349, 24353, 24354, 24355, 24356, 24360, + 24363, 24364, 24366, 24368, 24372, 24374, 24379, 24381, 24383, 24384, + 24388, 24389, 24391, 24397, 24400, 24404, 24408, 24411, 24416, 24419, + 24420, 24423, 24431, 24434, 24436, 24437, 24440, 24442, 24445, 24446, + 24457, 24461, 24463, 24470, 24476, 24477, 24482, 24487, 24491, 24484, + 24492, 24495, 24496, 24497, 24504, 24516, 24519, 24520, 24521, 24523, + 24528, 24529, 24530, 24531, 24532, 24542, 24545, 24546, 24552, 24553, + 24554, 24556, 24557, 24558, 24559, 24562, 24563, 24566, 24570, 24572, + 24583, 24586, 24589, 24595, 24596, 24599, 24600, 24602, 24607, 24612, + 24621, 24627, 24629, 24640, 24647, 24648, 24649, 24652, 24657, 24660, + 24662, 24663, 24669, 24673, 24679, 24689, 24702, 24703, 24706, 24710, + 24712, 24714, 24718, 24721, 24723, 24725, 24728, 24733, 24734, 24738, + 24740, 24741, 24744, 24752, 24753, 24759, 24763, 24766, 24770, 24772, + 24776, 24777, 24778, 24779, 24782, 24783, 24788, 24789, 24793, 24795, + 24797, 24798, 24802, 24805, 24818, 24821, 24824, 24828, 24829, 24834, + 24839, 24842, 24844, 24848, 24849, 24850, 24851, 24852, 24854, 24855, + 24857, 24860, 24862, 24866, 24874, 24875, 24880, 24881, 24885, 24886, + 24887, 24889, 24897, 24901, 24902, 24905, 24926, 24928, 24940, 24946, + 24952, 24955, 24956, 24959, 24960, 24961, 24963, 24964, 24971, 24973, + 24978, 24979, 24983, 24984, 24988, 24989, 24991, 24992, 24997, 25000, + 25002, 25005, 25016, 25017, 25020, 25024, 25025, 25026, 25038, 25039, + 25045, 25052, 25053, 25054, 25055, 25057, 25058, 25063, 25065, 25061, + 25068, 25069, 25071, 25089, 25091, 25092, 25095, 25107, 25109, 25116, + 25120, 25122, 25123, 25127, 25129, 25131, 25145, 25149, 25154, 25155, + 25156, 25158, 25164, 25168, 25169, 25170, 25172, 25174, 25178, 25180, + 25188, 25197, 25199, 25203, 25210, 25213, 25229, 25230, 25231, 25232, + 25254, 25256, 25267, 25270, 25271, 25274, 25278, 25279, 25284, 25294, + 25301, 25302, 25306, 25322, 25330, 25332, 25340, 25341, 25347, 25348, + 25354, 25355, 25357, 25360, 25363, 25366, 25368, 25385, 25386, 25389, + 25397, 25398, 25401, 25404, 25409, 25410, 25411, 25412, 25414, 25418, + 25419, 25422, 25426, 25427, 25428, 25432, 25435, 25445, 25446, 25452, + 25453, 25457, 25460, 25461, 25464, 25468, 25469, 25471, 25474, 25476, + 25479, 25482, 25488, 25492, 25493, 25497, 25498, 25502, 25508, 25510, + 25517, 25518, 25519, 25533, 25537, 25541, 25544, 25550, 25553, 25555, + 25556, 25557, 25564, 25568, 25573, 25578, 25580, 25586, 25587, 25589, + 25592, 25593, 25609, 25610, 25616, 25618, 25620, 25624, 25630, 25632, + 25634, 25636, 25637, 25641, 25642, 25647, 25648, 25653, 25661, 25663, + 25675, 25679, 25681, 25682, 25683, 25684, 25690, 25691, 25692, 25693, + 25695, 25696, 25697, 25699, 25709, 25715, 25716, 25723, 25725, 25733, + 25735, 25743, 25744, 25745, 25752, 25753, 25755, 25757, 25759, 25761, + 25763, 25766, 25768, 25772, 25779, 25789, 25790, 25791, 25796, 25801, + 25802, 25803, 25804, 25806, 25808, 25809, 25813, 25815, 25828, 25829, + 25833, 25834, 25837, 25840, 25845, 25847, 25851, 25855, 25857, 25860, + 25864, 25865, 25866, 25871, 25875, 25876, 25878, 25881, 25883, 25886, + 25887, 25890, 25894, 25897, 25902, 25905, 25914, 25916, 25917, 25923, + 25927, 25929, 25936, 25938, 25940, 25951, 25952, 25959, 25963, 25978, + 25981, 25985, 25989, 25994, 26002, 26005, 26008, 26013, 26016, 26019, + 26022, 26030, 26034, 26035, 26036, 26047, 26050, 26056, 26057, 26062, + 26064, 26068, 26070, 26072, 26079, 26096, 26098, 26100, 26101, 26105, + 26110, 26111, 26112, 26116, 26120, 26121, 26125, 26129, 26130, 26133, + 26134, 26141, 26142, 26145, 26146, 26147, 26148, 26150, 26153, 26154, + 26155, 26156, 26158, 26160, 26161, 26163, 26169, 26167, 26176, 26181, + 26182, 26186, 26188, 26193, 26190, 26199, 26200, 26201, 26203, 26204, + 26208, 26209, 26363, 26218, 26219, 26220, 26238, 26227, 26229, 26239, + 26231, 26232, 26233, 26235, 26240, 26236, 26251, 26252, 26253, 26256, + 26258, 26265, 26266, 26267, 26268, 26271, 26272, 26276, 26285, 26289, + 26290, 26293, 26299, 26303, 26304, 26306, 26307, 26312, 26316, 26318, + 26319, 26324, 26331, 26335, 26344, 26347, 26348, 26350, 26362, 26373, + 26375, 26382, 26387, 26393, 26396, 26400, 26402, 26419, 26430, 26437, + 26439, 26440, 26444, 26452, 26453, 26461, 26470, 26476, 26478, 26484, + 26486, 26491, 26497, 26500, 26510, 26511, 26513, 26515, 26518, 26520, + 26521, 26523, 26544, 26545, 26546, 26549, 26555, 26556, 26557, 26617, + 26560, 26562, 26563, 26565, 26568, 26569, 26578, 26583, 26585, 26588, + 26593, 26598, 26608, 26610, 26614, 26615, 26706, 26644, 26649, 26653, + 26655, 26664, 26663, 26668, 26669, 26671, 26672, 26673, 26675, 26683, + 26687, 26692, 26693, 26698, 26700, 26709, 26711, 26712, 26715, 26731, + 26734, 26735, 26736, 26737, 26738, 26741, 26745, 26746, 26747, 26748, + 26754, 26756, 26758, 26760, 26774, 26776, 26778, 26780, 26785, 26787, + 26789, 26793, 26794, 26798, 26802, 26811, 26821, 26824, 26828, 26831, + 26832, 26833, 26835, 26838, 26841, 26844, 26845, 26853, 26856, 26858, + 26859, 26860, 26861, 26864, 26865, 26869, 26870, 26875, 26876, 26877, + 26886, 26889, 26890, 26896, 26897, 26899, 26902, 26903, 26929, 26931, + 26933, 26936, 26939, 26946, 26949, 26953, 26958, 26967, 26971, 26979, + 26980, 26981, 26982, 26984, 26985, 26988, 26992, 26993, 26994, 27002, + 27003, 27007, 27008, 27021, 27026, 27030, 27032, 27041, 27045, 27046, + 27048, 27051, 27053, 27055, 27063, 27064, 27066, 27068, 27077, 27080, + 27089, 27094, 27095, 27106, 27109, 27118, 27119, 27121, 27123, 27125, + 27134, 27136, 27137, 27139, 27151, 27153, 27157, 27162, 27165, 27168, + 27172, 27176, 27184, 27186, 27188, 27191, 27195, 27198, 27199, 27205, + 27206, 27209, 27210, 27214, 27216, 27217, 27218, 27221, 27222, 27227, + 27236, 27239, 27242, 27249, 27251, 27262, 27265, 27267, 27270, 27271, + 27273, 27275, 27281, 27291, 27293, 27294, 27295, 27301, 27307, 27311, + 27312, 27313, 27316, 27325, 27326, 27327, 27334, 27337, 27336, 27340, + 27344, 27348, 27349, 27350, 27356, 27357, 27364, 27367, 27372, 27376, + 27377, 27378, 27388, 27389, 27394, 27395, 27398, 27399, 27401, 27407, + 27408, 27409, 27415, 27419, 27422, 27428, 27432, 27435, 27436, 27439, + 27445, 27446, 27451, 27455, 27462, 27466, 27469, 27474, 27478, 27480, + 27485, 27488, 27495, 27499, 27502, 27504, 27509, 27517, 27518, 27522, + 27525, 27543, 27547, 27551, 27552, 27554, 27555, 27560, 27561, 27564, + 27565, 27566, 27568, 27576, 27577, 27581, 27582, 27587, 27588, 27593, + 27596, 27606, 27610, 27617, 27619, 27622, 27623, 27630, 27633, 27639, + 27641, 27647, 27650, 27652, 27653, 27657, 27661, 27662, 27664, 27666, + 27673, 27679, 27686, 27687, 27688, 27692, 27694, 27699, 27701, 27702, + 27706, 27707, 27711, 27722, 27723, 27725, 27727, 27730, 27732, 27737, + 27739, 27740, 27755, 27757, 27759, 27764, 27766, 27768, 27769, 27771, + 27781, 27782, 27783, 27785, 27796, 27797, 27799, 27800, 27804, 27807, + 27824, 27826, 27828, 27842, 27846, 27853, 27855, 27856, 27857, 27858, + 27860, 27862, 27866, 27868, 27872, 27879, 27881, 27883, 27884, 27886, + 27890, 27892, 27908, 27911, 27914, 27918, 27919, 27921, 27923, 27930, + 27942, 27943, 27944, 27751, 27950, 27951, 27953, 27961, 27964, 27967, + 27991, 27998, 27999, 28001, 28005, 28007, 28015, 28016, 28028, 28034, + 28039, 28049, 28050, 28052, 28054, 28055, 28056, 28074, 28076, 28084, + 28087, 28089, 28093, 28095, 28100, 28104, 28106, 28110, 28111, 28118, + 28123, 28125, 28127, 28128, 28130, 28133, 28137, 28143, 28144, 28148, + 28150, 28156, 28160, 28164, 28190, 28194, 28199, 28210, 28214, 28217, + 28219, 28220, 28228, 28229, 28232, 28233, 28235, 28239, 28241, 28242, + 28243, 28244, 28247, 28252, 28253, 28254, 28258, 28259, 28264, 28275, + 28283, 28285, 28301, 28307, 28313, 28320, 28327, 28333, 28334, 28337, + 28339, 28347, 28351, 28352, 28353, 28355, 28359, 28360, 28362, 28365, + 28366, 28367, 28395, 28397, 28398, 28409, 28411, 28413, 28420, 28424, + 28426, 28428, 28429, 28438, 28440, 28442, 28443, 28454, 28457, 28458, + 28463, 28464, 28467, 28470, 28475, 28476, 28461, 28495, 28497, 28498, + 28499, 28503, 28505, 28506, 28509, 28510, 28513, 28514, 28520, 28524, + 28541, 28542, 28547, 28551, 28552, 28555, 28556, 28557, 28560, 28562, + 28563, 28564, 28566, 28570, 28575, 28576, 28581, 28582, 28583, 28584, + 28590, 28591, 28592, 28597, 28598, 28604, 28613, 28615, 28616, 28618, + 28634, 28638, 28648, 28649, 28656, 28661, 28665, 28668, 28669, 28672, + 28677, 28678, 28679, 28685, 28695, 28704, 28707, 28719, 28724, 28727, + 28729, 28732, 28739, 28740, 28744, 28745, 28746, 28747, 28756, 28757, + 28765, 28766, 28750, 28772, 28773, 28780, 28782, 28789, 28790, 28798, + 28801, 28805, 28806, 28820, 28821, 28822, 28823, 28824, 28827, 28836, + 28843, 28848, 28849, 28852, 28855, 28874, 28881, 28883, 28884, 28885, + 28886, 28888, 28892, 28900, 28922, 28931, 28932, 28933, 28934, 28935, + 28939, 28940, 28943, 28958, 28960, 28971, 28973, 28975, 28976, 28977, + 28984, 28993, 28997, 28998, 28999, 29002, 29003, 29008, 29010, 29015, + 29018, 29020, 29022, 29024, 29032, 29049, 29056, 29061, 29063, 29068, + 29074, 29082, 29083, 29088, 29090, 29103, 29104, 29106, 29107, 29114, + 29119, 29120, 29121, 29124, 29131, 29132, 29139, 29142, 29145, 29146, + 29148, 29176, 29182, 29184, 29191, 29192, 29193, 29203, 29207, 29210, + 29213, 29215, 29220, 29227, 29231, 29236, 29240, 29241, 29249, 29250, + 29251, 29253, 29262, 29263, 29264, 29267, 29269, 29270, 29274, 29276, + 29278, 29280, 29283, 29288, 29291, 29294, 29295, 29297, 29303, 29304, + 29307, 29308, 29311, 29316, 29321, 29325, 29326, 29331, 29339, 29352, + 29357, 29358, 29361, 29364, 29374, 29377, 29383, 29385, 29388, 29397, + 29398, 29400, 29407, 29413, 29427, 29428, 29434, 29435, 29438, 29442, + 29444, 29445, 29447, 29451, 29453, 29458, 29459, 29464, 29465, 29470, + 29474, 29476, 29479, 29480, 29484, 29489, 29490, 29493, 29498, 29499, + 29501, 29507, 29517, 29520, 29522, 29526, 29528, 29533, 29534, 29535, + 29536, 29542, 29543, 29545, 29547, 29548, 29550, 29551, 29553, 29559, + 29561, 29564, 29568, 29569, 29571, 29573, 29574, 29582, 29584, 29587, + 29589, 29591, 29592, 29596, 29598, 29599, 29600, 29602, 29605, 29606, + 29610, 29611, 29613, 29621, 29623, 29625, 29628, 29629, 29631, 29637, + 29638, 29641, 29643, 29644, 29647, 29650, 29651, 29654, 29657, 29661, + 29665, 29667, 29670, 29671, 29673, 29684, 29685, 29687, 29689, 29690, + 29691, 29693, 29695, 29696, 29697, 29700, 29703, 29706, 29713, 29722, + 29723, 29732, 29734, 29736, 29737, 29738, 29739, 29740, 29741, 29742, + 29743, 29744, 29745, 29753, 29760, 29763, 29764, 29766, 29767, 29771, + 29773, 29777, 29778, 29783, 29789, 29794, 29798, 29799, 29800, 29803, + 29805, 29806, 29809, 29810, 29824, 29825, 29829, 29830, 29831, 29833, + 29839, 29840, 29841, 29842, 29848, 29849, 29850, 29852, 29855, 29856, + 29857, 29859, 29862, 29864, 29865, 29866, 29867, 29870, 29871, 29873, + 29874, 29877, 29881, 29883, 29887, 29896, 29897, 29900, 29904, 29907, + 29912, 29914, 29915, 29918, 29919, 29924, 29928, 29930, 29931, 29935, + 29940, 29946, 29947, 29948, 29951, 29958, 29970, 29974, 29975, 29984, + 29985, 29988, 29991, 29993, 29994, 29999, 30006, 30009, 30013, 30014, + 30015, 30016, 30019, 30023, 30024, 30030, 30032, 30034, 30039, 30046, + 30047, 30049, 30063, 30065, 30073, 30074, 30075, 30076, 30077, 30078, + 30081, 30085, 30096, 30098, 30099, 30101, 30105, 30108, 30114, 30116, + 30132, 30138, 30143, 30144, 30145, 30148, 30150, 30156, 30158, 30159, + 30167, 30172, 30175, 30176, 30177, 30180, 30183, 30188, 30190, 30191, + 30193, 30201, 30208, 30210, 30211, 30212, 30215, 30216, 30218, 30220, + 30223, 30226, 30227, 30229, 30230, 30233, 30235, 30236, 30237, 30238, + 30243, 30245, 30246, 30249, 30253, 30258, 30259, 30261, 30264, 30265, + 30266, 30268, 30282, 30272, 30273, 30275, 30276, 30277, 30281, 30283, + 30293, 30297, 30303, 30308, 30309, 30317, 30318, 30319, 30321, 30324, + 30337, 30341, 30348, 30349, 30357, 30363, 30364, 30365, 30367, 30368, + 30370, 30371, 30372, 30373, 30374, 30375, 30376, 30378, 30381, 30397, + 30401, 30405, 30409, 30411, 30412, 30414, 30420, 30425, 30432, 30438, + 30440, 30444, 30448, 30449, 30454, 30457, 30460, 30464, 30470, 30474, + 30478, 30482, 30484, 30485, 30487, 30489, 30490, 30492, 30498, 30504, + 30509, 30510, 30511, 30516, 30517, 30518, 30521, 30525, 30526, 30530, + 30533, 30534, 30538, 30541, 30542, 30543, 30546, 30550, 30551, 30556, + 30558, 30559, 30560, 30562, 30564, 30567, 30570, 30572, 30576, 30578, + 30579, 30580, 30586, 30589, 30592, 30596, 30604, 30605, 30612, 30613, + 30614, 30618, 30623, 30626, 30631, 30634, 30638, 30639, 30641, 30645, + 30654, 30659, 30665, 30673, 30674, 30677, 30681, 30686, 30687, 30688, + 30692, 30694, 30698, 30700, 30704, 30705, 30708, 30712, 30715, 30725, + 30726, 30729, 30733, 30734, 30737, 30749, 30753, 30754, 30755, 30765, + 30766, 30768, 30773, 30775, 30787, 30788, 30791, 30792, 30796, 30798, + 30802, 30812, 30814, 30816, 30817, 30819, 30820, 30824, 30826, 30830, + 30842, 30846, 30858, 30863, 30868, 30872, 30881, 30877, 30878, 30879, + 30884, 30888, 30892, 30893, 30896, 30897, 30898, 30899, 30907, 30909, + 30911, 30919, 30920, 30921, 30924, 30926, 30930, 30931, 30933, 30934, + 30948, 30939, 30943, 30944, 30945, 30950, 30954, 30962, 30963, 30976, + 30966, 30967, 30970, 30971, 30975, 30982, 30988, 30992, 31002, 31004, + 31006, 31007, 31008, 31013, 31015, 31017, 31021, 31025, 31028, 31029, + 31035, 31037, 31039, 31044, 31045, 31046, 31050, 31051, 31055, 31057, + 31060, 31064, 31067, 31068, 31079, 31081, 31083, 31090, 31097, 31099, + 31100, 31102, 31115, 31116, 31121, 31123, 31124, 31125, 31126, 31128, + 31131, 31132, 31137, 31144, 31145, 31147, 31151, 31153, 31156, 31160, + 31163, 31170, 31172, 31175, 31176, 31178, 31183, 31188, 31190, 31194, + 31197, 31198, 31200, 31202, 31205, 31210, 31211, 31213, 31217, 31224, + 31228, 31234, 31235, 31239, 31241, 31242, 31244, 31249, 31253, 31259, + 31262, 31265, 31271, 31275, 31277, 31279, 31280, 31284, 31285, 31288, + 31289, 31290, 31300, 31301, 31303, 31304, 31308, 31317, 31318, 31321, + 31324, 31325, 31327, 31328, 31333, 31335, 31338, 31341, 31349, 31352, + 31358, 31360, 31362, 31365, 31366, 31370, 31371, 31376, 31377, 31380, + 31390, 31392, 31395, 31404, 31411, 31413, 31417, 31419, 31420, 31430, + 31433, 31436, 31438, 31441, 31451, 31464, 31465, 31467, 31468, 31473, + 31476, 31483, 31485, 31486, 31495, 31508, 31519, 31523, 31527, 31529, + 31530, 31531, 31533, 31534, 31535, 31536, 31537, 31540, 31549, 31551, + 31552, 31553, 31559, 31566, 31573, 31584, 31588, 31590, 31593, 31594, + 31597, 31599, 31602, 31603, 31607, 31620, 31625, 31630, 31632, 31633, + 31638, 31643, 31646, 31648, 31653, 31660, 31663, 31664, 31666, 31669, + 31670, 31674, 31675, 31676, 31677, 31682, 31685, 31688, 31690, 31700, + 31702, 31703, 31705, 31706, 31707, 31720, 31722, 31730, 31732, 31733, + 31736, 31737, 31738, 31740, 31742, 31745, 31746, 31747, 31748, 31750, + 31753, 31755, 31756, 31758, 31759, 31769, 31771, 31776, 31781, 31782, + 31784, 31788, 31793, 31795, 31796, 31798, 31801, 31802, 31814, 31818, + 31829, 31825, 31826, 31827, 31833, 31834, 31835, 31836, 31837, 31838, + 31841, 31843, 31847, 31849, 31853, 31854, 31856, 31858, 31865, 31868, + 31869, 31878, 31879, 31887, 31892, 31902, 31904, 31910, 31920, 31926, + 31927, 31930, 31931, 31932, 31935, 31940, 31943, 31944, 31945, 31949, + 31951, 31955, 31956, 31957, 31959, 31961, 31962, 31965, 31974, 31977, + 31979, 31989, 32003, 32007, 32008, 32009, 32015, 32017, 32018, 32019, + 32022, 32029, 32030, 32035, 32038, 32042, 32045, 32049, 32060, 32061, + 32062, 32064, 32065, 32071, 32072, 32077, 32081, 32083, 32087, 32089, + 32090, 32092, 32093, 32101, 32103, 32106, 32112, 32120, 32122, 32123, + 32127, 32129, 32130, 32131, 32133, 32134, 32136, 32139, 32140, 32141, + 32145, 32150, 32151, 32157, 32158, 32166, 32167, 32170, 32179, 32182, + 32183, 32185, 32194, 32195, 32196, 32197, 32198, 32204, 32205, 32206, + 32215, 32217, 32256, 32226, 32229, 32230, 32234, 32235, 32237, 32241, + 32245, 32246, 32249, 32250, 32264, 32272, 32273, 32277, 32279, 32284, + 32285, 32288, 32295, 32296, 32300, 32301, 32303, 32307, 32310, 32319, + 32324, 32325, 32327, 32334, 32336, 32338, 32344, 32351, 32353, 32354, + 32357, 32363, 32366, 32367, 32371, 32376, 32382, 32385, 32390, 32391, + 32394, 32397, 32401, 32405, 32408, 32410, 32413, 32414, 32572, 32571, + 32573, 32574, 32575, 32579, 32580, 32583, 32591, 32594, 32595, 32603, + 32604, 32605, 32609, 32611, 32612, 32613, 32614, 32621, 32625, 32637, + 32638, 32639, 32640, 32651, 32653, 32655, 32656, 32657, 32662, 32663, + 32668, 32673, 32674, 32678, 32682, 32685, 32692, 32700, 32703, 32704, + 32707, 32712, 32718, 32719, 32731, 32735, 32739, 32741, 32744, 32748, + 32750, 32751, 32754, 32762, 32765, 32766, 32767, 32775, 32776, 32778, + 32781, 32782, 32783, 32785, 32787, 32788, 32790, 32797, 32798, 32799, + 32800, 32804, 32806, 32812, 32814, 32816, 32820, 32821, 32823, 32825, + 32826, 32828, 32830, 32832, 32836, 32864, 32868, 32870, 32877, 32881, + 32885, 32897, 32904, 32910, 32924, 32926, 32934, 32935, 32939, 32952, + 32953, 32968, 32973, 32975, 32978, 32980, 32981, 32983, 32984, 32992, + 33005, 33006, 33008, 33010, 33011, 33014, 33017, 33018, 33022, 33027, + 33035, 33046, 33047, 33048, 33052, 33054, 33056, 33060, 33063, 33068, + 33072, 33077, 33082, 33084, 33093, 33095, 33098, 33100, 33106, 33111, + 33120, 33121, 33127, 33128, 33129, 33133, 33135, 33143, 33153, 33168, + 33156, 33157, 33158, 33163, 33166, 33174, 33176, 33179, 33182, 33186, + 33198, 33202, 33204, 33211, 33227, 33219, 33221, 33226, 33230, 33231, + 33237, 33239, 33243, 33245, 33246, 33249, 33252, 33259, 33260, 33264, + 33265, 33266, 33269, 33270, 33272, 33273, 33277, 33279, 33280, 33283, + 33295, 33299, 33300, 33305, 33306, 33309, 33313, 33314, 33320, 33330, + 33332, 33338, 33347, 33348, 33349, 33350, 33355, 33358, 33359, 33361, + 33366, 33372, 33376, 33379, 33383, 33389, 33396, 33403, 33405, 33407, + 33408, 33409, 33411, 33412, 33415, 33417, 33418, 33422, 33425, 33428, + 33430, 33432, 33434, 33435, 33440, 33441, 33443, 33444, 33447, 33448, + 33449, 33450, 33454, 33456, 33458, 33460, 33463, 33466, 33468, 33470, + 33471, 33478, 33488, 33493, 33498, 33504, 33506, 33508, 33512, 33514, + 33517, 33519, 33526, 33527, 33533, 33534, 33536, 33537, 33543, 33544, + 33546, 33547, 33620, 33563, 33565, 33566, 33567, 33569, 33570, 33580, + 33581, 33582, 33584, 33587, 33591, 33594, 33596, 33597, 33602, 33603, + 33604, 33607, 33613, 33614, 33617, 33621, 33622, 33623, 33648, 33656, + 33661, 33663, 33664, 33666, 33668, 33670, 33677, 33682, 33684, 33685, + 33688, 33689, 33691, 33692, 33693, 33702, 33703, 33705, 33708, 33726, + 33727, 33728, 33735, 33737, 33743, 33744, 33745, 33748, 33757, 33619, + 33768, 33770, 33782, 33784, 33785, 33788, 33793, 33798, 33802, 33807, + 33809, 33813, 33817, 33709, 33839, 33849, 33861, 33863, 33864, 33866, + 33869, 33871, 33873, 33874, 33878, 33880, 33881, 33882, 33884, 33888, + 33892, 33893, 33895, 33898, 33904, 33907, 33908, 33910, 33912, 33916, + 33917, 33921, 33925, 33938, 33939, 33941, 33950, 33958, 33960, 33961, + 33962, 33967, 33969, 33972, 33978, 33981, 33982, 33984, 33986, 33991, + 33992, 33996, 33999, 34003, 34012, 34023, 34026, 34031, 34032, 34033, + 34034, 34039, 34098, 34042, 34043, 34045, 34050, 34051, 34055, 34060, + 34062, 34064, 34076, 34078, 34082, 34083, 34084, 34085, 34087, 34090, + 34091, 34095, 34099, 34100, 34102, 34111, 34118, 34127, 34128, 34129, + 34130, 34131, 34134, 34137, 34140, 34141, 34142, 34143, 34144, 34145, + 34146, 34148, 34155, 34159, 34169, 34170, 34171, 34173, 34175, 34177, + 34181, 34182, 34185, 34187, 34188, 34191, 34195, 34200, 34205, 34207, + 34208, 34210, 34213, 34215, 34228, 34230, 34231, 34232, 34236, 34237, + 34238, 34239, 34242, 34247, 34250, 34251, 34254, 34221, 34264, 34266, + 34271, 34272, 34278, 34280, 34285, 34291, 34294, 34300, 34303, 34304, + 34308, 34309, 34317, 34318, 34320, 34321, 34322, 34328, 34329, 34331, + 34334, 34337, 34343, 34345, 34358, 34360, 34362, 34364, 34365, 34368, + 34370, 34374, 34386, 34387, 34390, 34391, 34392, 34393, 34397, 34400, + 34401, 34402, 34403, 34404, 34409, 34412, 34415, 34421, 34422, 34423, + 34426, 34445, 34449, 34454, 34456, 34458, 34460, 34465, 34470, 34471, + 34472, 34477, 34481, 34483, 34484, 34485, 34487, 34488, 34489, 34495, + 34496, 34497, 34499, 34501, 34513, 34514, 34517, 34519, 34522, 34524, + 34528, 34531, 34533, 34535, 34440, 34554, 34556, 34557, 34564, 34565, + 34567, 34571, 34574, 34575, 34576, 34579, 34580, 34585, 34590, 34591, + 34593, 34595, 34600, 34606, 34607, 34609, 34610, 34617, 34618, 34620, + 34621, 34622, 34624, 34627, 34629, 34637, 34648, 34653, 34657, 34660, + 34661, 34671, 34673, 34674, 34683, 34691, 34692, 34693, 34694, 34695, + 34696, 34697, 34699, 34700, 34704, 34707, 34709, 34711, 34712, 34713, + 34718, 34720, 34723, 34727, 34732, 34733, 34734, 34737, 34741, 34750, + 34751, 34753, 34760, 34761, 34762, 34766, 34773, 34774, 34777, 34778, + 34780, 34783, 34786, 34787, 34788, 34794, 34795, 34797, 34801, 34803, + 34808, 34810, 34815, 34817, 34819, 34822, 34825, 34826, 34827, 34832, + 34841, 34834, 34835, 34836, 34840, 34842, 34843, 34844, 34846, 34847, + 34856, 34861, 34862, 34864, 34866, 34869, 34874, 34876, 34881, 34883, + 34885, 34888, 34889, 34890, 34891, 34894, 34897, 34901, 34902, 34904, + 34906, 34908, 34911, 34912, 34916, 34921, 34929, 34937, 34939, 34944, + 34968, 34970, 34971, 34972, 34975, 34976, 34984, 34986, 35002, 35005, + 35006, 35008, 35018, 35019, 35020, 35021, 35022, 35025, 35026, 35027, + 35035, 35038, 35047, 35055, 35056, 35057, 35061, 35063, 35073, 35078, + 35085, 35086, 35087, 35093, 35094, 35096, 35097, 35098, 35100, 35104, + 35110, 35111, 35112, 35120, 35121, 35122, 35125, 35129, 35130, 35134, + 35136, 35138, 35141, 35142, 35145, 35151, 35154, 35159, 35162, 35163, + 35164, 35169, 35170, 35171, 35179, 35182, 35184, 35187, 35189, 35194, + 35195, 35196, 35197, 35209, 35213, 35216, 35220, 35221, 35227, 35228, + 35231, 35232, 35237, 35248, 35252, 35253, 35254, 35255, 35260, 35284, + 35285, 35286, 35287, 35288, 35301, 35305, 35307, 35309, 35313, 35315, + 35318, 35321, 35325, 35327, 35332, 35333, 35335, 35343, 35345, 35346, + 35348, 35349, 35358, 35360, 35362, 35364, 35366, 35371, 35372, 35375, + 35381, 35383, 35389, 35390, 35392, 35395, 35397, 35399, 35401, 35405, + 35406, 35411, 35414, 35415, 35416, 35420, 35421, 35425, 35429, 35431, + 35445, 35446, 35447, 35449, 35450, 35451, 35454, 35455, 35456, 35459, + 35462, 35467, 35471, 35472, 35474, 35478, 35479, 35481, 35487, 35495, + 35497, 35502, 35503, 35507, 35510, 35511, 35515, 35518, 35523, 35526, + 35528, 35529, 35530, 35537, 35539, 35540, 35541, 35543, 35549, 35551, + 35564, 35568, 35572, 35573, 35574, 35580, 35583, 35589, 35590, 35595, + 35601, 35612, 35614, 35615, 35594, 35629, 35632, 35639, 35644, 35650, + 35651, 35652, 35653, 35654, 35656, 35666, 35667, 35668, 35673, 35661, + 35678, 35683, 35693, 35702, 35704, 35705, 35708, 35710, 35713, 35716, + 35717, 35723, 35725, 35727, 35732, 35733, 35740, 35742, 35743, 35896, + 35897, 35901, 35902, 35909, 35911, 35913, 35915, 35919, 35921, 35923, + 35924, 35927, 35928, 35931, 35933, 35929, 35939, 35940, 35942, 35944, + 35945, 35949, 35955, 35957, 35958, 35963, 35966, 35974, 35975, 35979, + 35984, 35986, 35987, 35993, 35995, 35996, 36004, 36025, 36026, 36037, + 36038, 36041, 36043, 36047, 36054, 36053, 36057, 36061, 36065, 36072, + 36076, 36079, 36080, 36082, 36085, 36087, 36088, 36094, 36095, 36097, + 36099, 36105, 36114, 36119, 36123, 36197, 36201, 36204, 36206, 36223, + 36226, 36228, 36232, 36237, 36240, 36241, 36245, 36254, 36255, 36256, + 36262, 36267, 36268, 36271, 36274, 36277, 36279, 36281, 36283, 36288, + 36293, 36294, 36295, 36296, 36298, 36302, 36305, 36308, 36309, 36311, + 36313, 36324, 36325, 36327, 36332, 36336, 36284, 36337, 36338, 36340, + 36349, 36353, 36356, 36357, 36358, 36363, 36369, 36372, 36374, 36384, + 36385, 36386, 36387, 36390, 36391, 36401, 36403, 36406, 36407, 36408, + 36409, 36413, 36416, 36417, 36427, 36429, 36430, 36431, 36436, 36443, + 36444, 36445, 36446, 36449, 36450, 36457, 36460, 36461, 36463, 36464, + 36465, 36473, 36474, 36475, 36482, 36483, 36489, 36496, 36498, 36501, + 36506, 36507, 36509, 36510, 36514, 36519, 36521, 36525, 36526, 36531, + 36533, 36538, 36539, 36544, 36545, 36547, 36548, 36551, 36559, 36561, + 36564, 36572, 36584, 36590, 36592, 36593, 36599, 36601, 36602, 36589, + 36608, 36610, 36615, 36616, 36623, 36624, 36630, 36631, 36632, 36638, + 36640, 36641, 36643, 36645, 36647, 36648, 36652, 36653, 36654, 36660, + 36661, 36662, 36663, 36666, 36672, 36673, 36675, 36679, 36687, 36689, + 36690, 36691, 36692, 36693, 36696, 36701, 36702, 36709, 36765, 36768, + 36769, 36772, 36773, 36774, 36789, 36790, 36792, 36798, 36800, 36801, + 36806, 36810, 36811, 36813, 36816, 36818, 36819, 36821, 36832, 36835, + 36836, 36840, 36846, 36849, 36853, 36854, 36859, 36862, 36866, 36868, + 36872, 36876, 36888, 36891, 36904, 36905, 36911, 36906, 36908, 36909, + 36915, 36916, 36919, 36927, 36931, 36932, 36940, 36955, 36957, 36962, + 36966, 36967, 36972, 36976, 36980, 36985, 36997, 37000, 37003, 37004, + 37006, 37008, 37013, 37015, 37016, 37017, 37019, 37024, 37025, 37026, + 37029, 37040, 37042, 37043, 37044, 37046, 37053, 37068, 37054, 37059, + 37060, 37061, 37063, 37064, 37077, 37079, 37080, 37081, 37084, 37085, + 37087, 37093, 37074, 37110, 37099, 37103, 37104, 37108, 37118, 37119, + 37120, 37124, 37125, 37126, 37128, 37133, 37136, 37140, 37142, 37143, + 37144, 37146, 37148, 37150, 37152, 37157, 37154, 37155, 37159, 37161, + 37166, 37167, 37169, 37172, 37174, 37175, 37177, 37178, 37180, 37181, + 37187, 37191, 37192, 37199, 37203, 37207, 37209, 37210, 37211, 37217, + 37220, 37223, 37229, 37236, 37241, 37242, 37243, 37249, 37251, 37253, + 37254, 37258, 37262, 37265, 37267, 37268, 37269, 37272, 37278, 37281, + 37286, 37288, 37292, 37293, 37294, 37296, 37297, 37298, 37299, 37302, + 37307, 37308, 37309, 37311, 37314, 37315, 37317, 37331, 37332, 37335, + 37337, 37338, 37342, 37348, 37349, 37353, 37354, 37356, 37357, 37358, + 37359, 37360, 37361, 37367, 37369, 37371, 37373, 37376, 37377, 37380, + 37381, 37382, 37383, 37385, 37386, 37388, 37392, 37394, 37395, 37398, + 37400, 37404, 37405, 37411, 37412, 37413, 37414, 37416, 37422, 37423, + 37424, 37427, 37429, 37430, 37432, 37433, 37434, 37436, 37438, 37440, + 37442, 37443, 37446, 37447, 37450, 37453, 37454, 37455, 37457, 37464, + 37465, 37468, 37469, 37472, 37473, 37477, 37479, 37480, 37481, 37486, + 37487, 37488, 37493, 37494, 37495, 37496, 37497, 37499, 37500, 37501, + 37503, 37512, 37513, 37514, 37517, 37518, 37522, 37527, 37529, 37535, + 37536, 37540, 37541, 37543, 37544, 37547, 37551, 37554, 37558, 37560, + 37562, 37563, 37564, 37565, 37567, 37568, 37569, 37570, 37571, 37573, + 37574, 37575, 37576, 37579, 37580, 37581, 37582, 37584, 37587, 37589, + 37591, 37592, 37593, 37596, 37597, 37599, 37600, 37601, 37603, 37605, + 37607, 37608, 37612, 37614, 37616, 37625, 37627, 37631, 37632, 37634, + 37640, 37645, 37649, 37652, 37653, 37660, 37661, 37662, 37663, 37665, + 37668, 37669, 37671, 37673, 37674, 37683, 37684, 37686, 37687, 37703, + 37704, 37705, 37712, 37713, 37714, 37717, 37719, 37720, 37722, 37726, + 37732, 37733, 37735, 37737, 37738, 37741, 37743, 37744, 37745, 37747, + 37748, 37750, 37754, 37757, 37759, 37760, 37761, 37762, 37768, 37770, + 37771, 37773, 37775, 37778, 37781, 37784, 37787, 37790, 37793, 37795, + 37796, 37798, 37800, 37803, 37812, 37813, 37814, 37818, 37801, 37825, + 37828, 37829, 37830, 37831, 37833, 37834, 37835, 37836, 37837, 37843, + 37849, 37852, 37854, 37855, 37858, 37862, 37863, 37881, 37879, 37880, + 37882, 37883, 37885, 37889, 37890, 37892, 37896, 37897, 37901, 37902, + 37903, 37909, 37910, 37911, 37919, 37934, 37935, 37937, 37938, 37939, + 37940, 37947, 37951, 37949, 37955, 37957, 37960, 37962, 37964, 37973, + 37977, 37980, 37983, 37985, 37987, 37992, 37995, 37997, 37998, 37999, + 38001, 38002, 38020, 38019, 38264, 38265, 38270, 38276, 38280, 38284, + 38285, 38286, 38301, 38302, 38303, 38305, 38310, 38313, 38315, 38316, + 38324, 38326, 38330, 38333, 38335, 38342, 38344, 38345, 38347, 38352, + 38353, 38354, 38355, 38361, 38362, 38365, 38366, 38367, 38368, 38372, + 38374, 38429, 38430, 38434, 38436, 38437, 38438, 38444, 38449, 38451, + 38455, 38456, 38457, 38458, 38460, 38461, 38465, 38482, 38484, 38486, + 38487, 38488, 38497, 38510, 38516, 38523, 38524, 38526, 38527, 38529, + 38530, 38531, 38532, 38537, 38545, 38550, 38554, 38557, 38559, 38564, + 38565, 38566, 38569, 38574, 38575, 38579, 38586, 38602, 38610, 23986, + 38616, 38618, 38621, 38622, 38623, 38633, 38639, 38641, 38650, 38658, + 38659, 38661, 38665, 38682, 38683, 38685, 38689, 38690, 38691, 38696, + 38705, 38707, 38721, 38723, 38730, 38734, 38735, 38741, 38743, 38744, + 38746, 38747, 38755, 38759, 38762, 38766, 38771, 38774, 38775, 38776, + 38779, 38781, 38783, 38784, 38793, 38805, 38806, 38807, 38809, 38810, + 38814, 38815, 38818, 38828, 38830, 38833, 38834, 38837, 38838, 38840, + 38841, 38842, 38844, 38846, 38847, 38849, 38852, 38853, 38855, 38857, + 38858, 38860, 38861, 38862, 38864, 38865, 38868, 38871, 38872, 38873, + 38877, 38878, 38880, 38875, 38881, 38884, 38895, 38897, 38900, 38903, + 38904, 38906, 38919, 38922, 38937, 38925, 38926, 38932, 38934, 38940, + 38942, 38944, 38947, 38950, 38955, 38958, 38959, 38960, 38962, 38963, + 38965, 38949, 38974, 38980, 38983, 38986, 38993, 38994, 38995, 38998, + 38999, 39001, 39002, 39010, 39011, 39013, 39014, 39018, 39020, 39083, + 39085, 39086, 39088, 39092, 39095, 39096, 39098, 39099, 39103, 39106, + 39109, 39112, 39116, 39137, 39139, 39141, 39142, 39143, 39146, 39155, + 39158, 39170, 39175, 39176, 39185, 39189, 39190, 39191, 39194, 39195, + 39196, 39199, 39202, 39206, 39207, 39211, 39217, 39218, 39219, 39220, + 39221, 39225, 39226, 39227, 39228, 39232, 39233, 39238, 39239, 39240, + 39245, 39246, 39252, 39256, 39257, 39259, 39260, 39262, 39263, 39264, + 39323, 39325, 39327, 39334, 39344, 39345, 39346, 39349, 39353, 39354, + 39357, 39359, 39363, 39369, 39379, 39380, 39385, 39386, 39388, 39390, + 39399, 39402, 39403, 39404, 39408, 39412, 39413, 39417, 39421, 39422, + 39426, 39427, 39428, 39435, 39436, 39440, 39441, 39446, 39454, 39456, + 39458, 39459, 39460, 39463, 39469, 39470, 39475, 39477, 39478, 39480, + 39495, 39489, 39492, 39498, 39499, 39500, 39502, 39505, 39508, 39510, + 39517, 39594, 39596, 39598, 39599, 39602, 39604, 39605, 39606, 39609, + 39611, 39614, 39615, 39617, 39619, 39622, 39624, 39630, 39632, 39634, + 39637, 39638, 39639, 39643, 39644, 39648, 39652, 39653, 39655, 39657, + 39660, 39666, 39667, 39669, 39673, 39674, 39677, 39679, 39680, 39681, + 39682, 39683, 39684, 39685, 39688, 39689, 39691, 39692, 39693, 39694, + 39696, 39698, 39702, 39705, 39707, 39708, 39712, 39718, 39723, 39725, + 39731, 39732, 39733, 39735, 39737, 39738, 39741, 39752, 39755, 39756, + 39765, 39766, 39767, 39771, 39774, 39777, 39779, 39781, 39782, 39784, + 39786, 39787, 39788, 39789, 39790, 39795, 39797, 39799, 39800, 39801, + 39807, 39808, 39812, 39813, 39814, 39815, 39817, 39818, 39819, 39821, + 39823, 39824, 39828, 39834, 39837, 39838, 39846, 39847, 39849, 39852, + 39856, 39857, 39858, 39863, 39864, 39867, 39868, 39870, 39871, 39873, + 39879, 39880, 39886, 39888, 39895, 39896, 39901, 39903, 39909, 39911, + 39914, 39915, 39919, 39923, 39927, 39928, 39929, 39930, 39933, 39935, + 39936, 39938, 39947, 39951, 39953, 39958, 39960, 39961, 39962, 39964, + 39966, 39970, 39971, 39974, 39975, 39976, 39977, 39978, 39985, 39989, + 39990, 39991, 39997, 40001, 40003, 40004, 40005, 40009, 40010, 40014, + 40015, 40016, 40019, 40020, 40022, 40024, 40027, 40029, 40030, 40031, + 40035, 40041, 40042, 40028, 40043, 40040, 40046, 40048, 40050, 40053, + 40055, 40059, 40166, 40178, 40183, 40185, 40203, 40194, 40209, 40215, + 40216, 40220, 40221, 40222, 40239, 40240, 40242, 40243, 40244, 40250, + 40252, 40261, 40253, 40258, 40259, 40263, 40266, 40275, 40276, 40287, + 40291, 40290, 40293, 40297, 40298, 40299, 40304, 40310, 40311, 40315, + 40316, 40318, 40323, 40324, 40326, 40330, 40333, 40334, 40338, 40339, + 40341, 40342, 40343, 40344, 40353, 40362, 40364, 40366, 40369, 40373, + 40377, 40380, 40383, 40387, 40391, 40393, 40394, 40404, 40405, 40406, + 40407, 40410, 40414, 40415, 40416, 40421, 40423, 40425, 40427, 40430, + 40432, 40435, 40436, 40446, 40458, 40450, 40455, 40462, 40464, 40465, + 40466, 40469, 40470, 40473, 40476, 40477, 40570, 40571, 40572, 40576, + 40578, 40579, 40580, 40581, 40583, 40590, 40591, 40598, 40600, 40603, + 40606, 40612, 40616, 40620, 40622, 40623, 40624, 40627, 40628, 40629, + 40646, 40648, 40651, 40661, 40671, 40676, 40679, 40684, 40685, 40686, + 40688, 40689, 40690, 40693, 40696, 40703, 40706, 40707, 40713, 40719, + 40720, 40721, 40722, 40724, 40726, 40727, 40729, 40730, 40731, 40735, + 40738, 40742, 40746, 40747, 40751, 40753, 40754, 40756, 40759, 40761, + 40762, 40764, 40765, 40767, 40769, 40771, 40772, 40773, 40774, 40775, + 40787, 40789, 40790, 40791, 40792, 40794, 40797, 40798, 40808, 40809, + 40813, 40814, 40815, 40816, 40817, 40819, 40821, 40826, 40829, 40847, + 40848, 40849, 40850, 40852, 40854, 40855, 40862, 40865, 40866, 40867, + 40869, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_koi8_r[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 9555, 9556, 9557, 9558, + 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 1025, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, + 9578, 9579, 9580, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myhtml_encoding_map_koi8_u[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 1108, 9556, 1110, 1111, + 9559, 9560, 9561, 9562, 9563, 1169, 1118, 9566, 9567, 9568, + 9569, 1025, 1028, 9571, 1030, 1031, 9574, 9575, 9576, 9577, + 9578, 1168, 1038, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myhtml_encoding_map_macintosh[] = { + 196, 197, 199, 201, 209, 214, 220, 225, 224, 226, + 228, 227, 229, 231, 233, 232, 234, 235, 237, 236, + 238, 239, 241, 243, 242, 244, 246, 245, 250, 249, + 251, 252, 8224, 176, 162, 163, 167, 8226, 182, 223, + 174, 169, 8482, 180, 168, 8800, 198, 216, 8734, 177, + 8804, 8805, 165, 181, 8706, 8721, 8719, 960, 8747, 170, + 186, 937, 230, 248, 191, 161, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 192, 195, 213, 338, 339, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 9674, 255, 376, + 8260, 8364, 8249, 8250, 64257, 64258, 8225, 183, 8218, 8222, + 8240, 194, 202, 193, 203, 200, 205, 206, 207, 204, + 211, 212, 63743, 210, 218, 219, 217, 305, 710, 732, + 175, 728, 729, 730, 184, 733, 731, 711, +}; + +static const unsigned long myhtml_encoding_map_windows_1250[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 352, 8249, 346, 356, 381, 377, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 353, 8250, 347, 357, + 382, 378, 160, 711, 728, 321, 164, 260, 166, 167, + 168, 169, 350, 171, 172, 173, 174, 379, 176, 177, + 731, 322, 180, 181, 182, 183, 184, 261, 351, 187, + 317, 733, 318, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myhtml_encoding_map_windows_1251[] = { + 1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, + 1033, 8249, 1034, 1036, 1035, 1039, 1106, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 1113, 8250, 1114, 1116, + 1115, 1119, 160, 1038, 1118, 1032, 164, 1168, 166, 167, + 1025, 169, 1028, 171, 172, 173, 174, 1031, 176, 177, + 1030, 1110, 1169, 181, 182, 183, 1105, 8470, 1108, 187, + 1112, 1029, 1109, 1111, 1040, 1041, 1042, 1043, 1044, 1045, + 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, + 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, +}; + +static const unsigned long myhtml_encoding_map_windows_1252[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 382, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myhtml_encoding_map_windows_1253[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 157, + 158, 159, 160, 901, 902, 163, 164, 165, 166, 167, + 168, 169, 0x0000, 171, 172, 173, 174, 8213, 176, 177, + 178, 179, 900, 181, 182, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_windows_1254[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 286, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 304, 350, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 287, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 305, 351, 255, +}; + +static const unsigned long myhtml_encoding_map_windows_1255[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 156, 157, + 158, 159, 160, 161, 162, 163, 8362, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 191, 1456, 1457, 1458, 1459, 1460, 1461, + 1462, 1463, 1464, 1465, 0x0000, 1467, 1468, 1469, 1470, 1471, + 1472, 1473, 1474, 1475, 1520, 1521, 1522, 1523, 1524, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_windows_1256[] = { + 8364, 1662, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 1657, 8249, 338, 1670, 1688, 1672, 1711, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 1705, 8482, 1681, 8250, 339, 8204, + 8205, 1722, 160, 1548, 162, 163, 164, 165, 166, 167, + 168, 169, 1726, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 1563, 187, + 188, 189, 190, 1567, 1729, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 215, 1591, 1592, + 1593, 1594, 1600, 1601, 1602, 1603, 224, 1604, 226, 1605, + 1606, 1607, 1608, 231, 232, 233, 234, 235, 1609, 1610, + 238, 239, 1611, 1612, 1613, 1614, 244, 1615, 1616, 247, + 1617, 249, 1618, 251, 252, 8206, 8207, 1746, +}; + +static const unsigned long myhtml_encoding_map_windows_1257[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 168, 711, 184, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 175, + 731, 159, 160, 0x0000, 162, 163, 164, 0x0000, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 180, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 729, +}; + +static const unsigned long myhtml_encoding_map_windows_1258[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 258, 196, 197, + 198, 199, 200, 201, 202, 203, 768, 205, 206, 207, + 272, 209, 777, 211, 212, 416, 214, 215, 216, 217, + 218, 219, 220, 431, 771, 223, 224, 225, 226, 259, + 228, 229, 230, 231, 232, 233, 234, 235, 769, 237, + 238, 239, 273, 241, 803, 243, 244, 417, 246, 247, + 248, 249, 250, 251, 252, 432, 8363, 255, +}; + +static const unsigned long myhtml_encoding_map_windows_874[] = { + 8364, 129, 130, 131, 132, 8230, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 3585, 3586, 3587, 3588, 3589, 3590, 3591, + 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, + 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, + 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, + 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, + 3642, 0x0000, 0x0000, 0x0000, 0x0000, 3647, 3648, 3649, 3650, 3651, + 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, + 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, + 3672, 3673, 3674, 3675, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myhtml_encoding_map_x_mac_cyrillic[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 8224, 176, 1168, 163, 167, 8226, 182, 1030, + 174, 169, 8482, 1026, 1106, 8800, 1027, 1107, 8734, 177, + 8804, 8805, 1110, 181, 1169, 1032, 1028, 1108, 1031, 1111, + 1033, 1113, 1034, 1114, 1112, 1029, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 1035, 1115, 1036, 1116, 1109, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 8222, 1038, 1118, + 1039, 1119, 8470, 1025, 1105, 1103, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 8364, +}; + +static const myhtml_encoding_custom_f myhtml_encoding_function_index[] = { + myhtml_encoding_decode_utf_8, NULL, NULL, myhtml_encoding_decode_utf_8, myhtml_encoding_decode_utf_16le, + myhtml_encoding_decode_utf_16be, myhtml_encoding_decode_x_user_defined, + myhtml_encoding_decode_big5, myhtml_encoding_decode_euc_kr, myhtml_encoding_decode_gb18030, + myhtml_encoding_decode_ibm866, myhtml_encoding_decode_iso_8859_10, myhtml_encoding_decode_iso_8859_13, + myhtml_encoding_decode_iso_8859_14, myhtml_encoding_decode_iso_8859_15, myhtml_encoding_decode_iso_8859_16, + myhtml_encoding_decode_iso_8859_2, myhtml_encoding_decode_iso_8859_3, myhtml_encoding_decode_iso_8859_4, + myhtml_encoding_decode_iso_8859_5, myhtml_encoding_decode_iso_8859_6, myhtml_encoding_decode_iso_8859_7, + myhtml_encoding_decode_iso_8859_8, myhtml_encoding_decode_koi8_r, myhtml_encoding_decode_koi8_u, + myhtml_encoding_decode_macintosh, myhtml_encoding_decode_windows_1250, myhtml_encoding_decode_windows_1251, + myhtml_encoding_decode_windows_1252, myhtml_encoding_decode_windows_1253, myhtml_encoding_decode_windows_1254, + myhtml_encoding_decode_windows_1255, myhtml_encoding_decode_windows_1256, myhtml_encoding_decode_windows_1257, + myhtml_encoding_decode_windows_1258, myhtml_encoding_decode_windows_874, myhtml_encoding_decode_x_mac_cyrillic, + myhtml_encoding_decode_iso_2022_jp, myhtml_encoding_decode_gbk, myhtml_encoding_decode_shift_jis, + myhtml_encoding_decode_euc_jp, myhtml_encoding_decode_iso_8859_8_i +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_ENCODING_RESOURCE_H */ + + + + diff --git a/source/myhtml/incoming.c b/source/myhtml/incoming.c new file mode 100644 index 0000000..124b379 --- /dev/null +++ b/source/myhtml/incoming.c @@ -0,0 +1,213 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/incoming.h" +#include "myhtml/utils/resources.h" + +myhtml_incoming_buffer_t * myhtml_incomming_buffer_add(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, + const char *html, size_t html_size) +{ + myhtml_incoming_buffer_t *inc_buf = mcobject_malloc(mcobject, NULL); + + inc_buf->size = html_size; + inc_buf->length = 0; + inc_buf->data = html; + + if(current) { + inc_buf->offset = current->offset + current->size; + current->next = inc_buf; + } + else { + inc_buf->offset = 0; + } + + inc_buf->prev = current; + inc_buf->next = NULL; + + return inc_buf; +} + +void myhtml_incomming_buffer_clean(myhtml_incoming_buffer_t *current) +{ + memset(current, 0, sizeof(myhtml_incoming_buffer_t)); +} + +myhtml_incoming_buffer_t * myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin) +{ + if(inc_buf->offset < begin) { + while(inc_buf && (inc_buf->offset + inc_buf->size) < begin) + inc_buf = inc_buf->next; + } + else { + while(inc_buf && inc_buf->offset > begin) + inc_buf = inc_buf->prev; + } + + return inc_buf; +} + +const char * myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf) +{ + return inc_buf->data; +} + +size_t myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf) +{ + return inc_buf->length; +} + +size_t myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf) +{ + return inc_buf->size; +} + +size_t myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf) +{ + return inc_buf->offset; +} + +size_t myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin) +{ + return (begin - inc_buf->offset); +} + +size_t myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length) +{ + if((relative_begin + length) > inc_buf->size) + return (inc_buf->size - relative_begin); + + return length; +} + +myhtml_incoming_buffer_t * myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf) +{ + return inc_buf->next; +} + +myhtml_incoming_buffer_t * myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf) +{ + return inc_buf->prev; +} + +// // // +// convert only one 002345 (\002345) to code point +// +size_t myhtml_incoming_buffer_convert_one_escaped_to_code_point(myhtml_incoming_buffer_t **inc_buf, size_t *relative_pos) +{ + const unsigned char *u_data; + myhtml_incoming_buffer_t *current = *inc_buf; + + if(*relative_pos >= current->size) { + *relative_pos = 0; + current = current->next; + } + + u_data = (const unsigned char*)current->data; + + unsigned int consume = 0; + size_t code_point = 0; + + while(current) + { + if(myhtml_string_chars_num_map[ u_data[*relative_pos] ] != 0xff && consume < 6) { + code_point <<= 4; + code_point |= myhtml_string_chars_hex_map[ u_data[*relative_pos] ]; + + ++consume; + } + else + break; + + *relative_pos += 1; + + if(*relative_pos >= current->size) + { + if(current->next == NULL) + break; + + *relative_pos = 0; + + u_data = (const unsigned char*)current->data; + current = current->next; + } + } + + *inc_buf = current; + + return code_point; +} + +size_t myhtml_incoming_buffer_escaped_case_cmp(myhtml_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos) +{ + myhtml_incoming_buffer_t *current = *inc_buf; + + if(*relative_pos >= current->size) { + if(current->next == 0) + return to_size; + + *relative_pos = 0; + current = current->next; + } + + const unsigned char *u_to = (const unsigned char*)to; + const unsigned char *u_data = (const unsigned char*)current->data; + + size_t i = 0; + + while(i < to_size) + { + if(u_data[*relative_pos] == 0x5C) { + *relative_pos += 1; + + size_t code_point = myhtml_incoming_buffer_convert_one_escaped_to_code_point(¤t, relative_pos); + + if(code_point > 255 || myhtml_string_chars_lowercase_map[code_point] != myhtml_string_chars_lowercase_map[ u_to[i] ]) { + break; + } + + u_data = (const unsigned char*)current->data; + } + else if(myhtml_string_chars_lowercase_map[ u_data[*relative_pos] ] != myhtml_string_chars_lowercase_map[ u_to[i] ]) { + break; + } + else { + ++(*relative_pos); + } + + i++; + + if(*relative_pos >= current->size) + { + if(current->next == NULL) + break; + + current = current->next; + u_data = (const unsigned char*)current->data; + *relative_pos = 0; + } + } + + *inc_buf = current; + return (to_size - i); +} + + + + diff --git a/source/myhtml/incoming.h b/source/myhtml/incoming.h new file mode 100644 index 0000000..5c70209 --- /dev/null +++ b/source/myhtml/incoming.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_INCOMING_H +#define MyHTML_INCOMING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/tree.h" +#include "myhtml/utils/mcobject.h" + +struct myhtml_incoming_buffer { + const char* data; + size_t length; // use of data + size_t size; // size of data + size_t offset; // begin global offset + + struct myhtml_incoming_buffer* prev; + struct myhtml_incoming_buffer* next; +}; + + +// incoming buffer +myhtml_incoming_buffer_t * myhtml_incomming_buffer_add(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, const char *html, size_t html_size); +void myhtml_incomming_buffer_clean(myhtml_incoming_buffer_t *current); + +myhtml_incoming_buffer_t * myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); + +const char * myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); +size_t myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); +size_t myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); + +myhtml_incoming_buffer_t * myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); +myhtml_incoming_buffer_t * myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); + +size_t myhtml_incoming_buffer_convert_one_escaped_to_code_point(myhtml_incoming_buffer_t **inc_buf, size_t *relative_pos); +size_t myhtml_incoming_buffer_escaped_case_cmp(myhtml_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_INCOMING_H */ diff --git a/source/myhtml/myhtml.c b/source/myhtml/myhtml.c new file mode 100644 index 0000000..387d8f4 --- /dev/null +++ b/source/myhtml/myhtml.c @@ -0,0 +1,1470 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/myhtml.h" + +void myhtml_init_marker(myhtml_t* myhtml) +{ + myhtml->marker = (myhtml_tree_node_t*)myhtml_malloc(sizeof(myhtml_tree_node_t)); + + if(myhtml->marker) + myhtml_tree_node_clean(myhtml->marker); +} + +void myhtml_destroy_marker(myhtml_t* myhtml) +{ + if(myhtml->marker) + myhtml_free(myhtml->marker); +} + +myhtml_t * myhtml_create(void) +{ + return (myhtml_t*)myhtml_malloc(sizeof(myhtml_t)); +} + +myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size) +{ + myhtml_status_t status; + + myhtml_init_marker(myhtml); + + status = myhtml_tokenizer_state_init(myhtml); + if(status) { + myhtml->insertion_func = NULL; + myhtml->thread = NULL; + + return status; + } + + status = myhtml_rules_init(myhtml); + if(status) { + myhtml->thread = NULL; + + return status; + } + + myhtml->opt = opt; + myhtml->thread = mythread_create(); + + if(myhtml->thread == NULL) + return MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION; + +#ifdef MyHTML_BUILD_WITHOUT_THREADS + + status = mythread_init(myhtml->thread, NULL, thread_count, queue_size); + + if(status) + return status; + +#else /* MyHTML_BUILD_WITHOUT_THREADS */ + switch (opt) { + case MyHTML_OPTIONS_PARSE_MODE_SINGLE: + status = mythread_init(myhtml->thread, "lastmac", 0, queue_size); + if(status) + return status; + + break; + + case MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE: + status = mythread_init(myhtml->thread, "lastmac", 1, queue_size); + if(status) + return status; + + myhread_create_stream(myhtml->thread, myhtml_parser_worker_stream, &status); + break; + + default: + // default MyHTML_OPTIONS_PARSE_MODE_SEPARATELY + if(thread_count == 0) + thread_count = 1; + + status = mythread_init(myhtml->thread, "lastmac", (thread_count + 1), queue_size); + if(status) + return status; + + myhread_create_stream(myhtml->thread, myhtml_parser_stream, &status); + myhread_create_batch(myhtml->thread, myhtml_parser_worker, &status, thread_count); + break; + } + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + + myhtml_clean(myhtml); + + return status; +} + +void myhtml_clean(myhtml_t* myhtml) +{ + mythread_clean(myhtml->thread); +} + +myhtml_t* myhtml_destroy(myhtml_t* myhtml) +{ + if(myhtml == NULL) + return NULL; + + myhtml_destroy_marker(myhtml); + + mythread_destroy(myhtml->thread, true); + myhtml_tokenizer_state_destroy(myhtml); + + if(myhtml->insertion_func) + myhtml_free(myhtml->insertion_func); + + myhtml_free(myhtml); + + return NULL; +} + +myhtml_status_t myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size) +{ + if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { + myhtml_tree_clean(tree); + } + + myhtml_encoding_set(tree, encoding); + myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + + if(status) + return status; + + return myhtml_tokenizer_end(tree); +} + +myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +{ + if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { + myhtml_tree_clean(tree); + } + + if(tag_id == 0) + tag_id = MyHTML_TAG_DIV; + + if(ns == 0) + ns = MyHTML_NAMESPACE_HTML; + + if(myhtml_tokenizer_fragment_init(tree, tag_id, ns) == NULL) + return MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT; + + myhtml_encoding_set(tree, encoding); + myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + + if(status) + return status; + + return myhtml_tokenizer_end(tree); +} + +myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size) +{ + if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { + myhtml_tree_clean(tree); + } + + tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; + + myhtml_encoding_set(tree, encoding); + + myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + + if(status) + return status; + + return myhtml_tokenizer_end(tree); +} + +myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +{ + if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { + myhtml_tree_clean(tree); + } + + if(tag_id == 0) + tag_id = MyHTML_TAG_DIV; + + if(ns == 0) + ns = MyHTML_NAMESPACE_HTML; + + tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; + + if(myhtml_tokenizer_fragment_init(tree, tag_id, ns) == NULL) + return MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT; + + myhtml_encoding_set(tree, encoding); + + myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + + if(status) + return status; + + return myhtml_tokenizer_end(tree); +} + +myhtml_status_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size) +{ + if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { + myhtml_tree_clean(tree); + } + + return myhtml_tokenizer_chunk(tree, html, html_size); +} + +myhtml_status_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +{ + if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { + myhtml_tree_clean(tree); + } + + if(tag_id == 0) + tag_id = MyHTML_TAG_DIV; + + if(ns == 0) + ns = MyHTML_NAMESPACE_HTML; + + if(myhtml_tokenizer_fragment_init(tree, tag_id, ns) == NULL) + return MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT; + + return myhtml_tokenizer_chunk(tree, html, html_size); +} + +myhtml_status_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size) +{ + if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) + tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; + + return myhtml_parse_chunk(tree, html, html_size); +} + +myhtml_status_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +{ + if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) + tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; + + return myhtml_parse_chunk_fragment(tree, html, html_size, tag_id, ns); +} + +myhtml_status_t myhtml_parse_chunk_end(myhtml_tree_t* tree) +{ + return myhtml_tokenizer_end(tree); +} + +void myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding) +{ + if(encoding >= MyHTML_ENCODING_LAST_ENTRY) + return; + + tree->encoding_usereq = encoding; + tree->encoding = encoding; +} + +myhtml_encoding_t myhtml_encoding_get(myhtml_tree_t* tree) +{ + return tree->encoding; +} + +/* + * Nodes + */ + +myhtml_status_t myhtml_get_nodes_by_tag_id_in_scope_find_recursion(myhtml_tree_node_t *node, myhtml_collection_t *collection, myhtml_tag_id_t tag_id) +{ + while(node) { + if(node->tag_id == tag_id) { + collection->list[ collection->length ] = node; + collection->length++; + + if(collection->length >= collection->size) + { + myhtml_status_t mystatus = myhtml_collection_check_size(collection, 1024, 0); + + if(mystatus != MyHTML_STATUS_OK) + return mystatus; + } + } + + if(node->child) + myhtml_get_nodes_by_tag_id_in_scope_find_recursion(node->child, collection, tag_id); + + node = node->next; + } + + return MyHTML_STATUS_OK; +} + +myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, myhtml_status_t *status) +{ + if(node == NULL) + return NULL; + + myhtml_status_t mystatus = MyHTML_STATUS_OK; + + if(collection == NULL) { + collection = myhtml_collection_create(1024, &mystatus); + } + + if(mystatus) { + if(status) + *status = mystatus; + + return collection; + } + + if(node->child) + mystatus = myhtml_get_nodes_by_tag_id_in_scope_find_recursion(node->child, collection, tag_id); + + collection->list[collection->length] = NULL; + + if(status) + *status = mystatus; + + return collection; +} + +myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, myhtml_status_t *status) +{ + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_name(tree->tags, html, length); + return myhtml_get_nodes_by_tag_id_in_scope(tree, collection, node, tag_ctx->id, status); +} + +myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, myhtml_status_t *status) +{ + myhtml_tag_index_entry_t *index_tag = myhtml_tag_index_entry(tree->indexes->tags, tag_id); + myhtml_tag_index_node_t *index_node = myhtml_tag_index_first(tree->indexes->tags, tag_id); + + if(index_tag->count == 0) { + if(status) + *status = MyHTML_STATUS_OK; + + return collection; + } + + myhtml_status_t mystatus = MyHTML_STATUS_OK; + size_t idx = 0; + + if(collection == NULL) { + collection = myhtml_collection_create((index_tag->count + 128), &mystatus); + + collection->length += index_tag->count; + } + else { + idx = collection->length; + mystatus = myhtml_collection_check_size(collection, index_tag->count, 128); + } + + if(mystatus) { + if(status) + *status = mystatus; + + return collection; + } + + while (index_node) + { + collection->list[idx] = index_node->node; + idx++; + + index_node = index_node->next; + } + + collection->list[idx] = NULL; + + if(status) + *status = mystatus; + + return collection; +} + +myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, myhtml_status_t *status) +{ + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_name(tree->tags, html, length); + return myhtml_get_nodes_by_tag_id(tree, collection, tag_ctx->id, status); +} + +/* + * Manipulate Nodes + */ +myhtml_tree_node_t * myhtml_node_first(myhtml_tree_t* tree) +{ + if(tree->fragment) { + // document -> html -> need element + if(tree->document && tree->document->child) + return tree->document->child->child; + } + else if(tree->document) { + // document -> html + return tree->document->child; + } + + return NULL; +} + +myhtml_tree_node_t * myhtml_node_next(myhtml_tree_node_t *node) +{ + return node->next; +} + +myhtml_tree_node_t * myhtml_node_prev(myhtml_tree_node_t *node) +{ + return node->prev; +} + +myhtml_tree_node_t * myhtml_node_parent(myhtml_tree_node_t *node) +{ + return node->parent; +} + +myhtml_tree_node_t * myhtml_node_child(myhtml_tree_node_t *node) +{ + return node->child; +} + +myhtml_tree_node_t * myhtml_node_last_child(myhtml_tree_node_t *node) +{ + return node->last_child; +} + +myhtml_tree_node_t * myhtml_node_create(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +{ + myhtml_tree_node_t *node = myhtml_tree_node_create(tree); + + node->tag_id = tag_id; + node->ns = ns; + + return node; +} + +myhtml_tree_node_t * myhtml_node_remove(myhtml_tree_t* tree, myhtml_tree_node_t *node) +{ + return myhtml_tree_node_remove(tree, node); +} + +void myhtml_node_delete(myhtml_tree_t* tree, myhtml_tree_node_t *node) +{ + myhtml_tree_node_delete(tree, node); +} + +void myhtml_node_delete_recursive(myhtml_tree_t* tree, myhtml_tree_node_t *node) +{ + myhtml_tree_node_delete_recursive(tree, node); +} + +void myhtml_node_free(myhtml_tree_t* tree, myhtml_tree_node_t *node) +{ + myhtml_tree_node_free(tree, node); +} + +myhtml_tree_node_t * myhtml_node_insert_before(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node) +{ + if(target == NULL || node == NULL) + return NULL; + + myhtml_tree_node_insert_before(tree, target, node); + + return node; +} + +myhtml_tree_node_t * myhtml_node_insert_after(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node) +{ + if(target == NULL || node == NULL) + return NULL; + + myhtml_tree_node_insert_after(tree, target, node); + + return node; +} + +myhtml_tree_node_t * myhtml_node_append_child(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node) +{ + if(target == NULL || node == NULL) + return NULL; + + myhtml_tree_node_add_child(tree, target, node); + + return node; +} + +myhtml_tree_node_t * myhtml_node_insert_to_appropriate_place(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node) +{ + if(target == NULL || node == NULL) + return NULL; + + enum myhtml_tree_insertion_mode mode; + + tree->foster_parenting = true; + target = myhtml_tree_appropriate_place_inserting_in_tree(tree, target, &mode); + tree->foster_parenting = false; + + myhtml_tree_node_insert_by_mode(tree, target, node, mode); + + return node; +} + +myhtml_string_t * myhtml_node_text_set(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding) +{ + if(node == NULL) + return NULL; + + if(encoding >= MyHTML_ENCODING_LAST_ENTRY) + return NULL; + + if(node->token == NULL) { + mcobject_async_status_t mcstatus; + node->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); + + if(mcstatus) + return NULL; + + myhtml_token_node_clean(node->token); + } + + if(node->token->str.data == NULL) { + myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, (length + 2)); + } + else { + if(node->token->str.size < length) { + mchar_async_free(tree->mchar, node->token->str.node_idx, node->token->str.data); + myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, length); + } + else + node->token->str.length = 0; + } + + if(encoding != MyHTML_ENCODING_UTF_8) { + myhtml_string_append_with_convert_encoding(&node->token->str, text, length, encoding); + } + else { + myhtml_string_append(&node->token->str, text, length); + } + + node->token->raw_begin = 0; + node->token->raw_length = 0; + + return &node->token->str; +} + +myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding) +{ + if(node == NULL) + return NULL; + + if(encoding >= MyHTML_ENCODING_LAST_ENTRY) + return NULL; + + if(node->token == NULL) { + mcobject_async_status_t mcstatus; + node->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); + + if(mcstatus) + return NULL; + + myhtml_token_node_clean(node->token); + } + + if(node->token->str.data == NULL) { + myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, (length + 2)); + } + else { + if(node->token->str.size < length) { + mchar_async_free(tree->mchar, node->token->str.node_idx, node->token->str.data); + myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, length); + } + else + node->token->str.length = 0; + } + + myhtml_data_process_entry_t proc_entry; + myhtml_data_process_entry_clean(&proc_entry); + + proc_entry.encoding = encoding; + myhtml_encoding_result_clean(&proc_entry.res); + + myhtml_data_process(&proc_entry, &node->token->str, text, length); + myhtml_data_process_end(&proc_entry, &node->token->str); + + node->token->raw_begin = 0; + node->token->raw_length = 0; + + return &node->token->str; +} + +myhtml_token_node_t* myhtml_node_token(myhtml_tree_node_t *node) +{ + return node->token; +} + +myhtml_namespace_t myhtml_node_namespace(myhtml_tree_node_t *node) +{ + return node->ns; +} + +void myhtml_node_namespace_set(myhtml_tree_node_t *node, myhtml_namespace_t ns) +{ + node->ns = ns; +} + +myhtml_tag_id_t myhtml_node_tag_id(myhtml_tree_node_t *node) +{ + return node->tag_id; +} + +const char * myhtml_tag_name_by_id(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, size_t *length) +{ + if(length) + *length = 0; + + if(tree == NULL || tree->tags == NULL) + return NULL; + + const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tree->tags, tag_id); + + if(ctx == NULL) + return NULL; + + if(length) + *length = ctx->name_length; + + return ctx->name; +} + +myhtml_tag_id_t myhtml_tag_id_by_name(myhtml_tree_t* tree, const char *tag_name, size_t length) +{ + if(tree == NULL || tree->tags == NULL) + return MyHTML_TAG__UNDEF; + + const myhtml_tag_context_t *ctx = myhtml_tag_get_by_name(tree->tags, tag_name, length); + + if(ctx == NULL) + return MyHTML_TAG__UNDEF; + + return ctx->id; +} + +bool myhtml_node_is_close_self(myhtml_tree_node_t *node) +{ + if(node->token) + return (node->token->type & MyHTML_TOKEN_TYPE_CLOSE_SELF); + + return false; +} + +myhtml_tree_attr_t * myhtml_node_attribute_first(myhtml_tree_node_t *node) +{ + if(node->token) + return node->token->attr_first; + + return NULL; +} + +myhtml_tree_attr_t * myhtml_node_attribute_last(myhtml_tree_node_t *node) +{ + if(node->token) + return node->token->attr_last; + + return NULL; +} + +const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length) +{ + if(node->token && node->token->str.length && node->token->str.data) + { + if(length) + *length = node->token->str.length; + + return node->token->str.data; + } + + if(length) + *length = 0; + + return NULL; +} + +myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node) +{ + if(node && node->token) + return &node->token->str; + + return NULL; +} + +myhtml_position_t myhtml_node_raw_pasition(myhtml_tree_node_t *node) +{ + if(node && node->token) + return (myhtml_position_t){node->token->raw_begin, node->token->raw_length}; + + return (myhtml_position_t){0, 0}; +} + +myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node) +{ + if(node && node->token) + return (myhtml_position_t){node->token->element_begin, node->token->element_length}; + + return (myhtml_position_t){0, 0}; +} + +myhtml_status_t myhtml_get_nodes_by_attribute_key_recursion(myhtml_tree_t *tree, myhtml_tree_node_t* node, myhtml_collection_t* collection, const char* key, size_t key_len) +{ + while(node) + { + if(node->token && node->token->attr_first) { + myhtml_tree_attr_t* attr = node->token->attr_first; + + while(attr) { + myhtml_string_t* str_key = &attr->key; + + if(str_key->length == key_len && myhtml_strncasecmp(str_key->data, key, key_len) == 0) { + collection->list[ collection->length ] = node; + + collection->length++; + if(collection->length >= collection->size) { + myhtml_status_t status = myhtml_collection_check_size(collection, 1024, 0); + + if(status) + return status; + } + } + + attr = attr->next; + } + } + + if(node->child) { + myhtml_status_t status = myhtml_get_nodes_by_attribute_key_recursion(tree, node->child, collection, key, key_len); + + if(status) + return status; + } + + node = node->next; + } + + return MyHTML_STATUS_OK; +} + +myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, myhtml_status_t* status) +{ + if(collection == NULL) { + collection = myhtml_collection_create(1024, status); + + if((status && *status) || collection == NULL) + return NULL; + } + + if(scope_node == NULL) + scope_node = tree->node_html; + + myhtml_status_t rec_status = myhtml_get_nodes_by_attribute_key_recursion(tree, scope_node, collection, key, key_len); + + if(rec_status && status) + *status = rec_status; + + return collection; +} + +/* find by attribute value; case-sensitivity */ +bool myhtml_get_nodes_by_attribute_value_recursion_eq(myhtml_string_t* str, const char* value, size_t value_len) +{ + return str->length == value_len && myhtml_strncmp(str->data, value, value_len) == 0; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + const char *data = str->data; + + if(myhtml_strncmp(data, value, value_len) == 0) { + if((str->length > value_len && myhtml_utils_whithspace(data[value_len], ==, ||)) || str->length == value_len) + return true; + } + + for(size_t i = 1; (str->length - i) >= value_len; i++) + { + if(myhtml_utils_whithspace(data[(i - 1)], ==, ||)) { + if(myhtml_strncmp(&data[i], value, value_len) == 0) { + if((i > value_len && myhtml_utils_whithspace(data[(i + value_len)], ==, ||)) || (str->length - i) == value_len) + return true; + } + } + } + + return false; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_begin(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + return myhtml_strncmp(str->data, value, value_len) == 0; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_end(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + return myhtml_strncmp(&str->data[ (str->length - (str->length - value_len)) ], value, value_len) == 0; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_contain(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + const char *data = str->data; + + for(size_t i = 0; (str->length - i) >= value_len; i++) + { + if(myhtml_strncmp(&data[i], value, value_len) == 0) { + return true; + } + } + + return false; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated(myhtml_string_t* str, const char* value, size_t value_len) +{ + const char *data = str->data; + + if(str->length < value_len) + return false; + else if(str->length == value_len && myhtml_strncmp(data, value, value_len) == 0) { + return true; + } + else if(myhtml_strncmp(data, value, value_len) == 0 && data[value_len] == '-') { + return true; + } + + return false; +} + +/* find by attribute value; case-insensitive */ +bool myhtml_get_nodes_by_attribute_value_recursion_eq_i(myhtml_string_t* str, const char* value, size_t value_len) +{ + return str->length == value_len && myhtml_strncasecmp(str->data, value, value_len) == 0; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated_i(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + const char *data = str->data; + + if(myhtml_strncasecmp(data, value, value_len) == 0) { + if((str->length > value_len && myhtml_utils_whithspace(data[value_len], ==, ||)) || str->length == value_len) + return true; + } + + for(size_t i = 1; (str->length - i) >= value_len; i++) + { + if(myhtml_utils_whithspace(data[(i - 1)], ==, ||)) { + if(myhtml_strncasecmp(&data[i], value, value_len) == 0) { + if((i > value_len && myhtml_utils_whithspace(data[(i + value_len)], ==, ||)) || (str->length - i) == value_len) + return true; + } + } + } + + return false; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_begin_i(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + return myhtml_strncasecmp(str->data, value, value_len) == 0; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_end_i(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + return myhtml_strncasecmp(&str->data[ (str->length - (str->length - value_len)) ], value, value_len) == 0; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_contain_i(myhtml_string_t* str, const char* value, size_t value_len) +{ + if(str->length < value_len) + return false; + + const char *data = str->data; + + for(size_t i = 0; (str->length - i) >= value_len; i++) + { + if(myhtml_strncasecmp(&data[i], value, value_len) == 0) { + return true; + } + } + + return false; +} + +bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated_i(myhtml_string_t* str, const char* value, size_t value_len) +{ + const char *data = str->data; + + if(str->length < value_len) + return false; + else if(str->length == value_len && myhtml_strncasecmp(data, value, value_len) == 0) { + return true; + } + else if(myhtml_strncasecmp(data, value, value_len) == 0 && data[value_len] == '-') { + return true; + } + + return false; +} + +/* find by attribute value; basic functions */ +myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion(myhtml_tree_t *tree, myhtml_tree_node_t* node, + myhtml_collection_t* collection, + myhtml_attribute_value_find_f func_eq, + const char* value, size_t value_len) +{ + while(node) + { + if(node->token && node->token->attr_first) { + myhtml_tree_attr_t* attr = node->token->attr_first; + + while(attr) { + myhtml_string_t* str = &attr->value; + + if(func_eq(str, value, value_len)) { + collection->list[ collection->length ] = node; + + collection->length++; + if(collection->length >= collection->size) { + myhtml_status_t status = myhtml_collection_check_size(collection, 1024, 0); + + if(status) + return status; + } + } + + attr = attr->next; + } + } + + if(node->child) { + myhtml_status_t status = myhtml_get_nodes_by_attribute_value_recursion(tree, node->child, collection, func_eq, value, value_len); + + if(status) + return status; + } + + node = node->next; + } + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion_by_key(myhtml_tree_t *tree, myhtml_tree_node_t* node, + myhtml_collection_t* collection, + myhtml_attribute_value_find_f func_eq, + const char* key, size_t key_len, + const char* value, size_t value_len) +{ + while(node) + { + if(node->token && node->token->attr_first) { + myhtml_tree_attr_t* attr = node->token->attr_first; + + while(attr) { + myhtml_string_t* str_key = &attr->key; + myhtml_string_t* str = &attr->value; + + if(str_key->length == key_len && myhtml_strncasecmp(str_key->data, key, key_len) == 0) + { + if(func_eq(str, value, value_len)) { + collection->list[ collection->length ] = node; + + collection->length++; + if(collection->length >= collection->size) { + myhtml_status_t status = myhtml_collection_check_size(collection, 1024, 0); + + if(status) + return status; + } + } + } + + attr = attr->next; + } + } + + if(node->child) { + myhtml_status_t status = myhtml_get_nodes_by_attribute_value_recursion_by_key(tree, node->child, collection, func_eq, + key, key_len, value, value_len); + + if(status) + return status; + } + + node = node->next; + } + + return MyHTML_STATUS_OK; +} + +myhtml_collection_t * _myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + myhtml_attribute_value_find_f func_eq, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status) +{ + if(collection == NULL) { + collection = myhtml_collection_create(1024, status); + + if((status && *status) || collection == NULL) + return NULL; + } + + if(node == NULL) + node = tree->node_html; + + myhtml_status_t rec_status; + + if(key && key_len) + rec_status = myhtml_get_nodes_by_attribute_value_recursion_by_key(tree, node, collection, func_eq, key, key_len, value, value_len); + else + rec_status = myhtml_get_nodes_by_attribute_value_recursion(tree, node, collection, func_eq, value, value_len); + + if(rec_status && status) + *status = rec_status; + + return collection; +} + +myhtml_collection_t * myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status) +{ + if(case_insensitive) { + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_eq_i, + key, key_len, value, value_len, status); + } + + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_eq, + key, key_len, value, value_len, status); +} + +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status) +{ + if(case_insensitive) { + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated_i, + key, key_len, value, value_len, status); + } + + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated, + key, key_len, value, value_len, status); +} + +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status) +{ + if(case_insensitive) { + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_begin_i, + key, key_len, value, value_len, status); + } + + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_begin, + key, key_len, value, value_len, status); +} + +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status) +{ + if(case_insensitive) { + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_end_i, + key, key_len, value, value_len, status); + } + + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_end, + key, key_len, value, value_len, status); +} + +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status) +{ + if(case_insensitive) { + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_contain_i, + key, key_len, value, value_len, status); + } + + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_contain, + key, key_len, value, value_len, status); +} + +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status) +{ + if(case_insensitive) { + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated_i, + key, key_len, value, value_len, status); + } + + return _myhtml_get_nodes_by_attribute_value(tree, collection, node, + myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated, + key, key_len, value, value_len, status); +} + +/* + * Attributes + */ +myhtml_tree_attr_t * myhtml_attribute_next(myhtml_tree_attr_t *attr) +{ + return attr->next; +} + +myhtml_tree_attr_t * myhtml_attribute_prev(myhtml_tree_attr_t *attr) +{ + return attr->prev; +} + +enum myhtml_namespace myhtml_attribute_namespace(myhtml_tree_attr_t *attr) +{ + return attr->ns; +} + +void myhtml_attribute_namespace_set(myhtml_tree_attr_t *attr, myhtml_namespace_t ns) +{ + attr->ns = ns; +} + +const char * myhtml_attribute_key(myhtml_tree_attr_t *attr, size_t *length) +{ + if(attr->key.data && attr->key.length) + { + if(length) + *length = attr->key.length; + + return attr->key.data; + } + + if(length) + *length = 0; + + return NULL; +} + +const char * myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length) +{ + if(attr->value.data && attr->value.length) + { + if(length) + *length = attr->value.length; + + return attr->value.data; + } + + if(length) + *length = 0; + + return NULL; +} + +myhtml_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr) +{ + if(attr) + return &attr->key; + + return NULL; +} + +myhtml_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr) +{ + if(attr) + return &attr->value; + + return NULL; +} + +myhtml_tree_attr_t * myhtml_attribute_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len) +{ + if(node == NULL || node->token == NULL) + return NULL; + + return myhtml_token_attr_by_name(node->token, key, key_len); +} + +myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_t *tree, myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myhtml_encoding_t encoding) +{ + if(node == NULL) + return NULL; + + if(node->token == NULL) { + mcobject_async_status_t mcstatus; + node->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); + + if(mcstatus) + return NULL; + + myhtml_token_node_clean(node->token); + } + + return myhtml_token_node_attr_append_with_convert_encoding(tree->token, node->token, key, key_len, + value, value_len, tree->mcasync_token_id, encoding); +} + +myhtml_tree_attr_t * myhtml_attribute_remove(myhtml_tree_node_t *node, myhtml_tree_attr_t *attr) +{ + if(node == NULL || node->token == NULL) + return NULL; + + return myhtml_token_attr_remove(node->token, attr); +} + +myhtml_tree_attr_t * myhtml_attribute_remove_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len) +{ + if(node == NULL || node->token == NULL) + return NULL; + + return myhtml_token_attr_remove_by_name(node->token, key, key_len); +} + +void myhtml_attribute_delete(myhtml_tree_t *tree, myhtml_tree_node_t *node, myhtml_tree_attr_t *attr) +{ + if(node == NULL || node->token == NULL) + return; + + myhtml_token_attr_remove(node->token, attr); + myhtml_attribute_free(tree, attr); +} + +void myhtml_attribute_free(myhtml_tree_t *tree, myhtml_tree_attr_t *attr) +{ + if(attr->key.data) + mchar_async_free(attr->key.mchar, attr->key.node_idx, attr->key.data); + if(attr->value.data) + mchar_async_free(attr->value.mchar, attr->value.node_idx, attr->value.data); + + mcobject_async_free(tree->token->attr_obj, attr); +} + +myhtml_position_t myhtml_attribute_key_raw_position(myhtml_tree_attr_t *attr) +{ + if(attr) + return (myhtml_position_t){attr->raw_key_begin, attr->raw_key_length}; + + return (myhtml_position_t){0, 0}; +} + +myhtml_position_t myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr) +{ + if(attr) + return (myhtml_position_t){attr->raw_value_begin, attr->raw_value_length}; + + return (myhtml_position_t){0, 0}; +} + +/* + * Collections + */ +myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *status) +{ + myhtml_collection_t *collection = (myhtml_collection_t*)myhtml_malloc(sizeof(myhtml_collection_t)); + + if(collection == NULL) { + if(status) + *status = MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; + + return NULL; + } + + collection->size = size; + collection->length = 0; + collection->list = (myhtml_tree_node_t **)myhtml_malloc(sizeof(myhtml_tree_node_t*) * size); + + if(collection->list == NULL) { + myhtml_free(collection); + + if(status) + *status = MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; + + return NULL; + } + + if(status) + *status = MyHTML_STATUS_OK; + + return collection; +} + +myhtml_status_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length) +{ + if((collection->length + need) >= collection->size) + { + size_t tmp_size = collection->length + need + upto_length + 1; + myhtml_tree_node_t **tmp = (myhtml_tree_node_t **)myhtml_realloc(collection->list, sizeof(myhtml_tree_node_t*) * tmp_size); + + if(tmp) { + collection->length = upto_length; + collection->size = tmp_size; + collection->list = tmp; + } + else + return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; + } + + return MyHTML_STATUS_OK; +} + +void myhtml_collection_clean(myhtml_collection_t *collection) +{ + if(collection) + collection->length = 0; +} + +myhtml_collection_t * myhtml_collection_destroy(myhtml_collection_t *collection) +{ + if(collection == NULL) + return NULL; + + if(collection->list) + myhtml_free(collection->list); + + myhtml_free(collection); + + return NULL; +} + +/* queue */ +void myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token) +{ + mythread_queue_node_t *qnode = tree->current_qnode; + + if(tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN) { + if(token && token->tag_id == MyHTML_TAG__TEXT && token->type & MyHTML_TOKEN_TYPE_WHITESPACE) + { + myhtml_token_node_clean(token); + token->raw_begin = token->element_begin = (tree->global_offset + begin); + + return; + } + } + + qnode->token = token; + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + + if(tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) { + myhtml_parser_worker(0, qnode); + while(myhtml_rules_tree_dispatcher(tree, token)){}; + + tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread, tree->queue, 4, NULL); + } + else { + tree->current_qnode = mythread_queue_node_malloc_round(tree->myhtml->thread, tree->queue_entry, NULL); + } + +#else + + myhtml_parser_worker(0, qnode); + while(myhtml_rules_tree_dispatcher(tree, token)){}; + + tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread, tree->queue, 4, NULL); + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + + tree->current_qnode->tree = tree; + tree->current_qnode->prev = qnode; + + if(qnode) + myhtml_tokenizer_calc_current_namespace(tree, token); + + myhtml_token_node_malloc(tree->token, tree->current_token_node, tree->token->mcasync_token_id); + + tree->current_token_node->raw_begin = tree->current_token_node->element_begin = (tree->global_offset + begin); +} + +bool myhtml_utils_strcmp(const char* ab, const char* to_lowercase, size_t size) +{ + size_t i = 0; + + for(;;) { + if(i == size) + return true; + + if((const unsigned char)(to_lowercase[i] > 0x40 && to_lowercase[i] < 0x5b ? + (to_lowercase[i]|0x60) : to_lowercase[i]) != (const unsigned char)ab[i]) + { + return false; + } + + i++; + } + + return false; +} + +bool myhtml_is_html_node(myhtml_tree_node_t *node, myhtml_tag_id_t tag_id) +{ + if(node == NULL) + return false; + + return node->tag_id == tag_id && node->ns == MyHTML_NAMESPACE_HTML; +} + +/* version */ +myhtml_version_t myhtml_version(void) +{ + return (myhtml_version_t){MyHTML_VERSION_MAJOR, MyHTML_VERSION_MINOR, MyHTML_VERSION_PATCH}; +} + + + + diff --git a/source/myhtml/myhtml.h b/source/myhtml/myhtml.h new file mode 100644 index 0000000..01d86b6 --- /dev/null +++ b/source/myhtml/myhtml.h @@ -0,0 +1,238 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYHTML_H +#define MyHTML_MYHTML_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" + +#include "myhtml/utils/mctree.h" +#include "myhtml/utils/mcobject_async.h" +#include "myhtml/tree.h" +#include "myhtml/tag.h" +#include "myhtml/def.h" +#include "myhtml/parser.h" +#include "myhtml/tokenizer.h" +#include "myhtml/thread.h" +#include "myhtml/rules.h" +#include "myhtml/token.h" +#include "myhtml/charef.h" +#include "myhtml/encoding.h" +#include "myhtml/incoming.h" +#include "myhtml/callback.h" + +#define mh_queue_current() tree->queue +#define myhtml_tokenizer_state_set(tree) myhtml_tree_set(tree, state) + +#define mh_queue_get(idx, attr) myhtml->queue->nodes[idx].attr + +// space, tab, LF, FF, CR +#define myhtml_whithspace(onechar, action, logic) \ + onechar action ' ' logic \ + onechar action '\t' logic \ + onechar action '\n' logic \ + onechar action '\f' logic \ + onechar action '\r' + +#define myhtml_ascii_char_cmp(onechar) \ + ((onechar >= 'a' && onechar <= 'z') || \ + (onechar >= 'A' && onechar <= 'Z')) + +#define myhtml_ascii_char_unless_cmp(onechar) \ + ((onechar < 'a' || onechar > 'z') && \ + (onechar < 'A' || onechar > 'Z')) + +struct myhtml { + mythread_t *thread; + //mchar_async_t *mchar; // for all + + myhtml_tokenizer_state_f* parse_state_func; + myhtml_insertion_f* insertion_func; + + enum myhtml_options opt; + myhtml_tree_node_t *marker; +}; + +struct myhtml_collection { + myhtml_tree_node_t **list; + size_t size; + size_t length; +}; + + +myhtml_t * myhtml_create(void); +myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); +void myhtml_clean(myhtml_t* myhtml); +myhtml_t* myhtml_destroy(myhtml_t* myhtml); + +myhtml_status_t myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); + +myhtml_status_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +myhtml_status_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); +myhtml_status_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +myhtml_status_t myhtml_parse_chunk_end(myhtml_tree_t* tree); + +// encoding +void myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); +myhtml_encoding_t myhtml_encoding_get(myhtml_tree_t* tree); + +myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, myhtml_status_t* status); +/* like a [some=value] or #id */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some~=value] or .class */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some^=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some$=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some*=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); +/* like a [some|=value] */ +myhtml_collection_t * myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, + bool case_insensitive, + const char* key, size_t key_len, + const char* value, size_t value_len, + myhtml_status_t* status); + +myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, myhtml_status_t *status); + +myhtml_tree_node_t * myhtml_node_first(myhtml_tree_t* tree); +myhtml_tree_node_t * myhtml_node_next(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_prev(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_parent(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_child(myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_last_child(myhtml_tree_node_t *node); + +myhtml_tree_node_t * myhtml_node_insert_to_appropriate_place(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_append_child(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_insert_after(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); +myhtml_tree_node_t * myhtml_node_insert_before(myhtml_tree_t* tree, myhtml_tree_node_t *target, myhtml_tree_node_t *node); + +myhtml_tree_node_t * myhtml_node_create(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +myhtml_tree_node_t * myhtml_node_remove(myhtml_tree_t* tree, myhtml_tree_node_t *node); +void myhtml_node_delete(myhtml_tree_t* tree, myhtml_tree_node_t *node); +void myhtml_node_delete_recursive(myhtml_tree_t* tree, myhtml_tree_node_t *node); +void myhtml_node_free(myhtml_tree_t* tree, myhtml_tree_node_t *node); + +myhtml_token_node_t* myhtml_node_token(myhtml_tree_node_t *node); +myhtml_namespace_t myhtml_node_namespace(myhtml_tree_node_t *node); +void myhtml_node_namespace_set(myhtml_tree_node_t *node, myhtml_namespace_t ns); +myhtml_tag_id_t myhtml_node_tag_id(myhtml_tree_node_t *node); +const char * myhtml_tag_name_by_id(myhtml_tree_t* tree, myhtml_tag_id_t tag_id, size_t *length); +myhtml_tag_id_t myhtml_tag_id_by_name(myhtml_tree_t* tree, const char *tag_name, size_t length); +bool myhtml_node_is_close_self(myhtml_tree_node_t *node); +myhtml_tree_attr_t * myhtml_node_attribute_first(myhtml_tree_node_t *node); +myhtml_tree_attr_t * myhtml_node_attribute_last(myhtml_tree_node_t *node); +const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length); +myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node); +myhtml_position_t myhtml_node_raw_pasition(myhtml_tree_node_t *node); +myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); + +/* attributes */ +myhtml_tree_attr_t * myhtml_attribute_next(myhtml_tree_attr_t *attr); +myhtml_tree_attr_t * myhtml_attribute_prev(myhtml_tree_attr_t *attr); +enum myhtml_namespace myhtml_attribute_namespace(myhtml_tree_attr_t *attr); +void myhtml_attribute_namespace_set(myhtml_tree_attr_t *attr, myhtml_namespace_t ns); + +const char * myhtml_attribute_key(myhtml_tree_attr_t *attr, size_t *length); +const char * myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); +myhtml_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr); +myhtml_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr); +myhtml_tree_attr_t * myhtml_attribute_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); +myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_t *tree, myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myhtml_encoding_t encoding); +myhtml_tree_attr_t * myhtml_attribute_remove(myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); +myhtml_tree_attr_t * myhtml_attribute_remove_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); +void myhtml_attribute_delete(myhtml_tree_t *tree, myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); +void myhtml_attribute_free(myhtml_tree_t *tree, myhtml_tree_attr_t *attr); +myhtml_position_t myhtml_attribute_key_raw_position(myhtml_tree_attr_t *attr); +myhtml_position_t myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr); + +/* collection */ +myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *status); +void myhtml_collection_clean(myhtml_collection_t *collection); +myhtml_collection_t * myhtml_collection_destroy(myhtml_collection_t *collection); +myhtml_status_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); + +// strings +myhtml_string_t * myhtml_node_text_set(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); +myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); + +bool myhtml_utils_strcmp(const char* ab, const char* to_lowercase, size_t size); +bool myhtml_is_html_node(myhtml_tree_node_t *node, myhtml_tag_id_t tag_id); + +// queue +void myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token); + +/** + * Platform-specific hdef performance clock queries. + * Implemented in perf.c + */ + +/** Get clock resolution */ +uint64_t myhtml_hperf_res(myhtml_status_t *status); + +/** Get current value in clock ticks */ +uint64_t myhtml_hperf_clock(myhtml_status_t *status); + +/** Print an hperf measure */ +myhtml_status_t myhtml_hperf_print(const char *name, uint64_t x, uint64_t y, FILE *fh); +myhtml_status_t myhtml_hperf_print_by_val(const char *name, uint64_t x, FILE *fh); + +/* version */ +myhtml_version_t myhtml_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/source/myhtml/mynamespace.c b/source/myhtml/mynamespace.c new file mode 100644 index 0000000..082919f --- /dev/null +++ b/source/myhtml/mynamespace.c @@ -0,0 +1,114 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/mynamespace.h" +#include "myhtml/mynamespace_resource.h" +#include "myhtml/utils/resources.h" + +const myhtml_namespace_detect_name_entry_t * myhtml_namespace_name_entry_by_name(const char* name, size_t length) +{ + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyHTML_NAMESPACE_DETECT_NAME_STATIC_SIZE) + 1; + + while (myhtml_namespace_detect_name_entry_static_list_index[idx].name) + { + if(myhtml_namespace_detect_name_entry_static_list_index[idx].name_length == length) { + if(myhtml_strncasecmp(myhtml_namespace_detect_name_entry_static_list_index[idx].name, name, length) == 0) + return &myhtml_namespace_detect_name_entry_static_list_index[idx]; + + if(myhtml_namespace_detect_name_entry_static_list_index[idx].next) + idx = myhtml_namespace_detect_name_entry_static_list_index[idx].next; + else + return NULL; + } + else if(myhtml_namespace_detect_name_entry_static_list_index[idx].name_length > length) { + return NULL; + } + else { + idx = myhtml_namespace_detect_name_entry_static_list_index[idx].next; + } + } + + return NULL; +} + +bool myhtml_namespace_id_by_name(const char *name, size_t length, myhtml_namespace_t *ns) +{ + const myhtml_namespace_detect_name_entry_t *entry = myhtml_namespace_name_entry_by_name(name, length); + + if(entry) { + if(ns) + *ns = entry->ns; + + return true; + } + + return false; +} + +const char * myhtml_namespace_name_by_id(myhtml_namespace_t ns, size_t *length) +{ + if(ns > MyHTML_NAMESPACE_LAST_ENTRY) { + if(length) + *length = 0; + + return NULL; + } + + const char *name_ns = myhtml_namespace_resource_names_map[ns]; + + if(length) + *length = strlen(name_ns); + + return name_ns; +} + +myhtml_namespace_t myhtml_namespace_id_by_url(const char *url, size_t length) +{ + size_t i = 0; + while(myhtml_namespace_detect_url_entry_static_list_index[i].ns) + { + if(myhtml_namespace_detect_url_entry_static_list_index[i].url_length == length) { + size_t k = length; + + const unsigned char *u_url = (const unsigned char*)myhtml_namespace_detect_url_entry_static_list_index[i].url; + const unsigned char *u_target_url = (const unsigned char*)url; + + while(k) { + k--; + + if(u_url[k] != u_target_url[k]) { + i++; + continue; + } + } + + return myhtml_namespace_detect_url_entry_static_list_index[i].ns; + } + + i++; + } + + return MyHTML_NAMESPACE_UNDEF; +} + + diff --git a/source/myhtml/mynamespace.h b/source/myhtml/mynamespace.h new file mode 100644 index 0000000..c0daa5e --- /dev/null +++ b/source/myhtml/mynamespace.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYNAMESPACE_H +#define MyHTML_MYNAMESPACE_H +#pragma once + +#define MyHTML_NAMESPACE_DETECT_NAME_STATIC_SIZE 19 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "myhtml/myosi.h" +#include "myhtml/utils.h" + +struct myhtml_namespace_detect_name_entry { + const char* name; + size_t name_length; + + myhtml_namespace_t ns; + + size_t next; + size_t curr; +} +typedef myhtml_namespace_detect_name_entry_t; + +struct myhtml_namespace_detect_url_entry { + const char* url; + size_t url_length; + + myhtml_namespace_t ns; +} +typedef myhtml_namespace_detect_url_entry_t; + +const char * myhtml_namespace_name_by_id(myhtml_namespace_t ns, size_t *length); +bool myhtml_namespace_id_by_name(const char *name, size_t length, myhtml_namespace_t *ns); +myhtml_namespace_t myhtml_namespace_id_by_url(const char *url, size_t length); +const myhtml_namespace_detect_name_entry_t * myhtml_namespace_name_entry_by_name(const char* name, size_t length); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_MYNAMESPACE_H */ diff --git a/source/myhtml/mynamespace_resource.h b/source/myhtml/mynamespace_resource.h new file mode 100644 index 0000000..8dfdad2 --- /dev/null +++ b/source/myhtml/mynamespace_resource.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + */ + +#ifndef MyHTML_MYNAMESPACE_RESOURCE_H +#define MyHTML_MYNAMESPACE_RESOURCE_H +#pragma once + +static const myhtml_namespace_detect_name_entry_t myhtml_namespace_detect_name_entry_static_list_index[] = +{ + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"SVG", 3, MyHTML_NAMESPACE_SVG, 0, 6}, + {"XML", 3, MyHTML_NAMESPACE_XML, 0, 7}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"MATHML", 6, MyHTML_NAMESPACE_MATHML, 0, 10}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"XMLNS", 5, MyHTML_NAMESPACE_XMLNS, 0, 12}, + {"HTML", 4, MyHTML_NAMESPACE_HTML, 0, 13}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF, 0, 0}, + {"XLINK", 5, MyHTML_NAMESPACE_XLINK, 0, 19}, +}; + +static const char myhtml_namespace_resource_names_map[][8] = { + "", "HTML", "MathML", "SVG", "XLink", "XML", "XMLNS", "*" +}; + +static const myhtml_namespace_detect_url_entry_t myhtml_namespace_detect_url_entry_static_list_index[] = { + {"http://www.w3.org/1999/xhtml", 28, MyHTML_NAMESPACE_HTML}, + {"http://www.w3.org/1998/Math/MathML", 34, MyHTML_NAMESPACE_MATHML}, + {"http://www.w3.org/2000/svg", 26, MyHTML_NAMESPACE_SVG}, + {"http://www.w3.org/1999/xlink", 28, MyHTML_NAMESPACE_XLINK}, + {"http://www.w3.org/XML/1998/namespace", 36, MyHTML_NAMESPACE_XML}, + {"http://www.w3.org/2000/xmlns/", 29, MyHTML_NAMESPACE_XMLNS}, + {NULL, 0, MyHTML_NAMESPACE_UNDEF} +}; + +#endif /* MyHTML_MYNAMESPACE_RESOURCE_H */ diff --git a/source/myhtml/myosi.c b/source/myhtml/myosi.c new file mode 100644 index 0000000..cd1e683 --- /dev/null +++ b/source/myhtml/myosi.c @@ -0,0 +1,50 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/myosi.h" + +void * myhtml_mem_malloc(size_t size) +{ + return malloc(size); +} + +// see who's call realloc +void * myhtml_mem_realloc(void* dst, size_t size) +{ + return realloc(dst, size); +} + +void * myhtml_mem_calloc(size_t num, size_t size) +{ + return calloc(num, size); +} + +void myhtml_mem_free(void* dst) +{ + free(dst); +} + +void myhtml_print(FILE* out, const char* format, ...) +{ + va_list argptr; + va_start(argptr, format); + vfprintf(out, format, argptr); + va_end(argptr); +} diff --git a/source/myhtml/myosi.h b/source/myhtml/myosi.h new file mode 100644 index 0000000..9b2da8a --- /dev/null +++ b/source/myhtml/myosi.h @@ -0,0 +1,514 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYOSI_H +#define MyHTML_MYOSI_H +#pragma once + +#include +#include +#include +#include +#include +#include + +#define MyHTML_VERSION_MAJOR 1 +#define MyHTML_VERSION_MINOR 0 +#define MyHTML_VERSION_PATCH 3 + +#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WINPTHREADS_VERSION) +#define IS_OS_WINDOWS +#include +#endif + +#if defined(_MSC_VER) +# define MyHTML_DEPRECATED(func, message) __declspec(deprecated(message)) func +#elif defined(__GNUC__) || defined(__INTEL_COMPILER) +# define MyHTML_DEPRECATED(func, message) func __attribute__((deprecated(message))) +#else +# define MyHTML_DEPRECATED(func, message) func +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Mem */ +#ifdef MyHTML_EXTERN_MALLOC + extern void * MyHTML_EXTERN_MALLOC(size_t size); + #define myhtml_malloc MyHTML_EXTERN_MALLOC +#else + #define myhtml_malloc myhtml_mem_malloc +#endif + +#ifdef MyHTML_EXTERN_REALLOC + extern void * MyHTML_EXTERN_REALLOC(void* dst, size_t size); + #define myhtml_realloc MyHTML_EXTERN_REALLOC +#else + #define myhtml_realloc myhtml_mem_realloc +#endif + +#ifdef MyHTML_EXTERN_CALLOC + extern void * MyHTML_EXTERN_CALLOC(size_t num, size_t size); + #define myhtml_calloc MyHTML_EXTERN_CALLOC +#else + #define myhtml_calloc myhtml_mem_calloc +#endif + +#ifdef MyHTML_EXTERN_FREE + extern void MyHTML_EXTERN_FREE(void* dst); + #define myhtml_free MyHTML_EXTERN_FREE +#else + #define myhtml_free myhtml_mem_free +#endif + +/* Debug */ +#ifdef DEBUG_MODE + #define MyHTML_DEBUG(format, ...) \ + myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) +#else + #define MyHTML_DEBUG(format, ...) +#endif + +#ifdef DEBUG_MODE + #define MyHTML_DEBUG_ERROR(format, ...) \ + myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) +#else + #define MyHTML_DEBUG_ERROR(format, ...) +#endif + +#define myhtml_base_add(myhtml, point, lenn, sizen, strcn, size) \ + myhtml->Lenn++; \ + if(myhtml->lenn == myhtml->sizen) { \ + myhtml->sizen += size; \ + myhtml->point = (strcn*)myhtml_realloc(myhtml->point, \ + sizeof(strcn) * myhtml->sizen); \ + } + + +// encoding +// https://encoding.spec.whatwg.org/#the-encoding +// https://encoding.spec.whatwg.org/#legacy-single-byte-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(simplified)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(traditional)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-japanese-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-korean-encodings +// https://encoding.spec.whatwg.org/#legacy-miscellaneous-encodings + +enum myhtml_encoding_list { + MyHTML_ENCODING_DEFAULT = 0x00, +// MyHTML_ENCODING_AUTO = 0x01, // future +// MyHTML_ENCODING_CUSTOM = 0x02, // future + MyHTML_ENCODING_UTF_8 = 0x00, // default encoding + MyHTML_ENCODING_UTF_16LE = 0x04, + MyHTML_ENCODING_UTF_16BE = 0x05, + MyHTML_ENCODING_X_USER_DEFINED = 0x06, + MyHTML_ENCODING_BIG5 = 0x07, + MyHTML_ENCODING_EUC_KR = 0x08, + MyHTML_ENCODING_GB18030 = 0x09, + MyHTML_ENCODING_IBM866 = 0x0a, + MyHTML_ENCODING_ISO_8859_10 = 0x0b, + MyHTML_ENCODING_ISO_8859_13 = 0x0c, + MyHTML_ENCODING_ISO_8859_14 = 0x0d, + MyHTML_ENCODING_ISO_8859_15 = 0x0e, + MyHTML_ENCODING_ISO_8859_16 = 0x0f, + MyHTML_ENCODING_ISO_8859_2 = 0x10, + MyHTML_ENCODING_ISO_8859_3 = 0x11, + MyHTML_ENCODING_ISO_8859_4 = 0x12, + MyHTML_ENCODING_ISO_8859_5 = 0x13, + MyHTML_ENCODING_ISO_8859_6 = 0x14, + MyHTML_ENCODING_ISO_8859_7 = 0x15, + MyHTML_ENCODING_ISO_8859_8 = 0x16, + MyHTML_ENCODING_KOI8_R = 0x17, + MyHTML_ENCODING_KOI8_U = 0x18, + MyHTML_ENCODING_MACINTOSH = 0x19, + MyHTML_ENCODING_WINDOWS_1250 = 0x1a, + MyHTML_ENCODING_WINDOWS_1251 = 0x1b, + MyHTML_ENCODING_WINDOWS_1252 = 0x1c, + MyHTML_ENCODING_WINDOWS_1253 = 0x1d, + MyHTML_ENCODING_WINDOWS_1254 = 0x1e, + MyHTML_ENCODING_WINDOWS_1255 = 0x1f, + MyHTML_ENCODING_WINDOWS_1256 = 0x20, + MyHTML_ENCODING_WINDOWS_1257 = 0x21, + MyHTML_ENCODING_WINDOWS_1258 = 0x22, + MyHTML_ENCODING_WINDOWS_874 = 0x23, + MyHTML_ENCODING_X_MAC_CYRILLIC = 0x24, + MyHTML_ENCODING_ISO_2022_JP = 0x25, + MyHTML_ENCODING_GBK = 0x26, + MyHTML_ENCODING_SHIFT_JIS = 0x27, + MyHTML_ENCODING_EUC_JP = 0x28, + MyHTML_ENCODING_ISO_8859_8_I = 0x29, + MyHTML_ENCODING_LAST_ENTRY = 0x2a +} +typedef myhtml_encoding_t; + +// char references +typedef struct myhtml_data_process_entry myhtml_data_process_entry_t; + +// strings +typedef struct myhtml_string myhtml_string_t; + +// thread +enum mythread_thread_opt { + MyTHREAD_OPT_UNDEF = 0x00, + MyTHREAD_OPT_WAIT = 0x01, + MyTHREAD_OPT_QUIT = 0x02, + MyTHREAD_OPT_STOP = 0x04 +} +typedef mythread_thread_opt_t; + +typedef struct mythread_queue_list_entry mythread_queue_list_entry_t; +typedef struct mythread_queue_thread_param mythread_queue_thread_param_t; +typedef struct mythread_queue_list mythread_queue_list_t; +typedef struct mythread_queue_node mythread_queue_node_t; +typedef struct mythread_queue mythread_queue_t; + +typedef size_t mythread_id_t; +typedef struct mythread_workers_list mythread_workers_list_t; +typedef struct mythread_context mythread_context_t; +typedef struct mythread_list mythread_list_t; +typedef struct mythread mythread_t; + +// tree +enum myhtml_tree_flags { + MyHTML_TREE_FLAGS_CLEAN = 0x000, + MyHTML_TREE_FLAGS_SCRIPT = 0x001, + MyHTML_TREE_FLAGS_FRAMESET_OK = 0x002, + MyHTML_TREE_FLAGS_IFRAME_SRCDOC = 0x004, + MyHTML_TREE_FLAGS_ALREADY_STARTED = 0x008, + MyHTML_TREE_FLAGS_SINGLE_MODE = 0x010, + MyHTML_TREE_FLAGS_PARSE_END = 0x020, + MyHTML_TREE_FLAGS_PARSE_FLAG = 0x040, + MyHTML_TREE_FLAGS_PARSE_FLAG_EMIT_NEWLINE = 0x080 +}; + +enum myhtml_tree_parse_flags { + MyHTML_TREE_PARSE_FLAGS_CLEAN = 0x000, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE = 0x001, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_PROCESS_TOKEN = 0x003, + MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN = 0x004, + MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE = 0x008, +} +typedef myhtml_tree_parse_flags_t; + +typedef struct myhtml_tree_temp_tag_name myhtml_tree_temp_tag_name_t; +typedef struct myhtml_tree_insertion_list myhtml_tree_insertion_list_t; +typedef struct myhtml_tree_token_list myhtml_tree_token_list_t; +typedef struct myhtml_tree_list myhtml_tree_list_t; +typedef struct myhtml_tree_indexes myhtml_tree_indexes_t; +typedef struct myhtml_tree_doctype myhtml_tree_doctype_t; +typedef struct myhtml_async_args myhtml_async_args_t; + +typedef struct myhtml_tree_node myhtml_tree_node_t; +typedef struct myhtml_tree myhtml_tree_t; + +// token +enum myhtml_token_type { + MyHTML_TOKEN_TYPE_OPEN = 0x000, + MyHTML_TOKEN_TYPE_CLOSE = 0x001, + MyHTML_TOKEN_TYPE_CLOSE_SELF = 0x002, + MyHTML_TOKEN_TYPE_DONE = 0x004, + MyHTML_TOKEN_TYPE_WHITESPACE = 0x008, + MyHTML_TOKEN_TYPE_RCDATA = 0x010, + MyHTML_TOKEN_TYPE_RAWTEXT = 0x020, + MyHTML_TOKEN_TYPE_SCRIPT = 0x040, + MyHTML_TOKEN_TYPE_PLAINTEXT = 0x080, + MyHTML_TOKEN_TYPE_CDATA = 0x100, + MyHTML_TOKEN_TYPE_DATA = 0x200, + MyHTML_TOKEN_TYPE_COMMENT = 0x400, + MyHTML_TOKEN_TYPE_NULL = 0x800 +}; + +typedef size_t myhtml_token_index_t; +typedef size_t myhtml_token_attr_index_t; +typedef struct myhtml_token_replacement_entry myhtml_token_replacement_entry_t; +typedef struct myhtml_token_namespace_replacement myhtml_token_namespace_replacement_t; + +typedef struct myhtml_token_attr myhtml_token_attr_t; +typedef struct myhtml_token_node myhtml_token_node_t; +typedef struct myhtml_token myhtml_token_t; + +// tags +enum myhtml_tag_categories { + MyHTML_TAG_CATEGORIES_UNDEF = 0x000, + MyHTML_TAG_CATEGORIES_ORDINARY = 0x001, + MyHTML_TAG_CATEGORIES_SPECIAL = 0x002, + MyHTML_TAG_CATEGORIES_FORMATTING = 0x004, + MyHTML_TAG_CATEGORIES_SCOPE = 0x008, + MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM = 0x010, + MyHTML_TAG_CATEGORIES_SCOPE_BUTTON = 0x020, + MyHTML_TAG_CATEGORIES_SCOPE_TABLE = 0x040, + MyHTML_TAG_CATEGORIES_SCOPE_SELECT = 0x080 +}; + +typedef struct myhtml_tag_index_node myhtml_tag_index_node_t; +typedef struct myhtml_tag_index_entry myhtml_tag_index_entry_t; +typedef struct myhtml_tag_index myhtml_tag_index_t; + +typedef size_t myhtml_tag_id_t; + +typedef struct myhtml_tag myhtml_tag_t; + +// stream +typedef struct myhtml_stream_buffer_entry myhtml_stream_buffer_entry_t; +typedef struct myhtml_stream_buffer myhtml_stream_buffer_t; + +// parse +enum myhtml_tokenizer_state { + MyHTML_TOKENIZER_STATE_DATA = 0x000, + MyHTML_TOKENIZER_STATE_CHARACTER_REFERENCE_IN_DATA = 0x001, + MyHTML_TOKENIZER_STATE_RCDATA = 0x002, + MyHTML_TOKENIZER_STATE_CHARACTER_REFERENCE_IN_RCDATA = 0x003, + MyHTML_TOKENIZER_STATE_RAWTEXT = 0x004, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA = 0x005, + MyHTML_TOKENIZER_STATE_PLAINTEXT = 0x006, + MyHTML_TOKENIZER_STATE_TAG_OPEN = 0x007, + MyHTML_TOKENIZER_STATE_END_TAG_OPEN = 0x008, + MyHTML_TOKENIZER_STATE_TAG_NAME = 0x009, + MyHTML_TOKENIZER_STATE_RCDATA_LESS_THAN_SIGN = 0x00a, + MyHTML_TOKENIZER_STATE_RCDATA_END_TAG_OPEN = 0x00b, + MyHTML_TOKENIZER_STATE_RCDATA_END_TAG_NAME = 0x00c, + MyHTML_TOKENIZER_STATE_RAWTEXT_LESS_THAN_SIGN = 0x00d, + MyHTML_TOKENIZER_STATE_RAWTEXT_END_TAG_OPEN = 0x00e, + MyHTML_TOKENIZER_STATE_RAWTEXT_END_TAG_NAME = 0x00f, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_LESS_THAN_SIGN = 0x010, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_END_TAG_OPEN = 0x011, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_END_TAG_NAME = 0x012, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPE_START = 0x013, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPE_START_DASH = 0x014, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED = 0x015, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_DASH = 0x016, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_DASH_DASH = 0x017, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN = 0x018, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN = 0x019, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME = 0x01a, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPE_START = 0x01b, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED = 0x01c, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH = 0x01d, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH = 0x01e, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN = 0x01f, + MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPE_END = 0x020, + MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME = 0x021, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_NAME = 0x022, + MyHTML_TOKENIZER_STATE_AFTER_ATTRIBUTE_NAME = 0x023, + MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_VALUE = 0x024, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_DOUBLE_QUOTED = 0x025, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_SINGLE_QUOTED = 0x026, + MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_UNQUOTED = 0x027, + MyHTML_TOKENIZER_STATE_CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE = 0x028, + MyHTML_TOKENIZER_STATE_AFTER_ATTRIBUTE_VALUE__QUOTED = 0x029, + MyHTML_TOKENIZER_STATE_SELF_CLOSING_START_TAG = 0x02a, + MyHTML_TOKENIZER_STATE_BOGUS_COMMENT = 0x02b, + MyHTML_TOKENIZER_STATE_MARKUP_DECLARATION_OPEN = 0x02c, + MyHTML_TOKENIZER_STATE_COMMENT_START = 0x02d, + MyHTML_TOKENIZER_STATE_COMMENT_START_DASH = 0x02e, + MyHTML_TOKENIZER_STATE_COMMENT = 0x02f, + MyHTML_TOKENIZER_STATE_COMMENT_END_DASH = 0x030, + MyHTML_TOKENIZER_STATE_COMMENT_END = 0x031, + MyHTML_TOKENIZER_STATE_COMMENT_END_BANG = 0x032, + MyHTML_TOKENIZER_STATE_DOCTYPE = 0x033, + MyHTML_TOKENIZER_STATE_BEFORE_DOCTYPE_NAME = 0x034, + MyHTML_TOKENIZER_STATE_DOCTYPE_NAME = 0x035, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_NAME = 0x036, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_PUBLIC_KEYWORD = 0x037, + MyHTML_TOKENIZER_STATE_BEFORE_DOCTYPE_PUBLIC_IDENTIFIER = 0x038, + MyHTML_TOKENIZER_STATE_DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED = 0x039, + MyHTML_TOKENIZER_STATE_DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED = 0x03a, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_PUBLIC_IDENTIFIER = 0x03b, + MyHTML_TOKENIZER_STATE_BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS = 0x03c, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_SYSTEM_KEYWORD = 0x03d, + MyHTML_TOKENIZER_STATE_BEFORE_DOCTYPE_SYSTEM_IDENTIFIER = 0x03e, + MyHTML_TOKENIZER_STATE_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED = 0x03f, + MyHTML_TOKENIZER_STATE_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED = 0x040, + MyHTML_TOKENIZER_STATE_AFTER_DOCTYPE_SYSTEM_IDENTIFIER = 0x041, + MyHTML_TOKENIZER_STATE_BOGUS_DOCTYPE = 0x042, + MyHTML_TOKENIZER_STATE_CDATA_SECTION = 0x043, + MyHTML_TOKENIZER_STATE_CUSTOM_AFTER_DOCTYPE_NAME_A_Z = 0x044, + MyHTML_TOKENIZER_STATE_FIRST_ENTRY = MyHTML_TOKENIZER_STATE_DATA, + MyHTML_TOKENIZER_STATE_LAST_ENTRY = 0x045 +}; + +enum myhtml_insertion_mode { + MyHTML_INSERTION_MODE_INITIAL = 0x000, + MyHTML_INSERTION_MODE_BEFORE_HTML = 0x001, + MyHTML_INSERTION_MODE_BEFORE_HEAD = 0x002, + MyHTML_INSERTION_MODE_IN_HEAD = 0x003, + MyHTML_INSERTION_MODE_IN_HEAD_NOSCRIPT = 0x004, + MyHTML_INSERTION_MODE_AFTER_HEAD = 0x005, + MyHTML_INSERTION_MODE_IN_BODY = 0x006, + MyHTML_INSERTION_MODE_TEXT = 0x007, + MyHTML_INSERTION_MODE_IN_TABLE = 0x008, + MyHTML_INSERTION_MODE_IN_TABLE_TEXT = 0x009, + MyHTML_INSERTION_MODE_IN_CAPTION = 0x00a, + MyHTML_INSERTION_MODE_IN_COLUMN_GROUP = 0x00b, + MyHTML_INSERTION_MODE_IN_TABLE_BODY = 0x00c, + MyHTML_INSERTION_MODE_IN_ROW = 0x00d, + MyHTML_INSERTION_MODE_IN_CELL = 0x00e, + MyHTML_INSERTION_MODE_IN_SELECT = 0x00f, + MyHTML_INSERTION_MODE_IN_SELECT_IN_TABLE = 0x010, + MyHTML_INSERTION_MODE_IN_TEMPLATE = 0x011, + MyHTML_INSERTION_MODE_AFTER_BODY = 0x012, + MyHTML_INSERTION_MODE_IN_FRAMESET = 0x013, + MyHTML_INSERTION_MODE_AFTER_FRAMESET = 0x014, + MyHTML_INSERTION_MODE_AFTER_AFTER_BODY = 0x015, + MyHTML_INSERTION_MODE_AFTER_AFTER_FRAMESET = 0x016, + MyHTML_INSERTION_MODE_LAST_ENTRY = 0x017 +}; + +// base +/* + Very important!!! + + for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum myhtml_status { + MyHTML_STATUS_OK = 0x0000, + MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0001, + MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, + MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, + MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, + MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, + MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, + MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, + MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, + MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, + MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, + MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, + MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, + MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, + MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, + MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, + MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, + MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, + MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, + MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, + MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, + MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, + MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, + MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, + MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, + MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 +} +typedef myhtml_status_t; + +enum myhtml_namespace { + MyHTML_NAMESPACE_UNDEF = 0x00, + MyHTML_NAMESPACE_HTML = 0x01, + MyHTML_NAMESPACE_MATHML = 0x02, + MyHTML_NAMESPACE_SVG = 0x03, + MyHTML_NAMESPACE_XLINK = 0x04, + MyHTML_NAMESPACE_XML = 0x05, + MyHTML_NAMESPACE_XMLNS = 0x06, + + /* MyHTML_NAMESPACE_ANY == MyHTML_NAMESPACE_LAST_ENTRY */ + MyHTML_NAMESPACE_ANY = 0x07, + MyHTML_NAMESPACE_LAST_ENTRY = 0x07 +} +typedef myhtml_namespace_t; + +enum myhtml_options { + MyHTML_OPTIONS_DEFAULT = 0x00, + MyHTML_OPTIONS_PARSE_MODE_SINGLE = 0x01, + MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE = 0x02, + MyHTML_OPTIONS_PARSE_MODE_SEPARATELY = 0x04 +}; + +struct myhtml_position { + size_t begin; + size_t length; +} +typedef myhtml_position_t; + +struct myhtml_version { + int major; + int minor; + int patch; +} +typedef myhtml_version_t; + +typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; +typedef myhtml_token_attr_t myhtml_tree_attr_t; +typedef struct myhtml_collection myhtml_collection_t; +typedef struct myhtml myhtml_t; + +// parser state function +typedef size_t (*myhtml_tokenizer_state_f)(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); + +// parser stream function +typedef void (*mythread_f)(mythread_id_t thread_id, mythread_queue_node_t *qnode); + +// parser insertion mode function +typedef bool (*myhtml_insertion_f)(myhtml_tree_t* tree, myhtml_token_node_t* token); + +// char references state +typedef size_t (*myhtml_data_process_state_f)(myhtml_data_process_entry_t* charef, myhtml_string_t* str, const char* data, size_t offset, size_t size); + +// callback functions +typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); +typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); + +// find attribute value functions +typedef bool (*myhtml_attribute_value_find_f)(myhtml_string_t* str_key, const char* value, size_t value_len); + + +void * myhtml_mem_malloc(size_t size); +void * myhtml_mem_realloc(void* dst, size_t size); +void * myhtml_mem_calloc(size_t num, size_t size); +void myhtml_mem_free(void* dst); + +void myhtml_print(FILE* out, const char* format, ...); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/source/myhtml/mystring.c b/source/myhtml/mystring.c new file mode 100644 index 0000000..5c92505 --- /dev/null +++ b/source/myhtml/mystring.c @@ -0,0 +1,574 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/mystring.h" +#include "myhtml/utils/resources.h" + +///////////////////////////////////////////////////////// +//// Init, Clean, Destroy +//// +///////////////////////////////////////////////////////// +char * myhtml_string_init(mchar_async_t *mchar, size_t node_idx, myhtml_string_t* str, size_t size) +{ + str->data = mchar_async_malloc(mchar, node_idx, size); + str->size = size; + str->node_idx = node_idx; + str->mchar = mchar; + + myhtml_string_clean(str); + + return str->data; +} + +void myhtml_string_clean(myhtml_string_t* str) +{ + str->length = 0; +} + +void myhtml_string_clean_all(myhtml_string_t* str) +{ + memset(str, 0, sizeof(myhtml_string_t)); +} + +myhtml_string_t * myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj) +{ + if(str == NULL) + return NULL; + + if(str->data && str->mchar && str->node_idx) + mchar_async_free(str->mchar, str->node_idx, str->data); + + if(destroy_obj && str) + myhtml_free(str); + + return NULL; +} + +char * myhtml_string_realloc(myhtml_string_t *str, size_t new_size) +{ + if(str == NULL) + return NULL; + + char *tmp = mchar_async_realloc(str->mchar, str->node_idx, str->data, str->length, new_size); + + if(tmp) { + str->size = new_size; + str->data = tmp; + } + else + return NULL; + + return tmp; +} + +///////////////////////////////////////////////////////// +//// Basic API +//// +///////////////////////////////////////////////////////// +char * myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size) +{ + return mchar_async_malloc(mchar, node_id, size); +} + +char * myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size) +{ + return mchar_async_realloc(mchar, node_id, data, len_to_copy, size); +} + +void myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data) +{ + mchar_async_free(mchar, node_id, data); +} + +char * myhtml_string_data(myhtml_string_t *str) +{ + if(str == NULL) + return NULL; + + return str->data; +} + +size_t myhtml_string_length(myhtml_string_t *str) +{ + if(str == NULL) + return 0; + + return str->length; +} + +size_t myhtml_string_size(myhtml_string_t *str) +{ + if(str == NULL) + return 0; + + return str->size; +} + +char * myhtml_string_data_set(myhtml_string_t *str, char *data) +{ + if(str == NULL) + return NULL; + + str->data = data; + return str->data; +} + +size_t myhtml_string_size_set(myhtml_string_t *str, size_t size) +{ + if(str == NULL) + return 0; + + str->size = size; + return str->size; +} + +size_t myhtml_string_length_set(myhtml_string_t *str, size_t length) +{ + if(str == NULL) + return 0; + + str->length = length; + return str->length; +} + +///////////////////////////////////////////////////////// +//// Append API +//// +///////////////////////////////////////////////////////// +void myhtml_string_append(myhtml_string_t* str, const char* buff, size_t length) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + memcpy(&str->data[str->length], buff, (sizeof(char) * length)); + + str->length += length; + str->data[str->length] = '\0'; +} + +void myhtml_string_append_one(myhtml_string_t* str, const char data) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, 2, 1); + MyHTML_STRING_APPEND_BYTE_WITHOUT_REALLOC(data, str); + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC('\0', str); +} + +void myhtml_string_append_lowercase(myhtml_string_t* str, const char* data, size_t length) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned char *ref = (unsigned char*)&str->data[str->length]; + const unsigned char *buf = (const unsigned char*)data; + + size_t i; + for(i = 0; i < length; i++) { + ref[i] = myhtml_string_chars_lowercase_map[ buf[i] ]; + } + + ref[i] = '\0'; + str->length += length; +} + +size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned char *data = (unsigned char*)str->data; + const unsigned char *u_buff = (const unsigned char*)buff; + + /* 0x0D == \r */ + /* 0x0A == \n */ + + for (size_t i = 0; i < length; i++) + { + if(u_buff[i] == 0x0D) { + data[str->length] = 0x0A; + + if((i + 1) < length) { + if(u_buff[(i + 1)] == 0x0A) + i++; + } + else { + str->length++; + return str->length; + } + } + else if(u_buff[i] == 0x00 && emit_null_chars == false) + { + myhtml_string_realloc(str, (str->size + 5)); + data = (unsigned char*)str->data; + + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + data[str->length] = 0xEF; str->length++; + data[str->length] = 0xBF; str->length++; + data[str->length] = 0xBD; + } + else + data[str->length] = u_buff[i]; + + str->length++; + } + + str->data[str->length] = '\0'; + + return 0; +} + +size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned char *data = (unsigned char*)str->data; + const unsigned char *u_buff = (const unsigned char*)buff; + + for (size_t i = 0; i < length; i++) + { + if(u_buff[i] == 0x0D) { + data[str->length] = 0x0A; + + if((i + 1) < length) { + if(u_buff[(i + 1)] == 0x0A) + i++; + } + else { + str->length++; + return str->length; + } + } + else if(u_buff[i] == 0x00 && emit_null_chars == false) + { + myhtml_string_realloc(str, (str->size + 5)); + data = (unsigned char*)str->data; + + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + data[str->length] = 0xEF; str->length++; + data[str->length] = 0xBF; str->length++; + data[str->length] = 0xBD; + } + else { + data[str->length] = myhtml_string_chars_lowercase_map[ u_buff[i] ]; + } + + str->length++; + } + + str->data[str->length] = '\0'; + + return 0; +} + +size_t myhtml_string_before_append_any_preprocessing(myhtml_string_t* str, const char* buff, size_t length, size_t last_position) +{ + if(last_position == 0 || length == 0) + return 0; + + if(*buff == '\n') + return 1; + + return 0; +} + +///////////////////////////////////////////////////////// +//// Append With Convert Encoding and Preprocessing API +//// +///////////////////////////////////////////////////////// +size_t myhtml_string_append_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +{ + myhtml_encoding_result_t res; + myhtml_encoding_result_clean(&res); + + return myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &res, buff, length, encoding, emit_null_chars); +} + +size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned const char* u_buff = (unsigned const char*)buff; + const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); + + for (size_t i = 0; i < length; i++) + { + if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 1); + + size_t len = myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + + if(len == 1) { + if(str->data[str->length] == '\r') { + str->data[str->length] = '\n'; + + if((i + 1) < length) { + if(buff[(i + 1)] == '\n') + i++; + } + else { + str->length++; + return str->length; + } + } + else if(str->data[str->length] == 0x00 && emit_null_chars == false) + { + myhtml_string_realloc(str, (str->size + 5)); + + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + str->data[str->length] = (char)0xEF; str->length++; + str->data[str->length] = (char)0xBF; str->length++; + str->data[str->length] = (char)0xBD; + } + } + + str->length += len; + } + } + + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); + + return 0; +} + +size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +{ + myhtml_encoding_result_t res; + myhtml_encoding_result_clean(&res); + + return myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &res, buff, length, encoding, emit_null_chars); +} + +size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned const char* u_buff = (unsigned const char*)buff; + const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); + + for (size_t i = 0; i < length; i++) + { + if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 1); + + size_t len = myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(res->result, &str->data[str->length]); + + if(len == 1) { + if(str->data[str->length] == '\r') { + str->data[str->length] = '\n'; + + if((i + 1) < length) { + if(buff[(i + 1)] == '\n') + i++; + } + else { + str->length++; + return str->length; + } + } + else if(str->data[str->length] == 0x00 && emit_null_chars == false) + { + myhtml_string_realloc(str, (str->size + 5)); + + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + str->data[str->length] = (char)0xEF; str->length++; + str->data[str->length] = (char)0xBF; str->length++; + str->data[str->length] = (char)0xBD; + } + } + + str->length += len; + } + } + + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); + + return 0; +} + +///////////////////////////////////////////////////////// +//// Append With Convert Encoding without Preprocessing API +//// +///////////////////////////////////////////////////////// +void myhtml_string_append_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding) +{ + myhtml_encoding_result_t res; + myhtml_encoding_result_clean(&res); + + myhtml_string_append_chunk_with_convert_encoding(str, &res, buff, length, encoding); +} + +void myhtml_string_append_chunk_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding) +{ + unsigned const char* u_buff = (unsigned const char*)buff; + const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); + + for (size_t i = 0; i < length; i++) + { + if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + str->length += myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + } + } + + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); +} + +void myhtml_string_append_one_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char data, myhtml_encoding_t encoding) +{ + const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); + + if(func((unsigned const char)data, res) == MyHTML_ENCODING_STATUS_OK) { + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + str->length += myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC('\0', str); + } +} + + +void myhtml_string_append_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding) +{ + myhtml_encoding_result_t res; + myhtml_encoding_result_clean(&res); + + myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(str, &res, buff, length, encoding); +} + +void myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding) +{ + unsigned const char* u_buff = (unsigned const char*)buff; + const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); + + for (size_t i = 0; i < length; i++) + { + if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { + MyHTML_STRING_REALLOC_IF_NEED(str, 5, 1); + + size_t insert_len = myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + + if(insert_len == 1) { + str->data[str->length] = (const char)myhtml_string_chars_lowercase_map[ u_buff[i] ]; + } + + str->length += insert_len; + } + } + + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); +} + +void myhtml_string_copy(myhtml_string_t* dest, myhtml_string_t* target) +{ + myhtml_string_append(dest, target->data, target->length); +} + +size_t myhtml_string_raw_copy(char* str1, const char* str2, size_t size) +{ + str1[size] = '\0'; + + while(size) { + size--; + str1[size] = str2[size]; + } + + return size; +} + +size_t myhtml_string_raw_set_replacement_character(myhtml_string_t* target, size_t position) +{ + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + target->data[(position)] = (char)0xEF; + target->data[(position + 1)] = (char)0xBF; + target->data[(position + 2)] = (char)0xBD; + + return 3; +} + +void myhtml_string_append_with_replacement_null_characters_only(myhtml_string_t* str, const char* buff, size_t length) +{ + MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned char *data = (unsigned char*)str->data; + const unsigned char *u_buff = (const unsigned char*)buff; + + for (size_t i = 0; i < length; i++) + { + if(u_buff[i] == 0x00) { + myhtml_string_realloc(str, (str->size + 5)); + data = (unsigned char*)str->data; + + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + data[str->length] = 0xEF; str->length++; + data[str->length] = 0xBF; str->length++; + data[str->length] = 0xBD; + } + else + data[str->length] = u_buff[i]; + + str->length++; + } + + str->data[str->length] = '\0'; +} + +void myhtml_string_stay_only_whitespace(myhtml_string_t* target) +{ + char *data = target->data; + size_t pos = 0; + + for(size_t i = 0; i < target->length; i++) + { + if(myhtml_mystring_whitespace(data[i], ==, ||)) { + data[pos] = data[i]; + pos++; + } + } + + target->length = pos; +} + +size_t myhtml_string_crop_whitespace_from_begin(myhtml_string_t* target) +{ + char *data = target->data; + size_t i; + + for(i = 0; i < target->length; i++) { + if(myhtml_mystring_whitespace(data[i], !=, &&)) + break; + } + + if(i) + target->data = mchar_async_crop_first_chars_without_cache(target->data, i); + + target->length -= i; + + return i; +} + +size_t myhtml_string_whitespace_from_begin(myhtml_string_t* target) +{ + char *data = target->data; + size_t i; + + for(i = 0; i < target->length; i++) { + if(myhtml_mystring_whitespace(data[i], !=, &&)) + break; + } + + return i; +} + + diff --git a/source/myhtml/mystring.h b/source/myhtml/mystring.h new file mode 100644 index 0000000..a553a02 --- /dev/null +++ b/source/myhtml/mystring.h @@ -0,0 +1,146 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_MYSTRING_H +#define MyHTML_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/encoding.h" +#include "myhtml/utils/mchar_async.h" + +#define myhtml_string_get(str, attr) str->attr +#define myhtml_string_set(str, attr) myhtml_string_get(str, attr) +#define myhtml_string_len(str) myhtml_string_get(str, length) + +#define MyHTML_STRING_PREPROCESSOR_CHECK_BUFFER_SIZE(str, unsigned_data) \ + if(str->length >= str->size) { \ + myhtml_string_realloc(str, (str->length + 5)); \ + \ + unsigned_data = (unsigned char*)str->data; \ + } + +#define MyHTML_STRING_REALLOC_IF_NEED(str, need_length, upto) \ + if((str->length + need_length) >= str->size) { \ + myhtml_string_realloc(str, (str->length + need_length + upto)); \ + } \ + +#define MyHTML_STRING_APPEND_BYTE_WITHOUT_REALLOC(onechar, str) \ + str->data[str->length] = onechar; \ + str->length++ + +#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto) \ + if(str->length >= str->size) { \ + myhtml_string_realloc(str, (str->length + upto)); \ + } \ + str->data[str->length] = onechar + +#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC(onechar, str) \ + str->data[str->length] = onechar + +#define MyHTML_STRING_APPEND_BYTE(onechar, str, upto) \ + MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto); \ + str->length++ + +#define myhtml_mystring_whitespace(onechar, action, logic) \ + (onechar action ' ' logic \ + onechar action '\t' logic \ + onechar action '\n' logic \ + onechar action '\f' logic \ + onechar action '\r') + +struct myhtml_string { + char* data; + size_t size; + size_t length; + + mchar_async_t *mchar; + size_t node_idx; +}; + +typedef size_t myhtml_string_index_t; + +char * myhtml_string_init(mchar_async_t *mchar, size_t node_idx, myhtml_string_t* str, size_t size); +char * myhtml_string_realloc(myhtml_string_t *str, size_t new_size); + +void myhtml_string_clean(myhtml_string_t* str); +void myhtml_string_clean_all(myhtml_string_t* str); +myhtml_string_t * myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); + +/* basic api */ +char * myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); +char * myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); +void myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); + +char * myhtml_string_data(myhtml_string_t *str); +size_t myhtml_string_length(myhtml_string_t *str); +size_t myhtml_string_size(myhtml_string_t *str); +char * myhtml_string_data_set(myhtml_string_t *str, char *data); +size_t myhtml_string_size_set(myhtml_string_t *str, size_t size); +size_t myhtml_string_length_set(myhtml_string_t *str, size_t length); + +/* append */ +void myhtml_string_append(myhtml_string_t* str, const char* data, size_t length); +void myhtml_string_append_one(myhtml_string_t* str, const char data); +void myhtml_string_append_lowercase(myhtml_string_t* str, const char* data, size_t length); +void myhtml_string_append_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); + +/* append with convert encoding */ +void myhtml_string_append_chunk_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); +void myhtml_string_append_one_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char data, myhtml_encoding_t encoding); + +/* append with convert encoding lowercase */ +void myhtml_string_append_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); +void myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); + +/* Oh, long long long name */ + +/* append with convert encoding with preprocessing */ +size_t myhtml_string_append_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); + +/* append with convert encoding lowercase with preprocessing */ +size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); + +void myhtml_string_append_with_replacement_null_characters_only(myhtml_string_t* str, const char* buff, size_t length); + +/* append with preprocessing */ +size_t myhtml_string_before_append_any_preprocessing(myhtml_string_t* str, const char* buff, size_t length, size_t last_position); +size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); +size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); +size_t myhtml_string_raw_set_replacement_character(myhtml_string_t* target, size_t position); + +/* other functions */ +void myhtml_string_copy(myhtml_string_t* dest, myhtml_string_t* target); +size_t myhtml_string_raw_copy(char* str1, const char* str2, size_t size); +void myhtml_string_stay_only_whitespace(myhtml_string_t* target); +size_t myhtml_string_crop_whitespace_from_begin(myhtml_string_t* target); +size_t myhtml_string_whitespace_from_begin(myhtml_string_t* target); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_mystring_h */ diff --git a/source/myhtml/parser.c b/source/myhtml/parser.c new file mode 100644 index 0000000..82b87f5 --- /dev/null +++ b/source/myhtml/parser.c @@ -0,0 +1,281 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/parser.h" + +void myhtml_parser_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode) +{ + if((qnode->tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE) == 0) { + while(myhtml_rules_tree_dispatcher(qnode->tree, qnode->token)){} + } +} + +size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) +{ + myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); + size_t relative_begin = begin - buffer->offset; + + // if token data length in one buffer then print them all at once + if((relative_begin + length) <= buffer->size) { + if(tree->encoding == MyHTML_ENCODING_UTF_8) + myhtml_string_append_lowercase_with_preprocessing(str, &buffer->data[relative_begin], length, proc_entry->emit_null_char); + else + myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, + &buffer->data[relative_begin], length, + proc_entry->encoding, proc_entry->emit_null_char); + + return str->length; + } + + size_t save_position = 0; + // if the data are spread across multiple buffers that join them + while(buffer) { + if((relative_begin + length) > buffer->size) + { + size_t relative_end = (buffer->size - relative_begin); + length -= relative_end; + + size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], relative_end, save_position); + + if(relative_end > 0) { + if(tree->encoding == MyHTML_ENCODING_UTF_8) + save_position = myhtml_string_append_lowercase_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (relative_end - tmp_offset), proc_entry->emit_null_char); + else + save_position = myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, + &buffer->data[(relative_begin + tmp_offset)], (relative_end - tmp_offset), + proc_entry->encoding, proc_entry->emit_null_char); + } + + relative_begin = 0; + buffer = buffer->next; + } + else { + size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], length, save_position); + + if(length > 0) { + if(tree->encoding == MyHTML_ENCODING_UTF_8) + myhtml_string_append_lowercase_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), proc_entry->emit_null_char); + else + myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, + &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), + proc_entry->encoding, proc_entry->emit_null_char); + } + + break; + } + } + + return str->length; +} + +size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) +{ + myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); + size_t relative_begin = begin - buffer->offset; + + // if token data length in one buffer then print them all at once + if((relative_begin + length) <= buffer->size) { + if(tree->encoding == MyHTML_ENCODING_UTF_8) + myhtml_string_append_with_preprocessing(str, &buffer->data[relative_begin], length, proc_entry->emit_null_char); + else + myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, + &buffer->data[relative_begin], length, + proc_entry->encoding, proc_entry->emit_null_char); + + return str->length; + } + + size_t save_position = 0; + // if the data are spread across multiple buffers that join them + while(buffer) { + if((relative_begin + length) > buffer->size) + { + size_t relative_end = (buffer->size - relative_begin); + length -= relative_end; + + size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], relative_end, save_position); + + if(relative_end > 0) { + if(tree->encoding == MyHTML_ENCODING_UTF_8) + save_position = myhtml_string_append_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (relative_end - tmp_offset), proc_entry->emit_null_char); + else + save_position = myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, + &buffer->data[(relative_begin + tmp_offset)], + (relative_end - tmp_offset), + proc_entry->encoding, proc_entry->emit_null_char); + } + + relative_begin = 0; + buffer = buffer->next; + } + else { + size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], length, save_position); + + if(length > 0) { + if(tree->encoding == MyHTML_ENCODING_UTF_8) + myhtml_string_append_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), proc_entry->emit_null_char); + else + myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, + &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), + proc_entry->encoding, proc_entry->emit_null_char); + } + + break; + } + } + + return str->length; +} + +size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) +{ + myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); + size_t relative_begin = begin - buffer->offset; + + // if token data length in one buffer then print them all at once + if((relative_begin + length) <= buffer->size) { + myhtml_data_process(proc_entry, str, &buffer->data[relative_begin], length); + myhtml_data_process_end(proc_entry, str); + + return str->length; + } + + // if the data are spread across multiple buffers that join them + while(buffer) { + if((relative_begin + length) > buffer->size) + { + size_t relative_end = (buffer->size - relative_begin); + length -= relative_end; + + myhtml_data_process(proc_entry, str, &buffer->data[relative_begin], relative_end); + + relative_begin = 0; + buffer = buffer->next; + } + else { + myhtml_data_process(proc_entry, str, &buffer->data[relative_begin], length); + break; + } + } + + myhtml_data_process_end(proc_entry, str); + + return str->length; +} + +void myhtml_parser_worker(mythread_id_t thread_id, mythread_queue_node_t *qnode) +{ + myhtml_tree_t* tree = qnode->tree; + myhtml_token_node_t* token = qnode->token; + + if(qnode->tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_PROCESS_TOKEN) { + if(tree->callback_before_token) + tree->callback_before_token_ctx = tree->callback_before_token(tree, token, tree->callback_before_token_ctx); + + token->type |= MyHTML_TOKEN_TYPE_DONE; + + if(tree->callback_after_token) + tree->callback_after_token_ctx = tree->callback_after_token(tree, token, tree->callback_after_token_ctx); + + return; + } + + if(tree->callback_before_token) + tree->callback_before_token_ctx = tree->callback_before_token(tree, token, tree->callback_before_token_ctx); + + size_t mchar_node_id = qnode->tree->async_args[thread_id].mchar_node_id; + + if(token->tag_id == MyHTML_TAG__TEXT || + token->tag_id == MyHTML_TAG__COMMENT) + { + myhtml_string_init(tree->mchar, mchar_node_id, &token->str, (token->raw_length + 1)); + + token->attr_first = NULL; + token->attr_last = NULL; + + myhtml_data_process_entry_t proc_entry; + myhtml_data_process_entry_clean(&proc_entry); + + proc_entry.encoding = tree->encoding; + + if(token->type & MyHTML_TOKEN_TYPE_DATA) { + proc_entry.emit_null_char = true; + + myhtml_parser_token_data_to_string_charef(tree, &token->str, &proc_entry, token->raw_begin, token->raw_length); + } + else if(token->type & MyHTML_TOKEN_TYPE_RCDATA || token->type & MyHTML_TOKEN_TYPE_CDATA) { + myhtml_parser_token_data_to_string_charef(tree, &token->str, &proc_entry, token->raw_begin, token->raw_length); + } + else + myhtml_parser_token_data_to_string(tree, &token->str, &proc_entry, token->raw_begin, token->raw_length); + } + else if(token->attr_first) + { + myhtml_string_clean_all(&token->str); + + myhtml_token_attr_t* attr = token->attr_first; + myhtml_data_process_entry_t proc_entry; + + while(attr) + { + if(attr->raw_key_length) { + myhtml_data_process_entry_clean(&proc_entry); + proc_entry.encoding = tree->encoding; + + myhtml_string_init(tree->mchar, mchar_node_id, &attr->key, (attr->raw_key_length + 1)); + myhtml_parser_token_data_to_string_lowercase(tree, &attr->key, &proc_entry, attr->raw_key_begin, attr->raw_key_length); + } + else + myhtml_string_clean_all(&attr->key); + + if(attr->raw_value_length) { + myhtml_data_process_entry_clean(&proc_entry); + proc_entry.encoding = tree->encoding; + proc_entry.is_attributes = true; + + myhtml_string_init(tree->mchar, mchar_node_id, &attr->value, (attr->raw_value_length + 1)); + myhtml_parser_token_data_to_string_charef(tree, &attr->value, &proc_entry, attr->raw_value_begin, attr->raw_value_length); + } + else + myhtml_string_clean_all(&attr->value); + + attr = attr->next; + } + } + else { + token->attr_first = NULL; + token->attr_last = NULL; + + myhtml_string_clean_all(&token->str); + } + + token->type |= MyHTML_TOKEN_TYPE_DONE; + + if(tree->callback_after_token) + tree->callback_after_token_ctx = tree->callback_after_token(tree, token, tree->callback_after_token_ctx); +} + +void myhtml_parser_worker_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode) +{ + myhtml_parser_worker(thread_id, qnode); + myhtml_parser_stream(thread_id, qnode); +} + + diff --git a/source/myhtml/parser.h b/source/myhtml/parser.h new file mode 100644 index 0000000..b4d98f3 --- /dev/null +++ b/source/myhtml/parser.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_PARSER_H +#define MyHTML_PARSER_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/myhtml.h" +#include "myhtml/mystring.h" +#include "myhtml/tree.h" +#include "myhtml/token.h" +#include "myhtml/data_process.h" + +void myhtml_parser_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); +void myhtml_parser_worker(mythread_id_t thread_id, mythread_queue_node_t *qnode); +void myhtml_parser_worker_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); + +size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_parser_h */ diff --git a/source/myhtml/perf.c b/source/myhtml/perf.c new file mode 100644 index 0000000..f95faab --- /dev/null +++ b/source/myhtml/perf.c @@ -0,0 +1,288 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Authors: insoreiges@gmail.com (Evgeny Yakovlev), lex.borisov@gmail.com (Alexander Borisov) +*/ + +/** + * Platform-specific hdef performance clock value. + */ + +#include "myhtml/myhtml.h" +#include + +#if !defined(IS_OS_WINDOWS) +#include +#endif + +#if !defined(MyHTML_WITH_PERF) + +uint64_t myhtml_hperf_res(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF; + + return 0; +} + +uint64_t myhtml_hperf_clock(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF; + + return 0; +} + +#else + +#if defined(__APPLE__) +#include +#include +#elif defined(IS_OS_WINDOWS) +#endif + +#if defined(MyHTML_FORCE_RDTSC) /* Force using rdtsc, useful for comparison */ + +/** + * Get CPU rdtsc frequency. + * + * TODO: I think using rdtsc for measuring user-space counters is not correct: + * - rdtsc does not have a constant rate. instead ot is scaled to physical core's internal clock which changes due to power saving modes on modern CPUs + * - rdtsc is software-emulated in virtual machines which will introduce an inconsistency in reported ticks + * - user space process can be preempted between consecutive rdtsc measures but the physical clock will still tick while it is executing a different thread. + * also think what would happen if preempted process will be re-scheduled on a different physical core which has a different tsc value. + * - computing rdtsc frequency produces unreliable results (due to all of the above) + * + * Consider using platform-specific monotonic hperf timers (ftrace/dtrace) or even clock(). + */ +uint64_t myhtml_hperf_res(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_OK; + +#if defined(__APPLE__) && defined(CTL_HW) && defined(HW_CPU_FREQ) + unsigned long long freq = 0; + + /* OSX kernel: sysctl(CTL_HW | HW_CPU_FREQ) */ + size_t len = sizeof(freq); + int mib[2] = {CTL_HW, HW_CPU_FREQ}; + + int error = sysctl(mib, 2, &freq, &len, NULL, 0); + if (error) { + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; + } + + return freq; + +#elif defined(__linux__) + unsigned long long freq = 0; + + /* Use procfs on linux */ + FILE* fp = NULL; + fp = fopen("/proc/cpuinfo", "r"); + if (fp == NULL) { + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; + } + + /* Find 'CPU MHz :' */ + char buf[1024] = {0}; + double fval = 0.0; + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (sscanf(buf, "cpu MHz : %lf\n", &fval) == 1) { + freq = (unsigned long long)(fval * 1000000ull); + break; + } + } + + fclose(fp); + return freq; + +#else +# warning Cant figure out cpu frequency on this platfrom + + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; +#endif /* defined __APPLE__ || __linux__ ... */ +} + +uint64_t myhtml_hperf_clock(myhtml_status_t *status) +{ + uint64_t x; + + __asm__ volatile ( + "cpuid\n\t" /* cpuid serializes any out-of-order prefetches before executing rdtsc (clobbers ebx, ecx, edx) */ + "rdtsc\n\t" + "shl $32, %%rdx\n\t" + "or %%rdx, %%rax" + : "=a" (x) + : + : "rdx", "ebx", "ecx"); + + return x; +} + +#elif defined(_POSIX_TIMERS) && defined(_POSIX_CPUTIME) \ + && defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 199309L) /* Do we have clock_gettime? */ + +#define NSEC_PER_SECOND 1000000000ull +#define TIMESPEC_TO_USEC(tspec) (((uint64_t)(tspec).tv_sec * NSEC_PER_SECOND) + (tspec).tv_nsec) + +uint64_t myhtml_hperf_res(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_OK; + + struct timespec tspec; + int error = clock_getres(CLOCK_PROCESS_CPUTIME_ID, &tspec); + if (error) { + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; + } + + unsigned long long ticks_per_sec = (unsigned long long)((double)NSEC_PER_SECOND / TIMESPEC_TO_USEC(tspec)); + return ticks_per_sec; +} + +uint64_t myhtml_hperf_clock(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_OK; + + struct timespec tspec; + int error = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tspec); + if (error) { + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; + } + + return TIMESPEC_TO_USEC(tspec); +} + +#elif defined(__APPLE__) && defined(__MACH__) + +/* + * TODO: on OSX we can use clock_get_time: http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x + * Or this: http://web.archive.org/web/20100517095152/http://www.wand.net.nz/~smr26/wordpress/2009/01/19/monotonic-time-in-mac-os-x/comment-page-1/ + */ + +// TODO: this is incorrect plug for mac os x +// look at links before this comment + +#include + +uint64_t myhtml_hperf_res(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_OK; + + unsigned long long freq = 0; + + size_t len = sizeof(freq); + int mib[2] = {CTL_HW, HW_CPU_FREQ}; + + int error = sysctl(mib, 2, &freq, &len, NULL, 0); + if (error) { + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; + } + + return freq; +} + +uint64_t myhtml_hperf_clock(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_OK; + + return mach_absolute_time(); +} + +#else + +# warning No hperf implementation for this platform + +uint64_t myhtml_hperf_res(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; +} + +uint64_t myhtml_hperf_clock(myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; + + return 0; +} + +#endif /* defined(MyHTML_FORCE_RDTSC) ... */ +#endif /* MyHTML_WITH_PERF */ + +#define _MyHTML_CHECK_STATUS_AND_PRINT_ERROR \ + if(status == MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF) { \ + fprintf(fh, "MyHTML: Library compiled without perf source. Please, build library with -DMyHTML_WITH_PERF flag\n"); \ + } \ + else if(status) { \ + fprintf(fh, "MyHTML: Something wrong! Perhaps, your platform does not support the measurement of performance\n"); \ + } \ + else + +myhtml_status_t myhtml_hperf_print(const char *name, uint64_t x, uint64_t y, FILE *fh) { + myhtml_status_t status; + + unsigned long long freq = myhtml_hperf_res(&status); + + if(freq) { + _MyHTML_CHECK_STATUS_AND_PRINT_ERROR { + fprintf(fh, "%s: %0.5f\n", name, (((float)(y - x) / (float)freq))); + } + } + + return status; +} + +myhtml_status_t myhtml_hperf_print_by_val(const char *name, uint64_t x, FILE *fh) { + myhtml_status_t status; + + unsigned long long freq = myhtml_hperf_res(&status); + + if(freq) { + _MyHTML_CHECK_STATUS_AND_PRINT_ERROR { + fprintf(fh, "%s: %0.5f\n", name, ((float)x / (float)freq)); + } + } + + return status; +} + + diff --git a/source/myhtml/rules.c b/source/myhtml/rules.c new file mode 100644 index 0000000..e95136f --- /dev/null +++ b/source/myhtml/rules.c @@ -0,0 +1,3560 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/rules.h" + +void myhtml_insertion_fix_emit_for_text_begin_ws(myhtml_token_node_t* token) +{ + myhtml_token_node_wait_for_done(token); + myhtml_string_crop_whitespace_from_begin(&token->str); +} + +myhtml_token_node_t * myhtml_insertion_fix_split_for_text_begin_ws(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + myhtml_token_node_wait_for_done(token); + size_t len = myhtml_string_whitespace_from_begin(&token->str); + + if(len == 0) + return NULL; + + // create new ws token and insert + mcobject_async_status_t mcstatus; + myhtml_token_node_t* new_token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); + + if(mcstatus) + return NULL; + + myhtml_token_node_clean(new_token); + + myhtml_string_init(tree->mchar, tree->mchar_node_id, &new_token->str, (len + 2)); + + myhtml_string_append(&new_token->str, token->str.data, len); + + new_token->type |= MyHTML_TOKEN_TYPE_DONE; + + // and cut ws for original + token->str.data = mchar_async_crop_first_chars_without_cache(token->str.data, len); + token->str.length -= len; + + return new_token; +} + +void myhtml_insertion_fix_for_null_char_drop_all(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + myhtml_token_node_wait_for_done(token); + + myhtml_string_t *str = &token->str; + size_t len = str->length; + size_t offset = 0; + + for (size_t i = 0; i < len; ++i) + { + if (str->data[i] == '\0') + { + size_t next_non_null = i; + while ((next_non_null < len) && str->data[next_non_null] == '\0') {++next_non_null;} + + str->length = str->length - (next_non_null - i); + + size_t next_null = next_non_null; + while ((next_null < len) && str->data[next_null] != '\0') {++next_null;} + + memmove(&str->data[(i - offset)], &str->data[next_non_null], (next_null - next_non_null)); + + i = next_null - 1; + + offset++; + } + } +} + +bool myhtml_insertion_mode_initial(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { + return false; + } + + myhtml_insertion_fix_emit_for_text_begin_ws(token); + + // default, other token + tree->compat_mode = MyHTML_TREE_COMPAT_MODE_QUIRKS; + tree->insert_mode = MyHTML_INSERTION_MODE_BEFORE_HTML; + break; + } + + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_insert_comment(tree, token, tree->document); + return false; + } + + case MyHTML_TAG__DOCTYPE: + { + myhtml_token_node_wait_for_done(token); + + myhtml_token_release_and_check_doctype_attributes(tree->token, token, &tree->doctype); + + if((tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE) == 0) + myhtml_tree_node_insert_doctype(tree, token); + + // fix for tokenizer + if(tree->doctype.is_html == false && + (tree->doctype.attr_public == NULL || + tree->doctype.attr_system == NULL)) + { + tree->compat_mode = MyHTML_TREE_COMPAT_MODE_QUIRKS; + } + + tree->insert_mode = MyHTML_INSERTION_MODE_BEFORE_HTML; + return false; + } + + default: + tree->compat_mode = MyHTML_TREE_COMPAT_MODE_QUIRKS; + tree->insert_mode = MyHTML_INSERTION_MODE_BEFORE_HTML; + break; + } + + return true; +} + +bool myhtml_insertion_mode_before_html(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_BR: + case MyHTML_TAG_HTML: + case MyHTML_TAG_HEAD: + case MyHTML_TAG_BODY: + { + myhtml_tree_node_insert_root(tree, NULL, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_BEFORE_HEAD; + return true; + } + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_insert_comment(tree, token, tree->document); + break; + } + + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { + break; + } + + myhtml_insertion_fix_emit_for_text_begin_ws(token); + + // default, other token + myhtml_tree_node_insert_root(tree, NULL, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_BEFORE_HEAD; + return true; + } + + case MyHTML_TAG_HTML: + { + myhtml_tree_node_insert_root(tree, token, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_BEFORE_HEAD; + break; + } + + default: + { + myhtml_tree_node_insert_root(tree, NULL, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_BEFORE_HEAD; + return true; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_before_head(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_BR: + case MyHTML_TAG_HTML: + case MyHTML_TAG_HEAD: + case MyHTML_TAG_BODY: + { + tree->node_head = myhtml_tree_node_insert(tree, MyHTML_TAG_HEAD, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + return true; + } + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { + break; + } + + myhtml_insertion_fix_emit_for_text_begin_ws(token); + + // default, other token + tree->node_head = myhtml_tree_node_insert(tree, MyHTML_TAG_HEAD, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + return true; + } + + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_insert_comment(tree, token, 0); + break; + } + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_HTML: + { + return myhtml_insertion_mode_in_body(tree, token); + } + + case MyHTML_TAG_HEAD: + { + tree->node_head = myhtml_tree_node_insert_html_element(tree, token); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + break; + } + + default: + { + tree->node_head = myhtml_tree_node_insert(tree, MyHTML_TAG_HEAD, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + return true; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_in_head(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_HEAD: + { + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_HEAD; + break; + } + + case MyHTML_TAG_BR: + case MyHTML_TAG_HTML: + case MyHTML_TAG_BODY: + { + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_HEAD; + return true; + } + + case MyHTML_TAG_TEMPLATE: + { + if(myhtml_tree_open_elements_find_by_tag_idx_reverse(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, NULL) == NULL) + break; + + // oh God... + myhtml_tree_generate_all_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, false); + myhtml_tree_active_formatting_up_to_last_marker(tree); + myhtml_tree_template_insertion_pop(tree); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + break; + } + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) + { + myhtml_tree_node_insert_text(tree, token); + break; + } + + myhtml_token_node_t* new_token = myhtml_insertion_fix_split_for_text_begin_ws(tree, token); + if(new_token) + myhtml_tree_node_insert_text(tree, new_token); + + // default, other token + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_HEAD; + return true; + } + + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_insert_comment(tree, token, 0); + break; + } + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_HTML: + { + return myhtml_insertion_mode_in_body(tree, token); + } + + case MyHTML_TAG_BASE: + case MyHTML_TAG_BASEFONT: + case MyHTML_TAG_BGSOUND: + case MyHTML_TAG_LINK: + { + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + break; + } + + case MyHTML_TAG_META: + { + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + + // if the element has an http-equiv attribute + break; + } + + case MyHTML_TAG_TITLE: + { + myhtml_tree_node_insert_html_element(tree, token); + + tree->orig_insert_mode = tree->insert_mode; + tree->insert_mode = MyHTML_INSERTION_MODE_TEXT; + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RCDATA; + + break; + } + + case MyHTML_TAG_NOSCRIPT: + { + if(tree->flags & MyHTML_TREE_FLAGS_SCRIPT) { + myhtml_tree_node_insert_html_element(tree, token); + + tree->orig_insert_mode = tree->insert_mode; + tree->insert_mode = MyHTML_INSERTION_MODE_TEXT; + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RAWTEXT; + } + else { + myhtml_tree_node_insert_html_element(tree, token); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD_NOSCRIPT; + } + + break; + } + + case MyHTML_TAG_STYLE: + case MyHTML_TAG_NOFRAMES: + { + myhtml_tree_node_insert_html_element(tree, token); + + tree->orig_insert_mode = tree->insert_mode; + tree->insert_mode = MyHTML_INSERTION_MODE_TEXT; + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RAWTEXT; + + break; + } + + case MyHTML_TAG_SCRIPT: + { + // state 1 + enum myhtml_tree_insertion_mode insert_mode; + myhtml_tree_node_t* adjusted_location = myhtml_tree_appropriate_place_inserting(tree, NULL, &insert_mode); + + // state 2 + myhtml_tree_node_t* node = myhtml_tree_node_create(tree); + + node->tag_id = MyHTML_TAG_SCRIPT; + node->token = token; + node->ns = MyHTML_NAMESPACE_HTML; + node->flags = MyHTML_TREE_NODE_PARSER_INSERTED|MyHTML_TREE_NODE_BLOCKING; + + myhtml_tree_node_insert_by_mode(tree, adjusted_location, node, insert_mode); + myhtml_tree_open_elements_append(tree, node); + + tree->orig_insert_mode = tree->insert_mode; + tree->insert_mode = MyHTML_INSERTION_MODE_TEXT; + tree->state_of_builder = MyHTML_TOKENIZER_STATE_SCRIPT_DATA; + + break; + } + + case MyHTML_TAG_TEMPLATE: + { + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_active_formatting_append(tree, tree->myhtml->marker); // set marker + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TEMPLATE; + myhtml_tree_template_insertion_append(tree, MyHTML_INSERTION_MODE_IN_TEMPLATE); + + break; + } + + case MyHTML_TAG_HEAD: + break; + + default: + { + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_HEAD; + return true; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_in_head_noscript(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_NOSCRIPT: + { + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + break; + } + + case MyHTML_TAG_BR: + { + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + return true; + } + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_HTML: + { + return myhtml_insertion_mode_in_body(tree, token); + } + + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) + return myhtml_insertion_mode_in_head(tree, token); + + // default, other token + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + return true; + } + + case MyHTML_TAG_BASEFONT: + case MyHTML_TAG_BGSOUND: + case MyHTML_TAG_LINK: + case MyHTML_TAG_META: + case MyHTML_TAG_NOFRAMES: + case MyHTML_TAG_STYLE: + case MyHTML_TAG__COMMENT: + return myhtml_insertion_mode_in_head(tree, token); + + case MyHTML_TAG_HEAD: + case MyHTML_TAG_NOSCRIPT: + break; + + default: + { + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; + return true; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_after_head(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_BR: + case MyHTML_TAG_HTML: + case MyHTML_TAG_BODY: + { + tree->node_body = myhtml_tree_node_insert(tree, MyHTML_TAG_BODY, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + + case MyHTML_TAG_TEMPLATE: + { + return myhtml_insertion_mode_in_head(tree, token); + } + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) + { + myhtml_tree_node_insert_text(tree, token); + break; + } + + myhtml_token_node_t* new_token = myhtml_insertion_fix_split_for_text_begin_ws(tree, token); + if(new_token) + myhtml_tree_node_insert_text(tree, new_token); + + // default, other token + tree->node_body = myhtml_tree_node_insert(tree, MyHTML_TAG_BODY, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + + case MyHTML_TAG__COMMENT: + myhtml_tree_node_insert_comment(tree, token, 0); + break; + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_HTML: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG_BODY: + { + tree->node_body = myhtml_tree_node_insert_html_element(tree, token); + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + break; + } + + case MyHTML_TAG_FRAMESET: + myhtml_tree_node_insert_html_element(tree, token); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_FRAMESET; + break; + + case MyHTML_TAG_BASE: + case MyHTML_TAG_BASEFONT: + case MyHTML_TAG_BGSOUND: + case MyHTML_TAG_LINK: + case MyHTML_TAG_META: + case MyHTML_TAG_NOFRAMES: + case MyHTML_TAG_SCRIPT: + case MyHTML_TAG_STYLE: + case MyHTML_TAG_TEMPLATE: + case MyHTML_TAG_TITLE: + { + myhtml_tree_open_elements_append(tree, tree->node_head); + myhtml_insertion_mode_in_head(tree, token); + myhtml_tree_open_elements_remove(tree, tree->node_head); + } + + case MyHTML_TAG_HEAD: + { + break; + } + + default: + { + tree->node_body = myhtml_tree_node_insert(tree, MyHTML_TAG_BODY, MyHTML_NAMESPACE_HTML); + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_in_body_other_end_tag(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + // step 1 + size_t i = tree->open_elements->length; + while(i) { + i--; + + myhtml_tree_node_t* node = tree->open_elements->list[i]; + + // step 2 + if(node->tag_id == token->tag_id && node->ns == MyHTML_NAMESPACE_HTML) { + myhtml_tree_generate_implied_end_tags(tree, token->tag_id, MyHTML_NAMESPACE_HTML); + myhtml_tree_open_elements_pop_until_by_node(tree, node, false); + + return false; + } + + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, node->tag_id); + if(tag_ctx->cats[ node->ns ] & MyHTML_TAG_CATEGORIES_SPECIAL) { + break; + } + } + + return false; +} + +bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_TEMPLATE: + { + return myhtml_insertion_mode_in_head(tree, token); + } + + case MyHTML_TAG_BODY: + { + myhtml_tree_node_t* body_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_BODY, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE); + + if(body_node == NULL) + break; + + for (size_t i = 0; i < tree->open_elements->length; i++) { + switch (tree->open_elements->list[i]->tag_id) { + case MyHTML_TAG_DD: + case MyHTML_TAG_DT: + case MyHTML_TAG_LI: + case MyHTML_TAG_MENUITEM: + case MyHTML_TAG_OPTGROUP: + case MyHTML_TAG_OPTION: + case MyHTML_TAG_P: + case MyHTML_TAG_RB: + case MyHTML_TAG_RP: + case MyHTML_TAG_RT: + case MyHTML_TAG_RTC: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TD: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_TH: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + case MyHTML_TAG_BODY: + case MyHTML_TAG_HTML: + // set parse error + break; + + default: + break; + } + } + + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_BODY; + break; + } + + case MyHTML_TAG_HTML: + { + myhtml_tree_node_t* body_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_BODY, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE); + + if(body_node == NULL) + break; + + for (size_t i = 0; i < tree->open_elements->length; i++) { + switch (tree->open_elements->list[i]->tag_id) { + case MyHTML_TAG_DD: + case MyHTML_TAG_DT: + case MyHTML_TAG_LI: + case MyHTML_TAG_MENUITEM: + case MyHTML_TAG_OPTGROUP: + case MyHTML_TAG_OPTION: + case MyHTML_TAG_P: + case MyHTML_TAG_RB: + case MyHTML_TAG_RP: + case MyHTML_TAG_RT: + case MyHTML_TAG_RTC: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TD: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_TH: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + case MyHTML_TAG_BODY: + case MyHTML_TAG_HTML: + // set parse error + break; + + default: + break; + } + } + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_BODY; + + return true; + } + + case MyHTML_TAG_ADDRESS: + case MyHTML_TAG_ARTICLE: + case MyHTML_TAG_ASIDE: + case MyHTML_TAG_BLOCKQUOTE: + case MyHTML_TAG_BUTTON: + case MyHTML_TAG_CENTER: + case MyHTML_TAG_DETAILS: + case MyHTML_TAG_DIALOG: + case MyHTML_TAG_DIR: + case MyHTML_TAG_DIV: + case MyHTML_TAG_DL: + case MyHTML_TAG_FIELDSET: + case MyHTML_TAG_FIGCAPTION: + case MyHTML_TAG_FIGURE: + case MyHTML_TAG_FOOTER: + case MyHTML_TAG_HEADER: + case MyHTML_TAG_HGROUP: + case MyHTML_TAG_LISTING: + case MyHTML_TAG_MAIN: + case MyHTML_TAG_MENU: + case MyHTML_TAG_NAV: + case MyHTML_TAG_OL: + case MyHTML_TAG_PRE: + case MyHTML_TAG_SECTION: + case MyHTML_TAG_SUMMARY: + case MyHTML_TAG_UL: + { + if(myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE) == NULL) + break; + + // step 1 + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + // step 2 + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->ns != MyHTML_NAMESPACE_HTML) + // parse error + + // step 3 + myhtml_tree_open_elements_pop_until(tree, token->tag_id, MyHTML_NAMESPACE_HTML, false); + break; + } + + case MyHTML_TAG_FORM: + { + myhtml_tree_node_t* template_node = myhtml_tree_open_elements_find_by_tag_idx(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, NULL); + + if(template_node == NULL) + { + // step 1 + myhtml_tree_node_t* node = tree->node_form; + + // step 2 + tree->node_form = NULL; + + // step 3 + if(node == NULL || myhtml_tree_element_in_scope_by_node(tree, node, MyHTML_TAG_CATEGORIES_SCOPE) == false) { + // parse error + break; + } + + // step 4 + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + // step 5 + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node != node) + // // parse error + + // step 6 + myhtml_tree_open_elements_remove(tree, node); + } + else { + // step 1 + myhtml_tree_node_t* form_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_FORM, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE); + + if(form_node) + // parse error + break; + + // step 2 + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + // step 3 + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node != node) + // // parse error + + // step 4 + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_FORM, MyHTML_NAMESPACE_HTML, false); + } + + break; + } + + case MyHTML_TAG_P: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON) == NULL) { + // parse error + myhtml_tree_node_insert(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML); + } + + myhtml_tree_tags_close_p(tree); + break; + } + + case MyHTML_TAG_LI: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_LI, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM) == NULL) { + // parse error + break; + } + + // step 1 + myhtml_tree_generate_implied_end_tags(tree, MyHTML_TAG_LI, MyHTML_NAMESPACE_HTML); + + // step 2 + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->tag_id != MyHTML_TAG_LI) + // // parse error + + // step 3 + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_LI, MyHTML_NAMESPACE_HTML, false); + + break; + } + + case MyHTML_TAG_DT: + case MyHTML_TAG_DD: + { + if(myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE) == NULL) { + // parse error + break; + } + + // step 1 + myhtml_tree_generate_implied_end_tags(tree, token->tag_id, MyHTML_NAMESPACE_HTML); + + // step 2 + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->tag_id != token->tag_id) + // // parse error + + // step 3 + myhtml_tree_open_elements_pop_until(tree, token->tag_id, MyHTML_NAMESPACE_HTML, false); + + break; + } + + case MyHTML_TAG_H1: + case MyHTML_TAG_H2: + case MyHTML_TAG_H3: + case MyHTML_TAG_H4: + case MyHTML_TAG_H5: + case MyHTML_TAG_H6: + { + myhtml_tree_node_t** list = tree->open_elements->list; + + myhtml_tree_node_t* node = NULL; + size_t i = tree->open_elements->length; + while(i) { + i--; + + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, list[i]->tag_id); + + if((list[i]->tag_id == MyHTML_TAG_H1 || + list[i]->tag_id == MyHTML_TAG_H2 || + list[i]->tag_id == MyHTML_TAG_H3 || + list[i]->tag_id == MyHTML_TAG_H4 || + list[i]->tag_id == MyHTML_TAG_H5 || + list[i]->tag_id == MyHTML_TAG_H6) && + list[i]->ns == MyHTML_NAMESPACE_HTML) { + node = list[i]; + break; + } + else if(tag_ctx->cats[list[i]->ns] & MyHTML_TAG_CATEGORIES_SCOPE) + break; + } + + if(node == NULL) { + // parse error + break; + } + + // step 1 + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + // step 2 + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->tag_id != token->tag_id) + // // parse error + + // step 3 + while(tree->open_elements->length) { + tree->open_elements->length--; + + if((list[tree->open_elements->length]->tag_id == MyHTML_TAG_H1 || + list[tree->open_elements->length]->tag_id == MyHTML_TAG_H2 || + list[tree->open_elements->length]->tag_id == MyHTML_TAG_H3 || + list[tree->open_elements->length]->tag_id == MyHTML_TAG_H4 || + list[tree->open_elements->length]->tag_id == MyHTML_TAG_H5 || + list[tree->open_elements->length]->tag_id == MyHTML_TAG_H6) && + list[tree->open_elements->length]->ns == MyHTML_NAMESPACE_HTML) + { + break; + } + } + + break; + } + + case MyHTML_TAG_A: + case MyHTML_TAG_B: + case MyHTML_TAG_BIG: + case MyHTML_TAG_CODE: + case MyHTML_TAG_EM: + case MyHTML_TAG_FONT: + case MyHTML_TAG_I: + case MyHTML_TAG_NOBR: + case MyHTML_TAG_S: + case MyHTML_TAG_SMALL: + case MyHTML_TAG_STRIKE: + case MyHTML_TAG_STRONG: + case MyHTML_TAG_TT: + case MyHTML_TAG_U: + { + myhtml_tree_adoption_agency_algorithm(tree, token->tag_id); + //myhtml_insertion_mode_in_body_other_end_tag(tree, token); + + break; + } + + case MyHTML_TAG_APPLET: + case MyHTML_TAG_MARQUEE: + case MyHTML_TAG_OBJECT: + { + if(myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE) == NULL) { + // parse error + break; + } + + // step 1 + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + // step 2 + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->tag_id != token->tag_id) + // // parse error + + // step 3 + myhtml_tree_open_elements_pop_until(tree, token->tag_id, MyHTML_NAMESPACE_HTML, false); + + // step 4 + myhtml_tree_active_formatting_up_to_last_marker(tree); + + break; + } + + case MyHTML_TAG_BR: + { + if(token->attr_first) { + token->attr_first = NULL; + } + + if(token->attr_last) { + token->attr_last = NULL; + } + + myhtml_tree_active_formatting_reconstruction(tree); + + token->type = MyHTML_TOKEN_TYPE_OPEN; + + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + } + + default: + { + return myhtml_insertion_mode_in_body_other_end_tag(tree, token); + } + } + } + // open elements + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_NULL) { + myhtml_insertion_fix_for_null_char_drop_all(tree, token); + + if(token->str.length) { + myhtml_tree_active_formatting_reconstruction(tree); + myhtml_tree_node_insert_text(tree, token); + + if((token->type & MyHTML_TOKEN_TYPE_WHITESPACE) == 0) + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + } + } + else { + myhtml_tree_active_formatting_reconstruction(tree); + myhtml_tree_node_insert_text(tree, token); + + if((token->type & MyHTML_TOKEN_TYPE_WHITESPACE) == 0) + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + } + + break; + } + + case MyHTML_TAG__COMMENT: + myhtml_tree_node_insert_comment(tree, token, 0); + break; + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_HTML: + { + if(myhtml_tree_open_elements_find_by_tag_idx(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, NULL)) + break; + + if(tree->open_elements->length > 0) { + myhtml_tree_node_t* top_node = tree->open_elements->list[0]; + + if(top_node->token) { + myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(top_node->token); + myhtml_token_node_attr_copy_with_check(tree->token, token, top_node->token, tree->mcasync_attr_id); + } + else { + top_node->token = token; + } + } + + break; + } + + case MyHTML_TAG_BASE: + case MyHTML_TAG_BASEFONT: + case MyHTML_TAG_BGSOUND: + case MyHTML_TAG_LINK: + case MyHTML_TAG_META: + case MyHTML_TAG_NOFRAMES: + case MyHTML_TAG_SCRIPT: + case MyHTML_TAG_STYLE: + case MyHTML_TAG_TEMPLATE: + case MyHTML_TAG_TITLE: + { + return myhtml_insertion_mode_in_head(tree, token); + } + + case MyHTML_TAG_BODY: + { + if(tree->open_elements->length > 1) + { + if(!(tree->open_elements->list[1]->tag_id == MyHTML_TAG_BODY && + tree->open_elements->list[1]->ns == MyHTML_NAMESPACE_HTML) || + myhtml_tree_open_elements_find_by_tag_idx(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, NULL)) + break; + } + else + break; + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + + if(tree->open_elements->length > 1) { + myhtml_tree_node_t* top_node = tree->open_elements->list[1]; + + if(top_node->token) { + myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(top_node->token); + myhtml_token_node_attr_copy_with_check(tree->token, token, top_node->token, tree->mcasync_attr_id); + } + else { + top_node->token = token; + } + } + + break; + } + + case MyHTML_TAG_FRAMESET: + { + if(tree->open_elements->length > 1) + { + if(!(tree->open_elements->list[1]->tag_id == MyHTML_TAG_BODY && + tree->open_elements->list[1]->ns == MyHTML_NAMESPACE_HTML)) + break; + } + else + break; + + if((tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK) == 0) + break; + + myhtml_tree_node_t* node = tree->open_elements->list[1]; + + myhtml_tree_node_remove(tree, node); + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_HTML, MyHTML_NAMESPACE_HTML, true); + + myhtml_tree_node_insert_html_element(tree, token); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_FRAMESET; + break; + } + + case MyHTML_TAG__END_OF_FILE: + { + if(tree->template_insertion->length) + return myhtml_insertion_mode_in_template(tree, token); + + myhtml_tree_node_t** list = tree->open_elements->list; + for(size_t i = 0; i < tree->open_elements->length; i++) { + if(list[i]->tag_id != MyHTML_TAG_DD && list[i]->tag_id != MyHTML_TAG_DT && + list[i]->tag_id != MyHTML_TAG_LI && list[i]->tag_id != MyHTML_TAG_MENUITEM && + list[i]->tag_id != MyHTML_TAG_OPTGROUP && list[i]->tag_id != MyHTML_TAG_OPTION && + list[i]->tag_id != MyHTML_TAG_P && list[i]->tag_id != MyHTML_TAG_RB && + list[i]->tag_id != MyHTML_TAG_RP && list[i]->tag_id != MyHTML_TAG_RT && + list[i]->tag_id != MyHTML_TAG_RTC && list[i]->tag_id != MyHTML_TAG_TBODY && + list[i]->tag_id != MyHTML_TAG_TD && list[i]->tag_id != MyHTML_TAG_TFOOT && + list[i]->tag_id != MyHTML_TAG_TH && list[i]->tag_id != MyHTML_TAG_THEAD && + list[i]->tag_id != MyHTML_TAG_TR && list[i]->tag_id != MyHTML_TAG_BODY && + list[i]->tag_id != MyHTML_TAG_HTML && list[i]->ns != MyHTML_NAMESPACE_HTML) + { + // parse error + } + } + + myhtml_rules_stop_parsing(tree); + break; + } + + case MyHTML_TAG_ADDRESS: + case MyHTML_TAG_ARTICLE: + case MyHTML_TAG_ASIDE: + case MyHTML_TAG_BLOCKQUOTE: + case MyHTML_TAG_CENTER: + case MyHTML_TAG_DETAILS: + case MyHTML_TAG_DIALOG: + case MyHTML_TAG_DIR: + case MyHTML_TAG_DIV: + case MyHTML_TAG_DL: + case MyHTML_TAG_FIELDSET: + case MyHTML_TAG_FIGCAPTION: + case MyHTML_TAG_FIGURE: + case MyHTML_TAG_FOOTER: + case MyHTML_TAG_HEADER: + case MyHTML_TAG_HGROUP: + case MyHTML_TAG_MAIN: + case MyHTML_TAG_NAV: + case MyHTML_TAG_OL: + case MyHTML_TAG_P: + case MyHTML_TAG_SECTION: + case MyHTML_TAG_SUMMARY: + case MyHTML_TAG_UL: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_MENU: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(myhtml_is_html_node(current_node, MyHTML_TAG_MENUITEM)) + myhtml_tree_open_elements_pop(tree); + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_H1: + case MyHTML_TAG_H2: + case MyHTML_TAG_H3: + case MyHTML_TAG_H4: + case MyHTML_TAG_H5: + case MyHTML_TAG_H6: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + switch (current_node->tag_id) { + case MyHTML_TAG_H1: + case MyHTML_TAG_H2: + case MyHTML_TAG_H3: + case MyHTML_TAG_H4: + case MyHTML_TAG_H5: + case MyHTML_TAG_H6: + + if(current_node->ns == MyHTML_NAMESPACE_HTML) + myhtml_tree_open_elements_pop(tree); + + break; + + default: + break; + } + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_PRE: + case MyHTML_TAG_LISTING: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_insert_html_element(tree, token); + + // If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move on to the next one. + // (Newlines at the start of pre blocks are ignored as an authoring convenience.) + // !!! see dispatcher (myhtml_rules_tree_dispatcher) for this + tree->flags |= MyHTML_TREE_FLAGS_PARSE_FLAG|MyHTML_TREE_FLAGS_PARSE_FLAG_EMIT_NEWLINE; + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + break; + } + + case MyHTML_TAG_FORM: + { + myhtml_tree_node_t* is_in_node = myhtml_tree_open_elements_find_by_tag_idx(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, NULL); + if(tree->node_form && is_in_node == NULL) + break; + + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_t* current = myhtml_tree_node_insert_html_element(tree, token); + + if(is_in_node == NULL) + tree->node_form = current; + + break; + } + + case MyHTML_TAG_LI: + { + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + + size_t oel_index = tree->open_elements->length; + + while (oel_index) { + oel_index--; + + myhtml_tree_node_t* node = tree->open_elements->list[oel_index]; + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, node->tag_id); + + if(myhtml_is_html_node(node, MyHTML_TAG_LI)) { + myhtml_tree_generate_implied_end_tags(tree, MyHTML_TAG_LI, MyHTML_NAMESPACE_HTML); + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_LI, MyHTML_NAMESPACE_HTML, false); + break; + } + else if(tag_ctx->cats[node->ns] & MyHTML_TAG_CATEGORIES_SPECIAL) + { + if(!((node->tag_id == MyHTML_TAG_ADDRESS || node->tag_id == MyHTML_TAG_DIV || + node->tag_id == MyHTML_TAG_P) && node->ns == MyHTML_NAMESPACE_HTML)) + break; + } + } + + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_DT: + case MyHTML_TAG_DD: + { + // this is copy/past + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + + size_t oel_index = tree->open_elements->length; + + while (oel_index) { + oel_index--; + + myhtml_tree_node_t* node = tree->open_elements->list[oel_index]; + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, node->tag_id); + + if(myhtml_is_html_node(node, MyHTML_TAG_DD)) { + myhtml_tree_generate_implied_end_tags(tree, MyHTML_TAG_DD, MyHTML_NAMESPACE_HTML); + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_DD, MyHTML_NAMESPACE_HTML, false); + break; + } + else if(myhtml_is_html_node(node, MyHTML_TAG_DT)) { + myhtml_tree_generate_implied_end_tags(tree, MyHTML_TAG_DT, MyHTML_NAMESPACE_HTML); + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_DT, MyHTML_NAMESPACE_HTML, false); + break; + } + else if(tag_ctx->cats[node->ns] & MyHTML_TAG_CATEGORIES_SPECIAL) + { + if(!((node->tag_id == MyHTML_TAG_ADDRESS || node->tag_id == MyHTML_TAG_DIV || + node->tag_id == MyHTML_TAG_P) && node->ns == MyHTML_NAMESPACE_HTML)) + break; + } + } + + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_PLAINTEXT: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_insert_html_element(tree, token); + + tree->state_of_builder = MyHTML_TOKENIZER_STATE_PLAINTEXT; + break; + } + + case MyHTML_TAG_BUTTON: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_BUTTON, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE)) { + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_BUTTON, MyHTML_NAMESPACE_HTML, false); + } + + myhtml_tree_active_formatting_reconstruction(tree); + myhtml_tree_node_insert_html_element(tree, token); + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + break; + } + + case MyHTML_TAG_A: + { + myhtml_tree_node_t* node = myhtml_tree_active_formatting_between_last_marker(tree, MyHTML_TAG_A, NULL); + + if(node) { + myhtml_tree_adoption_agency_algorithm(tree, MyHTML_TAG_A); + node = myhtml_tree_active_formatting_between_last_marker(tree, MyHTML_TAG_A, NULL); + + if(node) { + myhtml_tree_open_elements_remove(tree, node); + myhtml_tree_active_formatting_remove(tree, node); + } + } + + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_tree_node_t* current = myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_active_formatting_append_with_check(tree, current); + break; + } + + case MyHTML_TAG_B: + case MyHTML_TAG_BIG: + case MyHTML_TAG_CODE: + case MyHTML_TAG_EM: + case MyHTML_TAG_FONT: + case MyHTML_TAG_I: + case MyHTML_TAG_S: + case MyHTML_TAG_SMALL: + case MyHTML_TAG_STRIKE: + case MyHTML_TAG_STRONG: + case MyHTML_TAG_TT: + case MyHTML_TAG_U: + { + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_tree_node_t* current = myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_active_formatting_append_with_check(tree, current); + break; + } + + case MyHTML_TAG_NOBR: + { + myhtml_tree_active_formatting_reconstruction(tree); + + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_NOBR, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE)) { + myhtml_tree_adoption_agency_algorithm(tree, MyHTML_TAG_NOBR); + myhtml_tree_active_formatting_reconstruction(tree); + } + + myhtml_tree_node_t* current = myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_active_formatting_append_with_check(tree, current); + break; + } + + case MyHTML_TAG_APPLET: + case MyHTML_TAG_MARQUEE: + case MyHTML_TAG_OBJECT: + { + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_active_formatting_append(tree, tree->myhtml->marker); // marker + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + break; + } + + case MyHTML_TAG_TABLE: + { + if((tree->compat_mode & MyHTML_TREE_COMPAT_MODE_QUIRKS) == 0 && + myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) + { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_insert_html_element(tree, token); + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + break; + } + + case MyHTML_TAG_AREA: + case MyHTML_TAG_BR: + case MyHTML_TAG_EMBED: + case MyHTML_TAG_IMG: + case MyHTML_TAG_KEYGEN: + case MyHTML_TAG_WBR: + { + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + break; + } + + case MyHTML_TAG_INPUT: + { + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + + myhtml_token_node_wait_for_done(token); + if(myhtml_token_attr_match_case(tree->token, token, "type", 4, "hidden", 6) == NULL) { + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + } + + break; + } + + case MyHTML_TAG_PARAM: + case MyHTML_TAG_SOURCE: + case MyHTML_TAG_TRACK: + { + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + break; + } + + case MyHTML_TAG_HR: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(myhtml_is_html_node(current_node, MyHTML_TAG_MENUITEM)) + myhtml_tree_open_elements_pop(tree); + + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + break; + } + + case MyHTML_TAG_IMAGE: + { + token->tag_id = MyHTML_TAG_IMG; + return true; + } + + case MyHTML_TAG_TEXTAREA: + { + myhtml_tree_node_insert_html_element(tree, token); + + // If the next token is a U+000A LINE FEED (LF) character token, + // then ignore that token and move on to the next one. + // (Newlines at the start of textarea elements are ignored as an authoring convenience.) + // !!! see dispatcher (myhtml_rules_tree_dispatcher) for this + tree->flags |= MyHTML_TREE_FLAGS_PARSE_FLAG|MyHTML_TREE_FLAGS_PARSE_FLAG_EMIT_NEWLINE; + + tree->orig_insert_mode = tree->insert_mode; + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + tree->insert_mode = MyHTML_INSERTION_MODE_TEXT; + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RCDATA; + + break; + } + + case MyHTML_TAG_XMP: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_BUTTON)) { + myhtml_tree_tags_close_p(tree); + } + + myhtml_tree_active_formatting_reconstruction(tree); + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RAWTEXT; + + myhtml_tree_generic_raw_text_element_parsing_algorithm(tree, token); + break; + } + + case MyHTML_TAG_IFRAME: + { + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RAWTEXT; + + myhtml_tree_generic_raw_text_element_parsing_algorithm(tree, token); + break; + } + + case MyHTML_TAG_NOEMBED: + { + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RAWTEXT; + myhtml_tree_generic_raw_text_element_parsing_algorithm(tree, token); + break; + } + + case MyHTML_TAG_NOSCRIPT: + { + if(tree->flags & MyHTML_TREE_FLAGS_SCRIPT) { + tree->state_of_builder = MyHTML_TOKENIZER_STATE_RAWTEXT; + myhtml_tree_generic_raw_text_element_parsing_algorithm(tree, token); + } + else { + myhtml_tree_active_formatting_reconstruction(tree); + myhtml_tree_node_insert_html_element(tree, token); + } +// else { +// myhtml_tree_node_insert_html_element(tree, token); +// tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD_NOSCRIPT; +// } + + break; + } + + case MyHTML_TAG_SELECT: + { + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_tree_node_insert_html_element(tree, token); + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + + if(tree->insert_mode == MyHTML_INSERTION_MODE_IN_TABLE || + tree->insert_mode == MyHTML_INSERTION_MODE_IN_CAPTION || + tree->insert_mode == MyHTML_INSERTION_MODE_IN_TABLE_BODY || + tree->insert_mode == MyHTML_INSERTION_MODE_IN_ROW || + tree->insert_mode == MyHTML_INSERTION_MODE_IN_CELL) + { + tree->insert_mode = MyHTML_INSERTION_MODE_IN_SELECT_IN_TABLE; + } + else + tree->insert_mode = MyHTML_INSERTION_MODE_IN_SELECT; + + break; + } + + case MyHTML_TAG_OPTGROUP: + case MyHTML_TAG_OPTION: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(myhtml_is_html_node(current_node, MyHTML_TAG_OPTION)) + myhtml_tree_open_elements_pop(tree); + + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_MENUITEM: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(myhtml_is_html_node(current_node, MyHTML_TAG_MENUITEM)) + myhtml_tree_open_elements_pop(tree); + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_RB: + case MyHTML_TAG_RTC: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_RUBY, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE)) { + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + } + + // myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + // if(current_node->tag_id != MyHTML_TAG_RUBY) PARSE_ERROR + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_RP: + case MyHTML_TAG_RT: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_RUBY, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE)) { + myhtml_tree_generate_implied_end_tags(tree, MyHTML_TAG_RTC, MyHTML_NAMESPACE_HTML); + } + + // myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + // if(current_node->tag_id != MyHTML_TAG_RTC || + // current_node->tag_id != MyHTML_TAG_RUBY) PARSE_ERROR + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_MATH: + { + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_token_node_wait_for_done(token); + + myhtml_token_adjust_mathml_attributes(token); + myhtml_token_adjust_foreign_attributes(token); + + myhtml_tree_node_t* current_node = myhtml_tree_node_insert_foreign_element(tree, token); + current_node->ns = MyHTML_NAMESPACE_MATHML; + + if(token->type & MyHTML_TOKEN_TYPE_CLOSE_SELF) + myhtml_tree_open_elements_pop(tree); + + break; + } + + case MyHTML_TAG_SVG: + { + myhtml_tree_active_formatting_reconstruction(tree); + + myhtml_token_node_wait_for_done(token); + + myhtml_token_adjust_svg_attributes(token); + myhtml_token_adjust_foreign_attributes(token); + + myhtml_tree_node_t* current_node = myhtml_tree_node_insert_foreign_element(tree, token); + current_node->ns = MyHTML_NAMESPACE_SVG; + + if(token->type & MyHTML_TOKEN_TYPE_CLOSE_SELF) + myhtml_tree_open_elements_pop(tree); + + break; + } + + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_FRAME: + case MyHTML_TAG_HEAD: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TD: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_TH: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + { + // Ignore this token. + break; + } + + default: + { + myhtml_tree_active_formatting_reconstruction(tree); + myhtml_tree_node_insert_html_element(tree, token); + + break; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_text(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_SCRIPT: + { + // new document.write is not works; set back + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = tree->orig_insert_mode; + break; + } + + default: + { + myhtml_tree_open_elements_pop(tree); + tree->insert_mode = tree->orig_insert_mode; + break; + } + } + } + else { + if(token->tag_id == MyHTML_TAG__END_OF_FILE) + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node->tag_id == MyHTML_TAG_SCRIPT) + current_node->flags |= MyHTML_TREE_FLAGS_ALREADY_STARTED; + + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = tree->orig_insert_mode; + return true; + } + + myhtml_tree_node_insert_text(tree, token); + } + + return false; +} + +bool myhtml_insertion_mode_in_table(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_TABLE: + { + myhtml_tree_node_t* table_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TABLE, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(table_node == NULL) + // parse error + break; + + myhtml_tree_open_elements_pop_until_by_node(tree, table_node, false); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + break; + } + + case MyHTML_TAG_BODY: + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_HTML: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TD: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_TH: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + { + // parse error + break; + } + + case MyHTML_TAG_TEMPLATE: + { + return myhtml_insertion_mode_in_head(tree, token); + } + + default: { + // parse error + tree->foster_parenting = true; + myhtml_insertion_mode_in_body(tree, token); + tree->foster_parenting = false; + + break; + } + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if((current_node->tag_id == MyHTML_TAG_TABLE || + current_node->tag_id == MyHTML_TAG_TBODY || + current_node->tag_id == MyHTML_TAG_TFOOT || + current_node->tag_id == MyHTML_TAG_THEAD || + current_node->tag_id == MyHTML_TAG_TR) && + current_node->ns == MyHTML_NAMESPACE_HTML) + { + myhtml_tree_token_list_clean(tree->token_list); + + tree->orig_insert_mode = tree->insert_mode; + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_TEXT; + + return true; + } + else { + tree->foster_parenting = true; + myhtml_insertion_mode_in_body(tree, token); + tree->foster_parenting = false; + + break; + } + } + + case MyHTML_TAG__COMMENT: + myhtml_tree_node_insert_comment(tree, token, 0); + break; + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_CAPTION: + { + myhtml_tree_clear_stack_back_table_context(tree); + + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_active_formatting_append(tree, tree->myhtml->marker); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_CAPTION; + break; + } + + case MyHTML_TAG_COLGROUP: + { + myhtml_tree_clear_stack_back_table_context(tree); + + myhtml_tree_node_insert_html_element(tree, token); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_COLUMN_GROUP; + break; + } + + case MyHTML_TAG_COL: + { + myhtml_tree_clear_stack_back_table_context(tree); + myhtml_tree_node_insert(tree, MyHTML_TAG_COLGROUP, MyHTML_NAMESPACE_HTML); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_COLUMN_GROUP; + return true; + } + + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + { + myhtml_tree_clear_stack_back_table_context(tree); + + myhtml_tree_node_insert_html_element(tree, token); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_BODY; + break; + } + + case MyHTML_TAG_TD: + case MyHTML_TAG_TH: + case MyHTML_TAG_TR: + { + myhtml_tree_clear_stack_back_table_context(tree); + myhtml_tree_node_insert(tree, MyHTML_TAG_TBODY, MyHTML_NAMESPACE_HTML); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_BODY; + return true; + } + + case MyHTML_TAG_TABLE: + { + // parse error + myhtml_tree_node_t* table_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TABLE, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(table_node == NULL) + break; + + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_TABLE, MyHTML_NAMESPACE_HTML, false); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + return true; + } + + case MyHTML_TAG_STYLE: + case MyHTML_TAG_SCRIPT: + case MyHTML_TAG_TEMPLATE: + { + return myhtml_insertion_mode_in_head(tree, token); + } + + case MyHTML_TAG_INPUT: + { + myhtml_token_node_wait_for_done(token); + if(myhtml_token_attr_match_case(tree->token, token, "type", 4, "hidden", 6) == NULL) { + tree->foster_parenting = true; + myhtml_insertion_mode_in_body(tree, token); + tree->foster_parenting = false; + + break; + } + + // parse error + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + + token->type |= MyHTML_TOKEN_TYPE_CLOSE_SELF; + break; + } + + case MyHTML_TAG_FORM: + { + // parse error + + myhtml_tree_node_t* template = myhtml_tree_open_elements_find_by_tag_idx(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, NULL); + if(tree->node_form || template) + break; + + tree->node_form = myhtml_tree_node_insert_html_element(tree, token); + + myhtml_tree_open_elements_pop(tree); + } + + case MyHTML_TAG__END_OF_FILE: + return myhtml_insertion_mode_in_body(tree, token); + + default: + { + // parse error + tree->foster_parenting = true; + myhtml_insertion_mode_in_body(tree, token); + tree->foster_parenting = false; + + break; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_in_table_text(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + // skip NULL, we replaced earlier + if(token->tag_id == MyHTML_TAG__TEXT) + { + if(token->type & MyHTML_TOKEN_TYPE_NULL) { + myhtml_insertion_fix_for_null_char_drop_all(tree, token); + + if(token->str.length) + myhtml_tree_token_list_append(tree->token_list, token); + } + else + myhtml_tree_token_list_append(tree->token_list, token); + } + else { + myhtml_tree_token_list_t* token_list = tree->token_list; + bool is_not_ws = false; + + for(size_t i = 0; i < token_list->length; i++) { + if((token_list->list[i]->type & MyHTML_TOKEN_TYPE_WHITESPACE) == 0) { + is_not_ws = true; + break; + } + } + + if(is_not_ws) + { + for(size_t i = 0; i < token_list->length; i++) { + tree->foster_parenting = true; + myhtml_insertion_mode_in_body(tree, token_list->list[i]); + tree->foster_parenting = false; + } + } + else { + for(size_t i = 0; i < token_list->length; i++) { + myhtml_tree_node_insert_text(tree, token_list->list[i]); + } + } + + tree->insert_mode = tree->orig_insert_mode; + return true; + } + + return false; +} + +bool myhtml_insertion_mode_in_caption(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_CAPTION: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_CAPTION, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE) == NULL) { + // parse error + break; + } + + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->tag_id != MyHTML_TAG_CAPTION) { + // // parse error + //} + + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_CAPTION, MyHTML_NAMESPACE_HTML, false); + myhtml_tree_active_formatting_up_to_last_marker(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + break; + } + + case MyHTML_TAG_TABLE: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_CAPTION, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE) == NULL) { + // parse error + break; + } + + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->tag_id != MyHTML_TAG_CAPTION) { + // // parse error + //} + + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_CAPTION, MyHTML_NAMESPACE_HTML, false); + myhtml_tree_active_formatting_up_to_last_marker(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + } + + case MyHTML_TAG_BODY: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_HTML: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TD: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_TH: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + { + break; + } + + default: + return myhtml_insertion_mode_in_body(tree, token); + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TD: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_TH: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + { + if(myhtml_tree_element_in_scope(tree, MyHTML_TAG_CAPTION, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE) == NULL) { + // parse error + break; + } + + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + //myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + //if(current_node->tag_id != MyHTML_TAG_CAPTION) { + // // parse error + //} + + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_CAPTION, MyHTML_NAMESPACE_HTML, false); + myhtml_tree_active_formatting_up_to_last_marker(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + } + + default: + return myhtml_insertion_mode_in_body(tree, token); + } + } + + return false; +} + +bool myhtml_insertion_mode_in_column_group(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_COLGROUP: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node == NULL || !(current_node->tag_id == MyHTML_TAG_COLGROUP && + current_node->ns == MyHTML_NAMESPACE_HTML)) + { + break; + } + + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + break; + } + + case MyHTML_TAG_COL: + { + break; + } + + case MyHTML_TAG_TEMPLATE: + { + return myhtml_insertion_mode_in_head(tree, token); + } + + default: { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node && current_node->tag_id == MyHTML_TAG_COLGROUP && + current_node->ns == MyHTML_NAMESPACE_HTML) + { + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + } + + break; + } + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { + myhtml_tree_node_insert_text(tree, token); + break; + } + + myhtml_token_node_t* new_token = myhtml_insertion_fix_split_for_text_begin_ws(tree, token); + if(new_token) + myhtml_tree_node_insert_text(tree, new_token); + + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node && current_node->tag_id == MyHTML_TAG_COLGROUP) + { + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + } + + // parse error + break; + } + + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_insert_comment(tree, token, 0); + break; + } + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_HTML: + { + return myhtml_insertion_mode_in_body(tree, token); + } + + case MyHTML_TAG_COL: + { + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + break; + } + + case MyHTML_TAG_TEMPLATE: + { + return myhtml_insertion_mode_in_head(tree, token); + } + + case MyHTML_TAG__END_OF_FILE: + return myhtml_insertion_mode_in_body(tree, token); + + default: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node && current_node->tag_id == MyHTML_TAG_COLGROUP && + current_node->ns == MyHTML_NAMESPACE_HTML) + { + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + } + + // parse error + break; + } + } + } + + return false; +} + +bool myhtml_insertion_mode_in_table_body(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + { + myhtml_tree_node_t* node = myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(node == NULL) + // parse error + break; + + myhtml_tree_clear_stack_back_table_body_context(tree); + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + break; + } + + case MyHTML_TAG_TABLE: + { + myhtml_tree_node_t* tbody_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TBODY, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + myhtml_tree_node_t* tfoot_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TFOOT, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + myhtml_tree_node_t* thead_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_THEAD, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(tbody_node == NULL && tfoot_node == NULL && thead_node == NULL) + // parse error + break; + + myhtml_tree_clear_stack_back_table_body_context(tree); + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + } + + case MyHTML_TAG_BODY: + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_HTML: + case MyHTML_TAG_TD: + case MyHTML_TAG_TH: + case MyHTML_TAG_TR: + { + // parse error + break; + } + + default: + return myhtml_insertion_mode_in_table(tree, token); + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG_TR: + { + myhtml_tree_clear_stack_back_table_body_context(tree); + + myhtml_tree_node_insert_html_element(tree, token); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_ROW; + break; + } + + case MyHTML_TAG_TH: + case MyHTML_TAG_TD: + { + // parse error + myhtml_tree_clear_stack_back_table_body_context(tree); + + myhtml_tree_node_insert(tree, MyHTML_TAG_TR, MyHTML_NAMESPACE_HTML); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_ROW; + return true; + } + + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + { + myhtml_tree_node_t* tbody_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TBODY, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + myhtml_tree_node_t* tfoot_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TFOOT, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + myhtml_tree_node_t* thead_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_THEAD, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(tbody_node == NULL && tfoot_node == NULL && thead_node == NULL) + // parse error + break; + + myhtml_tree_clear_stack_back_table_body_context(tree); + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + } + + default: + return myhtml_insertion_mode_in_table(tree, token); + } + } + + return false; +} + +bool myhtml_insertion_mode_in_row(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_TR: + { + myhtml_tree_node_t* tr_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TR, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(tr_node == NULL) + // parse error + break; + + myhtml_tree_clear_stack_back_table_row_context(tree); + + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_BODY; + break; + } + + case MyHTML_TAG_TABLE: + { + myhtml_tree_node_t* tr_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TR, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(tr_node == NULL) + // parse error + break; + + myhtml_tree_clear_stack_back_table_row_context(tree); + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_BODY; + return true; + } + + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + { + myhtml_tree_node_t* node = myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + if(node == NULL) + // parse error + break; + + myhtml_tree_node_t* tr_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TR, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + if(tr_node == NULL) + break; + + myhtml_tree_clear_stack_back_table_row_context(tree); + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_BODY; + return true; + } + + default: + return myhtml_insertion_mode_in_table(tree, token); + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG_TH: + case MyHTML_TAG_TD: + { + myhtml_tree_clear_stack_back_table_row_context(tree); + + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_active_formatting_append(tree, tree->myhtml->marker); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_CELL; + break; + } + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + { + myhtml_tree_node_t* tr_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TR, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(tr_node == NULL) + // parse error + break; + + myhtml_tree_clear_stack_back_table_row_context(tree); + myhtml_tree_open_elements_pop(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_BODY; + return true; + } + + default: + return myhtml_insertion_mode_in_table(tree, token); + } + } + + return false; +} + +bool myhtml_insertion_mode_in_cell(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_TD: + case MyHTML_TAG_TH: + { + myhtml_tree_node_t* node = myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(node == NULL) + // parse error + break; + + myhtml_tree_generate_implied_end_tags(tree, 0, MyHTML_NAMESPACE_UNDEF); + + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(!(current_node->ns = MyHTML_NAMESPACE_HTML && + current_node->tag_id == token->tag_id)) + { + // parse error + } + + myhtml_tree_open_elements_pop_until(tree, token->tag_id, MyHTML_NAMESPACE_HTML, false); + + myhtml_tree_active_formatting_up_to_last_marker(tree); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_ROW; + break; + } + + case MyHTML_TAG_BODY: + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_HTML: + break; + + case MyHTML_TAG_TABLE: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + { + myhtml_tree_node_t* node = myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(node == NULL) + // parse error + break; + + node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TD, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + if(node) { + myhtml_tree_close_cell(tree, node); + } + else { + node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TH, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + if(node) + myhtml_tree_close_cell(tree, node); + } + + return true; + } + + default: + return myhtml_insertion_mode_in_table(tree, token); + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COL: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TD: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_TH: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + { + myhtml_tree_node_t* td_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TD, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + myhtml_tree_node_t* th_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_TH, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(td_node == NULL && th_node == NULL) + // parse error + break; + + myhtml_tree_close_cell(tree, (td_node == NULL ? th_node : td_node)); + + return true; + } + + default: + return myhtml_insertion_mode_in_body(tree, token); + } + } + + return false; +} + +bool myhtml_insertion_mode_in_select(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_OPTGROUP: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node->tag_id == MyHTML_TAG_OPTION && + current_node->ns == MyHTML_NAMESPACE_HTML) + { + if(tree->open_elements->length > 1) { + myhtml_tree_node_t *optgrp_node = tree->open_elements->list[ tree->open_elements->length - 2 ]; + + if(optgrp_node->tag_id == MyHTML_TAG_OPTGROUP && + optgrp_node->ns == MyHTML_NAMESPACE_HTML) + { + myhtml_tree_open_elements_pop(tree); + } + } + else { + MyHTML_DEBUG_ERROR("in select state; open elements length < 2"); + } + } + + current_node = myhtml_tree_current_node(tree); + + if(current_node->tag_id == MyHTML_TAG_OPTGROUP && + current_node->ns == MyHTML_NAMESPACE_HTML) + myhtml_tree_open_elements_pop(tree); + else + // parse error + break; + + break; + } + + case MyHTML_TAG_OPTION: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node->tag_id == MyHTML_TAG_OPTION && + current_node->ns == MyHTML_NAMESPACE_HTML) + myhtml_tree_open_elements_pop(tree); + else + // parse error + break; + + break; + } + + case MyHTML_TAG_SELECT: + { + // parse error + myhtml_tree_node_t* select_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_SELECT, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_SELECT); + + if(select_node == NULL) + // parse error + break; + + myhtml_tree_open_elements_pop_until_by_node(tree, select_node, false); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + break; + } + + case MyHTML_TAG_TEMPLATE: + return myhtml_insertion_mode_in_head(tree, token); + + default: + // parse error + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: { + if(token->type & MyHTML_TOKEN_TYPE_NULL) { + myhtml_insertion_fix_for_null_char_drop_all(tree, token); + + if(token->str.length) + myhtml_tree_node_insert_text(tree, token); + } + else + myhtml_tree_node_insert_text(tree, token); + + break; + } + + case MyHTML_TAG__COMMENT: + myhtml_tree_node_insert_comment(tree, token, NULL); + break; + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_HTML: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG_OPTION: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(myhtml_is_html_node(current_node, token->tag_id)) + myhtml_tree_open_elements_pop(tree); + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_OPTGROUP: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node->tag_id == MyHTML_TAG_OPTION && + current_node->ns == MyHTML_NAMESPACE_HTML) + myhtml_tree_open_elements_pop(tree); + + current_node = myhtml_tree_current_node(tree); + + if(current_node->tag_id == token->tag_id && + current_node->ns == MyHTML_NAMESPACE_HTML) + myhtml_tree_open_elements_pop(tree); + + myhtml_tree_node_insert_html_element(tree, token); + break; + } + + case MyHTML_TAG_SELECT: + { + // parse error + myhtml_tree_node_t* select_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_SELECT, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_SELECT); + + if(select_node == NULL) + break; + + myhtml_tree_open_elements_pop_until_by_node(tree, select_node, false); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + break; + } + + case MyHTML_TAG_INPUT: + case MyHTML_TAG_KEYGEN: + case MyHTML_TAG_TEXTAREA: + { + // parse error + myhtml_tree_node_t* select_node = myhtml_tree_element_in_scope(tree, MyHTML_TAG_SELECT, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_SELECT); + + if(select_node == NULL) + break; + + myhtml_tree_open_elements_pop_until_by_node(tree, select_node, false); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + return true; + } + + case MyHTML_TAG_SCRIPT: + case MyHTML_TAG_TEMPLATE: + return myhtml_insertion_mode_in_head(tree, token); + + case MyHTML_TAG__END_OF_FILE: + return myhtml_insertion_mode_in_body(tree, token); + + default: + // parse error + break; + } + } + + return false; +} + +bool myhtml_insertion_mode_in_select_in_table(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_TABLE: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + case MyHTML_TAG_TD: + case MyHTML_TAG_TH: + { + // parse error + myhtml_tree_node_t* some_node = myhtml_tree_element_in_scope(tree, token->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_SCOPE_TABLE); + + if(some_node == NULL) + break; + + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_SELECT, MyHTML_NAMESPACE_HTML, false); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + return true; + } + + default: + return myhtml_insertion_mode_in_select(tree, token); + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_TABLE: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + case MyHTML_TAG_TR: + case MyHTML_TAG_TD: + case MyHTML_TAG_TH: + { + // parse error + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_SELECT, MyHTML_NAMESPACE_HTML, false); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + return true; + } + + default: + return myhtml_insertion_mode_in_select(tree, token); + } + } + + return false; +} + +bool myhtml_insertion_mode_in_template(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_TEMPLATE: + return myhtml_insertion_mode_in_body(tree, token); + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + case MyHTML_TAG__COMMENT: + case MyHTML_TAG__DOCTYPE: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG_BASE: + case MyHTML_TAG_BASEFONT: + case MyHTML_TAG_BGSOUND: + case MyHTML_TAG_LINK: + case MyHTML_TAG_META: + case MyHTML_TAG_NOFRAMES: + case MyHTML_TAG_SCRIPT: + case MyHTML_TAG_STYLE: + case MyHTML_TAG_TEMPLATE: + case MyHTML_TAG_TITLE: + return myhtml_insertion_mode_in_head(tree, token); + + case MyHTML_TAG_CAPTION: + case MyHTML_TAG_COLGROUP: + case MyHTML_TAG_TBODY: + case MyHTML_TAG_TFOOT: + case MyHTML_TAG_THEAD: + myhtml_tree_template_insertion_pop(tree); + myhtml_tree_template_insertion_append(tree, MyHTML_INSERTION_MODE_IN_TABLE); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE; + return true; + + case MyHTML_TAG_COL: + myhtml_tree_template_insertion_pop(tree); + myhtml_tree_template_insertion_append(tree, MyHTML_INSERTION_MODE_IN_COLUMN_GROUP); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_COLUMN_GROUP; + return true; + + case MyHTML_TAG_TR: + myhtml_tree_template_insertion_pop(tree); + myhtml_tree_template_insertion_append(tree, MyHTML_INSERTION_MODE_IN_TABLE_BODY); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_TABLE_BODY; + return true; + + case MyHTML_TAG_TD: + case MyHTML_TAG_TH: + myhtml_tree_template_insertion_pop(tree); + myhtml_tree_template_insertion_append(tree, MyHTML_INSERTION_MODE_IN_ROW); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_ROW; + return true; + + case MyHTML_TAG__END_OF_FILE: + { + myhtml_tree_node_t* node = myhtml_tree_open_elements_find_by_tag_idx(tree, MyHTML_TAG_TEMPLATE, MyHTML_NAMESPACE_HTML, NULL); + + if(node == NULL) { + myhtml_rules_stop_parsing(tree); + break; + } + + // parse error + myhtml_tree_open_elements_pop_until_by_node(tree, node, false); + myhtml_tree_active_formatting_up_to_last_marker(tree); + myhtml_tree_template_insertion_pop(tree); + myhtml_tree_reset_insertion_mode_appropriately(tree); + + return true; + } + + default: + myhtml_tree_template_insertion_pop(tree); + myhtml_tree_template_insertion_append(tree, MyHTML_INSERTION_MODE_IN_BODY); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + } + + return false; +} + +bool myhtml_insertion_mode_after_body(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_HTML: + { + if(tree->fragment) { + // parse error + break; + } + + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_AFTER_BODY; + break; + } + + default: + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) + return myhtml_insertion_mode_in_body(tree, token); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + + case MyHTML_TAG__COMMENT: + { + if(tree->open_elements->length == 0) { + MyHTML_DEBUG_ERROR("after body state; open_elements length < 1"); + break; + } + + myhtml_tree_node_t* adjusted_location = tree->open_elements->list[0]; + + // state 2 + myhtml_tree_node_t* node = myhtml_tree_node_create(tree); + + node->tag_id = MyHTML_TAG__COMMENT; + node->token = token; + node->ns = adjusted_location->ns; + + myhtml_tree_node_add_child(tree, adjusted_location, node); + + break; + } + + case MyHTML_TAG__DOCTYPE: + // parse error + break; + + case MyHTML_TAG_HTML: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG__END_OF_FILE: + myhtml_rules_stop_parsing(tree); + break; + + default: + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + } + + return false; +} + +bool myhtml_insertion_mode_in_frameset(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_FRAMESET: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node == tree->document->child) + // parse error + break; + + myhtml_tree_open_elements_pop(tree); + + current_node = myhtml_tree_current_node(tree); + + if(tree->fragment == NULL && + !(current_node->tag_id == MyHTML_TAG_FRAMESET && + current_node->ns == MyHTML_NAMESPACE_HTML)) + { + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_FRAMESET; + } + + break; + } + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { + myhtml_tree_node_insert_text(tree, token); + break; + } + + // parse error + myhtml_token_node_wait_for_done(token); + myhtml_string_stay_only_whitespace(&token->str); + + if(token->str.length) + myhtml_tree_node_insert_text(tree, token); + + break; + } + + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_insert_comment(tree, token, NULL); + break; + } + + case MyHTML_TAG__DOCTYPE: + // parse error + break; + + case MyHTML_TAG_HTML: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG_FRAMESET: + myhtml_tree_node_insert_html_element(tree, token); + break; + + case MyHTML_TAG_FRAME: + myhtml_tree_node_insert_html_element(tree, token); + myhtml_tree_open_elements_pop(tree); + break; + + case MyHTML_TAG_NOFRAMES: + return myhtml_insertion_mode_in_head(tree, token); + + case MyHTML_TAG__END_OF_FILE: + { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(current_node == tree->document->child) { + // parse error + } + + myhtml_rules_stop_parsing(tree); + break; + } + + default: + break; + } + } + + return false; +} + +bool myhtml_insertion_mode_after_frameset(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + switch (token->tag_id) { + case MyHTML_TAG_HTML: + tree->insert_mode = MyHTML_INSERTION_MODE_AFTER_AFTER_FRAMESET; + break; + + default: + break; + } + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { + myhtml_tree_node_insert_text(tree, token); + break; + } + + // parse error + myhtml_token_node_wait_for_done(token); + myhtml_string_stay_only_whitespace(&token->str); + + if(token->str.length) + myhtml_tree_node_insert_text(tree, token); + + break; + } + + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_insert_comment(tree, token, NULL); + break; + } + + case MyHTML_TAG__DOCTYPE: + // parse error + break; + + case MyHTML_TAG_HTML: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG_NOFRAMES: + return myhtml_insertion_mode_in_head(tree, token); + + case MyHTML_TAG__END_OF_FILE: + myhtml_rules_stop_parsing(tree); + break; + + default: + break; + } + } + + return false; +} + +bool myhtml_insertion_mode_after_after_body(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) + { + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_t* adjusted_location = tree->document; + myhtml_tree_node_t* node = myhtml_tree_node_create(tree); + + node->tag_id = MyHTML_TAG__COMMENT; + node->token = token; + node->ns = adjusted_location->ns; + + myhtml_tree_node_add_child(tree, adjusted_location, node); + break; + } + + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) + return myhtml_insertion_mode_in_body(tree, token); + + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + + case MyHTML_TAG_HTML: + case MyHTML_TAG__DOCTYPE: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG__END_OF_FILE: + myhtml_rules_stop_parsing(tree); + break; + + default: + tree->insert_mode = MyHTML_INSERTION_MODE_IN_BODY; + return true; + } + } + + return false; +} + +bool myhtml_insertion_mode_after_after_frameset(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) { + return false; + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__COMMENT: + { + myhtml_tree_node_t* adjusted_location = tree->document; + myhtml_tree_node_t* node = myhtml_tree_node_create(tree); + + node->tag_id = MyHTML_TAG__COMMENT; + node->token = token; + node->ns = adjusted_location->ns; + + myhtml_tree_node_add_child(tree, adjusted_location, node); + break; + } + + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_WHITESPACE) + return myhtml_insertion_mode_in_body(tree, token); + + myhtml_token_node_t* new_token = myhtml_insertion_fix_split_for_text_begin_ws(tree, token); + if(new_token) + return myhtml_insertion_mode_in_body(tree, new_token); + + // parse error + break; + } + + case MyHTML_TAG_HTML: + case MyHTML_TAG__DOCTYPE: + return myhtml_insertion_mode_in_body(tree, token); + + case MyHTML_TAG__END_OF_FILE: + myhtml_rules_stop_parsing(tree); + break; + + case MyHTML_TAG_NOFRAMES: + return myhtml_insertion_mode_in_head(tree, token); + + default: + // parse error + break; + } + } + + return false; +} + +bool myhtml_insertion_mode_in_foreign_content_end_other(myhtml_tree_t* tree, myhtml_tree_node_t* current_node, myhtml_token_node_t* token) +{ + if(current_node->tag_id != token->tag_id) { + // parse error + } + + if(tree->open_elements->length) + { + myhtml_tree_node_t** list = tree->open_elements->list; + size_t i = tree->open_elements->length - 1; + + while (i) + { + current_node = list[i]; + + if(current_node->tag_id == token->tag_id) { + myhtml_tree_open_elements_pop_until_by_node(tree, current_node, false); + return false; + } + + i--; + + if(list[i]->ns == MyHTML_NAMESPACE_HTML) + break; + } + } + + return tree->myhtml->insertion_func[tree->insert_mode](tree, token); +} + +bool myhtml_insertion_mode_in_foreign_content_start_other(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + myhtml_tree_node_t* adjusted_node = myhtml_tree_adjusted_current_node(tree); + + myhtml_token_node_wait_for_done(token); + + if(adjusted_node->ns == MyHTML_NAMESPACE_MATHML) { + myhtml_token_adjust_mathml_attributes(token); + } + else if(adjusted_node->ns == MyHTML_NAMESPACE_SVG) { + myhtml_token_adjust_svg_attributes(token); + } + + myhtml_token_adjust_foreign_attributes(token); + + myhtml_tree_node_t* node = myhtml_tree_node_insert_foreign_element(tree, token); + node->ns = adjusted_node->ns; + + if(token->type & MyHTML_TOKEN_TYPE_CLOSE_SELF) + { + if(token->tag_id == MyHTML_TAG_SCRIPT && + node->ns == MyHTML_NAMESPACE_SVG) + { + return myhtml_insertion_mode_in_foreign_content_end_other(tree, myhtml_tree_current_node(tree), token); + } + else { + myhtml_tree_open_elements_pop(tree); + } + } + + return false; +} + +bool myhtml_insertion_mode_in_foreign_content(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(token->type & MyHTML_TOKEN_TYPE_CLOSE) { + myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); + + if(token->tag_id == MyHTML_TAG_SCRIPT && + current_node->tag_id == MyHTML_TAG_SCRIPT && + current_node->ns == MyHTML_NAMESPACE_SVG) + { + myhtml_tree_open_elements_pop(tree); + // TODO: now script is disable, skip this + return false; + } + + return myhtml_insertion_mode_in_foreign_content_end_other(tree, current_node, token); + } + else { + switch (token->tag_id) + { + case MyHTML_TAG__TEXT: + { + if(token->type & MyHTML_TOKEN_TYPE_NULL) { + myhtml_token_node_wait_for_done(token); + myhtml_token_set_replacement_character_for_null_token(tree, token); + } + + myhtml_tree_node_insert_text(tree, token); + + if((token->type & MyHTML_TOKEN_TYPE_WHITESPACE) == 0) + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); + + break; + } + + case MyHTML_TAG__COMMENT: + myhtml_tree_node_insert_comment(tree, token, NULL); + break; + + case MyHTML_TAG__DOCTYPE: + break; + + case MyHTML_TAG_B: + case MyHTML_TAG_BIG: + case MyHTML_TAG_BLOCKQUOTE: + case MyHTML_TAG_BODY: + case MyHTML_TAG_BR: + case MyHTML_TAG_CENTER: + case MyHTML_TAG_CODE: + case MyHTML_TAG_DD: + case MyHTML_TAG_DIV: + case MyHTML_TAG_DL: + case MyHTML_TAG_DT: + case MyHTML_TAG_EM: + case MyHTML_TAG_EMBED: + case MyHTML_TAG_H1: + case MyHTML_TAG_H2: + case MyHTML_TAG_H3: + case MyHTML_TAG_H4: + case MyHTML_TAG_H5: + case MyHTML_TAG_H6: + case MyHTML_TAG_HEAD: + case MyHTML_TAG_HR: + case MyHTML_TAG_I: + case MyHTML_TAG_IMG: + case MyHTML_TAG_LI: + case MyHTML_TAG_LISTING: + case MyHTML_TAG_MENU: + case MyHTML_TAG_META: + case MyHTML_TAG_NOBR: + case MyHTML_TAG_OL: + case MyHTML_TAG_P: + case MyHTML_TAG_PRE: + case MyHTML_TAG_RUBY: + case MyHTML_TAG_S: + case MyHTML_TAG_SMALL: + case MyHTML_TAG_SPAN: + case MyHTML_TAG_STRONG: + case MyHTML_TAG_STRIKE: + case MyHTML_TAG_SUB: + case MyHTML_TAG_SUP: + case MyHTML_TAG_TABLE: + case MyHTML_TAG_TT: + case MyHTML_TAG_U: + case MyHTML_TAG_UL: + case MyHTML_TAG_VAR: + case MyHTML_TAG_FONT: + { + // parse error + if(token->tag_id == MyHTML_TAG_FONT) + { + myhtml_token_node_wait_for_done(token); + + if(myhtml_token_attr_by_name(token, "color", 5) == NULL && + myhtml_token_attr_by_name(token, "face" , 4) == NULL && + myhtml_token_attr_by_name(token, "size" , 4) == NULL) + return myhtml_insertion_mode_in_foreign_content_start_other(tree, token); + } + + if(tree->fragment == NULL) { + myhtml_tree_node_t* current_node; + + do { + myhtml_tree_open_elements_pop(tree); + current_node = myhtml_tree_current_node(tree); + } + while(current_node && !(myhtml_tree_is_mathml_integration_point(tree, current_node) || + myhtml_tree_is_html_integration_point(tree, current_node) || + current_node->ns == MyHTML_NAMESPACE_HTML)); + + return true; + } + } + + default: + return myhtml_insertion_mode_in_foreign_content_start_other(tree, token); + } + } + + return false; +} + +void myhtml_rules_stop_parsing(myhtml_tree_t* tree) +{ + // THIS! IS! -(SPARTA!)- STOP PARSING +} + +bool myhtml_rules_check_for_first_newline(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + if(tree->flags & MyHTML_TREE_FLAGS_PARSE_FLAG) { + if(tree->flags &MyHTML_TREE_FLAGS_PARSE_FLAG_EMIT_NEWLINE) + { + if(token->tag_id == MyHTML_TAG__TEXT) { + myhtml_token_node_wait_for_done(token); + + if(token->str.length > 0) { + if(token->str.data[0] == '\n') { + token->str.data = mchar_async_crop_first_chars_without_cache(token->str.data, 1); + + token->str.length--; + + if(token->str.length == 0) { + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_PARSE_FLAG); + return true; + } + } + } + else + return true; + } + } + + tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_PARSE_FLAG); + } + + return false; +} + +bool myhtml_rules_tree_dispatcher(myhtml_tree_t* tree, myhtml_token_node_t* token) +{ + // for textarea && pre && listen + if(myhtml_rules_check_for_first_newline(tree, token)) + return false; + + if(tree->state_of_builder != MyHTML_TOKENIZER_STATE_DATA) + tree->state_of_builder = MyHTML_TOKENIZER_STATE_DATA; + + bool reprocess = false; + myhtml_tree_node_t* adjusted_node = myhtml_tree_adjusted_current_node(tree); + + if(tree->open_elements->length == 0 || adjusted_node->ns == MyHTML_NAMESPACE_HTML) { + reprocess = tree->myhtml->insertion_func[tree->insert_mode](tree, token); + } + else if(myhtml_tree_is_mathml_integration_point(tree, adjusted_node) && + ((token->tag_id == MyHTML_TAG__TEXT || + (token->tag_id != MyHTML_TAG_MGLYPH && token->tag_id != MyHTML_TAG_MALIGNMARK)) && + (token->type & MyHTML_TOKEN_TYPE_CLOSE) == 0)) + { + reprocess = tree->myhtml->insertion_func[tree->insert_mode](tree, token); + } + else if(adjusted_node->tag_id == MyHTML_TAG_ANNOTATION_XML && + adjusted_node->ns == MyHTML_NAMESPACE_MATHML && + token->tag_id == MyHTML_TAG_SVG && (token->type & MyHTML_TOKEN_TYPE_CLOSE) == 0) + { + reprocess = tree->myhtml->insertion_func[tree->insert_mode](tree, token); + } + else if(myhtml_tree_is_html_integration_point(tree, adjusted_node) && + ((token->type & MyHTML_TOKEN_TYPE_CLOSE) == 0 || token->tag_id == MyHTML_TAG__TEXT)) + { + reprocess = tree->myhtml->insertion_func[tree->insert_mode](tree, token); + } + else if(token->tag_id == MyHTML_TAG__END_OF_FILE) + reprocess = tree->myhtml->insertion_func[tree->insert_mode](tree, token); + else + reprocess = myhtml_insertion_mode_in_foreign_content(tree, token); + + if(reprocess == false) { + tree->token_last_done = token; + } + + return reprocess; +} + +myhtml_status_t myhtml_rules_init(myhtml_t* myhtml) +{ + myhtml->insertion_func = (myhtml_insertion_f*)myhtml_malloc(sizeof(myhtml_insertion_f) * MyHTML_INSERTION_MODE_LAST_ENTRY); + + if(myhtml->insertion_func == NULL) + return MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION; + + myhtml->insertion_func[MyHTML_INSERTION_MODE_INITIAL] = myhtml_insertion_mode_initial; + myhtml->insertion_func[MyHTML_INSERTION_MODE_BEFORE_HTML] = myhtml_insertion_mode_before_html; + myhtml->insertion_func[MyHTML_INSERTION_MODE_BEFORE_HEAD] = myhtml_insertion_mode_before_head; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_HEAD] = myhtml_insertion_mode_in_head; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_HEAD_NOSCRIPT] = myhtml_insertion_mode_in_head_noscript; + myhtml->insertion_func[MyHTML_INSERTION_MODE_AFTER_HEAD] = myhtml_insertion_mode_after_head; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_BODY] = myhtml_insertion_mode_in_body; + myhtml->insertion_func[MyHTML_INSERTION_MODE_TEXT] = myhtml_insertion_mode_text; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_TABLE] = myhtml_insertion_mode_in_table; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_TABLE_TEXT] = myhtml_insertion_mode_in_table_text; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_CAPTION] = myhtml_insertion_mode_in_caption; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_COLUMN_GROUP] = myhtml_insertion_mode_in_column_group; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_TABLE_BODY] = myhtml_insertion_mode_in_table_body; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_ROW] = myhtml_insertion_mode_in_row; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_CELL] = myhtml_insertion_mode_in_cell; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_SELECT] = myhtml_insertion_mode_in_select; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_SELECT_IN_TABLE] = myhtml_insertion_mode_in_select_in_table; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_TEMPLATE] = myhtml_insertion_mode_in_template; + myhtml->insertion_func[MyHTML_INSERTION_MODE_AFTER_BODY] = myhtml_insertion_mode_after_body; + myhtml->insertion_func[MyHTML_INSERTION_MODE_IN_FRAMESET] = myhtml_insertion_mode_in_frameset; + myhtml->insertion_func[MyHTML_INSERTION_MODE_AFTER_FRAMESET] = myhtml_insertion_mode_after_frameset; + myhtml->insertion_func[MyHTML_INSERTION_MODE_AFTER_AFTER_BODY] = myhtml_insertion_mode_after_after_body; + myhtml->insertion_func[MyHTML_INSERTION_MODE_AFTER_AFTER_FRAMESET] = myhtml_insertion_mode_after_after_frameset; + + return MyHTML_STATUS_OK; +} + + diff --git a/source/myhtml/rules.h b/source/myhtml/rules.h new file mode 100644 index 0000000..1724e22 --- /dev/null +++ b/source/myhtml/rules.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_RULES_H +#define MyHTML_RULES_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/myhtml.h" +#include "myhtml/tree.h" + + +myhtml_status_t myhtml_rules_init(myhtml_t* myhtml); +void myhtml_rules_stop_parsing(myhtml_tree_t* tree); + +bool myhtml_rules_tree_dispatcher(myhtml_tree_t* tree, myhtml_token_node_t* token); +bool myhtml_insertion_mode_in_body_other_end_tag(myhtml_tree_t* tree, myhtml_token_node_t* token); +bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* token); +bool myhtml_insertion_mode_in_template(myhtml_tree_t* tree, myhtml_token_node_t* token); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_rules_h */ diff --git a/source/myhtml/stream.c b/source/myhtml/stream.c new file mode 100644 index 0000000..b0779df --- /dev/null +++ b/source/myhtml/stream.c @@ -0,0 +1,143 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/stream.h" + +myhtml_stream_buffer_t * myhtml_stream_buffer_create(void) +{ + return myhtml_calloc(1, sizeof(myhtml_stream_buffer_t)); +} + +myhtml_status_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size) +{ + stream_buffer->length = 0; + stream_buffer->size = entries_size; + stream_buffer->entries = myhtml_calloc(entries_size, sizeof(myhtml_stream_buffer_entry_t)); + + if(stream_buffer->entries == NULL) + return MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT; + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size) +{ + if(stream_buffer_entry->data) { + if(size <= stream_buffer_entry->size) + return MyHTML_STATUS_OK; + else + myhtml_free(stream_buffer_entry->data); + } + + stream_buffer_entry->length = 0; + stream_buffer_entry->size = size; + stream_buffer_entry->data = myhtml_malloc(size * sizeof(char)); + + if(stream_buffer_entry->data == NULL) + return MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT; + + return MyHTML_STATUS_OK; +} + +void myhtml_stream_buffer_entry_clean(myhtml_stream_buffer_entry_t* stream_buffer_entry) +{ + if(stream_buffer_entry) + stream_buffer_entry->length = 0; +} + +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_entry_destroy(myhtml_stream_buffer_entry_t* stream_buffer_entry, bool self_destroy) +{ + if(stream_buffer_entry == NULL) + return NULL; + + if(stream_buffer_entry->data) + myhtml_free(stream_buffer_entry->data); + + if(self_destroy) { + myhtml_free(stream_buffer_entry); + return NULL; + } + + return stream_buffer_entry; +} + +void myhtml_stream_buffer_clean(myhtml_stream_buffer_t* stream_buffer) +{ + if(stream_buffer) + stream_buffer->length = 0; +} + +myhtml_stream_buffer_t * myhtml_stream_buffer_destroy(myhtml_stream_buffer_t* stream_buffer, bool self_destroy) +{ + if(stream_buffer == NULL) + return NULL; + + if(stream_buffer->entries) { + for(size_t i = 0; i < stream_buffer->length; i++) + myhtml_stream_buffer_entry_destroy(&stream_buffer->entries[i], false); + + myhtml_free(stream_buffer->entries); + } + + if(self_destroy) { + myhtml_free(stream_buffer); + return NULL; + } + + return stream_buffer; +} + +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_add_entry(myhtml_stream_buffer_t* stream_buffer, size_t entry_data_size) +{ + if(stream_buffer->length >= stream_buffer->size) { + size_t new_size = stream_buffer->size << 1; + + myhtml_stream_buffer_entry_t *entries = myhtml_realloc(stream_buffer, sizeof(myhtml_stream_buffer_entry_t) * new_size); + + if(entries) { + memset(&entries[stream_buffer->size], 0, (new_size - stream_buffer->size)); + + stream_buffer->entries = entries; + stream_buffer->size = new_size; + } + else + return NULL; + } + + myhtml_stream_buffer_entry_t *entry = &stream_buffer->entries[ stream_buffer->length ]; + myhtml_status_t status = myhtml_stream_buffer_entry_init(entry, entry_data_size); + + if(status != MyHTML_STATUS_OK) + return NULL; + + stream_buffer->length++; + + return entry; +} + +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_current_entry(myhtml_stream_buffer_t* stream_buffer) +{ + if(stream_buffer->length == 0) + return NULL; + + return &stream_buffer->entries[ (stream_buffer->length - 1) ]; +} + + diff --git a/source/myhtml/stream.h b/source/myhtml/stream.h new file mode 100644 index 0000000..e015438 --- /dev/null +++ b/source/myhtml/stream.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_STREAM_H +#define MyHTML_STREAM_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" +#include "myhtml/myhtml.h" + + +struct myhtml_stream_buffer_entry { + char* data; + size_t length; + size_t size; +}; + +struct myhtml_stream_buffer { + myhtml_stream_buffer_entry_t* entries; + size_t length; + size_t size; + + myhtml_encoding_result_t res; +}; + +myhtml_stream_buffer_t * myhtml_stream_buffer_create(void); +myhtml_status_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size); +void myhtml_stream_buffer_clean(myhtml_stream_buffer_t* stream_buffer); +myhtml_stream_buffer_t * myhtml_stream_buffer_destroy(myhtml_stream_buffer_t* stream_buffer, bool self_destroy); +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_add_entry(myhtml_stream_buffer_t* stream_buffer, size_t entry_data_size); +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_current_entry(myhtml_stream_buffer_t* stream_buffer); + +myhtml_status_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size); +void myhtml_stream_buffer_entry_clean(myhtml_stream_buffer_entry_t* stream_buffer_entry); +myhtml_stream_buffer_entry_t * myhtml_stream_buffer_entry_destroy(myhtml_stream_buffer_entry_t* stream_buffer_entry, bool self_destroy); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyHTML_STREAM_H */ diff --git a/source/myhtml/tag.c b/source/myhtml/tag.c new file mode 100755 index 0000000..de5daab --- /dev/null +++ b/source/myhtml/tag.c @@ -0,0 +1,320 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/tag.h" + + +myhtml_tag_t * myhtml_tag_create(void) +{ + return (myhtml_tag_t*)myhtml_malloc(sizeof(myhtml_tag_t)); +} + +myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags) +{ + tags->mcsimple_context = mcsimple_create(); + + if(tags->mcsimple_context == NULL) + return MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION; + + mcsimple_init(tags->mcsimple_context, 128, 1024, sizeof(myhtml_tag_context_t)); + + tags->mchar_node = mchar_async_node_add(tree->mchar); + tags->tree = mctree_create(32); + tags->mchar = tree->mchar; + tags->tags_count = MyHTML_TAG_LAST_ENTRY; + tags->mcobject_tag_index = NULL; + + myhtml_tag_clean(tags); + + return MyHTML_STATUS_OK; +} + +void myhtml_tag_clean(myhtml_tag_t* tags) +{ + tags->tags_count = MyHTML_TAG_LAST_ENTRY; + + mcsimple_clean(tags->mcsimple_context); + mchar_async_node_clean(tags->mchar, tags->mchar_node); + mctree_clean(tags->tree); +} + +myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags) +{ + if(tags == NULL) + return NULL; + + tags->tree = mctree_destroy(tags->tree); + tags->mcsimple_context = mcsimple_destroy(tags->mcsimple_context, true); + + mchar_async_node_delete(tags->mchar, tags->mchar_node); + + myhtml_free(tags); + + return NULL; +} + +myhtml_tag_index_t * myhtml_tag_index_create(void) +{ + return (myhtml_tag_index_t*)myhtml_calloc(1, sizeof(myhtml_tag_index_t)); +} + +myhtml_status_t myhtml_tag_index_init(myhtml_tag_t* tags, myhtml_tag_index_t* idx_tags) +{ + /* Tags Index */ + tags->mcobject_tag_index = mcobject_create(); + if(tags->mcobject_tag_index == NULL) + return MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION; + + myhtml_status_t status = mcobject_init(tags->mcobject_tag_index, 4096, sizeof(myhtml_incoming_buffer_t)); + if(status) + return status; + + idx_tags->tags_size = tags->tags_count + 128; + idx_tags->tags_length = 0; + idx_tags->tags = (myhtml_tag_index_entry_t*)myhtml_calloc(idx_tags->tags_size, sizeof(myhtml_tag_index_entry_t)); + + if(idx_tags->tags == NULL) + return MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION; + + return MyHTML_STATUS_OK; +} + +void myhtml_tag_index_clean(myhtml_tag_t* tags, myhtml_tag_index_t* index_tags) +{ + mcobject_clean(tags->mcobject_tag_index); + memset(index_tags->tags, 0, sizeof(myhtml_tag_index_entry_t) * index_tags->tags_size); +} + +myhtml_tag_index_t * myhtml_tag_index_destroy(myhtml_tag_t* tags, myhtml_tag_index_t* index_tags) +{ + mcobject_destroy(tags->mcobject_tag_index, true); + + if(index_tags == NULL) + return NULL; + + if(index_tags->tags) { + myhtml_free(index_tags->tags); + index_tags->tags = NULL; + } + + myhtml_free(index_tags); + + return NULL; +} + +void myhtml_tag_index_check_size(myhtml_tag_t* tags, myhtml_tag_index_t* index_tags, myhtml_tag_id_t tag_id) +{ + if(tag_id >= index_tags->tags_size) { + size_t new_size = tag_id + 128; + + myhtml_tag_index_entry_t *index_entries = (myhtml_tag_index_entry_t*)myhtml_realloc(index_tags->tags, + sizeof(myhtml_tag_index_entry_t) * + new_size); + + if(index_entries) { + index_tags->tags = index_entries; + + memset(&index_tags->tags[index_tags->tags_size], 0, sizeof(myhtml_tag_index_entry_t) + * (new_size - index_tags->tags_size)); + + index_tags->tags_size = new_size; + } + else { + // TODO: error + } + } +} + +myhtml_status_t myhtml_tag_index_add(myhtml_tag_t* tags, myhtml_tag_index_t* idx_tags, myhtml_tree_node_t* node) +{ + myhtml_tag_index_check_size(tags, idx_tags, node->tag_id); + + myhtml_tag_index_entry_t* tag = &idx_tags->tags[node->tag_id]; + + myhtml_status_t status; + myhtml_tag_index_node_t* new_node = mcobject_malloc(tags->mcobject_tag_index, &status); + + if(status) + return status; + + myhtml_tag_index_clean_node(new_node); + + if(tag->first == NULL) { + tag->first = new_node; + new_node->prev = NULL; + } + else { + tag->last->next = new_node; + new_node->prev = tag->last; + } + + new_node->next = NULL; + new_node->node = node; + + tag->last = new_node; + + tag->count++; + + return MyHTML_STATUS_OK; +} + +myhtml_tag_index_entry_t * myhtml_tag_index_entry(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id) +{ + if(tag_index->tags_size > tag_id) + return &tag_index->tags[tag_id]; + + return NULL; +} + +size_t myhtml_tag_index_entry_count(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id) +{ + if(tag_index->tags_size > tag_id) + return tag_index->tags[tag_id].count; + + return 0; +} + +myhtml_tag_index_node_t * myhtml_tag_index_first(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id) +{ + if(tag_index->tags_size > tag_id) + return tag_index->tags[tag_id].first; + + return NULL; +} + +myhtml_tag_index_node_t * myhtml_tag_index_last(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id) +{ + if(tag_index->tags_size > tag_id) + return tag_index->tags[tag_id].last; + + return NULL; +} + +myhtml_tag_index_node_t * myhtml_tag_index_next(myhtml_tag_index_node_t *index_node) +{ + if(index_node) + return index_node->next; + + return NULL; +} + +myhtml_tag_index_node_t * myhtml_tag_index_prev(myhtml_tag_index_node_t *index_node) +{ + if(index_node) + return index_node->prev; + + return NULL; +} + + +myhtml_tree_node_t * myhtml_tag_index_tree_node(myhtml_tag_index_node_t *index_node) +{ + if(index_node) + return index_node->node; + + return NULL; +} + +myhtml_tag_id_t myhtml_tag_add(myhtml_tag_t* tags, const char* key, size_t key_size, + enum myhtml_tokenizer_state data_parser, bool to_lcase) +{ + char* cache = mchar_async_malloc(tags->mchar, tags->mchar_node, (key_size + 1)); + + if(to_lcase) { + size_t i; + for(i = 0; i < key_size; i++) { + cache[i] = key[i] > 0x40 && key[i] < 0x5b ? (key[i]|0x60) : key[i]; + } + cache[i] = '\0'; + } + else { + strncpy(cache, key, key_size); + cache[key_size] = '\0'; + } + + // add tags + + myhtml_tag_context_t *tag_ctx = mcsimple_malloc(tags->mcsimple_context); + + mctree_insert(tags->tree, cache, key_size, (void *)tag_ctx, NULL); + + tag_ctx->id = tags->tags_count; + tag_ctx->name = cache; + tag_ctx->name_length = key_size; + tag_ctx->data_parser = data_parser; + + tags->tags_count++; + + memset(tag_ctx->cats, 0, sizeof(enum myhtml_tag_categories) * MyHTML_NAMESPACE_LAST_ENTRY); + + return tag_ctx->id; +} + +void myhtml_tag_set_category(myhtml_tag_t* tags, myhtml_tag_id_t tag_idx, + enum myhtml_namespace ns, enum myhtml_tag_categories cats) +{ + if(tag_idx < MyHTML_TAG_LAST_ENTRY) + return; + + myhtml_tag_context_t *tag_ctx = mcsimple_get_by_absolute_position(tags->mcsimple_context, (tag_idx - MyHTML_TAG_LAST_ENTRY)); + tag_ctx->cats[ns] = cats; +} + +const myhtml_tag_context_t * myhtml_tag_get_by_id(myhtml_tag_t* tags, myhtml_tag_id_t tag_id) +{ + if(tag_id >= MyHTML_TAG_LAST_ENTRY) { + return mcsimple_get_by_absolute_position(tags->mcsimple_context, (tag_id - MyHTML_TAG_LAST_ENTRY)); + } + + return myhtml_tag_static_get_by_id(tag_id); +} + +const myhtml_tag_context_t * myhtml_tag_get_by_name(myhtml_tag_t* tags, const char* name, size_t length) +{ + const myhtml_tag_context_t *ctx = myhtml_tag_static_search(name, length); + + if(ctx) + return ctx; + + mctree_index_t idx = mctree_search_lowercase(tags->tree, name, length); + + return (myhtml_tag_context_t*)tags->tree->nodes[idx].value; +} + +void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh) +{ + size_t i; + for(i = MyHTML_TAG_FIRST_ENTRY; i < MyHTML_TAG_LAST_ENTRY; i++) + { + const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tags, i); + + fprintf(fh, "<%s id=\"%zu\">\n", ctx->name, i); + } + + for(i = (MyHTML_TAG_LAST_ENTRY + 1); i < tags->tags_count; i++) + { + const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tags, i); + + fprintf(fh, "<%s id=\"%zu\">\n", ctx->name, i); + } +} + + + diff --git a/source/myhtml/tag.h b/source/myhtml/tag.h new file mode 100644 index 0000000..3437cb9 --- /dev/null +++ b/source/myhtml/tag.h @@ -0,0 +1,149 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef myhtml_tag_H +#define myhtml_tag_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" + +#include "myhtml/tag_const.h" +#include "myhtml/tokenizer.h" +#include "myhtml/tree.h" +#include "myhtml/utils.h" +#include "myhtml/utils/mctree.h" +#include "myhtml/utils/mchar_async.h" +#include "myhtml/utils/mcobject.h" +#include "myhtml/utils/mcobject_async.h" +#include "myhtml/utils/mcsimple.h" + +#define myhtml_tag_get(tags, idx, attr) tags->context[idx].attr + +#define myhtml_tag_context_clean(tags, idx) \ + tags->context[idx].id = 0; \ + tags->context[idx].name = NULL; \ + tags->context[idx].name_length = 0; \ + tags->context[idx].data_parser = MyHTML_TOKENIZER_STATE_DATA; \ + memset(tags->context[idx].cats, MyHTML_TAG_CATEGORIES_UNDEF, sizeof(tags->context[idx].cats)); + + +#define myhtml_tag_context_add(tags) \ + tags->context_length++; \ + if(tags->context_length == tags->context_size) { \ + tags->context_size += 4096; \ + tags->context = (myhtml_tag_context_t*)myhtml_realloc(tags->context, \ + sizeof(myhtml_tag_context_t) * tags->context_size); \ + } \ + myhtml_tag_context_clean(tags, tags->context_length) + +#define myhtml_tag_index_clean_node(index_node) \ + memset(index_node, 0, sizeof(myhtml_tag_index_node_t)); + +struct myhtml_tag_index_entry { + myhtml_tag_index_node_t *first; + myhtml_tag_index_node_t *last; + size_t count; +}; + +struct myhtml_tag_index_node { + myhtml_tag_index_node_t *next; + myhtml_tag_index_node_t *prev; + + myhtml_tree_node_t* node; +}; + +struct myhtml_tag_index { + myhtml_tag_index_entry_t* tags; + size_t tags_length; + size_t tags_size; +}; + +struct myhtml_tag_context { + myhtml_tag_id_t id; + + const char* name; + size_t name_length; + + enum myhtml_tokenizer_state data_parser; + enum myhtml_tag_categories cats[MyHTML_NAMESPACE_LAST_ENTRY]; +} +typedef myhtml_tag_context_t; + +struct myhtml_tag_static_list { + const myhtml_tag_context_t* ctx; + size_t next; + size_t cur; +} +typedef myhtml_tag_static_list_t; + +struct myhtml_tag { + mctree_t* tree; + mcsimple_t* mcsimple_context; + + size_t tags_count; + size_t mchar_node; + + mchar_async_t *mchar; + mcobject_t *mcobject_tag_index; +}; + +myhtml_tag_t * myhtml_tag_create(void); +myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags); +void myhtml_tag_clean(myhtml_tag_t* tags); +myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags); + +myhtml_tag_id_t myhtml_tag_add(myhtml_tag_t* tags, const char* key, size_t key_size, + enum myhtml_tokenizer_state data_parser, bool to_lcase); + +void myhtml_tag_set_category(myhtml_tag_t* tags, myhtml_tag_id_t tag_idx, + enum myhtml_namespace ns, enum myhtml_tag_categories cats); + +myhtml_tag_index_t * myhtml_tag_index_create(void); +myhtml_status_t myhtml_tag_index_init(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index); +void myhtml_tag_index_clean(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index); +myhtml_tag_index_t * myhtml_tag_index_destroy(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index); + +myhtml_status_t myhtml_tag_index_add(myhtml_tag_t* tags, myhtml_tag_index_t* tag_index, myhtml_tree_node_t* node); +myhtml_tag_index_entry_t * myhtml_tag_index_entry(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); +myhtml_tag_index_node_t * myhtml_tag_index_first(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); +myhtml_tag_index_node_t * myhtml_tag_index_last(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); +myhtml_tag_index_node_t * myhtml_tag_index_next(myhtml_tag_index_node_t *index_node); +myhtml_tag_index_node_t * myhtml_tag_index_prev(myhtml_tag_index_node_t *index_node); +myhtml_tree_node_t * myhtml_tag_index_tree_node(myhtml_tag_index_node_t *index_node); + +size_t myhtml_tag_index_entry_count(myhtml_tag_index_t* tag_index, myhtml_tag_id_t tag_id); + +const myhtml_tag_context_t * myhtml_tag_get_by_id(myhtml_tag_t* tags, myhtml_tag_id_t tag_id); +const myhtml_tag_context_t * myhtml_tag_get_by_name(myhtml_tag_t* tags, const char* name, size_t length); + +const myhtml_tag_context_t * myhtml_tag_static_get_by_id(size_t idx); +const myhtml_tag_context_t * myhtml_tag_static_search(const char* name, size_t length); + +void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/source/myhtml/tag_const.h b/source/myhtml/tag_const.h new file mode 100644 index 0000000..0f5b389 --- /dev/null +++ b/source/myhtml/tag_const.h @@ -0,0 +1,293 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TAG_CONST_H +#define MyHTML_TAG_CONST_H +#pragma once + +#define MyHTML_BASE_STATIC_SIZE 479 + + +#ifdef __cplusplus +extern "C" { +#endif + +enum myhtml_tags { + MyHTML_TAG__UNDEF = 0x000, + MyHTML_TAG__TEXT = 0x001, + MyHTML_TAG__COMMENT = 0x002, + MyHTML_TAG__DOCTYPE = 0x003, + MyHTML_TAG_A = 0x004, + MyHTML_TAG_ABBR = 0x005, + MyHTML_TAG_ACRONYM = 0x006, + MyHTML_TAG_ADDRESS = 0x007, + MyHTML_TAG_ANNOTATION_XML = 0x008, + MyHTML_TAG_APPLET = 0x009, + MyHTML_TAG_AREA = 0x00a, + MyHTML_TAG_ARTICLE = 0x00b, + MyHTML_TAG_ASIDE = 0x00c, + MyHTML_TAG_AUDIO = 0x00d, + MyHTML_TAG_B = 0x00e, + MyHTML_TAG_BASE = 0x00f, + MyHTML_TAG_BASEFONT = 0x010, + MyHTML_TAG_BDI = 0x011, + MyHTML_TAG_BDO = 0x012, + MyHTML_TAG_BGSOUND = 0x013, + MyHTML_TAG_BIG = 0x014, + MyHTML_TAG_BLINK = 0x015, + MyHTML_TAG_BLOCKQUOTE = 0x016, + MyHTML_TAG_BODY = 0x017, + MyHTML_TAG_BR = 0x018, + MyHTML_TAG_BUTTON = 0x019, + MyHTML_TAG_CANVAS = 0x01a, + MyHTML_TAG_CAPTION = 0x01b, + MyHTML_TAG_CENTER = 0x01c, + MyHTML_TAG_CITE = 0x01d, + MyHTML_TAG_CODE = 0x01e, + MyHTML_TAG_COL = 0x01f, + MyHTML_TAG_COLGROUP = 0x020, + MyHTML_TAG_COMMAND = 0x021, + MyHTML_TAG_COMMENT = 0x022, + MyHTML_TAG_DATALIST = 0x023, + MyHTML_TAG_DD = 0x024, + MyHTML_TAG_DEL = 0x025, + MyHTML_TAG_DETAILS = 0x026, + MyHTML_TAG_DFN = 0x027, + MyHTML_TAG_DIALOG = 0x028, + MyHTML_TAG_DIR = 0x029, + MyHTML_TAG_DIV = 0x02a, + MyHTML_TAG_DL = 0x02b, + MyHTML_TAG_DT = 0x02c, + MyHTML_TAG_EM = 0x02d, + MyHTML_TAG_EMBED = 0x02e, + MyHTML_TAG_FIELDSET = 0x02f, + MyHTML_TAG_FIGCAPTION = 0x030, + MyHTML_TAG_FIGURE = 0x031, + MyHTML_TAG_FONT = 0x032, + MyHTML_TAG_FOOTER = 0x033, + MyHTML_TAG_FORM = 0x034, + MyHTML_TAG_FRAME = 0x035, + MyHTML_TAG_FRAMESET = 0x036, + MyHTML_TAG_H1 = 0x037, + MyHTML_TAG_H2 = 0x038, + MyHTML_TAG_H3 = 0x039, + MyHTML_TAG_H4 = 0x03a, + MyHTML_TAG_H5 = 0x03b, + MyHTML_TAG_H6 = 0x03c, + MyHTML_TAG_HEAD = 0x03d, + MyHTML_TAG_HEADER = 0x03e, + MyHTML_TAG_HGROUP = 0x03f, + MyHTML_TAG_HR = 0x040, + MyHTML_TAG_HTML = 0x041, + MyHTML_TAG_I = 0x042, + MyHTML_TAG_IFRAME = 0x043, + MyHTML_TAG_IMAGE = 0x044, + MyHTML_TAG_IMG = 0x045, + MyHTML_TAG_INPUT = 0x046, + MyHTML_TAG_INS = 0x047, + MyHTML_TAG_ISINDEX = 0x048, + MyHTML_TAG_KBD = 0x049, + MyHTML_TAG_KEYGEN = 0x04a, + MyHTML_TAG_LABEL = 0x04b, + MyHTML_TAG_LEGEND = 0x04c, + MyHTML_TAG_LI = 0x04d, + MyHTML_TAG_LINK = 0x04e, + MyHTML_TAG_LISTING = 0x04f, + MyHTML_TAG_MAIN = 0x050, + MyHTML_TAG_MAP = 0x051, + MyHTML_TAG_MARK = 0x052, + MyHTML_TAG_MARQUEE = 0x053, + MyHTML_TAG_MENU = 0x054, + MyHTML_TAG_MENUITEM = 0x055, + MyHTML_TAG_META = 0x056, + MyHTML_TAG_METER = 0x057, + MyHTML_TAG_MTEXT = 0x058, + MyHTML_TAG_NAV = 0x059, + MyHTML_TAG_NOBR = 0x05a, + MyHTML_TAG_NOEMBED = 0x05b, + MyHTML_TAG_NOFRAMES = 0x05c, + MyHTML_TAG_NOSCRIPT = 0x05d, + MyHTML_TAG_OBJECT = 0x05e, + MyHTML_TAG_OL = 0x05f, + MyHTML_TAG_OPTGROUP = 0x060, + MyHTML_TAG_OPTION = 0x061, + MyHTML_TAG_OUTPUT = 0x062, + MyHTML_TAG_P = 0x063, + MyHTML_TAG_PARAM = 0x064, + MyHTML_TAG_PLAINTEXT = 0x065, + MyHTML_TAG_PRE = 0x066, + MyHTML_TAG_PROGRESS = 0x067, + MyHTML_TAG_Q = 0x068, + MyHTML_TAG_RB = 0x069, + MyHTML_TAG_RP = 0x06a, + MyHTML_TAG_RT = 0x06b, + MyHTML_TAG_RTC = 0x06c, + MyHTML_TAG_RUBY = 0x06d, + MyHTML_TAG_S = 0x06e, + MyHTML_TAG_SAMP = 0x06f, + MyHTML_TAG_SCRIPT = 0x070, + MyHTML_TAG_SECTION = 0x071, + MyHTML_TAG_SELECT = 0x072, + MyHTML_TAG_SMALL = 0x073, + MyHTML_TAG_SOURCE = 0x074, + MyHTML_TAG_SPAN = 0x075, + MyHTML_TAG_STRIKE = 0x076, + MyHTML_TAG_STRONG = 0x077, + MyHTML_TAG_STYLE = 0x078, + MyHTML_TAG_SUB = 0x079, + MyHTML_TAG_SUMMARY = 0x07a, + MyHTML_TAG_SUP = 0x07b, + MyHTML_TAG_SVG = 0x07c, + MyHTML_TAG_TABLE = 0x07d, + MyHTML_TAG_TBODY = 0x07e, + MyHTML_TAG_TD = 0x07f, + MyHTML_TAG_TEMPLATE = 0x080, + MyHTML_TAG_TEXTAREA = 0x081, + MyHTML_TAG_TFOOT = 0x082, + MyHTML_TAG_TH = 0x083, + MyHTML_TAG_THEAD = 0x084, + MyHTML_TAG_TIME = 0x085, + MyHTML_TAG_TITLE = 0x086, + MyHTML_TAG_TR = 0x087, + MyHTML_TAG_TRACK = 0x088, + MyHTML_TAG_TT = 0x089, + MyHTML_TAG_U = 0x08a, + MyHTML_TAG_UL = 0x08b, + MyHTML_TAG_VAR = 0x08c, + MyHTML_TAG_VIDEO = 0x08d, + MyHTML_TAG_WBR = 0x08e, + MyHTML_TAG_XMP = 0x08f, + MyHTML_TAG_ALTGLYPH = 0x090, + MyHTML_TAG_ALTGLYPHDEF = 0x091, + MyHTML_TAG_ALTGLYPHITEM = 0x092, + MyHTML_TAG_ANIMATE = 0x093, + MyHTML_TAG_ANIMATECOLOR = 0x094, + MyHTML_TAG_ANIMATEMOTION = 0x095, + MyHTML_TAG_ANIMATETRANSFORM = 0x096, + MyHTML_TAG_CIRCLE = 0x097, + MyHTML_TAG_CLIPPATH = 0x098, + MyHTML_TAG_COLOR_PROFILE = 0x099, + MyHTML_TAG_CURSOR = 0x09a, + MyHTML_TAG_DEFS = 0x09b, + MyHTML_TAG_DESC = 0x09c, + MyHTML_TAG_ELLIPSE = 0x09d, + MyHTML_TAG_FEBLEND = 0x09e, + MyHTML_TAG_FECOLORMATRIX = 0x09f, + MyHTML_TAG_FECOMPONENTTRANSFER = 0x0a0, + MyHTML_TAG_FECOMPOSITE = 0x0a1, + MyHTML_TAG_FECONVOLVEMATRIX = 0x0a2, + MyHTML_TAG_FEDIFFUSELIGHTING = 0x0a3, + MyHTML_TAG_FEDISPLACEMENTMAP = 0x0a4, + MyHTML_TAG_FEDISTANTLIGHT = 0x0a5, + MyHTML_TAG_FEDROPSHADOW = 0x0a6, + MyHTML_TAG_FEFLOOD = 0x0a7, + MyHTML_TAG_FEFUNCA = 0x0a8, + MyHTML_TAG_FEFUNCB = 0x0a9, + MyHTML_TAG_FEFUNCG = 0x0aa, + MyHTML_TAG_FEFUNCR = 0x0ab, + MyHTML_TAG_FEGAUSSIANBLUR = 0x0ac, + MyHTML_TAG_FEIMAGE = 0x0ad, + MyHTML_TAG_FEMERGE = 0x0ae, + MyHTML_TAG_FEMERGENODE = 0x0af, + MyHTML_TAG_FEMORPHOLOGY = 0x0b0, + MyHTML_TAG_FEOFFSET = 0x0b1, + MyHTML_TAG_FEPOINTLIGHT = 0x0b2, + MyHTML_TAG_FESPECULARLIGHTING = 0x0b3, + MyHTML_TAG_FESPOTLIGHT = 0x0b4, + MyHTML_TAG_FETILE = 0x0b5, + MyHTML_TAG_FETURBULENCE = 0x0b6, + MyHTML_TAG_FILTER = 0x0b7, + MyHTML_TAG_FONT_FACE = 0x0b8, + MyHTML_TAG_FONT_FACE_FORMAT = 0x0b9, + MyHTML_TAG_FONT_FACE_NAME = 0x0ba, + MyHTML_TAG_FONT_FACE_SRC = 0x0bb, + MyHTML_TAG_FONT_FACE_URI = 0x0bc, + MyHTML_TAG_FOREIGNOBJECT = 0x0bd, + MyHTML_TAG_G = 0x0be, + MyHTML_TAG_GLYPH = 0x0bf, + MyHTML_TAG_GLYPHREF = 0x0c0, + MyHTML_TAG_HKERN = 0x0c1, + MyHTML_TAG_LINE = 0x0c2, + MyHTML_TAG_LINEARGRADIENT = 0x0c3, + MyHTML_TAG_MARKER = 0x0c4, + MyHTML_TAG_MASK = 0x0c5, + MyHTML_TAG_METADATA = 0x0c6, + MyHTML_TAG_MISSING_GLYPH = 0x0c7, + MyHTML_TAG_MPATH = 0x0c8, + MyHTML_TAG_PATH = 0x0c9, + MyHTML_TAG_PATTERN = 0x0ca, + MyHTML_TAG_POLYGON = 0x0cb, + MyHTML_TAG_POLYLINE = 0x0cc, + MyHTML_TAG_RADIALGRADIENT = 0x0cd, + MyHTML_TAG_RECT = 0x0ce, + MyHTML_TAG_SET = 0x0cf, + MyHTML_TAG_STOP = 0x0d0, + MyHTML_TAG_SWITCH = 0x0d1, + MyHTML_TAG_SYMBOL = 0x0d2, + MyHTML_TAG_TEXT = 0x0d3, + MyHTML_TAG_TEXTPATH = 0x0d4, + MyHTML_TAG_TREF = 0x0d5, + MyHTML_TAG_TSPAN = 0x0d6, + MyHTML_TAG_USE = 0x0d7, + MyHTML_TAG_VIEW = 0x0d8, + MyHTML_TAG_VKERN = 0x0d9, + MyHTML_TAG_MATH = 0x0da, + MyHTML_TAG_MACTION = 0x0db, + MyHTML_TAG_MALIGNGROUP = 0x0dc, + MyHTML_TAG_MALIGNMARK = 0x0dd, + MyHTML_TAG_MENCLOSE = 0x0de, + MyHTML_TAG_MERROR = 0x0df, + MyHTML_TAG_MFENCED = 0x0e0, + MyHTML_TAG_MFRAC = 0x0e1, + MyHTML_TAG_MGLYPH = 0x0e2, + MyHTML_TAG_MI = 0x0e3, + MyHTML_TAG_MLABELEDTR = 0x0e4, + MyHTML_TAG_MLONGDIV = 0x0e5, + MyHTML_TAG_MMULTISCRIPTS = 0x0e6, + MyHTML_TAG_MN = 0x0e7, + MyHTML_TAG_MO = 0x0e8, + MyHTML_TAG_MOVER = 0x0e9, + MyHTML_TAG_MPADDED = 0x0ea, + MyHTML_TAG_MPHANTOM = 0x0eb, + MyHTML_TAG_MROOT = 0x0ec, + MyHTML_TAG_MROW = 0x0ed, + MyHTML_TAG_MS = 0x0ee, + MyHTML_TAG_MSCARRIES = 0x0ef, + MyHTML_TAG_MSCARRY = 0x0f0, + MyHTML_TAG_MSGROUP = 0x0f1, + MyHTML_TAG_MSLINE = 0x0f2, + MyHTML_TAG_MSPACE = 0x0f3, + MyHTML_TAG_MSQRT = 0x0f4, + MyHTML_TAG_MSROW = 0x0f5, + MyHTML_TAG_MSTACK = 0x0f6, + MyHTML_TAG_MSTYLE = 0x0f7, + MyHTML_TAG_MSUB = 0x0f8, + MyHTML_TAG_MSUP = 0x0f9, + MyHTML_TAG_MSUBSUP = 0x0fa, + MyHTML_TAG__END_OF_FILE = 0x0fb, + MyHTML_TAG_FIRST_ENTRY = MyHTML_TAG__TEXT, + MyHTML_TAG_LAST_ENTRY = 0x0fc +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/source/myhtml/tag_init.c b/source/myhtml/tag_init.c new file mode 100755 index 0000000..cc37446 --- /dev/null +++ b/source/myhtml/tag_init.c @@ -0,0 +1,2627 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/utils/resources.h" +#include "tag.h" + +static const myhtml_tag_context_t myhtml_tag_base_list[MyHTML_TAG_LAST_ENTRY] = +{ + {MyHTML_TAG__UNDEF, "-undef", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG__TEXT, "-text", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG__COMMENT, "_comment", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG__DOCTYPE, "!doctype", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_A, "a", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ABBR, "abbr", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ACRONYM, "acronym", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ADDRESS, "address", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ANNOTATION_XML, "annotation-xml", 14, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_APPLET, "applet", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_AREA, "area", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ARTICLE, "article", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ASIDE, "aside", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_AUDIO, "audio", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_B, "b", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BASE, "base", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BASEFONT, "basefont", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BDI, "bdi", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BDO, "bdo", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BGSOUND, "bgsound", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BIG, "big", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BLINK, "blink", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BLOCKQUOTE, "blockquote", 10, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BODY, "body", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BR, "br", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_BUTTON, "button", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CANVAS, "canvas", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CAPTION, "caption", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CENTER, "center", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CITE, "cite", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CODE, "code", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_COL, "col", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_COLGROUP, "colgroup", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_COMMAND, "command", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_COMMENT, "comment", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DATALIST, "datalist", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DD, "dd", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DEL, "del", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DETAILS, "details", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DFN, "dfn", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DIALOG, "dialog", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DIR, "dir", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DIV, "div", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DL, "dl", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DT, "dt", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_EM, "em", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_EMBED, "embed", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FIELDSET, "fieldset", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FIGCAPTION, "figcaption", 10, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FIGURE, "figure", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FONT, "font", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FOOTER, "footer", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FORM, "form", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FRAME, "frame", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FRAMESET, "frameset", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_H1, "h1", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_H2, "h2", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_H3, "h3", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_H4, "h4", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_H5, "h5", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_H6, "h6", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_HEAD, "head", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_HEADER, "header", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_HGROUP, "hgroup", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_HR, "hr", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_HTML, "html", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON|MyHTML_TAG_CATEGORIES_SCOPE_TABLE, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_I, "i", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_IFRAME, "iframe", 6, MyHTML_TOKENIZER_STATE_RAWTEXT, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_IMAGE, "image", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_IMG, "img", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_INPUT, "input", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_INS, "ins", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ISINDEX, "isindex", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_KBD, "kbd", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_KEYGEN, "keygen", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_LABEL, "label", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_LEGEND, "legend", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_LI, "li", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_LINK, "link", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_LISTING, "listing", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MAIN, "main", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MAP, "map", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MARK, "mark", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MARQUEE, "marquee", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MENU, "menu", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MENUITEM, "menuitem", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_META, "meta", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_METER, "meter", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MTEXT, "mtext", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_NAV, "nav", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_NOBR, "nobr", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_NOEMBED, "noembed", 7, MyHTML_TOKENIZER_STATE_RAWTEXT, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_NOFRAMES, "noframes", 8, MyHTML_TOKENIZER_STATE_RAWTEXT, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_NOSCRIPT, "noscript", 8, MyHTML_TOKENIZER_STATE_RAWTEXT, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_OBJECT, "object", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_OL, "ol", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_OPTGROUP, "optgroup", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY|MyHTML_TAG_CATEGORIES_SCOPE_SELECT, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_OPTION, "option", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY|MyHTML_TAG_CATEGORIES_SCOPE_SELECT, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_OUTPUT, "output", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_P, "p", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_PARAM, "param", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_PLAINTEXT, "plaintext", 9, MyHTML_TOKENIZER_STATE_PLAINTEXT, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_PRE, "pre", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_PROGRESS, "progress", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_Q, "q", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_RB, "rb", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_RP, "rp", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_RT, "rt", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_RTC, "rtc", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_RUBY, "ruby", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_S, "s", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SAMP, "samp", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SCRIPT, "script", 6, MyHTML_TOKENIZER_STATE_SCRIPT_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SECTION, "section", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SELECT, "select", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SMALL, "small", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SOURCE, "source", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SPAN, "span", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_STRIKE, "strike", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_STRONG, "strong", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_STYLE, "style", 5, MyHTML_TOKENIZER_STATE_RAWTEXT, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SUB, "sub", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SUMMARY, "summary", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SUP, "sup", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SVG, "svg", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TABLE, "table", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON|MyHTML_TAG_CATEGORIES_SCOPE_TABLE, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TBODY, "tbody", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TD, "td", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TEMPLATE, "template", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON|MyHTML_TAG_CATEGORIES_SCOPE_TABLE, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TEXTAREA, "textarea", 8, MyHTML_TOKENIZER_STATE_RCDATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TFOOT, "tfoot", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TH, "th", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_THEAD, "thead", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TIME, "time", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TITLE, "title", 5, MyHTML_TOKENIZER_STATE_RCDATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TR, "tr", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TRACK, "track", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TT, "tt", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_U, "u", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_FORMATTING, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_UL, "ul", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_VAR, "var", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_VIDEO, "video", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_WBR, "wbr", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_XMP, "xmp", 3, MyHTML_TOKENIZER_STATE_RAWTEXT, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ALTGLYPH, "altGlyph", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ALTGLYPHDEF, "altGlyphDef", 11, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ALTGLYPHITEM, "altGlyphItem", 12, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ANIMATE, "animate", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ANIMATECOLOR, "animateColor", 12, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ANIMATEMOTION, "animateMotion", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ANIMATETRANSFORM, "animateTransform", 16, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CIRCLE, "circle", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CLIPPATH, "clipPath", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_COLOR_PROFILE, "color-profile", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_CURSOR, "cursor", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DEFS, "defs", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_DESC, "desc", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_ELLIPSE, "ellipse", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEBLEND, "feBlend", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FECOLORMATRIX, "feColorMatrix", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FECOMPONENTTRANSFER, "feComponentTransfer", 19, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FECOMPOSITE, "feComposite", 11, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FECONVOLVEMATRIX, "feConvolveMatrix", 16, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEDIFFUSELIGHTING, "feDiffuseLighting", 17, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEDISPLACEMENTMAP, "feDisplacementMap", 17, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEDISTANTLIGHT, "feDistantLight", 14, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEDROPSHADOW, "feDropShadow", 12, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEFLOOD, "feFlood", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEFUNCA, "feFuncA", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEFUNCB, "feFuncB", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEFUNCG, "feFuncG", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEFUNCR, "feFuncR", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEGAUSSIANBLUR, "feGaussianBlur", 14, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEIMAGE, "feImage", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEMERGE, "feMerge", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEMERGENODE, "feMergeNode", 11, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEMORPHOLOGY, "feMorphology", 12, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEOFFSET, "feOffset", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FEPOINTLIGHT, "fePointLight", 12, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FESPECULARLIGHTING, "feSpecularLighting", 18, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FESPOTLIGHT, "feSpotLight", 11, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FETILE, "feTile", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FETURBULENCE, "feTurbulence", 12, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FILTER, "filter", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FONT_FACE, "font-face", 9, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FONT_FACE_FORMAT, "font-face-format", 16, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FONT_FACE_NAME, "font-face-name", 14, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FONT_FACE_SRC, "font-face-src", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FONT_FACE_URI, "font-face-uri", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_FOREIGNOBJECT, "foreignObject", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_G, "g", 1, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_GLYPH, "glyph", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_GLYPHREF, "glyphRef", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_HKERN, "hkern", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_LINE, "line", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_LINEARGRADIENT, "linearGradient", 14, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MARKER, "marker", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MASK, "mask", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_METADATA, "metadata", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MISSING_GLYPH, "missing-glyph", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MPATH, "mpath", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_PATH, "path", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_PATTERN, "pattern", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_POLYGON, "polygon", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_POLYLINE, "polyline", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_RADIALGRADIENT, "radialGradient", 14, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_RECT, "rect", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SET, "set", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_STOP, "stop", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SWITCH, "switch", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_SYMBOL, "symbol", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TEXT, "text", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TEXTPATH, "textPath", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TREF, "tref", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_TSPAN, "tspan", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_USE, "use", 3, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_VIEW, "view", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_VKERN, "vkern", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MATH, "math", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MACTION, "maction", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MALIGNGROUP, "maligngroup", 11, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MALIGNMARK, "malignmark", 10, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MENCLOSE, "menclose", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MERROR, "merror", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MFENCED, "mfenced", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MFRAC, "mfrac", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MGLYPH, "mglyph", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MI, "mi", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MLABELEDTR, "mlabeledtr", 10, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MLONGDIV, "mlongdiv", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MMULTISCRIPTS, "mmultiscripts", 13, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MN, "mn", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MO, "mo", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MOVER, "mover", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MPADDED, "mpadded", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MPHANTOM, "mphantom", 8, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MROOT, "mroot", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MROW, "mrow", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MS, "ms", 2, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_SPECIAL|MyHTML_TAG_CATEGORIES_SCOPE|MyHTML_TAG_CATEGORIES_SCOPE_LIST_ITEM|MyHTML_TAG_CATEGORIES_SCOPE_BUTTON, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSCARRIES, "mscarries", 9, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSCARRY, "mscarry", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSGROUP, "msgroup", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSLINE, "msline", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSPACE, "mspace", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSQRT, "msqrt", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSROW, "msrow", 5, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSTACK, "mstack", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSTYLE, "mstyle", 6, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSUB, "msub", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSUP, "msup", 4, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG_MSUBSUP, "msubsup", 7, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + }, + {MyHTML_TAG__END_OF_FILE, "-end-of-file", 12, MyHTML_TOKENIZER_STATE_DATA, + { + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY, MyHTML_TAG_CATEGORIES_ORDINARY, + MyHTML_TAG_CATEGORIES_ORDINARY + } + } +}; + + +static const myhtml_tag_static_list_t myhtml_tag_static_list_index[] = +{ + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_USE], 0, 6}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_H5], 480, 8}, + {&myhtml_tag_base_list[MyHTML_TAG_I], 481, 9}, + {&myhtml_tag_base_list[MyHTML_TAG_DIALOG], 0, 10}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_BODY], 0, 12}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ANIMATECOLOR], 0, 14}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_BUTTON], 0, 16}, + {&myhtml_tag_base_list[MyHTML_TAG_DEFS], 0, 17}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_PATTERN], 482, 21}, + {&myhtml_tag_base_list[MyHTML_TAG_FIGURE], 483, 22}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_B], 484, 25}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_OL], 0, 27}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_DETAILS], 485, 29}, + {&myhtml_tag_base_list[MyHTML_TAG_FEBLEND], 486, 30}, + {&myhtml_tag_base_list[MyHTML_TAG_MN], 0, 31}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ELLIPSE], 0, 37}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FEFUNCB], 0, 39}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FEDROPSHADOW], 0, 41}, + {&myhtml_tag_base_list[MyHTML_TAG_THEAD], 0, 42}, + {&myhtml_tag_base_list[MyHTML_TAG_FETURBULENCE], 0, 43}, + {&myhtml_tag_base_list[MyHTML_TAG_LINE], 0, 44}, + {&myhtml_tag_base_list[MyHTML_TAG_MSTACK], 0, 45}, + {&myhtml_tag_base_list[MyHTML_TAG_DL], 0, 46}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_SCRIPT], 487, 48}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FONT_FACE_NAME], 0, 50}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_PLAINTEXT], 0, 53}, + {&myhtml_tag_base_list[MyHTML_TAG_NOSCRIPT], 0, 54}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_PROGRESS], 0, 56}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FOREIGNOBJECT], 0, 58}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MAIN], 0, 61}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_BDO], 0, 63}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ISINDEX], 0, 65}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_INPUT], 0, 68}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_CAPTION], 0, 70}, + {&myhtml_tag_base_list[MyHTML_TAG_H3], 0, 71}, + {&myhtml_tag_base_list[MyHTML_TAG_G], 0, 72}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_LINEARGRADIENT], 0, 79}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ANIMATETRANSFORM], 0, 82}, + {&myhtml_tag_base_list[MyHTML_TAG_ARTICLE], 488, 83}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_XMP], 0, 85}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_TT], 0, 89}, + {&myhtml_tag_base_list[MyHTML_TAG_SVG], 489, 90}, + {&myhtml_tag_base_list[MyHTML_TAG_P], 490, 91}, + {&myhtml_tag_base_list[MyHTML_TAG_RUBY], 0, 92}, + {&myhtml_tag_base_list[MyHTML_TAG_FECOLORMATRIX], 0, 93}, + {&myhtml_tag_base_list[MyHTML_TAG_TSPAN], 491, 94}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MMULTISCRIPTS], 0, 96}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MSUB], 0, 98}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ALTGLYPHDEF], 0, 102}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_RT], 492, 104}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_BIG], 494, 106}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FONT_FACE_FORMAT], 0, 108}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FECOMPONENTTRANSFER], 0, 114}, + {&myhtml_tag_base_list[MyHTML_TAG_FIGCAPTION], 0, 115}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_STYLE], 0, 117}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_CIRCLE], 0, 120}, + {&myhtml_tag_base_list[MyHTML_TAG_VAR], 0, 121}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_VIEW], 0, 126}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ASIDE], 0, 128}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_PATH], 0, 130}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_NOFRAMES], 0, 132}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_H1], 0, 134}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_LEGEND], 0, 136}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_OBJECT], 495, 138}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MFENCED], 496, 140}, + {&myhtml_tag_base_list[MyHTML_TAG_META], 0, 141}, + {&myhtml_tag_base_list[MyHTML_TAG_NAV], 0, 142}, + {&myhtml_tag_base_list[MyHTML_TAG_TABLE], 497, 143}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_RP], 0, 150}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MROW], 0, 153}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MPATH], 0, 159}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MS], 0, 163}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ABBR], 0, 165}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_LI], 0, 168}, + {&myhtml_tag_base_list[MyHTML_TAG_SUMMARY], 498, 169}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_TEXT], 0, 177}, + {&myhtml_tag_base_list[MyHTML_TAG_CENTER], 499, 178}, + {&myhtml_tag_base_list[MyHTML_TAG_TH], 500, 179}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_AUDIO], 0, 188}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MARK], 502, 190}, + {&myhtml_tag_base_list[MyHTML_TAG_MSROW], 0, 191}, + {&myhtml_tag_base_list[MyHTML_TAG_DIR], 0, 192}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MSGROUP], 503, 195}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_HKERN], 504, 200}, + {&myhtml_tag_base_list[MyHTML_TAG_FEPOINTLIGHT], 0, 201}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_EMBED], 0, 206}, + {&myhtml_tag_base_list[MyHTML_TAG_RECT], 505, 207}, + {&myhtml_tag_base_list[MyHTML_TAG_PARAM], 507, 208}, + {&myhtml_tag_base_list[MyHTML_TAG_DT], 508, 209}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FEDISPLACEMENTMAP], 0, 214}, + {&myhtml_tag_base_list[MyHTML_TAG_BDI], 0, 215}, + {&myhtml_tag_base_list[MyHTML_TAG_H6], 0, 216}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_BLINK], 0, 220}, + {&myhtml_tag_base_list[MyHTML_TAG_MAP], 509, 221}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_GLYPHREF], 0, 224}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ALTGLYPH], 0, 233}, + {&myhtml_tag_base_list[MyHTML_TAG_TEXTPATH], 510, 234}, + {&myhtml_tag_base_list[MyHTML_TAG__TEXT], 0, 235}, + {&myhtml_tag_base_list[MyHTML_TAG_VKERN], 511, 236}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG__UNDEF], 0, 238}, + {&myhtml_tag_base_list[MyHTML_TAG_MENU], 0, 239}, + {&myhtml_tag_base_list[MyHTML_TAG_CITE], 513, 240}, + {&myhtml_tag_base_list[MyHTML_TAG_LINK], 0, 241}, + {&myhtml_tag_base_list[MyHTML_TAG_HR], 0, 242}, + {&myhtml_tag_base_list[MyHTML_TAG_RADIALGRADIENT], 0, 243}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_HEADER], 0, 245}, + {&myhtml_tag_base_list[MyHTML_TAG_ACRONYM], 0, 246}, + {&myhtml_tag_base_list[MyHTML_TAG_TBODY], 0, 247}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MO], 0, 249}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MSCARRIES], 0, 251}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FEFUNCG], 0, 256}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FRAME], 0, 258}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_SET], 0, 264}, + {&myhtml_tag_base_list[MyHTML_TAG_FEIMAGE], 514, 265}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_SAMP], 515, 268}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_TRACK], 0, 270}, + {&myhtml_tag_base_list[MyHTML_TAG_LISTING], 0, 271}, + {&myhtml_tag_base_list[MyHTML_TAG_FONT_FACE], 0, 272}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_AREA], 0, 275}, + {&myhtml_tag_base_list[MyHTML_TAG_SYMBOL], 0, 276}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_U], 0, 278}, + {&myhtml_tag_base_list[MyHTML_TAG_H4], 516, 279}, + {&myhtml_tag_base_list[MyHTML_TAG_ANIMATEMOTION], 0, 280}, + {&myhtml_tag_base_list[MyHTML_TAG_SUB], 518, 281}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FEFUNCA], 0, 283}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_S], 519, 293}, + {&myhtml_tag_base_list[MyHTML_TAG_FIELDSET], 520, 294}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_INS], 0, 301}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_OPTGROUP], 0, 304}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_SPAN], 0, 306}, + {&myhtml_tag_base_list[MyHTML_TAG_BLOCKQUOTE], 0, 307}, + {&myhtml_tag_base_list[MyHTML_TAG_DEL], 522, 308}, + {&myhtml_tag_base_list[MyHTML_TAG_A], 0, 309}, + {&myhtml_tag_base_list[MyHTML_TAG_SMALL], 0, 310}, + {&myhtml_tag_base_list[MyHTML_TAG_BR], 523, 311}, + {&myhtml_tag_base_list[MyHTML_TAG_MARKER], 524, 312}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FOOTER], 525, 314}, + {&myhtml_tag_base_list[MyHTML_TAG_BASE], 0, 315}, + {&myhtml_tag_base_list[MyHTML_TAG_Q], 526, 316}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MATH], 0, 319}, + {&myhtml_tag_base_list[MyHTML_TAG__DOCTYPE], 0, 320}, + {&myhtml_tag_base_list[MyHTML_TAG_SUP], 527, 321}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_DESC], 0, 323}, + {&myhtml_tag_base_list[MyHTML_TAG_TEMPLATE], 0, 324}, + {&myhtml_tag_base_list[MyHTML_TAG_COMMAND], 0, 325}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_RTC], 0, 329}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_IMAGE], 0, 336}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_METER], 528, 340}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_H2], 0, 342}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FESPOTLIGHT], 0, 344}, + {&myhtml_tag_base_list[MyHTML_TAG_NOBR], 0, 345}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_VIDEO], 0, 347}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_IMG], 0, 353}, + {&myhtml_tag_base_list[MyHTML_TAG_DATALIST], 0, 354}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MSCARRY], 0, 356}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_NOEMBED], 0, 361}, + {&myhtml_tag_base_list[MyHTML_TAG_DD], 529, 362}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_UL], 0, 365}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MI], 0, 378}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_HTML], 0, 382}, + {&myhtml_tag_base_list[MyHTML_TAG_FESPECULARLIGHTING], 0, 383}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FONT], 530, 387}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_SWITCH], 0, 390}, + {&myhtml_tag_base_list[MyHTML_TAG_MLONGDIV], 0, 391}, + {&myhtml_tag_base_list[MyHTML_TAG_GLYPH], 0, 392}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FEDISTANTLIGHT], 0, 394}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_COMMENT], 0, 396}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_TIME], 0, 402}, + {&myhtml_tag_base_list[MyHTML_TAG_IFRAME], 0, 403}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FORM], 0, 405}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_PRE], 531, 407}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FECONVOLVEMATRIX], 0, 409}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_FEGAUSSIANBLUR], 0, 412}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_BASEFONT], 532, 414}, + {&myhtml_tag_base_list[MyHTML_TAG_SECTION], 533, 415}, + {&myhtml_tag_base_list[MyHTML_TAG_MENCLOSE], 0, 416}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_ALTGLYPHITEM], 0, 421}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MARQUEE], 0, 424}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_DFN], 0, 429}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MSLINE], 534, 432}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_DIV], 536, 434}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_TEXTAREA], 0, 444}, + {&myhtml_tag_base_list[MyHTML_TAG_POLYLINE], 0, 445}, + {&myhtml_tag_base_list[MyHTML_TAG_FEFUNCR], 0, 446}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_APPLET], 537, 453}, + {&myhtml_tag_base_list[MyHTML_TAG_MSUP], 0, 454}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_CLIPPATH], 0, 460}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_COL], 538, 463}, + {&myhtml_tag_base_list[MyHTML_TAG_EM], 0, 464}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MTEXT], 539, 472}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_MGLYPH], 0, 478}, + {NULL, 0, 0}, + {&myhtml_tag_base_list[MyHTML_TAG_KBD], 0, 480}, + {&myhtml_tag_base_list[MyHTML_TAG_ADDRESS], 0, 481}, + {&myhtml_tag_base_list[MyHTML_TAG_POLYGON], 0, 482}, + {&myhtml_tag_base_list[MyHTML_TAG_FETILE], 0, 483}, + {&myhtml_tag_base_list[MyHTML_TAG__COMMENT], 0, 484}, + {&myhtml_tag_base_list[MyHTML_TAG_FONT_FACE_SRC], 0, 485}, + {&myhtml_tag_base_list[MyHTML_TAG_FEFLOOD], 0, 486}, + {&myhtml_tag_base_list[MyHTML_TAG_SELECT], 0, 487}, + {&myhtml_tag_base_list[MyHTML_TAG_ANIMATE], 0, 488}, + {&myhtml_tag_base_list[MyHTML_TAG_COLGROUP], 0, 489}, + {&myhtml_tag_base_list[MyHTML_TAG_ANNOTATION_XML], 0, 490}, + {&myhtml_tag_base_list[MyHTML_TAG_FEMORPHOLOGY], 0, 491}, + {&myhtml_tag_base_list[MyHTML_TAG_TR], 493, 492}, + {&myhtml_tag_base_list[MyHTML_TAG_BGSOUND], 0, 493}, + {&myhtml_tag_base_list[MyHTML_TAG_MACTION], 0, 494}, + {&myhtml_tag_base_list[MyHTML_TAG_OUTPUT], 0, 495}, + {&myhtml_tag_base_list[MyHTML_TAG_MPADDED], 0, 496}, + {&myhtml_tag_base_list[MyHTML_TAG_TITLE], 0, 497}, + {&myhtml_tag_base_list[MyHTML_TAG_MALIGNGROUP], 0, 498}, + {&myhtml_tag_base_list[MyHTML_TAG_CURSOR], 0, 499}, + {&myhtml_tag_base_list[MyHTML_TAG_STRONG], 501, 500}, + {&myhtml_tag_base_list[MyHTML_TAG_COLOR_PROFILE], 0, 501}, + {&myhtml_tag_base_list[MyHTML_TAG_MASK], 0, 502}, + {&myhtml_tag_base_list[MyHTML_TAG_MSUBSUP], 0, 503}, + {&myhtml_tag_base_list[MyHTML_TAG_MLABELEDTR], 0, 504}, + {&myhtml_tag_base_list[MyHTML_TAG_MENUITEM], 506, 505}, + {&myhtml_tag_base_list[MyHTML_TAG_MPHANTOM], 0, 506}, + {&myhtml_tag_base_list[MyHTML_TAG_KEYGEN], 0, 507}, + {&myhtml_tag_base_list[MyHTML_TAG_TD], 0, 508}, + {&myhtml_tag_base_list[MyHTML_TAG_TFOOT], 0, 509}, + {&myhtml_tag_base_list[MyHTML_TAG_MALIGNMARK], 0, 510}, + {&myhtml_tag_base_list[MyHTML_TAG_STRIKE], 512, 511}, + {&myhtml_tag_base_list[MyHTML_TAG_SOURCE], 0, 512}, + {&myhtml_tag_base_list[MyHTML_TAG_CODE], 0, 513}, + {&myhtml_tag_base_list[MyHTML_TAG_FEMERGE], 0, 514}, + {&myhtml_tag_base_list[MyHTML_TAG_STOP], 0, 515}, + {&myhtml_tag_base_list[MyHTML_TAG_FECOMPOSITE], 517, 516}, + {&myhtml_tag_base_list[MyHTML_TAG_FEMERGENODE], 0, 517}, + {&myhtml_tag_base_list[MyHTML_TAG_METADATA], 0, 518}, + {&myhtml_tag_base_list[MyHTML_TAG_CANVAS], 0, 519}, + {&myhtml_tag_base_list[MyHTML_TAG_FRAMESET], 521, 520}, + {&myhtml_tag_base_list[MyHTML_TAG_FEOFFSET], 0, 521}, + {&myhtml_tag_base_list[MyHTML_TAG_MFRAC], 0, 522}, + {&myhtml_tag_base_list[MyHTML_TAG_RB], 0, 523}, + {&myhtml_tag_base_list[MyHTML_TAG_MERROR], 0, 524}, + {&myhtml_tag_base_list[MyHTML_TAG_FILTER], 0, 525}, + {&myhtml_tag_base_list[MyHTML_TAG_MISSING_GLYPH], 0, 526}, + {&myhtml_tag_base_list[MyHTML_TAG_FONT_FACE_URI], 0, 527}, + {&myhtml_tag_base_list[MyHTML_TAG_MOVER], 0, 528}, + {&myhtml_tag_base_list[MyHTML_TAG_LABEL], 0, 529}, + {&myhtml_tag_base_list[MyHTML_TAG_TREF], 0, 530}, + {&myhtml_tag_base_list[MyHTML_TAG_HEAD], 0, 531}, + {&myhtml_tag_base_list[MyHTML_TAG__END_OF_FILE], 0, 532}, + {&myhtml_tag_base_list[MyHTML_TAG_FEDIFFUSELIGHTING], 0, 533}, + {&myhtml_tag_base_list[MyHTML_TAG_MSPACE], 535, 534}, + {&myhtml_tag_base_list[MyHTML_TAG_MSTYLE], 0, 535}, + {&myhtml_tag_base_list[MyHTML_TAG_HGROUP], 0, 536}, + {&myhtml_tag_base_list[MyHTML_TAG_OPTION], 0, 537}, + {&myhtml_tag_base_list[MyHTML_TAG_WBR], 0, 538}, + {&myhtml_tag_base_list[MyHTML_TAG_MROOT], 540, 539}, + {&myhtml_tag_base_list[MyHTML_TAG_MSQRT], 0, 540}, + +}; + + +const myhtml_tag_context_t * myhtml_tag_static_search(const char* name, size_t length) +{ + size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyHTML_BASE_STATIC_SIZE) + 1; + + while (myhtml_tag_static_list_index[idx].ctx) + { + if(myhtml_tag_static_list_index[idx].ctx->name_length == length) { + if(myhtml_strncasecmp(myhtml_tag_static_list_index[idx].ctx->name, name, length) == 0) + return myhtml_tag_static_list_index[idx].ctx; + + if(myhtml_tag_static_list_index[idx].next) + idx = myhtml_tag_static_list_index[idx].next; + else + return NULL; + } + else if(myhtml_tag_static_list_index[idx].ctx->name_length > length) { + return NULL; + } + else { + idx = myhtml_tag_static_list_index[idx].next; + } + } + + return NULL; +} + +const myhtml_tag_context_t * myhtml_tag_static_get_by_id(size_t idx) +{ + return &myhtml_tag_base_list[idx]; +} + + + diff --git a/source/myhtml/thread.c b/source/myhtml/thread.c new file mode 100644 index 0000000..7428ec4 --- /dev/null +++ b/source/myhtml/thread.c @@ -0,0 +1,1132 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/thread.h" + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + +#if defined(IS_OS_WINDOWS) +/*********************************************************************************** + * + * For Windows + * + ***********************************************************************************/ +myhtml_status_t myhtml_thread_create(mythread_t *mythread, mythread_list_t *thr, void *work_func) +{ + thr->pth = CreateThread(NULL, // default security attributes + 0, // use default stack size + work_func, // thread function name + &thr->data, // argument to thread function + 0, // use default creation flags + NULL); // returns the thread identifier + + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_join(mythread_t *mythread, mythread_list_t *thr) +{ + WaitForSingleObject(thr->pth, INFINITE); + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_cancel(mythread_t *mythread, mythread_list_t *thr) +{ + TerminateThread(thr->pth, 0); + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_attr_init(mythread_t *mythread) +{ + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_attr_clean(mythread_t *mythread) +{ + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_attr_destroy(mythread_t *mythread) +{ + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_create(mythread_t *mythread, mythread_context_t *ctx, size_t prefix_id) +{ + ctx->mutex = CreateSemaphore(NULL, 0, 1, NULL); + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_post(mythread_t *mythread, mythread_context_t *ctx) +{ + ReleaseSemaphore(ctx->mutex, 1, NULL); + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_wait(mythread_t *mythread, mythread_context_t *ctx) +{ + WaitForSingleObject(ctx->mutex, INFINITE); + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_try_wait(mythread_t *mythread, mythread_context_t *ctx) +{ + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_close(mythread_t *mythread, mythread_context_t *ctx) +{ + CloseHandle(ctx->mutex); + + return MyHTML_STATUS_OK; +} + +void myhtml_thread_nanosleep(const struct timespec *tomeout) +{ + Sleep(0); +} + +#else /* defined(IS_OS_WINDOWS) */ +/*********************************************************************************** + * + * For all unix system. POSIX pthread + * + ***********************************************************************************/ + +myhtml_status_t myhtml_thread_create(mythread_t *mythread, mythread_list_t *thr, void *work_func) +{ + pthread_create(&thr->pth, mythread->attr, + work_func, + (void*)(&thr->data)); + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_join(mythread_t *mythread, mythread_list_t *thr) +{ + pthread_join(thr->pth, NULL); + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_cancel(mythread_t *mythread, mythread_list_t *thr) +{ + pthread_cancel(thr->pth); + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_attr_init(mythread_t *mythread) +{ + mythread->attr = (pthread_attr_t*)myhtml_calloc(1, sizeof(pthread_attr_t)); + + if(mythread->attr == NULL) + return MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC; + + mythread->sys_last_error = pthread_attr_init(mythread->attr); + if(mythread->sys_last_error) + return MyHTML_STATUS_THREAD_ERROR_ATTR_INIT; + + mythread->sys_last_error = pthread_attr_setdetachstate(mythread->attr, PTHREAD_CREATE_JOINABLE); + if(mythread->sys_last_error) + return MyHTML_STATUS_THREAD_ERROR_ATTR_SET; + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_attr_clean(mythread_t *mythread) +{ + mythread->attr = NULL; + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_thread_attr_destroy(mythread_t *mythread) +{ + if(mythread->attr) { + mythread->sys_last_error = pthread_attr_destroy(mythread->attr); + + myhtml_free(mythread->attr); + mythread->attr = NULL; + + if(mythread->sys_last_error) + return MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY; + } + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_create(mythread_t *mythread, mythread_context_t *ctx, size_t prefix_id) +{ + ctx->mutex = (pthread_mutex_t*)myhtml_calloc(1, sizeof(pthread_mutex_t)); + + if(ctx->mutex == NULL) + return MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC; + + if(pthread_mutex_init(ctx->mutex, NULL)) { + mythread->sys_last_error = errno; + return MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT; + } + + if(pthread_mutex_lock(ctx->mutex)) { + mythread->sys_last_error = errno; + return MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK; + } + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_post(mythread_t *mythread, mythread_context_t *ctx) +{ + if(pthread_mutex_unlock(ctx->mutex)) { + mythread->sys_last_error = errno; + return MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK; + } + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_wait(mythread_t *mythread, mythread_context_t *ctx) +{ + if(pthread_mutex_lock(ctx->mutex)) { + mythread->sys_last_error = errno; + return MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK; + } + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_try_wait(mythread_t *mythread, mythread_context_t *ctx) +{ + if(pthread_mutex_trylock(ctx->mutex)) { + mythread->sys_last_error = errno; + return MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK; + } + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_hread_mutex_close(mythread_t *mythread, mythread_context_t *ctx) +{ + if(ctx->mutex) { + pthread_mutex_destroy(ctx->mutex); + myhtml_free(ctx->mutex); + + ctx->mutex = NULL; + } + + return MyHTML_STATUS_OK; +} + +void myhtml_thread_nanosleep(const struct timespec *tomeout) +{ + nanosleep(tomeout, NULL); +} + +#endif /* !defined(IS_OS_WINDOWS) */ +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +/* + * + * MyTHREAD logic + * + */ + +mythread_t * mythread_create(void) +{ + return myhtml_calloc(1, sizeof(mythread_t)); +} + +#ifdef MyHTML_BUILD_WITHOUT_THREADS + +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size) +{ + return MyHTML_STATUS_OK; +} + +#else /* MyHTML_BUILD_WITHOUT_THREADS */ + +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size) +{ + mythread->batch_count = 0; + mythread->batch_first_id = 0; + mythread->stream_opt = MyTHREAD_OPT_STOP; + mythread->batch_opt = MyTHREAD_OPT_STOP; + + if(thread_count) + { + myhtml_status_t status = myhtml_thread_attr_init(mythread); + if(status) + return status; + + mythread->pth_list_root = 1; + mythread->pth_list_length = 1; + mythread->pth_list_size = thread_count + 1; + mythread->pth_list = (mythread_list_t*)myhtml_calloc(mythread->pth_list_size, sizeof(mythread_list_t)); + + if(mythread->pth_list == NULL) + return MyHTML_STATUS_THREAD_ERROR_LIST_INIT; + } + else { + myhtml_thread_attr_clean(mythread); + + mythread->sys_last_error = 0; + mythread->pth_list_root = 1; + mythread->pth_list_length = 1; + mythread->pth_list_size = 0; + mythread->pth_list = NULL; + } + + myhtml_status_t status; + mythread->queue_list = mythread_queue_list_create(mythread, &status); + + if(mythread->queue_list == NULL) + return status; + + if(sem_prefix) + { + mythread->sem_prefix_length = strlen(sem_prefix); + + if(mythread->sem_prefix_length) { + mythread->sem_prefix = myhtml_calloc((mythread->sem_prefix_length + 1), sizeof(char)); + + if(mythread->sem_prefix == NULL) { + mythread->sem_prefix_length = 0; + return MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC; + } + + myhtml_string_raw_copy(mythread->sem_prefix, sem_prefix, mythread->sem_prefix_length); + } + } + + return MyHTML_STATUS_OK; +} + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +void mythread_clean(mythread_t *mythread) +{ + mythread->sys_last_error = 0; +} + +mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy) +{ + if(mythread == NULL) + return NULL; + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + + myhtml_thread_attr_destroy(mythread); + + if(mythread->pth_list) { + mythread_resume_all(mythread); + mythread_stream_quit_all(mythread); + mythread_batch_quit_all(mythread); + mythread_wait_all_for_done(mythread); + + for (size_t i = mythread->pth_list_root; i < mythread->pth_list_length; i++) + { + myhtml_thread_join(mythread, &mythread->pth_list[i]); + } + + myhtml_free(mythread->pth_list); + mythread->pth_list = NULL; + } + + if(mythread->queue_list) { + myhtml_free(mythread->queue_list); + } + + if(mythread->sem_prefix) { + myhtml_free(mythread->sem_prefix); + + mythread->sem_prefix = NULL; + mythread->sem_prefix_length = 0; + } + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + + if(self_destroy) { + myhtml_free(mythread); + return NULL; + } + + return mythread; +} + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + +mythread_id_t _myhread_create_stream_raw(mythread_t *mythread, mythread_f func, void *work_func, myhtml_status_t *status, size_t total_count) +{ + mythread->sys_last_error = 0; + + if(status) + *status = MyHTML_STATUS_OK; + + if(mythread->pth_list_length >= mythread->pth_list_size) { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_NO_SLOTS; + + return 0; + } + + mythread_list_t *thr = &mythread->pth_list[mythread->pth_list_length]; + + thr->data.mythread = mythread; + thr->data.func = func; + thr->data.id = mythread->pth_list_length; + thr->data.t_count = total_count; + thr->data.opt = MyTHREAD_OPT_STOP; + + myhtml_status_t m_status = myhtml_hread_mutex_create(mythread, &thr->data, 0); + + if(m_status != MyHTML_STATUS_OK && status) { + *status = m_status; + return 0; + } + + m_status = myhtml_thread_create(mythread, thr, work_func); + if(m_status != MyHTML_STATUS_OK) + return 0; + + mythread->pth_list_length++; + return thr->data.id; +} + +mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_f func, myhtml_status_t *status) +{ + return _myhread_create_stream_raw(mythread, func, mythread_function_stream, status, 0); +} + +mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml_status_t *status, size_t count) +{ + if(mythread->batch_count) { + *status = MyHTML_STATUS_THREAD_ERROR_BATCH_INIT; + return 0; + } + else if((mythread->pth_list_length + count) > mythread->pth_list_size) { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_NO_SLOTS; + + return 0; + } + + if(count == 0) + count = 1; + + mythread->batch_first_id = 0; + mythread->batch_count = count; + + size_t start = mythread->pth_list_length; + *status = MyHTML_STATUS_OK; + + bool init_first = false; + + for (size_t i = 0; i < count; i++) + { + mythread_id_t curr_id = _myhread_create_stream_raw(mythread, func, mythread_function_batch, status, i); + + if(init_first == false) { + mythread->batch_first_id = curr_id; + init_first = true; + } + + if(*status) + { + for (size_t n = start; n < (start + i); n++) + { + mythread_list_t *thr = &mythread->pth_list[n]; + + myhtml_thread_cancel(mythread, thr); + + myhtml_hread_mutex_post(mythread, &thr->data); + myhtml_hread_mutex_close(mythread, &thr->data); + } + + mythread->batch_first_id = 0; + mythread->batch_count = 0; + + break; + } + } + + return mythread->batch_first_id; +} + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +// mythread queue functions +// TODO: size = 1024; -- never use +#ifndef MyHTML_BUILD_WITHOUT_THREADS +mythread_queue_list_t * mythread_queue_list_create(mythread_t *mythread, myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_OK; + + mythread_queue_list_t* queue_list = (mythread_queue_list_t*)myhtml_calloc(1, sizeof(mythread_queue_list_t)); + + if(queue_list == NULL) { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; + return NULL; + } + + return queue_list; +} + +mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status) +{ + mythread_queue_list_t *queue_list = mythread->queue_list; + + if(status) + *status = MyHTML_STATUS_OK; + + mythread_queue_list_entry_t* entry = (mythread_queue_list_entry_t*)myhtml_calloc(1, sizeof(mythread_queue_list_entry_t)); + + if(entry == NULL) { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; + return NULL; + } + + entry->thread_param = (mythread_queue_thread_param_t*)myhtml_calloc(mythread->pth_list_size, sizeof(mythread_queue_thread_param_t)); + + if(entry->thread_param == NULL) { + myhtml_free(entry); + + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; + return NULL; + } + + size_t idx; + for (idx = mythread->batch_first_id; idx < (mythread->batch_first_id + mythread->batch_count); idx++) { + entry->thread_param[idx].use = mythread->pth_list[idx].data.t_count; + } + + entry->queue = queue; + + if(mythread->stream_opt == MyTHREAD_OPT_UNDEF) { + mythread_suspend_all(mythread); + } + else if(mythread->stream_opt == MyTHREAD_OPT_STOP) { + mythread_stop_all(mythread); + } + + if(queue_list->first) { + queue_list->last->next = entry; + entry->prev = queue_list->last; + + queue_list->last = entry; + } + else { + queue_list->first = entry; + queue_list->last = entry; + } + + queue_list->count++; + + if(mythread->stream_opt != MyTHREAD_OPT_STOP) + mythread_resume_all(mythread); + + return entry; +} + +mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue) +{ + mythread_queue_list_t *queue_list = mythread->queue_list; + + mythread_queue_list_entry_t *next = entry->next; + mythread_queue_list_entry_t *prev = entry->prev; + + if(mythread->stream_opt == MyTHREAD_OPT_UNDEF) { + mythread_suspend_all(mythread); + } + else if(mythread->stream_opt == MyTHREAD_OPT_STOP) { + mythread_stop_all(mythread); + } + + if(prev) + prev->next = next; + + if(next) + next->prev = prev; + + if(queue_list->first == entry) + queue_list->first = next; + + if(queue_list->last == entry) + queue_list->last = prev; + + if(mythread->stream_opt != MyTHREAD_OPT_STOP) + mythread_resume_all(mythread); + + if(destroy_queue && entry->queue) + mythread_queue_destroy(entry->queue); + + if(entry->thread_param) + myhtml_free(entry->thread_param); + + myhtml_free(entry); + + queue_list->count--; + + return NULL; +} + +void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry) +{ + if(entry == NULL) + return; + + mythread_queue_clean(entry->queue); + + size_t idx; + for (idx = mythread->pth_list_root; idx < mythread->batch_first_id; idx++) { + entry->thread_param[idx].use = 0; + } + + for (idx = mythread->batch_first_id; idx < (mythread->batch_first_id + mythread->batch_count); idx++) { + entry->thread_param[idx].use = mythread->pth_list[idx].data.t_count; + } +} + +void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry) +{ + if(entry == NULL) + return; + + size_t idx; + const struct timespec tomeout = {0, 0}; + + for (idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { + mythread_queue_thread_param_t *thread_param = &entry->thread_param[ idx ]; + while(thread_param->use < entry->queue->nodes_uses) { + myhtml_thread_nanosleep(&tomeout); + } + } +} + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +mythread_queue_t * mythread_queue_create(size_t size, myhtml_status_t *status) +{ + if(status) + *status = MyHTML_STATUS_OK; + + if(size < 4096) + size = 4096; + + mythread_queue_t* queue = (mythread_queue_t*)myhtml_malloc(sizeof(mythread_queue_t)); + + if(queue == NULL) { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; + return NULL; + } + + queue->nodes_pos_size = 512; + queue->nodes_size = size; + queue->nodes = (mythread_queue_node_t**)myhtml_calloc(queue->nodes_pos_size, sizeof(mythread_queue_node_t*)); + + if(queue->nodes == NULL) { + myhtml_free(queue); + + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; + return NULL; + } + + mythread_queue_clean(queue); + + queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)myhtml_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); + + if(queue->nodes[queue->nodes_pos] == NULL) { + myhtml_free(queue->nodes); + myhtml_free(queue); + + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; + return NULL; + } + + return queue; +} + +void mythread_queue_clean(mythread_queue_t* queue) +{ + queue->nodes_length = 0; + queue->nodes_pos = 0; + queue->nodes_root = 0; + queue->nodes_uses = 0; + + if(queue->nodes[queue->nodes_pos]) + mythread_queue_node_clean(&queue->nodes[queue->nodes_pos][queue->nodes_length]); +} + +mythread_queue_t * mythread_queue_destroy(mythread_queue_t* queue) +{ + if(queue == NULL) + return NULL; + + if(queue->nodes) { + for (size_t i = 0; i <= queue->nodes_pos; i++) { + myhtml_free(queue->nodes[i]); + } + + myhtml_free(queue->nodes); + } + + myhtml_free(queue); + + return NULL; +} + +void mythread_queue_node_clean(mythread_queue_node_t* qnode) +{ + memset(qnode, 0, sizeof(mythread_queue_node_t)); +} + +mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode) +{ + return qnode->prev; +} + +mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue) +{ + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} + +mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue) +{ + return &queue->nodes[0][0]; +} + +size_t mythread_queue_count_used_node(mythread_queue_t* queue) +{ + return queue->nodes_uses; +} + +mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, myhtml_status_t *status) +{ + queue->nodes_length++; + + if(queue->nodes_length >= queue->nodes_size) + { + queue->nodes_pos++; + + if(queue->nodes_pos >= queue->nodes_pos_size) + { + mythread_wait_all_for_done(mythread); + + queue->nodes_pos_size <<= 1; + mythread_queue_node_t** tmp = myhtml_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); + + if(tmp) { + memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (queue->nodes_pos_size - queue->nodes_pos)); + + queue->nodes = tmp; + } + else { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; + + return NULL; + } + } + + if(queue->nodes[queue->nodes_pos] == NULL) { + queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)myhtml_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); + + if(queue->nodes[queue->nodes_pos] == NULL) { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; + + return NULL; + } + } + + queue->nodes_length = 0; + } + + queue->nodes_uses++; + + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} + +mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, myhtml_status_t *status) +{ + queue->nodes_length++; + + if(queue->nodes_uses >= limit) { + queue->nodes_uses++; + mythread_wait_all_for_done(mythread); + + queue->nodes_length = 0; + queue->nodes_pos = 0; + queue->nodes_root = 0; + queue->nodes_uses = 0; + } + else if(queue->nodes_length >= queue->nodes_size) + { + queue->nodes_pos++; + + if(queue->nodes_pos >= queue->nodes_pos_size) + { + mythread_wait_all_for_done(mythread); + + queue->nodes_pos_size <<= 1; + mythread_queue_node_t** tmp = myhtml_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); + + if(tmp) { + memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (queue->nodes_pos_size - queue->nodes_pos)); + + queue->nodes = tmp; + } + else { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; + + return NULL; + } + } + + if(queue->nodes[queue->nodes_pos] == NULL) { + queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)myhtml_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); + + if(queue->nodes[queue->nodes_pos] == NULL) { + if(status) + *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; + + return NULL; + } + } + + queue->nodes_length = 0; + } + + queue->nodes_uses++; + + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + +mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, myhtml_status_t *status) +{ + mythread_queue_t* queue = entry->queue; + + queue->nodes_length++; + + if(queue->nodes_length >= queue->nodes_size) { + queue->nodes_uses++; + + mythread_queue_list_entry_wait_for_done(mythread, entry); + mythread_queue_list_entry_clean(mythread, entry); + } + else + queue->nodes_uses++; + + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +#ifdef MyHTML_BUILD_WITHOUT_THREADS + +void mythread_stream_quit_all(mythread_t *mythread) {} +void mythread_batch_quit_all(mythread_t *mythread) {} +void mythread_stream_stop_all(mythread_t *mythread) {}; +void mythread_batch_stop_all(mythread_t *mythread) {}; +void mythread_stop_all(mythread_t *mythread) {}; +void mythread_resume_all(mythread_t *mythread) {}; +void mythread_wait_all_for_done(mythread_t *mythread) {}; +void mythread_suspend_all(mythread_t *mythread) {}; + +#else /* MyHTML_BUILD_WITHOUT_THREADS */ + +// mythread functions +void mythread_stream_quit_all(mythread_t *mythread) +{ + mythread->stream_opt = MyTHREAD_OPT_QUIT; +} + +void mythread_batch_quit_all(mythread_t *mythread) +{ + mythread->batch_opt = MyTHREAD_OPT_QUIT; +} + +void mythread_stream_stop_all(mythread_t *mythread) +{ + if(mythread->stream_opt != MyTHREAD_OPT_STOP) + mythread->stream_opt = MyTHREAD_OPT_STOP; + + size_t idx; + const struct timespec tomeout = {0, 0}; + + for (idx = mythread->pth_list_root; idx < mythread->batch_first_id; idx++) { + while(mythread->pth_list[idx].data.opt != MyTHREAD_OPT_STOP) { + myhtml_thread_nanosleep(&tomeout); + } + } +} + +void mythread_batch_stop_all(mythread_t *mythread) +{ + if(mythread->batch_opt != MyTHREAD_OPT_STOP) + mythread->batch_opt = MyTHREAD_OPT_STOP; + + size_t idx; + const struct timespec tomeout = {0, 0}; + + for (idx = mythread->batch_first_id; idx < (mythread->batch_first_id + mythread->batch_count); idx++) { + while(mythread->pth_list[idx].data.opt != MyTHREAD_OPT_STOP) { + myhtml_thread_nanosleep(&tomeout); + } + } +} + +void mythread_stop_all(mythread_t *mythread) +{ + mythread_stream_stop_all(mythread); + mythread_batch_stop_all(mythread); +} + +void mythread_resume_all(mythread_t *mythread) +{ + if(mythread->stream_opt == MyTHREAD_OPT_UNDEF && + mythread->batch_opt == MyTHREAD_OPT_UNDEF) + return; + + if(mythread->stream_opt == MyTHREAD_OPT_WAIT || + mythread->batch_opt == MyTHREAD_OPT_WAIT) + { + mythread->stream_opt = MyTHREAD_OPT_UNDEF; + mythread->batch_opt = MyTHREAD_OPT_UNDEF; + } + else { + mythread->stream_opt = MyTHREAD_OPT_UNDEF; + mythread->batch_opt = MyTHREAD_OPT_UNDEF; + + for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { + myhtml_hread_mutex_post(mythread, &mythread->pth_list[idx].data); + } + } +} + +void mythread_wait_all_for_done(mythread_t *mythread) +{ + const struct timespec tomeout = {0, 0}; + + mythread_queue_list_t *queue_list = mythread->queue_list; + mythread_queue_list_entry_t *entry = queue_list->first; + + while(entry) + { + for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { + while(entry->thread_param[idx].use < entry->queue->nodes_uses) { + myhtml_thread_nanosleep(&tomeout); + } + } + + entry = entry->next; + } +} + +void mythread_suspend_all(mythread_t *mythread) +{ + if(mythread->stream_opt != MyTHREAD_OPT_WAIT) + mythread->stream_opt = MyTHREAD_OPT_WAIT; + + if(mythread->batch_opt != MyTHREAD_OPT_WAIT) + mythread->batch_opt = MyTHREAD_OPT_WAIT; + + const struct timespec tomeout = {0, 0}; + + for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { + myhtml_hread_mutex_try_wait(mythread, &mythread->pth_list[idx].data); + + while(mythread->pth_list[idx].data.opt != MyTHREAD_OPT_WAIT) { + myhtml_thread_nanosleep(&tomeout); + } + } +} + +bool mythread_function_see_for_all_done(mythread_queue_list_t *queue_list, size_t thread_id) +{ + size_t done_count = 0; + + mythread_queue_list_entry_t *entry = queue_list->first; + while(entry) + { + if(entry->thread_param[ thread_id ].use >= entry->queue->nodes_uses) { + done_count++; + entry = entry->next; + } + else + break; + } + + return done_count == queue_list->count; +} + +bool mythread_function_see_opt(mythread_context_t *ctx, volatile mythread_thread_opt_t opt, size_t done_count, const struct timespec *timeout) +{ + mythread_t * mythread = ctx->mythread; + mythread_queue_list_t *queue_list = mythread->queue_list; + + if(done_count != queue_list->count) + return false; + + if(opt & MyTHREAD_OPT_STOP) + { + if(mythread_function_see_for_all_done(queue_list, ctx->id)) + { + ctx->opt = MyTHREAD_OPT_STOP; + myhtml_hread_mutex_wait(mythread, ctx); + ctx->opt = MyTHREAD_OPT_UNDEF; + + return false; + } + } + else if(opt & MyTHREAD_OPT_QUIT) + { + if(mythread_function_see_for_all_done(queue_list, ctx->id)) + { + myhtml_hread_mutex_close(mythread, ctx); + ctx->opt = MyTHREAD_OPT_QUIT; + return true; + } + } + + myhtml_thread_nanosleep(timeout); + + return false; +} + +void mythread_function_batch(void *arg) +{ + mythread_context_t *ctx = (mythread_context_t*)arg; + mythread_t * mythread = ctx->mythread; + mythread_queue_list_t *queue_list = mythread->queue_list; + + const struct timespec timeout = {0, 0}; + myhtml_hread_mutex_wait(mythread, ctx); + + do { + if(mythread->batch_opt & MyTHREAD_OPT_WAIT) { + ctx->opt = MyTHREAD_OPT_WAIT; + + while (mythread->batch_opt & MyTHREAD_OPT_WAIT) { + myhtml_thread_nanosleep(&timeout); + } + + ctx->opt = MyTHREAD_OPT_UNDEF; + } + + mythread_queue_list_entry_t *entry = queue_list->first; + size_t done_count = 0; + + while(entry) + { + mythread_queue_thread_param_t *thread_param = &entry->thread_param[ ctx->id ]; + + if(thread_param->use < entry->queue->nodes_uses) + { + size_t pos = thread_param->use / entry->queue->nodes_size; + size_t len = thread_param->use % entry->queue->nodes_size; + + mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; + + if((qnode->tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) + ctx->func(ctx->id, qnode); + + thread_param->use += mythread->batch_count; + } + else + done_count++; + + entry = entry->next; + } + + if(done_count == queue_list->count && + mythread_function_see_opt(ctx, mythread->batch_opt, done_count, &timeout)) + break; + } + while (1); +} + +void mythread_function_stream(void *arg) +{ + mythread_context_t *ctx = (mythread_context_t*)arg; + mythread_t * mythread = ctx->mythread; + mythread_queue_list_t *queue_list = mythread->queue_list; + + const struct timespec timeout = {0, 0}; + myhtml_hread_mutex_wait(mythread, ctx); + + do { + if(mythread->stream_opt & MyTHREAD_OPT_WAIT) { + ctx->opt = MyTHREAD_OPT_WAIT; + + while (mythread->stream_opt & MyTHREAD_OPT_WAIT) { + myhtml_thread_nanosleep(&timeout); + } + + ctx->opt = MyTHREAD_OPT_UNDEF; + } + + mythread_queue_list_entry_t *entry = queue_list->first; + size_t done_count = 0; + + while(entry) + { + mythread_queue_thread_param_t *thread_param = &entry->thread_param[ ctx->id ]; + + if(thread_param->use < entry->queue->nodes_uses) + { + size_t pos = thread_param->use / entry->queue->nodes_size; + size_t len = thread_param->use % entry->queue->nodes_size; + + mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; + + if((qnode->tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) + ctx->func(ctx->id, qnode); + + thread_param->use++; + } + else + done_count++; + + entry = entry->next; + } + + if(done_count == queue_list->count && + mythread_function_see_opt(ctx, mythread->stream_opt, done_count, &timeout)) + break; + } + while (1); +} + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + + diff --git a/source/myhtml/thread.h b/source/myhtml/thread.h new file mode 100644 index 0000000..b156833 --- /dev/null +++ b/source/myhtml/thread.h @@ -0,0 +1,212 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_THREAD_H +#define MyHTML_THREAD_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myhtml/myosi.h" + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + +#if !defined(IS_OS_WINDOWS) +# include +# include +#endif + +#include +#include + +#include +#include + +#include "myhtml/myhtml.h" +#include "myhtml/tree.h" +#include "myhtml/mystring.h" + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +#define MyTHREAD_SEM_NAME "myhtml" + + +#ifdef MyHTML_BUILD_WITHOUT_THREADS + +struct mythread { + int sys_last_error; +}; + +#else /* MyHTML_BUILD_WITHOUT_THREADS */ + +void mythread_function_stream(void *arg); +void mythread_function_batch(void *arg); + +// thread +struct mythread_context { + mythread_id_t id; + +#if defined(IS_OS_WINDOWS) + HANDLE mutex; +#else + pthread_mutex_t *mutex; +#endif + + size_t sem_name_size; + + mythread_f func; + + volatile size_t t_count; + volatile mythread_thread_opt_t opt; + + mythread_t *mythread; +}; + +struct mythread_list { +#if defined(IS_OS_WINDOWS) + HANDLE pth; +#else + pthread_t pth; +#endif + mythread_context_t data; +}; + +struct mythread_workers_list { + mythread_list_t *list; + size_t count; +}; + +struct mythread { + mythread_list_t *pth_list; + size_t pth_list_length; + size_t pth_list_size; + size_t pth_list_root; + + mythread_queue_list_t *queue_list; + + char *sem_prefix; + size_t sem_prefix_length; + +#if !defined(IS_OS_WINDOWS) + pthread_attr_t *attr; +#endif + + int sys_last_error; + + mythread_id_t batch_first_id; + mythread_id_t batch_count; + + volatile mythread_thread_opt_t stream_opt; + volatile mythread_thread_opt_t batch_opt; +}; + +mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_f func, myhtml_status_t *status); +mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml_status_t *status, size_t count); + +void myhtml_thread_nanosleep(const struct timespec *tomeout); + +#endif + +mythread_t * mythread_create(void); +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size); +void mythread_clean(mythread_t *mythread); +mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy); + +void mythread_stream_quit_all(mythread_t *mythread); +void mythread_batch_quit_all(mythread_t *mythread); + +void mythread_stream_stop_all(mythread_t *mythread); +void mythread_batch_stop_all(mythread_t *mythread); + +void mythread_stop_all(mythread_t *mythread); +void mythread_wait_all_for_done(mythread_t *mythread); +void mythread_resume_all(mythread_t *mythread); +void mythread_suspend_all(mythread_t *mythread); + +// queue +struct mythread_queue_node { + mythread_queue_node_t *prev; + myhtml_token_node_t *token; + myhtml_tree_t *tree; +}; + +struct mythread_queue_thread_param { + volatile size_t use; +}; + +struct mythread_queue_list_entry { + mythread_queue_list_entry_t *next; + mythread_queue_list_entry_t *prev; + mythread_queue_t *queue; + mythread_queue_thread_param_t *thread_param; +}; + +struct mythread_queue_list { + mythread_queue_list_entry_t *first; + mythread_queue_list_entry_t *last; + + volatile size_t count; +}; + +struct mythread_queue { + mythread_queue_node_t **nodes; + + size_t nodes_pos; + size_t nodes_pos_size; + size_t nodes_length; + + volatile size_t nodes_uses; + volatile size_t nodes_size; + volatile size_t nodes_root; +}; + +mythread_queue_t * mythread_queue_create(size_t size, myhtml_status_t *status); +void mythread_queue_clean(mythread_queue_t* queue); +mythread_queue_t * mythread_queue_destroy(mythread_queue_t* token); + +void mythread_queue_node_clean(mythread_queue_node_t* qnode); + +size_t mythread_queue_count_used_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode); +mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, myhtml_status_t *status); +mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, myhtml_status_t *status); + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + +mythread_queue_list_t * mythread_queue_list_create(mythread_t *mythread, myhtml_status_t *status); +mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status); +mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue); +void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry); +void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry); + +mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, myhtml_status_t *status); + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* defined(__myhtml__myhtml_thread__) */ + diff --git a/source/myhtml/token.c b/source/myhtml/token.c new file mode 100644 index 0000000..10ef13a --- /dev/null +++ b/source/myhtml/token.c @@ -0,0 +1,942 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/token.h" + +// all key size == value size +static const myhtml_token_replacement_entry_t myhtml_token_attr_svg_replacement[] = { + {"attributename", 13, "attributeName", 13}, + {"attributetype", 13, "attributeType", 13}, + {"basefrequency", 13, "baseFrequency", 13}, + {"baseprofile", 11, "baseProfile", 11}, + {"calcmode", 8, "calcMode", 8}, + {"clippathunits", 13, "clipPathUnits", 13}, + {"diffuseconstant", 15, "diffuseConstant", 15}, + {"edgemode", 8, "edgeMode", 8}, + {"filterunits", 11, "filterUnits", 11}, + {"glyphref", 8, "glyphRef", 8}, + {"gradienttransform", 17, "gradientTransform", 17}, + {"gradientunits", 13, "gradientUnits", 13}, + {"kernelmatrix", 12, "kernelMatrix", 12}, + {"kernelunitlength", 16, "kernelUnitLength", 16}, + {"keypoints", 9, "keyPoints", 9}, + {"keysplines", 10, "keySplines", 10}, + {"keytimes", 8, "keyTimes", 8}, + {"lengthadjust", 12, "lengthAdjust", 12}, + {"limitingconeangle", 17, "limitingConeAngle", 17}, + {"markerheight", 12, "markerHeight", 12}, + {"markerunits", 11, "markerUnits", 11}, + {"markerwidth", 11, "markerWidth", 11}, + {"maskcontentunits", 16, "maskContentUnits", 16}, + {"maskunits", 9, "maskUnits", 9}, + {"numoctaves", 10, "numOctaves", 10}, + {"pathlength", 10, "pathLength", 10}, + {"patterncontentunits", 19, "patternContentUnits", 19}, + {"patterntransform", 16, "patternTransform", 16}, + {"patternunits", 12, "patternUnits", 12}, + {"pointsatx", 9, "pointsAtX", 9}, + {"pointsaty", 9, "pointsAtY", 9}, + {"pointsatz", 9, "pointsAtZ", 9}, + {"preservealpha", 13, "preserveAlpha", 13}, + {"preserveaspectratio", 19, "preserveAspectRatio", 19}, + {"primitiveunits", 14, "primitiveUnits", 14}, + {"refx", 4, "refX", 4}, + {"refy", 4, "refY", 4}, + {"repeatcount", 11, "repeatCount", 11}, + {"repeatdur", 9, "repeatDur", 9}, + {"requiredextensions", 18, "requiredExtensions", 18}, + {"requiredfeatures", 16, "requiredFeatures", 16}, + {"specularconstant", 16, "specularConstant", 16}, + {"specularexponent", 16, "specularExponent", 16}, + {"spreadmethod", 12, "spreadMethod", 12}, + {"startoffset", 11, "startOffset", 11}, + {"stddeviation", 12, "stdDeviation", 12}, + {"stitchtiles", 11, "stitchTiles", 11}, + {"surfacescale", 12, "surfaceScale", 12}, + {"systemlanguage", 14, "systemLanguage", 14}, + {"tablevalues", 11, "tableValues", 11}, + {"targetx", 7, "targetX", 7}, + {"targety", 7, "targetY", 7}, + {"textlength", 10, "textLength", 10}, + {"viewbox", 7, "viewBox", 7}, + {"viewtarget", 10, "viewTarget", 10}, + {"xchannelselector", 16, "xChannelSelector", 16}, + {"ychannelselector", 16, "yChannelSelector", 16}, + {"zoomandpan", 10, "zoomAndPan", 10} +}; + +// all key size > value size +static const myhtml_token_namespace_replacement_t myhtml_token_attr_namespace_replacement[] = { + {"xlink:actuate", 13, "actuate", 7, MyHTML_NAMESPACE_XLINK}, + {"xlink:arcrole", 13, "arcrole", 7, MyHTML_NAMESPACE_XLINK}, + {"xlink:href", 10, "href", 4, MyHTML_NAMESPACE_XLINK}, + {"xlink:role", 10, "role", 4, MyHTML_NAMESPACE_XLINK}, + {"xlink:show", 10, "show", 4, MyHTML_NAMESPACE_XLINK}, + {"xlink:title", 11, "title", 5, MyHTML_NAMESPACE_XLINK}, + {"xlink:type", 10, "type", 4, MyHTML_NAMESPACE_XLINK}, + {"xml:lang", 8, "lang", 4, MyHTML_NAMESPACE_XML}, + {"xml:space", 9, "space", 5, MyHTML_NAMESPACE_XML}, + {"xmlns", 5, "xmlns", 5, MyHTML_NAMESPACE_XMLNS}, + {"xmlns:xlink", 11, "xlink", 5, MyHTML_NAMESPACE_XMLNS} +}; + +myhtml_token_t * myhtml_token_create(myhtml_tree_t* tree, size_t size) +{ + if(size == 0) + size = 4096; + + myhtml_token_t* token = (myhtml_token_t*)myhtml_malloc(sizeof(myhtml_token_t)); + + if(token == NULL) + return NULL; + + token->nodes_obj = mcobject_async_create(); + + if(token->nodes_obj == NULL) { + free(token); + return NULL; + } + + token->attr_obj = mcobject_async_create(); + + if(token->attr_obj == NULL) { + free(token->nodes_obj); + free(token); + + return NULL; + } + + mcobject_async_init(token->nodes_obj, 128, size, sizeof(myhtml_token_node_t)); + mcobject_async_init(token->attr_obj, 128, size, sizeof(myhtml_token_attr_t)); + + token->mcasync_token_id = mcobject_async_node_add(token->nodes_obj, NULL); + token->mcasync_attr_id = mcobject_async_node_add(token->attr_obj, NULL); + + token->tree = tree; + + return token; +} + +void myhtml_token_clean(myhtml_token_t* token) +{ + mcobject_async_node_clean(token->nodes_obj, token->mcasync_token_id); + mcobject_async_node_clean(token->attr_obj, token->mcasync_attr_id); +} + +void myhtml_token_clean_all(myhtml_token_t* token) +{ + mcobject_async_clean(token->nodes_obj); + mcobject_async_clean(token->attr_obj); +} + +myhtml_token_t * myhtml_token_destroy(myhtml_token_t* token) +{ + if(token == NULL) + return NULL; + + if(token->nodes_obj) + token->nodes_obj = mcobject_async_destroy(token->nodes_obj, 1); + + if(token->attr_obj) + token->attr_obj = mcobject_async_destroy(token->attr_obj, 1); + + myhtml_free(token); + + return NULL; +} + +void myhtml_token_node_clean(myhtml_token_node_t* node) +{ + memset(node, 0, sizeof(myhtml_token_node_t)); + node->type = MyHTML_TOKEN_TYPE_OPEN|MyHTML_TOKEN_TYPE_WHITESPACE; + + myhtml_string_clean_all(&node->str); +} + +void myhtml_token_attr_clean(myhtml_token_attr_t* attr) +{ + memset(attr, 0, sizeof(myhtml_token_attr_t)); + attr->ns = MyHTML_NAMESPACE_HTML; + + myhtml_string_clean_all(&attr->key); + myhtml_string_clean_all(&attr->value); +} + +myhtml_tag_id_t myhtml_token_node_tag_id(myhtml_token_node_t *token_node) +{ + return token_node->tag_id; +} + +myhtml_position_t myhtml_token_node_raw_pasition(myhtml_token_node_t *token_node) +{ + if(token_node) + return (myhtml_position_t){token_node->raw_begin, token_node->raw_length}; + + return (myhtml_position_t){0, 0}; +} + +myhtml_position_t myhtml_token_node_element_pasition(myhtml_token_node_t *token_node) +{ + if(token_node) + return (myhtml_position_t){token_node->element_begin, token_node->element_length}; + + return (myhtml_position_t){0, 0}; +} + +myhtml_tree_attr_t * myhtml_token_node_attribute_first(myhtml_token_node_t *token_node) +{ + return token_node->attr_first; +} + +myhtml_tree_attr_t * myhtml_token_node_attribute_last(myhtml_token_node_t *token_node) +{ + return token_node->attr_first; +} + +const char * myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length) +{ + if(length) + *length = token_node->str.length; + + return token_node->str.data; +} + +myhtml_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node) +{ + return &token_node->str; +} + +bool myhtml_token_node_is_close_self(myhtml_token_node_t *token_node) +{ + return (token_node->type & MyHTML_TOKEN_TYPE_CLOSE_SELF); +} + +void myhtml_token_node_wait_for_done(myhtml_token_node_t* node) +{ +#ifndef MyHTML_BUILD_WITHOUT_THREADS + + const struct timespec timeout = {0, 0}; + while((node->type & MyHTML_TOKEN_TYPE_DONE) == 0) {myhtml_thread_nanosleep(&timeout);} + +#endif +} + +myhtml_token_node_t * myhtml_token_node_clone(myhtml_token_t* token, myhtml_token_node_t* node, size_t token_thread_idx, size_t attr_thread_idx) +{ + if(node == NULL) + return NULL; + + myhtml_tree_t* tree = token->tree; + + myhtml_token_node_t* new_node = mcobject_async_malloc(token->nodes_obj, token_thread_idx, NULL); + + new_node->tag_id = node->tag_id; + new_node->type = node->type; + new_node->attr_first = NULL; + new_node->attr_last = NULL; + new_node->raw_begin = node->raw_begin; + new_node->raw_length = node->raw_length; + + myhtml_string_init(tree->mchar, tree->mchar_node_id, &new_node->str, node->str.size); + myhtml_token_node_attr_copy(token, node, new_node, attr_thread_idx); + + return new_node; +} + +void myhtml_token_node_text_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* text, size_t text_len) +{ + myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &dest->str, (text_len + 2)); + + myhtml_string_t* string = &dest->str; + myhtml_string_append(string, text, text_len); +} + +myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtml_token_node_t* dest, + const char* key, size_t key_len, + const char* value, size_t value_len, size_t thread_idx) +{ + myhtml_token_attr_t* new_attr = mcobject_async_malloc(token->attr_obj, thread_idx, NULL); + new_attr->next = 0; + + if(key_len) { + myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (key_len + 1)); + myhtml_string_append_lowercase(&new_attr->key, key, key_len); + } + else + myhtml_string_clean_all(&new_attr->key); + + if(value_len) { + myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (value_len + 1)); + myhtml_string_append(&new_attr->value, value, value_len); + } + else + myhtml_string_clean_all(&new_attr->value); + + if(dest->attr_first == NULL) { + new_attr->prev = 0; + + dest->attr_first = new_attr; + dest->attr_last = new_attr; + } + else { + dest->attr_last->next = new_attr; + new_attr->prev = dest->attr_last; + + dest->attr_last = new_attr; + } + + new_attr->ns = MyHTML_NAMESPACE_HTML; + + return new_attr; +} + +myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, + const char* key, size_t key_len, + const char* value, size_t value_len, + size_t thread_idx, myhtml_encoding_t encoding) +{ + myhtml_token_attr_t* new_attr = mcobject_async_malloc(token->attr_obj, thread_idx, NULL); + new_attr->next = 0; + + if(key_len) { + myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (key_len + 1)); + + if(encoding == MyHTML_ENCODING_UTF_8) + myhtml_string_append_lowercase(&new_attr->key, key, key_len); + else + myhtml_string_append_lowercase_ascii_with_convert_encoding(&new_attr->key, key, key_len, encoding); + } + else + myhtml_string_clean_all(&new_attr->key); + + if(value_len) { + myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (value_len + 1)); + + if(encoding == MyHTML_ENCODING_UTF_8) + myhtml_string_append(&new_attr->value, value, value_len); + else + myhtml_string_append_with_convert_encoding(&new_attr->value, value, value_len, encoding); + } + else + myhtml_string_clean_all(&new_attr->value); + + if(dest->attr_first == NULL) { + new_attr->prev = 0; + + dest->attr_first = new_attr; + dest->attr_last = new_attr; + } + else { + dest->attr_last->next = new_attr; + new_attr->prev = dest->attr_last; + + dest->attr_last = new_attr; + } + + new_attr->ns = MyHTML_NAMESPACE_HTML; + + return new_attr; +} + +void myhtml_token_node_attr_copy_with_check(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx) +{ + myhtml_token_attr_t* attr = target->attr_first; + + while (attr) + { + if(attr->key.length && myhtml_token_attr_by_name(dest, attr->key.data, attr->key.length) == NULL) { + myhtml_token_attr_copy(token, attr, dest, thread_idx); + } + + attr = attr->next; + } +} + +void myhtml_token_node_attr_copy(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx) +{ + myhtml_token_attr_t* attr = target->attr_first; + + while (attr) + { + myhtml_token_attr_copy(token, attr, dest, thread_idx); + attr = attr->next; + } +} + +bool myhtml_token_attr_copy(myhtml_token_t* token, myhtml_token_attr_t* attr, myhtml_token_node_t* dest, size_t thread_idx) +{ + myhtml_token_attr_t* new_attr = mcobject_async_malloc(token->attr_obj, thread_idx, NULL); + new_attr->next = 0; + + if(attr->key.length) { + myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (attr->key.length + 1)); + myhtml_string_append_lowercase(&new_attr->key, attr->key.data, attr->key.length); + } + else + myhtml_string_clean_all(&new_attr->key); + + if(attr->value.length) { + myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (attr->value.length + 1)); + myhtml_string_append(&new_attr->value, attr->value.data, attr->value.length); + } + else + myhtml_string_clean_all(&new_attr->value); + + if(dest->attr_first == NULL) { + new_attr->prev = 0; + + dest->attr_first = new_attr; + dest->attr_last = new_attr; + } + else { + dest->attr_last->next = new_attr; + new_attr->prev = dest->attr_last; + + dest->attr_last = new_attr; + } + + new_attr->ns = attr->ns; + + return true; +} + +myhtml_token_attr_t * myhtml_token_attr_match(myhtml_token_t* token, myhtml_token_node_t* target, + const char* key, size_t key_size, const char* value, size_t value_size) +{ + myhtml_token_attr_t* attr = target->attr_first; + + while (attr) + { + if(attr->key.length == key_size && attr->value.length == value_size) + { + if((myhtml_strcmp(attr->key.data, key) == 0)) { + if((myhtml_strcmp(attr->value.data, value) == 0)) + return attr; + else + return NULL; + } + } + + attr = attr->next; + } + + return NULL; +} + +myhtml_token_attr_t * myhtml_token_attr_match_case(myhtml_token_t* token, myhtml_token_node_t* target, + const char* key, size_t key_size, const char* value, size_t value_size) +{ + myhtml_token_attr_t* attr = target->attr_first; + + while (attr) + { + if(attr->key.length == key_size && attr->value.length == value_size) + { + if((myhtml_strcmp(attr->key.data, key) == 0)) { + if((myhtml_strcasecmp(attr->value.data, value) == 0)) + return attr; + else + return NULL; + } + } + + attr = attr->next; + } + + return NULL; +} + +void myhtml_token_adjust_mathml_attributes(myhtml_token_node_t* target) +{ + myhtml_token_attr_t* attr = myhtml_token_attr_by_name(target, "definitionurl", 13); + + if(attr) { + memcpy(attr->key.data, "definitionURL", 13); + } +} + +void _myhtml_token_create_copy_srt(myhtml_token_t* token, const char* from, size_t from_size, char** to) +{ + *to = mchar_async_malloc(token->tree->mchar, token->tree->mchar_node_id, (from_size + 2)); + myhtml_string_raw_copy(*to, from, from_size); +} + +void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_tree_doctype_t* return_doctype) +{ + myhtml_token_attr_t* attr = target->attr_first; + + if(attr && attr->key.length) { + _myhtml_token_create_copy_srt(token, attr->key.data, attr->key.length, &return_doctype->attr_name); + + if(myhtml_strcmp("html", return_doctype->attr_name)) + return_doctype->is_html = false; + else + return_doctype->is_html = true; + } + else { + return_doctype->is_html = false; + + _myhtml_token_create_copy_srt(token, "\0", 1, &return_doctype->attr_name); + + if(return_doctype->attr_public) + myhtml_free(return_doctype->attr_public); + return_doctype->attr_public = NULL; + + if(return_doctype->attr_system) + myhtml_free(return_doctype->attr_system); + return_doctype->attr_system = NULL; + + return; + } + + attr = attr->next; + + if(attr && attr->value.length) + { + if(myhtml_strcasecmp(attr->value.data, "PUBLIC") == 0) + { + // try see public + attr = attr->next; + + if(attr && attr->value.length) { + _myhtml_token_create_copy_srt(token, attr->value.data, attr->value.length, &return_doctype->attr_public); + + // try see system + attr = attr->next; + + if(attr && attr->value.length) + _myhtml_token_create_copy_srt(token, attr->value.data, attr->value.length, &return_doctype->attr_system); + else { + if(return_doctype->attr_system) + myhtml_free(return_doctype->attr_system); + + _myhtml_token_create_copy_srt(token, "\0", 1, &return_doctype->attr_system); + } + } + else { + if(return_doctype->attr_public) + myhtml_free(return_doctype->attr_public); + return_doctype->attr_public = NULL; + + if(return_doctype->attr_system) + myhtml_free(return_doctype->attr_system); + return_doctype->attr_system = NULL; + } + } + else if(myhtml_strncasecmp(attr->value.data, "SYSTEM", attr->value.length) == 0) + { + attr = attr->next; + + if(attr && attr->value.length) { + _myhtml_token_create_copy_srt(token, "\0", 1, &return_doctype->attr_public); + _myhtml_token_create_copy_srt(token, attr->value.data, attr->value.length, &return_doctype->attr_system); + } + else { + if(return_doctype->attr_public) + myhtml_free(return_doctype->attr_public); + return_doctype->attr_public = NULL; + + if(return_doctype->attr_system) + myhtml_free(return_doctype->attr_system); + return_doctype->attr_system = NULL; + } + } + else { + if(return_doctype->attr_public) + myhtml_free(return_doctype->attr_public); + return_doctype->attr_public = NULL; + + if(return_doctype->attr_system) + myhtml_free(return_doctype->attr_system); + return_doctype->attr_system = NULL; + } + } +} + +bool myhtml_token_doctype_check_html_4_0(myhtml_tree_doctype_t* return_doctype) +{ + return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD HTML 4.0//EN") && + (return_doctype->attr_system == NULL || myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/REC-html40/strict.dtd")); +} + +bool myhtml_token_doctype_check_html_4_01(myhtml_tree_doctype_t* return_doctype) +{ + return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD HTML 4.01//EN") && + (return_doctype->attr_system == NULL || myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/html4/strict.dtd")); +} + +bool myhtml_token_doctype_check_xhtml_1_0(myhtml_tree_doctype_t* return_doctype) +{ + if(return_doctype->attr_system == NULL) + return true; + + return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD XHTML 1.0 Strict//EN") && + myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"); +} + +bool myhtml_token_doctype_check_xhtml_1_1(myhtml_tree_doctype_t* return_doctype) +{ + if(return_doctype->attr_system == NULL) + return true; + + return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD XHTML 1.1//EN") && + myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"); +} + +bool myhtml_token_release_and_check_doctype_attributes(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_tree_doctype_t* return_doctype) +{ + if(return_doctype == NULL) + return false; + + myhtml_token_strict_doctype_by_token(token, target, return_doctype); + + if(return_doctype->attr_name == NULL) + return false; + + if((return_doctype->is_html || + return_doctype->attr_public || + (return_doctype->attr_system && myhtml_strcmp(return_doctype->attr_system, "about:legacy-compat")))) + { + if(return_doctype->attr_public == NULL) + return false; + + if(return_doctype->is_html && + myhtml_token_doctype_check_html_4_0(return_doctype) && + myhtml_token_doctype_check_html_4_01(return_doctype) && + myhtml_token_doctype_check_xhtml_1_0(return_doctype) && + myhtml_token_doctype_check_xhtml_1_1(return_doctype)) + { + return false; + } + } + + return true; +} + +void myhtml_token_adjust_svg_attributes(myhtml_token_node_t* target) +{ + size_t count = sizeof(myhtml_token_attr_svg_replacement) / sizeof(myhtml_token_replacement_entry_t); + + for (size_t i = 0; i < count; i++) + { + myhtml_token_attr_t* attr = myhtml_token_attr_by_name(target, myhtml_token_attr_svg_replacement[i].from, + myhtml_token_attr_svg_replacement[i].from_size); + + if(attr) { + myhtml_string_clean(&attr->key); + myhtml_string_append(&attr->key, myhtml_token_attr_svg_replacement[i].to, + myhtml_token_attr_svg_replacement[i].to_size); + } + } +} + +void myhtml_token_adjust_foreign_attributes(myhtml_token_node_t* target) +{ + size_t count = sizeof(myhtml_token_attr_namespace_replacement) / sizeof(myhtml_token_namespace_replacement_t); + + for (size_t i = 0; i < count; i++) + { + myhtml_token_attr_t* attr = myhtml_token_attr_by_name(target, myhtml_token_attr_namespace_replacement[i].from, + myhtml_token_attr_namespace_replacement[i].from_size); + + if(attr) { + myhtml_string_clean(&attr->key); + myhtml_string_append(&attr->key, myhtml_token_attr_namespace_replacement[i].to, + myhtml_token_attr_namespace_replacement[i].to_size); + + attr->ns = myhtml_token_attr_namespace_replacement[i].ns; + } + } +} + +bool myhtml_token_attr_compare(myhtml_token_node_t* target, myhtml_token_node_t* dest) +{ + if(target == NULL || dest == NULL) + return false; + + myhtml_token_attr_t* target_attr = target->attr_first; + myhtml_token_attr_t* dest_attr = dest->attr_first; + + while (target_attr && dest_attr) + { + if(target_attr->key.length == dest_attr->key.length && + target_attr->value.length == dest_attr->value.length) + { + if(myhtml_strcmp(target_attr->key.data, dest_attr->key.data) != 0) + break; + + if(myhtml_strcasecmp(target_attr->value.data, dest_attr->value.data) != 0) + break; + } + else + break; + + target_attr = target_attr->next; + dest_attr = dest_attr->next; + } + + if(target_attr == NULL && dest_attr == NULL) + return true; + + return false; +} + +myhtml_token_attr_t * myhtml_token_attr_by_name(myhtml_token_node_t* node, const char* name, size_t name_length) +{ + myhtml_token_attr_t* attr = node->attr_first; + + while (attr) + { + if(name_length == attr->key.length) { + if(myhtml_strcmp(attr->key.data, name) == 0) + break; + } + + attr = attr->next; + } + + return attr; +} + +void myhtml_token_delete(myhtml_token_t* token, myhtml_token_node_t* node) +{ + if(node->str.data && node->str.mchar) { + mchar_async_free(node->str.mchar, node->str.node_idx, node->str.data); + } + + mcobject_async_free(token->nodes_obj, node); +} + +void myhtml_token_attr_delete_all(myhtml_token_t* token, myhtml_token_node_t* node) +{ + myhtml_token_attr_t* attr = node->attr_first; + + while (attr) + { + if(attr->key.data && attr->key.mchar) { + mchar_async_free(attr->key.mchar, attr->key.node_idx, attr->key.data); + } + + if(attr->value.data && attr->value.mchar) { + mchar_async_free(attr->value.mchar, attr->value.node_idx, attr->value.data); + } + + attr = attr->next; + } +} + +myhtml_token_attr_t * myhtml_token_attr_remove(myhtml_token_node_t* node, myhtml_token_attr_t* attr) +{ + if(attr) + { + if(attr->prev) { + attr->prev->next = attr->next; + } + else { + node->attr_first = attr->next; + } + + if(attr->next) { + attr->next->prev = attr->prev; + } + else { + node->attr_last = attr->prev; + } + + attr->next = NULL; + attr->prev = NULL; + } + + return attr; +} + +myhtml_token_attr_t * myhtml_token_attr_remove_by_name(myhtml_token_node_t* node, const char* name, size_t name_length) +{ + return myhtml_token_attr_remove(node, myhtml_token_attr_by_name(node, name, name_length)); +} + +myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, myhtml_token_node_t* token_to, myhtml_token_node_t* token_from, bool cp_reverse) +{ + myhtml_token_node_wait_for_done(token_to); + myhtml_token_node_wait_for_done(token_from); + + myhtml_string_t *string1 = &token_to->str; + myhtml_string_t *string2 = &token_from->str; + + token_to->raw_begin = 0; + token_to->raw_length = 0; + + if(token_to->str.node_idx == tree->mchar_node_id) + { + if(cp_reverse) { + //myhtml_string_copy(string2, &string_base); + } + else { + myhtml_string_copy(string1, string2); + } + + return token_to; + } + if(token_from->str.node_idx == tree->mchar_node_id) + { + if(cp_reverse) { + myhtml_string_copy(string2, string1); + } + else { + myhtml_string_copy(string1, string2); + } + + return token_from; + } + else { + myhtml_string_t string_base; + myhtml_string_init(tree->mchar, tree->mchar_node_id, &string_base, (string1->length + string2->length + 2)); + + if(cp_reverse) { + myhtml_string_copy(&string_base, string2); + myhtml_string_copy(&string_base, string1); + } + else { + myhtml_string_copy(&string_base, string1); + myhtml_string_copy(&string_base, string2); + } + + token_to->str = string_base; + } + + return token_to; +} + +void myhtml_token_set_replacement_character_for_null_token(myhtml_tree_t* tree, myhtml_token_node_t* node) +{ + myhtml_token_node_wait_for_done(node); + + myhtml_string_t new_str; + myhtml_string_init(tree->mchar, tree->mchar_node_id, &new_str, (node->str.length + 2)); + + myhtml_string_append_with_replacement_null_characters_only(&new_str, node->str.data, node->str.length); + + node->str = new_str; +} + +void myhtml_token_set_done(myhtml_token_node_t* node) +{ + node->type |= MyHTML_TOKEN_TYPE_DONE; +} + +void myhtml_token_print_param_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out) +{ + if(node->type & MyHTML_TOKEN_TYPE_CLOSE) { + fprintf(out, "tag_id, node->raw_begin, node->raw_length, + (size_t)node->attr_first, (size_t)node->attr_last); + + if(node->type & MyHTML_TOKEN_TYPE_CLOSE_SELF) { + fprintf(out, " />\n"); + } + else { + fprintf(out, ">\n"); + } +} + +void myhtml_token_print_by_idx(myhtml_tree_t* tree, myhtml_token_node_t* node, FILE* out) +{ + const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tree->tags, node->tag_id); + + if(node->tag_id == MyHTML_TAG__TEXT || + node->tag_id == MyHTML_TAG__COMMENT) + { + if(node->str.length) { + fprintf(out, "%.*s: %.*s\n", (int)ctx->name_length, ctx->name, + (int)node->str.length, node->str.data); + } + else { + fprintf(out, "%.*s is empty\n", (int)ctx->name_length, ctx->name); + } + } + else + { + if(node->type & MyHTML_TOKEN_TYPE_CLOSE) { + fprintf(out, "name_length, ctx->name, node->tag_id); + + myhtml_token_print_attr(tree, node, out); + + if(node->type & MyHTML_TOKEN_TYPE_CLOSE_SELF) { + fprintf(out, " />\n"); + } + else { + fprintf(out, ">\n"); + } + } +} + +void myhtml_token_print_attr(myhtml_tree_t* tree, myhtml_token_node_t* node, FILE* out) +{ + myhtml_token_attr_t* attr = node->attr_first; + + while(attr) + { + fprintf(out, " %s", attr->key.data); + + if(attr->ns != MyHTML_NAMESPACE_HTML) + { + switch (attr->ns) { + case MyHTML_NAMESPACE_SVG: + fprintf(out, ":svg"); + break; + case MyHTML_NAMESPACE_MATHML: + fprintf(out, ":math"); + break; + case MyHTML_NAMESPACE_XLINK: + fprintf(out, ":xlink"); + break; + case MyHTML_NAMESPACE_XML: + fprintf(out, ":xml"); + break; + case MyHTML_NAMESPACE_XMLNS: + fprintf(out, ":xmlns"); + break; + default: + fprintf(out, ":UNDEF"); + break; + } + } + + if(attr->value.length) { + fprintf(out, "=\"%s\"", attr->value.data); + } + + attr = attr->next; + } +} + + diff --git a/source/myhtml/token.h b/source/myhtml/token.h new file mode 100644 index 0000000..e22acff --- /dev/null +++ b/source/myhtml/token.h @@ -0,0 +1,168 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyHTML_TOKEN_H +#define MyHTML_TOKEN_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "myhtml/myosi.h" +#include "myhtml/utils.h" +#include "myhtml/tag.h" +#include "myhtml/myhtml.h" +#include "myhtml/mystring.h" +#include "myhtml/utils/mcobject_async.h" +#include "myhtml/utils/mchar_async.h" +#include "myhtml/utils/mcsync.h" + +#define myhtml_token_attr_malloc(token, attr_node, thread_idx) \ + attr_node = mcobject_async_malloc(token->attr_obj, thread_idx, NULL); \ + myhtml_token_attr_clean(attr_node) + +#define myhtml_token_node_set_done(token_node) token_node->type |= MyHTML_TOKEN_TYPE_DONE + +#define myhtml_token_node_malloc(token, token_node, thread_idx) \ + token_node = (myhtml_token_node_t*)mcobject_async_malloc(token->nodes_obj, thread_idx, NULL); \ + myhtml_token_node_clean(token_node) + +struct myhtml_token_replacement_entry { + char* from; + size_t from_size; + + char* to; + size_t to_size; +}; + +struct myhtml_token_namespace_replacement { + char* from; + size_t from_size; + + char* to; + size_t to_size; + + enum myhtml_namespace ns; +}; + +struct myhtml_token_attr { + myhtml_token_attr_t* next; + myhtml_token_attr_t* prev; + + myhtml_string_t key; + myhtml_string_t value; + + size_t raw_key_begin; + size_t raw_key_length; + size_t raw_value_begin; + size_t raw_value_length; + + enum myhtml_namespace ns; +}; + +struct myhtml_token_node { + myhtml_tag_id_t tag_id; + + myhtml_string_t str; + + size_t raw_begin; + size_t raw_length; + + size_t element_begin; + size_t element_length; + + myhtml_token_attr_t* attr_first; + myhtml_token_attr_t* attr_last; + + volatile enum myhtml_token_type type; +}; + +struct myhtml_token { + myhtml_tree_t* tree; // ref + + mcobject_async_t* nodes_obj; // myhtml_token_node_t + mcobject_async_t* attr_obj; // myhtml_token_attr_t + + // def thread node id + size_t mcasync_token_id; + size_t mcasync_attr_id; + + bool is_new_tmp; +}; + +myhtml_token_t * myhtml_token_create(myhtml_tree_t* tree, size_t size); +void myhtml_token_clean(myhtml_token_t* token); +void myhtml_token_clean_all(myhtml_token_t* token); +myhtml_token_t * myhtml_token_destroy(myhtml_token_t* token); + +myhtml_tag_id_t myhtml_token_node_tag_id(myhtml_token_node_t *token_node); +myhtml_position_t myhtml_token_node_raw_pasition(myhtml_token_node_t *token_node); +myhtml_position_t myhtml_token_node_element_pasition(myhtml_token_node_t *token_node); + +myhtml_tree_attr_t * myhtml_token_node_attribute_first(myhtml_token_node_t *token_node); +myhtml_tree_attr_t * myhtml_token_node_attribute_last(myhtml_token_node_t *token_node); + +const char * myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); +myhtml_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node); + +bool myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); + +void myhtml_token_node_clean(myhtml_token_node_t* node); +void myhtml_token_attr_clean(myhtml_token_attr_t* attr); +myhtml_token_attr_t * myhtml_token_attr_remove(myhtml_token_node_t* node, myhtml_token_attr_t* attr); +myhtml_token_attr_t * myhtml_token_attr_remove_by_name(myhtml_token_node_t* node, const char* name, size_t name_length); +void myhtml_token_attr_delete_all(myhtml_token_t* token, myhtml_token_node_t* node); +void myhtml_token_delete(myhtml_token_t* token, myhtml_token_node_t* node); +void myhtml_token_node_wait_for_done(myhtml_token_node_t* node); +void myhtml_token_set_done(myhtml_token_node_t* node); + +myhtml_token_attr_t * myhtml_token_attr_match(myhtml_token_t* token, myhtml_token_node_t* target, const char* key, size_t key_size, const char* value, size_t value_size); +myhtml_token_attr_t * myhtml_token_attr_match_case(myhtml_token_t* token, myhtml_token_node_t* target, const char* key, size_t key_size, const char* value, size_t value_size); + +bool myhtml_token_release_and_check_doctype_attributes(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_tree_doctype_t* return_doctype); + +void myhtml_token_adjust_mathml_attributes(myhtml_token_node_t* target); +void myhtml_token_adjust_svg_attributes(myhtml_token_node_t* target); +void myhtml_token_adjust_foreign_attributes(myhtml_token_node_t* target); + +myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx); +myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx, myhtml_encoding_t encoding); +void myhtml_token_node_text_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* text, size_t text_len); +void myhtml_token_node_attr_copy(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); +void myhtml_token_node_attr_copy_with_check(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); +myhtml_token_node_t * myhtml_token_node_clone(myhtml_token_t* token, myhtml_token_node_t* node, size_t token_thread_idx, size_t attr_thread_idx); +bool myhtml_token_attr_copy(myhtml_token_t* token, myhtml_token_attr_t* attr, myhtml_token_node_t* dest, size_t thread_idx); +myhtml_token_attr_t * myhtml_token_attr_by_name(myhtml_token_node_t* node, const char* name, size_t name_size); +bool myhtml_token_attr_compare(myhtml_token_node_t* target, myhtml_token_node_t* dest); +myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, myhtml_token_node_t* token_to, myhtml_token_node_t* token_from, bool cp_reverse); +void myhtml_token_set_replacement_character_for_null_token(myhtml_tree_t* tree, myhtml_token_node_t* node); + +void myhtml_token_print_param_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); +void myhtml_token_print_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); +void myhtml_token_print_attr(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* myhtml_token_h */ diff --git a/source/myhtml/tokenizer.c b/source/myhtml/tokenizer.c new file mode 100644 index 0000000..1d18c38 --- /dev/null +++ b/source/myhtml/tokenizer.c @@ -0,0 +1,1690 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myhtml/tokenizer.h" +#include "myhtml/utils/resources.h" + +myhtml_status_t myhtml_tokenizer_set_first_settings(myhtml_tree_t* tree, const char* html, size_t html_length) +{ + tree->current_qnode = mythread_queue_get_current_node(tree->queue); + mythread_queue_node_clean(tree->current_qnode); + + tree->current_qnode->tree = tree; + + myhtml_token_node_malloc(tree->token, tree->current_token_node, tree->mcasync_token_id); + + tree->incoming_buf_first = tree->incoming_buf; + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length) +{ + return myhtml_tokenizer_chunk(tree, html, html_length); +} + +myhtml_status_t myhtml_tokenizer_chunk_process(myhtml_tree_t* tree, const char* html, size_t html_length) +{ + myhtml_t* myhtml = tree->myhtml; + myhtml_tokenizer_state_f* state_f = myhtml->parse_state_func; + + // add for a chunk + tree->incoming_buf = myhtml_incomming_buffer_add(tree->incoming_buf, tree->mcobject_incoming_buf, html, html_length); + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + + if(myhtml->opt & MyHTML_OPTIONS_PARSE_MODE_SINGLE) + tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; + + if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) + { + if(tree->queue_entry == NULL) { + myhtml_status_t status = MyHTML_STATUS_OK; + tree->queue_entry = mythread_queue_list_entry_push(myhtml->thread, tree->queue, &status); + + if(status) + return status; + } + + myhtml_tokenizer_post(tree); + } + +#else + + tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; + +#endif + + if(tree->current_qnode == NULL) { + myhtml_tokenizer_set_first_settings(tree, html, html_length); + } + + size_t offset = 0; + + while (offset < html_length) { + offset = state_f[tree->state](tree, tree->current_token_node, html, offset, html_length); + } + + tree->global_offset += html_length; + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length) +{ + if(tree->encoding_usereq == MyHTML_ENCODING_UTF_16LE || + tree->encoding_usereq == MyHTML_ENCODING_UTF_16BE) + { + return myhtml_tokenizer_chunk_with_stream_buffer(tree, html, html_length); + } + + return myhtml_tokenizer_chunk_process(tree, html, html_length); +} + +myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length) +{ + unsigned const char* u_html = (unsigned const char*)html; + const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(tree->encoding); + + if(tree->stream_buffer == NULL) { + tree->stream_buffer = myhtml_stream_buffer_create(); + + if(tree->stream_buffer == NULL) + return MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE; + + myhtml_status_t status = myhtml_stream_buffer_init(tree->stream_buffer, 1024); + + if(status) + return status; + + if(myhtml_stream_buffer_add_entry(tree->stream_buffer, (4096 * 4)) == NULL) + return MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY; + } + + myhtml_stream_buffer_t *stream_buffer = tree->stream_buffer; + myhtml_stream_buffer_entry_t *stream_entry = myhtml_stream_buffer_current_entry(stream_buffer); + + size_t temp_curr_pos = stream_entry->length; + + for (size_t i = 0; i < html_length; i++) + { + if(func(u_html[i], &stream_buffer->res) == MyHTML_ENCODING_STATUS_OK) + { + if((stream_entry->length + 4) >= stream_entry->size) + { + tree->encoding = MyHTML_ENCODING_UTF_8; + myhtml_tokenizer_chunk_process(tree, &stream_entry->data[temp_curr_pos], (stream_entry->length - temp_curr_pos)); + + stream_entry = myhtml_stream_buffer_add_entry(stream_buffer, (4096 * 4)); + + if(stream_entry == NULL) + return MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY; + + temp_curr_pos = stream_entry->length; + } + + stream_entry->length += myhtml_encoding_codepoint_to_ascii_utf_8(stream_buffer->res.result, &stream_entry->data[ stream_entry->length ]); + } + } + + if((stream_entry->length - temp_curr_pos)) { + tree->encoding = MyHTML_ENCODING_UTF_8; + myhtml_tokenizer_chunk_process(tree, &stream_entry->data[temp_curr_pos], (stream_entry->length - temp_curr_pos)); + } + + return MyHTML_STATUS_OK; +} + +myhtml_status_t myhtml_tokenizer_end(myhtml_tree_t* tree) +{ + if(tree->incoming_buf) + { + tree->global_offset -= tree->incoming_buf->size; + + tree->myhtml->parse_state_func[(tree->state + MyHTML_TOKENIZER_STATE_LAST_ENTRY)] + (tree, tree->current_token_node, tree->incoming_buf->data, tree->incoming_buf->size, tree->incoming_buf->size); + } + + tree->current_token_node->tag_id = MyHTML_TAG__END_OF_FILE; + + myhtml_queue_add(tree, 0, tree->current_token_node); + +#ifndef MyHTML_BUILD_WITHOUT_THREADS + + if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) + { + mythread_queue_list_entry_wait_for_done(tree->myhtml->thread, tree->queue_entry); + tree->queue_entry = mythread_queue_list_entry_delete(tree->myhtml->thread, tree->queue_entry, false); + + if(tree->myhtml->thread->queue_list->count == 0) { + //myhtml_tokenizer_wait(tree); + myhtml_tokenizer_pause(tree); + } + } + +#endif + + tree->flags |= MyHTML_TREE_FLAGS_PARSE_END; + +#ifdef DEBUG_MODE + if(tree->open_elements->length) { + MyHTML_DEBUG_ERROR("Tokenizer end; Open Elements is %zu", tree->open_elements->length); + } + if(tree->active_formatting->length) { + MyHTML_DEBUG_ERROR("Tokenizer end; Active Formatting Elements is %zu", tree->active_formatting->length); + } +#endif + + return MyHTML_STATUS_OK; +} + +myhtml_tree_node_t * myhtml_tokenizer_fragment_init(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, enum myhtml_namespace ns) +{ + // step 3 + tree->fragment = myhtml_tree_node_create(tree); + tree->fragment->ns = ns; + tree->fragment->tag_id = tag_idx; + + // step 4, is already done + if(ns == MyHTML_NAMESPACE_HTML) { + if(tag_idx == MyHTML_TAG_NOSCRIPT) { + if(tree->flags & MyHTML_TREE_FLAGS_SCRIPT) { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT; + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + } + } + else { + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, tag_idx); + myhtml_tokenizer_state_set(tree) = tag_ctx->data_parser; + } + } + + mcobject_async_status_t mcstatus; + tree->fragment->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); + + if(mcstatus) + return NULL; + + myhtml_token_node_clean(tree->fragment->token); + myhtml_token_set_done(tree->fragment->token); + + tree->token_namespace = tree->fragment->token; + + // step 5-7 + myhtml_tree_node_t* root = myhtml_tree_node_insert_root(tree, NULL, MyHTML_NAMESPACE_HTML); + + if(tag_idx == MyHTML_TAG_TEMPLATE) + myhtml_tree_template_insertion_append(tree, MyHTML_INSERTION_MODE_IN_TEMPLATE); + + myhtml_tree_reset_insertion_mode_appropriately(tree); + + return root; +} + +void myhtml_tokenizer_wait(myhtml_tree_t* tree) +{ + mythread_wait_all_for_done(tree->myhtml->thread); +} + +void myhtml_tokenizer_post(myhtml_tree_t* tree) +{ + mythread_resume_all(tree->myhtml->thread); +} + +void myhtml_tokenizer_pause(myhtml_tree_t* tree) +{ + mythread_stop_all(tree->myhtml->thread); +} + +void myhtml_tokenizer_calc_current_namespace(myhtml_tree_t* tree, myhtml_token_node_t* token_node) +{ + if(tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) + { + myhtml_tokenizer_state_set(tree) = tree->state_of_builder; + } + else { + if(token_node->tag_id == MyHTML_TAG_MATH || + token_node->tag_id == MyHTML_TAG_SVG || + token_node->tag_id == MyHTML_TAG_FRAMESET) + { + tree->token_namespace = token_node; + } + else if(tree->token_namespace && (token_node->type & MyHTML_TOKEN_TYPE_CLOSE) == 0) { + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, token_node->tag_id); + + if(tag_ctx->data_parser != MyHTML_TOKENIZER_STATE_DATA) + { + myhtml_tree_wait_for_last_done_token(tree, token_node); + myhtml_tokenizer_state_set(tree) = tree->state_of_builder; + } + } + } +} + +void myhtml_check_tag_parser(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset) +{ + myhtml_tag_t* tags = tree->tags; + const myhtml_tag_context_t *tag_ctx = NULL; + + if(html_offset < token_node->raw_length) { + const char *tagname = myhtml_tree_incomming_buffer_make_data(tree, token_node->raw_begin, token_node->raw_length); + tag_ctx = myhtml_tag_get_by_name(tags, tagname, token_node->raw_length); + } + else { + tag_ctx = myhtml_tag_get_by_name(tags, &html[ (token_node->raw_begin - tree->global_offset) ], token_node->raw_length); + } + + if(tag_ctx) { + token_node->tag_id = tag_ctx->id; + } + else { + if(html_offset < token_node->raw_length) { + const char *tagname = myhtml_tree_incomming_buffer_make_data(tree, token_node->raw_begin, token_node->raw_length); + token_node->tag_id = myhtml_tag_add(tags, tagname, token_node->raw_length, MyHTML_TOKENIZER_STATE_DATA, true); + } + else { + token_node->tag_id = myhtml_tag_add(tags, &html[ (token_node->raw_begin - tree->global_offset) ], token_node->raw_length, MyHTML_TOKENIZER_STATE_DATA, true); + } + + myhtml_tag_set_category(tags, token_node->tag_id, MyHTML_NAMESPACE_HTML, MyHTML_TAG_CATEGORIES_ORDINARY); + } +} + +//// +myhtml_token_node_t * myhtml_tokenizer_queue_create_text_node_if_need(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t absolute_html_offset, enum myhtml_token_type type) +{ + if(token_node->tag_id == MyHTML_TAG__UNDEF) + { + if(absolute_html_offset > token_node->raw_begin) + { + size_t tmp_begin = token_node->element_begin; + + token_node->type |= type; + token_node->tag_id = MyHTML_TAG__TEXT; + token_node->element_begin = token_node->raw_begin; + token_node->raw_length = token_node->element_length = absolute_html_offset - token_node->raw_begin; + + myhtml_queue_add(tree, tmp_begin, token_node); + + return tree->current_token_node; + } + } + + return token_node; +} + +void myhtml_tokenizer_set_state(myhtml_tree_t* tree, myhtml_token_node_t* token_node) +{ + if((token_node->type & MyHTML_TOKEN_TYPE_CLOSE) == 0) + { + if(token_node->tag_id == MyHTML_TAG_NOSCRIPT && + (tree->flags & MyHTML_TREE_FLAGS_SCRIPT) == 0) + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + } + else { + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, token_node->tag_id); + myhtml_tokenizer_state_set(tree) = tag_ctx->data_parser; + } + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + } +} + +///////////////////////////////////////////////////////// +//// RCDATA +//// +///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_rcdata(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(tree->tmp_tag_id == 0) { + token_node->raw_begin = (html_offset + tree->global_offset); + + mythread_queue_node_t* prev_qnode = mythread_queue_get_prev_node(tree->current_qnode); + + if(prev_qnode && prev_qnode->token) { + tree->tmp_tag_id = prev_qnode->token->tag_id; + } + else if(tree->fragment) { + tree->tmp_tag_id = tree->fragment->tag_id; + } + } + + while(html_offset < html_size) + { + if(html[html_offset] == '<') + { + token_node->element_begin = (html_offset + tree->global_offset); + + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA_LESS_THAN_SIGN; + + break; + } + + html_offset++; + } + + return html_offset; +} + +size_t myhtml_tokenizer_state_rcdata_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(html[html_offset] == '/') + { + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA_END_TAG_OPEN; + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA; + } + + return html_offset; +} + +size_t myhtml_tokenizer_state_rcdata_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA_END_TAG_NAME; + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA; + } + + return html_offset; +} + +bool _myhtml_tokenizer_state_andata_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t *html_offset, size_t tmp_begin, enum myhtml_token_type type) +{ + token_node->raw_length = (*html_offset + tree->global_offset) - token_node->raw_begin; + myhtml_check_tag_parser(tree, token_node, html, *html_offset); + + if(token_node->tag_id != tree->tmp_tag_id) + { + token_node->raw_begin = tmp_begin; + token_node->raw_length = 0; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA; + + (*html_offset)++; + return false; + } + + if((token_node->raw_begin - 2) > tmp_begin) + { + token_node->raw_length = (token_node->raw_begin - 2) - tmp_begin; + token_node->raw_begin = tmp_begin; + token_node->element_begin = tmp_begin; + token_node->element_length = token_node->raw_length; + token_node->type |= type; + token_node->tag_id = MyHTML_TAG__TEXT; + + myhtml_queue_add(tree, *html_offset, token_node); + token_node = tree->current_token_node; + } + + token_node->tag_id = tree->tmp_tag_id; + token_node->type |= MyHTML_TOKEN_TYPE_CLOSE; + + return true; +} + +size_t myhtml_tokenizer_state_rcdata_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + size_t tmp_begin = token_node->raw_begin; + token_node->raw_begin = html_offset + tree->global_offset; + + while(html_offset < html_size) + { + if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_WHITESPACE) + { + if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RCDATA)) { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + tree->tmp_tag_id = 0; + html_offset++; + + return html_offset; + } + + break; + } + else if(html[html_offset] == '>') + { + if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RCDATA)) { + html_offset++; + + token_node = tree->current_token_node; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + + tree->tmp_tag_id = 0; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + + return html_offset; + } + + break; + } + // check end of tag + else if(html[html_offset] == '/') + { + if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RCDATA)) { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + tree->tmp_tag_id = 0; + html_offset++; + + return html_offset; + } + + break; + } + else if (myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyHTML_TOKENIZER_CHAR_A_Z_a_z) { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA; + break; + } + + html_offset++; + } + + token_node->raw_begin = tmp_begin; + return html_offset; +} + +///////////////////////////////////////////////////////// +//// RAWTEXT +//// +///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_rawtext(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(tree->tmp_tag_id == 0) { + token_node->raw_begin = (html_offset + tree->global_offset); + + mythread_queue_node_t* prev_qnode = mythread_queue_get_prev_node(tree->current_qnode); + + if(prev_qnode && prev_qnode->token) { + tree->tmp_tag_id = prev_qnode->token->tag_id; + } + else if(tree->fragment) { + tree->tmp_tag_id = tree->fragment->tag_id; + } + } + + + while(html_offset < html_size) + { + if(html[html_offset] == '<') + { + token_node->element_begin = (html_offset + tree->global_offset); + + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT_LESS_THAN_SIGN; + + break; + } + + html_offset++; + } + + return html_offset; +} + +size_t myhtml_tokenizer_state_rawtext_less_than_sign(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(html[html_offset] == '/') + { + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT_END_TAG_OPEN; + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT; + } + + return html_offset; +} + +size_t myhtml_tokenizer_state_rawtext_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT_END_TAG_NAME; + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT; + } + + return html_offset; +} + +size_t myhtml_tokenizer_state_rawtext_end_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + size_t tmp_begin = token_node->raw_begin; + token_node->raw_begin = html_offset + tree->global_offset; + + while(html_offset < html_size) + { + if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_WHITESPACE) + { + if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RAWTEXT)) { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + tree->tmp_tag_id = 0; + html_offset++; + } + + return html_offset; + } + else if(html[html_offset] == '>') + { + if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RAWTEXT)) { + html_offset++; + + token_node = tree->current_token_node; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + + tree->tmp_tag_id = 0; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + } + + return html_offset; + } + // check end of tag + else if(html[html_offset] == '/') + { + if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RAWTEXT)) { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + tree->tmp_tag_id = 0; + html_offset++; + } + + return html_offset; + } + else if (myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyHTML_TOKENIZER_CHAR_A_Z_a_z) { + token_node->raw_begin = tmp_begin; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT; + + return html_offset; + } + + html_offset++; + } + + token_node->raw_begin = tmp_begin; + return html_offset; +} + +///////////////////////////////////////////////////////// +//// PLAINTEXT +//// +///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_plaintext(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if((token_node->type & MyHTML_TOKEN_TYPE_PLAINTEXT) == 0) + token_node->type |= MyHTML_TOKEN_TYPE_PLAINTEXT; + + token_node->raw_begin = (html_offset + tree->global_offset); + token_node->raw_length = token_node->element_length = (html_size + tree->global_offset) - token_node->raw_begin; + token_node->tag_id = MyHTML_TAG__TEXT; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + myhtml_queue_add(tree, html_size, token_node); + + return html_size; +} + +///////////////////////////////////////////////////////// +//// CDATA +//// +///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_cdata_section(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if((token_node->type & MyHTML_TOKEN_TYPE_CDATA) == 0) + token_node->type |= MyHTML_TOKEN_TYPE_CDATA; + + while(html_offset < html_size) + { + if(html[html_offset] == '>') + { + const char *tagname; + if(html_offset < 2) + tagname = myhtml_tree_incomming_buffer_make_data(tree,((html_offset + tree->global_offset) - 2), 2); + else + tagname = &html[html_offset - 2]; + + if(tagname[0] == ']' && tagname[1] == ']') + { + token_node->raw_length = (((html_offset + tree->global_offset) - 2) - token_node->raw_begin); + html_offset++; + + if(token_node->raw_length) { + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + + myhtml_queue_add(tree, html_offset, token_node); + } + else { + token_node->raw_begin = html_offset + tree->global_offset; + } + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + break; + } + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// outside of tag +//// %HERE%
%HERE%
%HERE% +///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_data(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + while(html_offset < html_size) + { + if(html[html_offset] == '<') + { + token_node->element_begin = (tree->global_offset + html_offset); + + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_TAG_OPEN; + + break; + } + else if(html[html_offset] == '\0' && (token_node->type & MyHTML_TOKEN_TYPE_NULL) == 0) { + token_node->type |= MyHTML_TOKEN_TYPE_NULL; + } + else if(token_node->type & MyHTML_TOKEN_TYPE_WHITESPACE && + myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyHTML_TOKENIZER_CHAR_WHITESPACE) { + token_node->type ^= (token_node->type & MyHTML_TOKEN_TYPE_WHITESPACE); + token_node->type |= MyHTML_TOKEN_TYPE_DATA; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag +//// <%HERE%div>
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) + { + token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((tree->global_offset + html_offset) - 1), MyHTML_TOKEN_TYPE_DATA); + + token_node->raw_begin = tree->global_offset + html_offset; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_TAG_NAME; + } + else if(html[html_offset] == '!') + { + token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((tree->global_offset + html_offset) - 1), MyHTML_TOKEN_TYPE_DATA); + + html_offset++; + token_node->raw_begin = tree->global_offset + html_offset; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_MARKUP_DECLARATION_OPEN; + } + else if(html[html_offset] == '/') + { + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_END_TAG_OPEN; + } + else if(html[html_offset] == '?') + { + token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((tree->global_offset + html_offset) - 1), MyHTML_TOKEN_TYPE_DATA); + + token_node->raw_begin = tree->global_offset + html_offset; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BOGUS_COMMENT; + } + else { + token_node->type ^= (token_node->type & MyHTML_TOKEN_TYPE_WHITESPACE); + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag +//// global_offset + html_offset) - 2), MyHTML_TOKEN_TYPE_DATA); + + token_node->raw_begin = tree->global_offset + html_offset; + token_node->type = MyHTML_TOKEN_TYPE_CLOSE; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_TAG_NAME; + } + else if(html[html_offset] == '>') + { + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DATA; + } + else { + token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((tree->global_offset + html_offset) - 2), MyHTML_TOKEN_TYPE_DATA); + + token_node->raw_begin = tree->global_offset + html_offset; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BOGUS_COMMENT; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag +//// raw_begin + 2) > (html_size + tree->global_offset)) { + tree->incoming_buf->length = html_offset; + return html_size; + } + + const char *tagname = myhtml_tree_incomming_buffer_make_data(tree, token_node->raw_begin, 2); + + // for a comment + if(tagname[0] == '-' && tagname[1] == '-') + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_COMMENT_START; + + html_offset += 2; + + token_node->raw_begin = html_offset + tree->global_offset; + token_node->raw_length = 0; + + return html_offset; + } + + if((token_node->raw_begin + 7) > (html_size + tree->global_offset)) { + tree->incoming_buf->length = html_offset; + return html_size; + } + + tagname = myhtml_tree_incomming_buffer_make_data(tree, token_node->raw_begin, 7); + + if(myhtml_strncasecmp(tagname, "DOCTYPE", 7) == 0) + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DOCTYPE; + + html_offset = (token_node->raw_begin + 7) - tree->incoming_buf->offset; + + token_node->raw_length = 7; + token_node->tag_id = MyHTML_TAG__DOCTYPE; + + return html_offset; + } + + // CDATA sections can only be used in foreign content (MathML or SVG) + if(strncmp(tagname, "[CDATA[", 7) == 0) { + if(tree->current_qnode->prev && tree->current_qnode->prev->token) + { + myhtml_tree_wait_for_last_done_token(tree, tree->current_qnode->prev->token); + myhtml_tree_node_t *adjusted_current_node = myhtml_tree_adjusted_current_node(tree); + + if(adjusted_current_node && + adjusted_current_node->ns != MyHTML_NAMESPACE_HTML) + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_CDATA_SECTION; + + html_offset = (token_node->raw_begin + 7) - tree->incoming_buf->offset; + + token_node->raw_begin += 7; + token_node->raw_length = 0; + token_node->tag_id = MyHTML_TAG__TEXT; + + return html_offset; + } + } + } + + token_node->raw_length = 0; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BOGUS_COMMENT; + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag +//// <%HERE% +///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + while(html_offset < html_size) + { + if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_WHITESPACE) + { + token_node->raw_length = (tree->global_offset + html_offset) - token_node->raw_begin; + myhtml_check_tag_parser(tree, token_node, html, html_offset); + + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + break; + } + else if(html[html_offset] == '/') + { + token_node->raw_length = (tree->global_offset + html_offset) - token_node->raw_begin; + myhtml_check_tag_parser(tree, token_node, html, html_offset); + + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_SELF_CLOSING_START_TAG; + + break; + } + else if(html[html_offset] == '>') + { + token_node->raw_length = (tree->global_offset + html_offset) - token_node->raw_begin; + + myhtml_check_tag_parser(tree, token_node, html, html_offset); + myhtml_tokenizer_set_state(tree, token_node); + + html_offset++; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + + break; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag +//// <%HERE% +///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_self_closing_start_tag(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + if(html[html_offset] == '>') { + token_node->type |= MyHTML_TOKEN_TYPE_CLOSE_SELF; + myhtml_tokenizer_set_state(tree, token_node); + + html_offset++; + + // TODO: ?????? + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag, after tag name +////
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_before_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + // skip WS + myhtml_parser_skip_whitespace() + + if(html_offset >= html_size) { + return html_offset; + } + + if(html[html_offset] == '>') + { + myhtml_tokenizer_set_state(tree, token_node); + + html_offset++; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + } + else if(html[html_offset] == '/') { + token_node->type |= MyHTML_TOKEN_TYPE_CLOSE_SELF; + + html_offset++; + } + else { + myhtml_parser_queue_set_attr(tree, token_node) + + tree->attr_current->raw_key_begin = html_offset + tree->global_offset; + tree->attr_current->raw_key_length = 0; + tree->attr_current->raw_value_begin = 0; + tree->attr_current->raw_value_length = 0; + + if(html[html_offset] == '=') + html_offset++; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_ATTRIBUTE_NAME; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag, inside of attr key +////
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + while(html_offset < html_size) + { + if(myhtml_whithspace(html[html_offset], ==, ||)) + { + tree->attr_current->raw_key_length = (tree->global_offset + html_offset) - tree->attr_current->raw_key_begin; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_AFTER_ATTRIBUTE_NAME; + + html_offset++; + break; + } + else if(html[html_offset] == '=') + { + tree->attr_current->raw_key_length = (tree->global_offset + html_offset) - tree->attr_current->raw_key_begin; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_VALUE; + + html_offset++; + break; + } + else if(html[html_offset] == '>') + { + tree->attr_current->raw_key_length = (tree->global_offset + html_offset) - tree->attr_current->raw_key_begin; + myhtml_tokenizer_set_state(tree, token_node); + + html_offset++; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + break; + } + else if(html[html_offset] == '/') + { + tree->attr_current->raw_key_length = (tree->global_offset + html_offset) - tree->attr_current->raw_key_begin; + + token_node->type |= MyHTML_TOKEN_TYPE_CLOSE_SELF; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + html_offset++; + break; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag, after attr key +////
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_after_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + while(html_offset < html_size) + { + if(html[html_offset] == '=') + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_VALUE; + + html_offset++; + break; + } + else if(html[html_offset] == '>') + { + myhtml_tokenizer_set_state(tree, token_node); + + html_offset++; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + break; + } + else if(html[html_offset] == '"' || html[html_offset] == '\'' || html[html_offset] == '<') + { + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + myhtml_parser_queue_set_attr(tree, token_node) + + tree->attr_current->raw_key_begin = (tree->global_offset + html_offset); + tree->attr_current->raw_key_length = 0; + tree->attr_current->raw_value_begin = 0; + tree->attr_current->raw_value_length = 0; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_ATTRIBUTE_NAME; + break; + } + else if(myhtml_whithspace(html[html_offset], !=, &&)) + { + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + myhtml_parser_queue_set_attr(tree, token_node) + + tree->attr_current->raw_key_begin = (html_offset + tree->global_offset); + tree->attr_current->raw_key_length = 0; + tree->attr_current->raw_value_begin = 0; + tree->attr_current->raw_value_length = 0; + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_ATTRIBUTE_NAME; + break; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag, after attr key +////
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_before_attribute_value(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + while(html_offset < html_size) + { + if(html[html_offset] == '>') { + myhtml_tokenizer_set_state(tree, token_node); + + html_offset++; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + break; + } + else if(myhtml_whithspace(html[html_offset], !=, &&)) + { + if(html[html_offset] == '"') { + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_DOUBLE_QUOTED; + } + else if(html[html_offset] == '\'') { + html_offset++; + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_SINGLE_QUOTED; + } + else { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_ATTRIBUTE_VALUE_UNQUOTED; + } + + tree->attr_current->raw_value_begin = (tree->global_offset + html_offset); + + break; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag, inside of attr value +////
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_attribute_value_double_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + //myhtml_t* myhtml = tree->myhtml; + + while(html_offset < html_size) + { + if(html[html_offset] == '"') + { + tree->attr_current->raw_value_length = (tree->global_offset + html_offset) - tree->attr_current->raw_value_begin; + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + html_offset++; + break; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag, inside of attr value +////
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_attribute_value_single_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + //myhtml_t* myhtml = tree->myhtml; + + while(html_offset < html_size) + { + if(html[html_offset] == '\'') + { + tree->attr_current->raw_value_length = (tree->global_offset + html_offset) - tree->attr_current->raw_value_begin; + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + html_offset++; + break; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// inside of tag, inside of attr value +////
+///////////////////////////////////////////////////////// +size_t myhtml_tokenizer_state_attribute_value_unquoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) +{ + while(html_offset < html_size) + { + if(myhtml_whithspace(html[html_offset], ==, ||)) + { + myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; + + tree->attr_current->raw_value_length = (tree->global_offset + html_offset) - tree->attr_current->raw_value_begin; + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + html_offset++; + break; + } + else if(html[html_offset] == '>') { + tree->attr_current->raw_value_length = (tree->global_offset + html_offset) - tree->attr_current->raw_value_begin; + + myhtml_tokenizer_set_state(tree, token_node); + + html_offset++; + + token_node->element_length = (tree->global_offset + html_offset) - token_node->element_begin; + myhtml_queue_add(tree, html_offset, token_node); + + myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->token->mcasync_attr_id); + + break; + } + + html_offset++; + } + + return html_offset; +} + +///////////////////////////////////////////////////////// +//// COMMENT +////